From 38c005e7c07b5ccaab3345dc8c66cbc27b95692a Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Mon, 20 Jan 2020 23:31:55 -0800 Subject: fixes #1169 survey and xsurvey could use message cloning fixes #1160 Consider limiting maximum hop count to 15 fixes #1098 Maximum maxTTL should be compile time defined This doesn't expose the max-MaxTTL in the CMakeList.txt -- there is really no reason anyone should be changing it. This does not yet inline the message header into the nni_msg_t, but it is my intention to do so soon, and eliminate most of the conditional cases for failure on inserting into the header. --- src/core/defs.h | 16 +++++++++++++++- src/core/message.c | 6 +++--- 2 files changed, 18 insertions(+), 4 deletions(-) (limited to 'src/core') diff --git a/src/core/defs.h b/src/core/defs.h index 9e320e1d..eaba7428 100644 --- a/src/core/defs.h +++ b/src/core/defs.h @@ -1,5 +1,5 @@ // -// Copyright 2019 Staysail Systems, Inc. +// Copyright 2020 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // // This software is supplied under the terms of the MIT License, a @@ -161,4 +161,18 @@ typedef enum { typedef nni_type nni_opt_type; +// NNI_MAX_MAX_TTL is the maximum value that MAX_TTL can be set to - +// i.e. the number of nng_device boundaries that a message can traverse. +// This value drives the size of pre-allocated headers and back-trace +// buffers -- we need 4 bytes for each hop, plus 4 bytes for the request +// identifier. Thus, it is recommended not to set this value too large. +// (It is possible to scale out to inconceivably large networks with +// only a few hops - we have yet to see more than 4 in practice.) +#ifndef NNI_MAX_MAX_TTL +#define NNI_MAX_MAX_TTL 15 +#endif + +// NNI_MAX_HEADER_SIZE is our header size. +#define NNI_MAX_HEADER_SIZE ((NNI_MAX_MAX_TTL + 1) * sizeof(uint32_t)) + #endif // CORE_DEFS_H diff --git a/src/core/message.c b/src/core/message.c index 888585ad..00b23a55 100644 --- a/src/core/message.c +++ b/src/core/message.c @@ -470,9 +470,9 @@ nni_msg_alloc(nni_msg **mp, size_t sz) return (NNG_ENOMEM); } - // 64-bytes of header, including room for 32 bytes - // of headroom and 32 bytes of trailer. - if ((rv = nni_chunk_grow(&m->m_header, 32, 32)) != 0) { + // Header size is strictly limited. We need max hops plus one for + // the request or survey ID. TODO: Inline the header (no chunk). + if ((rv = nni_chunk_grow(&m->m_header, NNI_MAX_HEADER_SIZE, 0)) != 0) { NNI_FREE_STRUCT(m); return (rv); } -- cgit v1.2.3-70-g09d2