From 12fc2c3186aef381820305e290981d620da47fe1 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 20 Sep 2014 01:14:17 +0100 Subject: [PATCH] site: Permit multiple peer addresses even if peer is static This is necessary to permit multiple addresses of multiple address families. We (arbitrarily) set the default limit to 3. Abolish the MAX_MOBILE_PEERS_MAX constant and size the peer addresses array by MAX_PEER_ADDRS directly. Signed-off-by: Ian Jackson --- README | 3 +++ site.c | 29 +++++++++++++++-------------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/README b/README index 94334b3..962755e 100644 --- a/README +++ b/README @@ -319,6 +319,9 @@ site: dict argument their contact addresses might both change at once. [false] mobile-peers-max (integer): Maximum number of peer port/addr pairs we remember and send to. Must be at least 1 and no more than 5. [3] + static-peers-max (integer): Maximum number of peer port/addr pairs + we can try for a static site. Must be at least 1 and no more + than 5. [3] mobile-peer-expiry (integer): For "mobile" peers only, the length of time (in seconds) for which we will keep sending to multiple address/ports from which we have not seen incoming traffic. [120] diff --git a/site.c b/site.c index cea331e..cf40540 100644 --- a/site.c +++ b/site.c @@ -41,6 +41,7 @@ #define DEFAULT_MOBILE_PEER_EXPIRY (2*60) /* [s] */ #define DEFAULT_MOBILE_PEERS_MAX 3 /* send at most this many copies (default) */ +#define DEFAULT_STATIC_PEERS_MAX 3 /* retain at most this many peer addresses */ /* Each site can be in one of several possible states. */ @@ -220,8 +221,6 @@ static struct flagstr log_event_table[]={ */ -#define MAX_MOBILE_PEERS_MAX MAX_PEER_ADDRS /* send at most this many copies */ - typedef struct { struct timeval last; struct comm_addr addr; @@ -231,7 +230,7 @@ typedef struct { /* configuration information */ /* runtime information */ int npeers; - transport_peer peers[MAX_MOBILE_PEERS_MAX]; + transport_peer peers[MAX_PEER_ADDRS]; } transport_peers; /* Basic operations on transport peer address sets */ @@ -1962,12 +1961,14 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context, st->mobile_peer_expiry= dict_read_number( dict,"mobile-peer-expiry",False,"site",loc,DEFAULT_MOBILE_PEER_EXPIRY); - st->transport_peers_max= !st->peer_mobile ? 1 : dict_read_number( - dict,"mobile-peers-max",False,"site",loc,DEFAULT_MOBILE_PEERS_MAX); + const char *peerskey= st->peer_mobile + ? "mobile-peers-max" : "static-peers-max"; + st->transport_peers_max= dict_read_number( + dict,peerskey,False,"site",loc,DEFAULT_MOBILE_PEERS_MAX); if (st->transport_peers_max<1 || - st->transport_peers_max>=MAX_MOBILE_PEERS_MAX) { - cfgfatal(loc,"site","mobile-peers-max must be in range 1.." - STRING(MAX_MOBILE_PEERS_MAX) "\n"); + st->transport_peers_max>=MAX_PEER_ADDRS) { + cfgfatal(loc,"site", "%s must be in range 1.." + STRING(MAX_PEER_ADDRS) "\n", peerskey); } if (st->key_lifetime < DEFAULT(KEY_RENEGOTIATE_GAP)*2) @@ -2172,11 +2173,11 @@ static bool_t transport_compute_setupinit_peers(struct site *st, incoming_packet_addr ? " incoming packet address;" : "", st->peers.npeers); - /* Non-mobile peers have st->peers.npeers==0 or ==1, since they - * have transport_peers_max==1. The effect is that this code - * always uses the configured address if supplied, or otherwise - * the address of the incoming PROD, or the existing data peer if - * one exists; this is as desired. */ + /* Non-mobile peers try addresses until one is plausible. The + * effect is that this code always tries first the configured + * address if supplied, or otherwise the address of the incoming + * PROD, or finally the existing data peer if one exists; this is + * as desired. */ transport_peers_copy(st,&st->setup_peers,&st->peers); transport_peers_expire(st,&st->setup_peers); @@ -2257,7 +2258,7 @@ void transport_xmit(struct site *st, transport_peers *peers, int slot; transport_peers_expire(st, peers); unsigned failed=0; /* bitmask */ - assert(MAX_MOBILE_PEERS_MAX < sizeof(unsigned)*CHAR_BIT); + assert(MAX_PEER_ADDRS < sizeof(unsigned)*CHAR_BIT); int nfailed=0; for (slot=0; slotnpeers; slot++) { -- 2.30.2