X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=site.c;h=84847e26a36f8362c8b03b8d7750913393dd2041;hb=fbef1df1dba01447d6e28002a0d2885bf4192f34;hp=73a0c4d659ce9cab6fb24afeeecf1ba966515ba5;hpb=ee226369193a35e6883d1031261205d2db4693b9;p=secnet.git diff --git a/site.c b/site.c index 73a0c4d..84847e2 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. */ @@ -144,9 +145,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 +218,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 +227,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 */ @@ -1197,7 +1193,8 @@ static bool_t send_msg(struct site *st) } static void site_resolve_callback(void *sst, const struct comm_addr *addrs, - int naddrs) + int naddrs, const char *address, + const char *failwhy) { struct site *st=sst; @@ -1207,7 +1204,7 @@ static void site_resolve_callback(void *sst, const struct comm_addr *addrs, slog(st,LOG_STATE,"resolution of %s completed, %d addrs, eg: %s", st->address, naddrs, comm_addr_to_string(&addrs[0]));; } else { - slog(st,LOG_ERROR,"resolution of %s failed",st->address); + slog(st,LOG_ERROR,"resolution of %s failed: %s",st->address,failwhy); } switch (st->state) { @@ -1962,12 +1959,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 +2171,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 +2256,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++) {