X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=site.c;h=db78d5f4ed27001d300951fa77784597096169ba;hb=e6d6991c815cb4b06efc4b3be4c631e0ef166bc4;hp=9ba1a2857051787978c5dec0b1692974dcf4f136;hpb=c215a4bc817daf7b5631236c3c7b6a509479b034;p=secnet.git diff --git a/site.c b/site.c index 9ba1a28..db78d5f 100644 --- a/site.c +++ b/site.c @@ -296,6 +296,7 @@ struct site { /* configuration information */ string_t localname; string_t remotename; + bool_t keepalive; bool_t local_mobile, peer_mobile; /* Mobile client support */ int32_t transport_peers_max; string_t tunname; /* localname<->remotename by default, used in logs */ @@ -1164,16 +1165,18 @@ static bool_t process_msg0(struct site *st, struct buffer_if *msg0, } static void dump_packet(struct site *st, struct buffer_if *buf, - const struct comm_addr *addr, bool_t incoming) + const struct comm_addr *addr, bool_t incoming, + bool_t ok) { uint32_t dest=get_uint32(buf->start); uint32_t source=get_uint32(buf->start+4); uint32_t msgtype=get_uint32(buf->start+8); if (st->log_events & LOG_DUMP) - slilog(st->log,M_DEBUG,"%s: %s: %08x<-%08x: %08x:", + slilog(st->log,M_DEBUG,"%s: %s: %08x<-%08x: %08x: %s%s", st->tunname,incoming?"incoming":"outgoing", - dest,source,msgtype); + dest,source,msgtype,comm_addr_to_string(addr), + ok?"":" - fail"); } static uint32_t site_status(void *st) @@ -1427,6 +1430,9 @@ static void enter_state_run(struct site *st) memset(st->dhsecret,0,st->dh->len); memset(st->sharedsecret,0,st->sharedsecretlen); set_link_quality(st); + + if (st->keepalive && !current_valid(st)) + initiate_key_setup(st, "keepalive", 0); } static bool_t ensure_resolving(struct site *st) @@ -1600,8 +1606,8 @@ static void generate_send_prod(struct site *st, slog(st,LOG_SETUP_INIT,"prodding peer for key exchange"); st->allow_send_prod=0; generate_prod(st,&st->scratch); - dump_packet(st,&st->scratch,source,False); - source->comm->sendmsg(source->comm->st, &st->scratch, source); + bool_t ok = source->comm->sendmsg(source->comm->st, &st->scratch, source); + dump_packet(st,&st->scratch,source,False,ok); } static inline void site_settimeout(uint64_t timeout, int *timeout_io) @@ -1734,7 +1740,7 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf, if (!named_for_us(st,buf,msgtype,&named_msg)) return False; /* It's a MSG1 addressed to us. Decide what to do about it. */ - dump_packet(st,buf,source,True); + dump_packet(st,buf,source,True,True); if (st->state==SITE_RUN || st->state==SITE_RESOLVE || st->state==SITE_WAIT) { /* We should definitely process it */ @@ -1784,7 +1790,7 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf, if (msgtype==LABEL_PROD) { if (!named_for_us(st,buf,msgtype,&named_msg)) return False; - dump_packet(st,buf,source,True); + dump_packet(st,buf,source,True,True); if (st->state!=SITE_RUN) { slog(st,LOG_DROP,"ignoring PROD when not in state RUN"); } else if (current_valid(st)) { @@ -1797,7 +1803,7 @@ static bool_t site_incoming(void *sst, struct buffer_if *buf, } if (dest==st->index) { /* Explicitly addressed to us */ - if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True); + if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True,True); switch (msgtype) { case LABEL_NAK: /* If the source is our current peer then initiate a key setup, @@ -1965,6 +1971,8 @@ static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context, st->localname=dict_read_string(dict, "local-name", True, "site", loc); st->remotename=dict_read_string(dict, "name", True, "site", loc); + st->keepalive=dict_read_bool(dict,"keepalive",False,"site",loc,False); + st->peer_mobile=dict_read_bool(dict,"mobile",False,"site",loc,False); st->local_mobile= dict_read_bool(dict,"local-mobile",False,"site",loc,False); @@ -2347,10 +2355,10 @@ void transport_xmit(struct site *st, transport_peers *peers, int nfailed=0; for (slot=0; slotnpeers; slot++) { transport_peer *peer=&peers->peers[slot]; - if (candebug) - dump_packet(st, buf, &peer->addr, False); bool_t ok = peer->addr.comm->sendmsg(peer->addr.comm->st, buf, &peer->addr); + if (candebug) + dump_packet(st, buf, &peer->addr, False, ok); if (!ok) { failed |= 1U << slot; nfailed++; @@ -2372,12 +2380,14 @@ void transport_xmit(struct site *st, transport_peers *peers, transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers); assert(wslot+nfailed == peers->npeers); COPY_ARRAY(peers->peers+wslot, failedpeers, nfailed); + transport_peers_debug(st,peers,"mobile failure reorder",0,0,0); } } else { if (failed && peers->npeers > 1) { int wslot=0; transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers); peers->npeers=wslot; + transport_peers_debug(st,peers,"non-mobile failure cleanup",0,0,0); } } }