X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=site.c;h=d360699214bdd5b54bffa8738193ce06099b9a5d;hp=b19388dd7c61a10eb794c3d20c4d8bd658dfa712;hb=2093fb5ca832669236d9e4e8b6475a14b96b3d2a;hpb=cc4206168fb95a0dcd96c2e1f8243e9fd6f4589b diff --git a/site.c b/site.c index b19388d..d360699 100644 --- a/site.c +++ b/site.c @@ -40,7 +40,6 @@ #define DEFAULT_MOBILE_WAIT_TIME (10*1000) /* [ms] */ #define DEFAULT_MOBILE_PEER_EXPIRY (2*60) /* [s] */ -#define DEFAULT_MOBILE_PEERS_MAX 3 /* send at most this many copies (default) */ /* Each site can be in one of several possible states. */ @@ -144,9 +143,6 @@ static struct flagstr log_event_table[]={ /* Details of "mobile peer" semantics: - | Note: this comment is wishful thinking right now. It will be - | implemented in subsequent commits. - - We use the same data structure for the different configurations, but manage it with different algorithms. @@ -220,8 +216,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 +225,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 */ @@ -1967,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, st->address ? 4 : 3); 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) @@ -2092,11 +2088,6 @@ static void transport_peers_debug(struct site *st, transport_peers *dst, } } -static bool_t transport_addrs_equal(const struct comm_addr *a, - const struct comm_addr *b) { - return !memcmp(a,b,sizeof(*a)); -} - static void transport_peers_expire(struct site *st, transport_peers *peers) { /* peers must be sorted first */ int previous_peers=peers->npeers; @@ -2120,7 +2111,7 @@ static bool_t transport_peer_record_one(struct site *st, transport_peers *peers, return 0; for (search=0; searchnpeers; search++) - if (transport_addrs_equal(&peers->peers[search].addr, ca)) + if (comm_addr_equal(&peers->peers[search].addr, ca)) return 1; peers->peers[peers->npeers].addr = *ca; @@ -2139,7 +2130,7 @@ static void transport_record_peers(struct site *st, transport_peers *peers, * Caller must first call transport_peers_expire. */ if (naddrs==1 && peers->npeers>=1 && - transport_addrs_equal(&addrs[0], &peers->peers[0].addr)) { + comm_addr_equal(&addrs[0], &peers->peers[0].addr)) { /* optimisation, also avoids debug for trivial updates */ peers->peers[0].last = *tv_now; return; @@ -2187,11 +2178,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); @@ -2268,7 +2259,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++) {