From: Ian Jackson Date: Sat, 20 Sep 2014 00:14:17 +0000 (+0100) Subject: site: Permit multiple peer addresses even if peer is static X-Git-Tag: base.polypath.v1~25 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=commitdiff_plain;h=2e6d9cbe8398e0fc949e22d8e6ad0601925bb8c7 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 --- 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 73a0c4d..8565a4d 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++) {