chiark / gitweb /
site: Prepare for adding more MSG3 variants
[secnet.git] / site.c
1 /* site.c - manage communication with a remote network site */
2
3 /*
4  * This file is part of secnet.
5  * See README for full list of copyright holders.
6  *
7  * secnet is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  * 
12  * secnet is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * version 3 along with secnet; if not, see
19  * https://www.gnu.org/licenses/gpl.html.
20  */
21
22 /* The 'site' code doesn't know anything about the structure of the
23    packets it's transmitting.  In fact, under the new netlink
24    configuration scheme it doesn't need to know anything at all about
25    IP addresses, except how to contact its peer.  This means it could
26    potentially be used to tunnel other protocols too (IPv6, IPX, plain
27    old Ethernet frames) if appropriate netlink code can be written
28    (and that ought not to be too hard, eg. using the TUN/TAP device to
29    pretend to be an Ethernet interface).  */
30
31 /* At some point in the future the netlink code will be asked for
32    configuration information to go in the PING/PONG packets at the end
33    of the key exchange. */
34
35 #include "secnet.h"
36 #include <stdio.h>
37 #include <string.h>
38 #include <limits.h>
39 #include <assert.h>
40 #include <sys/socket.h>
41
42 #include <sys/mman.h>
43 #include "util.h"
44 #include "unaligned.h"
45 #include "magic.h"
46
47 #define SETUP_BUFFER_LEN 2048
48
49 #define DEFAULT_KEY_LIFETIME                  (3600*1000) /* [ms] */
50 #define DEFAULT_KEY_RENEGOTIATE_GAP           (5*60*1000) /* [ms] */
51 #define DEFAULT_SETUP_RETRIES 5
52 #define DEFAULT_SETUP_RETRY_INTERVAL             (2*1000) /* [ms] */
53 #define DEFAULT_WAIT_TIME                       (20*1000) /* [ms] */
54
55 #define DEFAULT_MOBILE_KEY_LIFETIME      (2*24*3600*1000) /* [ms] */
56 #define DEFAULT_MOBILE_KEY_RENEGOTIATE_GAP (12*3600*1000) /* [ms] */
57 #define DEFAULT_MOBILE_SETUP_RETRIES 30
58 #define DEFAULT_MOBILE_SETUP_RETRY_INTERVAL      (1*1000) /* [ms] */
59 #define DEFAULT_MOBILE_WAIT_TIME                (10*1000) /* [ms] */
60
61 #define DEFAULT_MOBILE_PEER_EXPIRY            (2*60)      /* [s] */
62
63 /* Each site can be in one of several possible states. */
64
65 /* States:
66    SITE_STOP         - nothing is allowed to happen; tunnel is down;
67                        all session keys have been erased
68      -> SITE_RUN upon external instruction
69    SITE_RUN          - site up, maybe with valid key
70      -> SITE_RESOLVE upon outgoing packet and no valid key
71          we start name resolution for the other end of the tunnel
72      -> SITE_SENTMSG2 upon valid incoming message 1 and suitable time
73          we send an appropriate message 2
74    SITE_RESOLVE      - waiting for name resolution
75      -> SITE_SENTMSG1 upon successful resolution
76          we send an appropriate message 1
77      -> SITE_SENTMSG2 upon valid incoming message 1 (then abort resolution)
78          we abort resolution and 
79      -> SITE_WAIT on timeout or resolution failure
80    SITE_SENTMSG1
81      -> SITE_SENTMSG2 upon valid incoming message 1 from higher priority end
82      -> SITE_SENTMSG3 upon valid incoming message 2
83      -> SITE_WAIT on timeout
84    SITE_SENTMSG2
85      -> SITE_SENTMSG4 upon valid incoming message 3
86      -> SITE_WAIT on timeout
87    SITE_SENTMSG3
88      -> SITE_SENTMSG5 upon valid incoming message 4
89      -> SITE_WAIT on timeout
90    SITE_SENTMSG4
91      -> SITE_RUN upon valid incoming message 5
92      -> SITE_WAIT on timeout
93    SITE_SENTMSG5
94      -> SITE_RUN upon valid incoming message 6
95      -> SITE_WAIT on timeout
96    SITE_WAIT         - failed to establish key; do nothing for a while
97      -> SITE_RUN on timeout
98    */
99
100 #define SITE_STOP     0
101 #define SITE_RUN      1
102 #define SITE_RESOLVE  2
103 #define SITE_SENTMSG1 3
104 #define SITE_SENTMSG2 4
105 #define SITE_SENTMSG3 5
106 #define SITE_SENTMSG4 6
107 #define SITE_SENTMSG5 7
108 #define SITE_WAIT     8
109
110 #define CASES_MSG3_KNOWN LABEL_MSG3: case LABEL_MSG3BIS
111
112 int32_t site_max_start_pad = 4*4;
113
114 static cstring_t state_name(uint32_t state)
115 {
116     switch (state) {
117     case 0: return "STOP";
118     case 1: return "RUN";
119     case 2: return "RESOLVE";
120     case 3: return "SENTMSG1";
121     case 4: return "SENTMSG2";
122     case 5: return "SENTMSG3";
123     case 6: return "SENTMSG4";
124     case 7: return "SENTMSG5";
125     case 8: return "WAIT";
126     default: return "*bad state*";
127     }
128 }
129
130 #define NONCELEN 8
131
132 #define LOG_UNEXPECTED    0x00000001
133 #define LOG_SETUP_INIT    0x00000002
134 #define LOG_SETUP_TIMEOUT 0x00000004
135 #define LOG_ACTIVATE_KEY  0x00000008
136 #define LOG_TIMEOUT_KEY   0x00000010
137 #define LOG_SEC           0x00000020
138 #define LOG_STATE         0x00000040
139 #define LOG_DROP          0x00000080
140 #define LOG_DUMP          0x00000100
141 #define LOG_ERROR         0x00000400
142 #define LOG_PEER_ADDRS    0x00000800
143
144 static struct flagstr log_event_table[]={
145     { "unexpected", LOG_UNEXPECTED },
146     { "setup-init", LOG_SETUP_INIT },
147     { "setup-timeout", LOG_SETUP_TIMEOUT },
148     { "activate-key", LOG_ACTIVATE_KEY },
149     { "timeout-key", LOG_TIMEOUT_KEY },
150     { "security", LOG_SEC },
151     { "state-change", LOG_STATE },
152     { "packet-drop", LOG_DROP },
153     { "dump-packets", LOG_DUMP },
154     { "errors", LOG_ERROR },
155     { "peer-addrs", LOG_PEER_ADDRS },
156     { "default", LOG_SETUP_INIT|LOG_SETUP_TIMEOUT|
157       LOG_ACTIVATE_KEY|LOG_TIMEOUT_KEY|LOG_SEC|LOG_ERROR },
158     { "all", 0xffffffff },
159     { NULL, 0 }
160 };
161
162
163 /***** TRANSPORT PEERS declarations *****/
164
165 /* Details of "mobile peer" semantics:
166
167    - We use the same data structure for the different configurations,
168      but manage it with different algorithms.
169    
170    - We record up to mobile_peers_max peer address/port numbers
171      ("peers") for key setup, and separately up to mobile_peers_max
172      for data transfer.
173
174    - In general, we make a new set of addrs (see below) when we start
175      a new key exchange; the key setup addrs become the data transport
176      addrs when key setup complets.
177
178    If our peer is mobile:
179
180    - We send to all recent addresses of incoming packets, plus
181      initially all configured addresses (which we also expire).
182
183    - So, we record addrs of good incoming packets, as follows:
184       1. expire any peers last seen >120s ("mobile-peer-expiry") ago
185       2. add the peer of the just received packet to the applicable list
186          (possibly evicting the oldest entries to make room)
187      NB that we do not expire peers until an incoming packet arrives.
188
189    - If the peer has a configured address or name, we record them the
190      same way, but only as a result of our own initiation of key
191      setup.  (We might evict some incoming packet addrs to make room.)
192
193    - The default number of addrs to keep is 3, or 4 if we have a
194      configured name or address.  That's space for two configured
195      addresses (one IPv6 and one IPv4), plus two received addresses.
196
197    - Outgoing packets are sent to every recorded address in the
198      applicable list.  Any unsupported[1] addresses are deleted from
199      the list right away.  (This should only happen to configured
200      addresses, of course, but there is no need to check that.)
201
202    - When we successfully complete a key setup, we merge the key setup
203      peers into the data transfer peers.
204
205    [1] An unsupported address is one for whose AF we don't have a
206      socket (perhaps because we got EAFNOSUPPORT or some such) or for
207      which sendto gives ENETUNREACH.
208
209    If neither end is mobile:
210
211    - When peer initiated the key exchange, we use the incoming packet
212      address.
213
214    - When we initiate the key exchange, we try configured addresses
215      until we get one which isn't unsupported then fixate on that.
216
217    - When we complete a key setup, we replace the data transport peers
218      with those from the key setup.
219
220    If we are mobile:
221
222    - We can't tell when local network setup changes so we can't cache
223      the unsupported addrs and completely remove the spurious calls to
224      sendto, but we can optimise things a bit by deprioritising addrs
225      which seem to be unsupported.
226
227    - Use only configured addresses.  (Except, that if our peer
228      initiated a key exchange we use the incoming packet address until
229      our name resolution completes.)
230
231    - When we send a packet, try each address in turn; if addr
232      supported, put that address to the end of the list for future
233      packets, and go onto the next address.
234
235    - When we complete a key setup, we replace the data transport peers
236      with those from the key setup.
237
238    */
239
240 typedef struct {
241     struct timeval last;
242     struct comm_addr addr;
243 } transport_peer;
244
245 typedef struct {
246 /* configuration information */
247 /* runtime information */
248     int npeers;
249     transport_peer peers[MAX_PEER_ADDRS];
250 } transport_peers;
251
252 /* Basic operations on transport peer address sets */
253 static void transport_peers_clear(struct site *st, transport_peers *peers);
254 static int transport_peers_valid(transport_peers *peers);
255 static void transport_peers_copy(struct site *st, transport_peers *dst,
256                                  const transport_peers *src);
257
258 /* Record address of incoming setup packet; resp. data packet. */
259 static void transport_setup_msgok(struct site *st, const struct comm_addr *a);
260 static void transport_data_msgok(struct site *st, const struct comm_addr *a);
261
262 /* Initialise the setup addresses.  Called before we send the first
263  * packet in a key exchange.  If we are the initiator, as a result of
264  * resolve completing (or being determined not to be relevant) or an
265  * incoming PROD; if we are the responder, as a result of the MSG1. */
266 static bool_t transport_compute_setupinit_peers(struct site *st,
267         const struct comm_addr *configured_addrs /* 0 if none or not found */,
268         int n_configured_addrs /* 0 if none or not found */,
269         const struct comm_addr *incoming_packet_addr /* 0 if none */);
270
271 /* Called if we are the responder in a key setup, when the resolve
272  * completes.  transport_compute_setupinit_peers will hvae been called
273  * earlier.  If _complete is called, we are still doing the key setup
274  * (and we should use the new values for both the rest of the key
275  * setup and the ongoing data exchange); if _tardy is called, the key
276  * setup is done (either completed or not) and only the data peers are
277  * relevant */
278 static void transport_resolve_complete(struct site *st,
279         const struct comm_addr *addrs, int naddrs);
280 static void transport_resolve_complete_tardy(struct site *st,
281         const struct comm_addr *addrs, int naddrs);
282
283 static void transport_xmit(struct site *st, transport_peers *peers,
284                            struct buffer_if *buf, bool_t candebug);
285
286  /***** END of transport peers declarations *****/
287
288
289 struct data_key {
290     struct transform_inst_if *transform;
291     uint64_t key_timeout; /* End of life of current key */
292     uint32_t remote_session_id;
293 };
294
295 struct site {
296     closure_t cl;
297     struct site_if ops;
298 /* configuration information */
299     string_t localname;
300     string_t remotename;
301     bool_t keepalive;
302     bool_t local_mobile, peer_mobile; /* Mobile client support */
303     int32_t transport_peers_max;
304     string_t tunname; /* localname<->remotename by default, used in logs */
305     cstring_t *addresses; /* DNS name or address(es) for bootstrapping, optional */
306     int remoteport; /* Port for bootstrapping, optional */
307     uint32_t mtu_target;
308     struct netlink_if *netlink;
309     struct comm_if **comms;
310     struct comm_clientinfo **commclientinfos;
311     int ncomms;
312     struct resolver_if *resolver;
313     struct log_if *log;
314     struct random_if *random;
315     struct rsaprivkey_if *privkey;
316     struct rsapubkey_if *pubkey;
317     struct transform_if **transforms;
318     int ntransforms;
319     struct dh_if *dh;
320     struct hash_if *hash;
321
322     uint32_t index; /* Index of this site */
323     uint32_t early_capabilities;
324     uint32_t local_capabilities;
325     int32_t setup_retries; /* How many times to send setup packets */
326     int32_t setup_retry_interval; /* Initial timeout for setup packets */
327     int32_t wait_timeout_mean; /* How long to wait if setup unsuccessful */
328     int32_t mobile_peer_expiry; /* How long to remember 2ary addresses */
329     int32_t key_lifetime; /* How long a key lasts once set up */
330     int32_t key_renegotiate_time; /* If we see traffic (or a keepalive)
331                                       after this time, initiate a new
332                                       key exchange */
333
334     bool_t our_name_later; /* our name > peer name */
335     uint32_t log_events;
336
337 /* runtime information */
338     uint32_t state;
339     uint64_t now; /* Most recently seen time */
340     bool_t allow_send_prod;
341     bool_t msg1_crossed_logged;
342     int resolving_count;
343     int resolving_n_results_all;
344     int resolving_n_results_stored;
345     struct comm_addr resolving_results[MAX_PEER_ADDRS];
346
347     /* The currently established session */
348     struct data_key current;
349     struct data_key auxiliary_key;
350     bool_t auxiliary_is_new;
351     uint64_t renegotiate_key_time; /* When we can negotiate a new key */
352     uint64_t auxiliary_renegotiate_key_time;
353     transport_peers peers; /* Current address(es) of peer for data traffic */
354
355     /* The current key setup protocol exchange.  We can only be
356        involved in one of these at a time.  There's a potential for
357        denial of service here (the attacker keeps sending a setup
358        packet; we keep trying to continue the exchange, and have to
359        timeout before we can listen for another setup packet); perhaps
360        we should keep a list of 'bad' sources for setup packets. */
361     uint32_t remote_capabilities;
362     uint16_t remote_adv_mtu;
363     struct transform_if *chosen_transform;
364     uint32_t setup_session_id;
365     transport_peers setup_peers;
366     uint8_t localN[NONCELEN]; /* Nonces for key exchange */
367     uint8_t remoteN[NONCELEN];
368     struct buffer_if buffer; /* Current outgoing key exchange packet */
369     struct buffer_if scratch;
370     int32_t retries; /* Number of retries remaining */
371     uint64_t timeout; /* Timeout for current state */
372     uint8_t *dhsecret;
373     uint8_t *sharedsecret;
374     uint32_t sharedsecretlen, sharedsecretallocd;
375     struct transform_inst_if *new_transform; /* For key setup/verify */
376 };
377
378 static uint32_t event_log_priority(struct site *st, uint32_t event)
379 {
380     if (!(event&st->log_events))
381         return 0;
382     switch(event) {
383     case LOG_UNEXPECTED:    return M_INFO;
384     case LOG_SETUP_INIT:    return M_INFO;
385     case LOG_SETUP_TIMEOUT: return M_NOTICE;
386     case LOG_ACTIVATE_KEY:  return M_INFO;
387     case LOG_TIMEOUT_KEY:   return M_INFO;
388     case LOG_SEC:           return M_SECURITY;
389     case LOG_STATE:         return M_DEBUG;
390     case LOG_DROP:          return M_DEBUG;
391     case LOG_DUMP:          return M_DEBUG;
392     case LOG_ERROR:         return M_ERR;
393     case LOG_PEER_ADDRS:    return M_DEBUG;
394     default:                return M_ERR;
395     }
396 }
397
398 static void vslog(struct site *st, uint32_t event, cstring_t msg, va_list ap)
399 FORMAT(printf,3,0);
400 static void vslog(struct site *st, uint32_t event, cstring_t msg, va_list ap)
401 {
402     uint32_t class;
403
404     class=event_log_priority(st, event);
405     if (class) {
406         slilog_part(st->log,class,"%s: ",st->tunname);
407         vslilog_part(st->log,class,msg,ap);
408         slilog_part(st->log,class,"\n");
409     }
410 }
411
412 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
413 FORMAT(printf,3,4);
414 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
415 {
416     va_list ap;
417     va_start(ap,msg);
418     vslog(st,event,msg,ap);
419     va_end(ap);
420 }
421
422 static void logtimeout(struct site *st, const char *fmt, ...)
423 FORMAT(printf,2,3);
424 static void logtimeout(struct site *st, const char *fmt, ...)
425 {
426     uint32_t class=event_log_priority(st,LOG_SETUP_TIMEOUT);
427     if (!class)
428         return;
429
430     va_list ap;
431     va_start(ap,fmt);
432
433     slilog_part(st->log,class,"%s: ",st->tunname);
434     vslilog_part(st->log,class,fmt,ap);
435
436     const char *delim;
437     int i;
438     for (i=0, delim=" (tried ";
439          i<st->setup_peers.npeers;
440          i++, delim=", ") {
441         transport_peer *peer=&st->setup_peers.peers[i];
442         const char *s=comm_addr_to_string(&peer->addr);
443         slilog_part(st->log,class,"%s%s",delim,s);
444     }
445
446     slilog_part(st->log,class,")\n");
447     va_end(ap);
448 }
449
450 static void set_link_quality(struct site *st);
451 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel);
452 static void delete_one_key(struct site *st, struct data_key *key,
453                            const char *reason /* may be 0 meaning don't log*/,
454                            const char *which /* ignored if !reasonn */,
455                            uint32_t loglevel /* ignored if !reasonn */);
456 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
457                                  const struct comm_addr *prod_hint);
458 static void enter_state_run(struct site *st);
459 static bool_t enter_state_resolve(struct site *st);
460 static void decrement_resolving_count(struct site *st, int by);
461 static bool_t enter_new_state(struct site *st,uint32_t next);
462 static void enter_state_wait(struct site *st);
463 static void activate_new_key(struct site *st);
464
465 static bool_t is_transform_valid(struct transform_inst_if *transform)
466 {
467     return transform && transform->valid(transform->st);
468 }
469
470 static bool_t current_valid(struct site *st)
471 {
472     return is_transform_valid(st->current.transform);
473 }
474
475 #define DEFINE_CALL_TRANSFORM(fwdrev)                                   \
476 static transform_apply_return                                           \
477 call_transform_##fwdrev(struct site *st,                                \
478                                    struct transform_inst_if *transform, \
479                                    struct buffer_if *buf,               \
480                                    const char **errmsg)                 \
481 {                                                                       \
482     if (!is_transform_valid(transform)) {                               \
483         *errmsg="transform not set up";                                 \
484         return transform_apply_err;                                     \
485     }                                                                   \
486     return transform->fwdrev(transform->st,buf,errmsg);                 \
487 }
488
489 DEFINE_CALL_TRANSFORM(forwards)
490 DEFINE_CALL_TRANSFORM(reverse)
491
492 static void dispose_transform(struct transform_inst_if **transform_var)
493 {
494     struct transform_inst_if *transform=*transform_var;
495     if (transform) {
496         transform->delkey(transform->st);
497         transform->destroy(transform->st);
498     }
499     *transform_var = 0;
500 }    
501
502 #define CHECK_AVAIL(b,l) do { if ((b)->size<(l)) return False; } while(0)
503 #define CHECK_EMPTY(b) do { if ((b)->size!=0) return False; } while(0)
504 #define CHECK_TYPE(b,t) do { uint32_t type; \
505     CHECK_AVAIL((b),4); \
506     type=buf_unprepend_uint32((b)); \
507     if (type!=(t)) return False; } while(0)
508
509 static _Bool type_is_msg34(uint32_t type)
510 {
511     switch (type) {
512         case CASES_MSG3_KNOWN: case LABEL_MSG4: return True;
513         default: return False;
514     }
515 }
516
517 struct parsedname {
518     int32_t len;
519     uint8_t *name;
520     struct buffer_if extrainfo;
521 };
522
523 struct msg {
524     uint8_t *hashstart;
525     uint32_t dest;
526     uint32_t source;
527     struct parsedname remote;
528     struct parsedname local;
529     uint32_t remote_capabilities;
530     uint16_t remote_mtu;
531     int capab_transformnum;
532     uint8_t *nR;
533     uint8_t *nL;
534     int32_t pklen;
535     char *pk;
536     int32_t hashlen;
537     int32_t siglen;
538     char *sig;
539 };
540
541 static int32_t wait_timeout(struct site *st) {
542     int32_t t = st->wait_timeout_mean;
543     int8_t factor;
544     if (t < INT_MAX/2) {
545         st->random->generate(st->random->st,sizeof(factor),&factor);
546         t += (t / 256) * factor;
547     }
548     return t;
549 }
550
551 static _Bool set_new_transform(struct site *st, char *pk)
552 {
553     _Bool ok;
554
555     /* Make room for the shared key */
556     st->sharedsecretlen=st->chosen_transform->keylen?:st->dh->ceil_len;
557     assert(st->sharedsecretlen);
558     if (st->sharedsecretlen > st->sharedsecretallocd) {
559         st->sharedsecretallocd=st->sharedsecretlen;
560         st->sharedsecret=safe_realloc_ary(st->sharedsecret,1,
561                                           st->sharedsecretallocd,
562                                           "site:sharedsecret");
563     }
564
565     /* Generate the shared key */
566     st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->len,pk,
567                        st->sharedsecret,st->sharedsecretlen);
568
569     /* Set up the transform */
570     struct transform_if *generator=st->chosen_transform;
571     struct transform_inst_if *generated=generator->create(generator->st);
572     ok = generated->setkey(generated->st,st->sharedsecret,
573                            st->sharedsecretlen,st->our_name_later);
574
575     dispose_transform(&st->new_transform);
576     if (!ok) return False;
577     st->new_transform=generated;
578
579     slog(st,LOG_SETUP_INIT,"key exchange negotiated transform"
580          " %d (capabilities ours=%#"PRIx32" theirs=%#"PRIx32")",
581          st->chosen_transform->capab_bit,
582          st->local_capabilities, st->remote_capabilities);
583     return True;
584 }
585
586 struct xinfoadd {
587     int32_t lenpos, afternul;
588 };
589 static void append_string_xinfo_start(struct buffer_if *buf,
590                                       struct xinfoadd *xia,
591                                       const char *str)
592     /* Helps construct one of the names with additional info as found
593      * in MSG1..4.  Call this function first, then append all the
594      * desired extra info (not including the nul byte) to the buffer,
595      * then call append_string_xinfo_done. */
596 {
597     xia->lenpos = buf->size;
598     buf_append_string(buf,str);
599     buf_append_uint8(buf,0);
600     xia->afternul = buf->size;
601 }
602 static void append_string_xinfo_done(struct buffer_if *buf,
603                                      struct xinfoadd *xia)
604 {
605     /* we just need to adjust the string length */
606     if (buf->size == xia->afternul) {
607         /* no extra info, strip the nul too */
608         buf_unappend_uint8(buf);
609     } else {
610         put_uint16(buf->start+xia->lenpos, buf->size-(xia->lenpos+2));
611     }
612 }
613
614 /* Build any of msg1 to msg4. msg5 and msg6 are built from the inside
615    out using a transform of config data supplied by netlink */
616 static bool_t generate_msg(struct site *st, uint32_t type, cstring_t what)
617 {
618     void *hst;
619     uint8_t *hash;
620     string_t dhpub, sig;
621     unsigned minor;
622
623     st->retries=st->setup_retries;
624     BUF_ALLOC(&st->buffer,what);
625     buffer_init(&st->buffer,0);
626     buf_append_uint32(&st->buffer,
627         (type==LABEL_MSG1?0:st->setup_session_id));
628     buf_append_uint32(&st->buffer,st->index);
629     buf_append_uint32(&st->buffer,type);
630
631     struct xinfoadd xia;
632     append_string_xinfo_start(&st->buffer,&xia,st->localname);
633     if ((st->local_capabilities & st->early_capabilities) ||
634         (type != LABEL_MSG1)) {
635         buf_append_uint32(&st->buffer,st->local_capabilities);
636     }
637     if (type_is_msg34(type)) {
638         buf_append_uint16(&st->buffer,st->mtu_target);
639     }
640     append_string_xinfo_done(&st->buffer,&xia);
641
642     buf_append_string(&st->buffer,st->remotename);
643     BUF_ADD_OBJ(append,&st->buffer,st->localN);
644     if (type==LABEL_MSG1) return True;
645     BUF_ADD_OBJ(append,&st->buffer,st->remoteN);
646     if (type==LABEL_MSG2) return True;
647
648     if (hacky_par_mid_failnow()) return False;
649
650     if (MSGMAJOR(type) == 3) do {
651         minor = MSGMINOR(type);
652         if (minor < 1) break;
653         buf_append_uint8(&st->buffer,st->chosen_transform->capab_bit);
654     } while (0);
655
656     dhpub=st->dh->makepublic(st->dh->st,st->dhsecret,st->dh->len);
657     buf_append_string(&st->buffer,dhpub);
658     free(dhpub);
659     hash=safe_malloc(st->hash->len, "generate_msg");
660     hst=st->hash->init();
661     st->hash->update(hst,st->buffer.start,st->buffer.size);
662     st->hash->final(hst,hash);
663     sig=st->privkey->sign(st->privkey->st,hash,st->hash->len);
664     buf_append_string(&st->buffer,sig);
665     free(sig);
666     free(hash);
667     return True;
668 }
669
670 static bool_t unpick_name(struct buffer_if *msg, struct parsedname *nm)
671 {
672     CHECK_AVAIL(msg,2);
673     nm->len=buf_unprepend_uint16(msg);
674     CHECK_AVAIL(msg,nm->len);
675     nm->name=buf_unprepend(msg,nm->len);
676     uint8_t *nul=memchr(nm->name,0,nm->len);
677     if (!nul) {
678         buffer_readonly_view(&nm->extrainfo,0,0);
679     } else {
680         buffer_readonly_view(&nm->extrainfo, nul+1, msg->start-(nul+1));
681         nm->len=nul-nm->name;
682     }
683     return True;
684 }
685
686 static bool_t unpick_msg(struct site *st, uint32_t type,
687                          struct buffer_if *msg, struct msg *m)
688 {
689     unsigned minor;
690
691     m->capab_transformnum=-1;
692     m->hashstart=msg->start;
693     CHECK_AVAIL(msg,4);
694     m->dest=buf_unprepend_uint32(msg);
695     CHECK_AVAIL(msg,4);
696     m->source=buf_unprepend_uint32(msg);
697     CHECK_TYPE(msg,type);
698     if (!unpick_name(msg,&m->remote)) return False;
699     m->remote_capabilities=0;
700     m->remote_mtu=0;
701     if (m->remote.extrainfo.size) {
702         CHECK_AVAIL(&m->remote.extrainfo,4);
703         m->remote_capabilities=buf_unprepend_uint32(&m->remote.extrainfo);
704     }
705     if (type_is_msg34(type) && m->remote.extrainfo.size) {
706         CHECK_AVAIL(&m->remote.extrainfo,2);
707         m->remote_mtu=buf_unprepend_uint16(&m->remote.extrainfo);
708     }
709     if (!unpick_name(msg,&m->local)) return False;
710     if (type==LABEL_PROD) {
711         CHECK_EMPTY(msg);
712         return True;
713     }
714     CHECK_AVAIL(msg,NONCELEN);
715     m->nR=buf_unprepend(msg,NONCELEN);
716     if (type==LABEL_MSG1) {
717         CHECK_EMPTY(msg);
718         return True;
719     }
720     CHECK_AVAIL(msg,NONCELEN);
721     m->nL=buf_unprepend(msg,NONCELEN);
722     if (type==LABEL_MSG2) {
723         CHECK_EMPTY(msg);
724         return True;
725     }
726     if (MSGMAJOR(type) == 3) do {
727         minor = MSGMINOR(type);
728 #define MAYBE_READ_CAP(minminor, kind, dflt) do {                       \
729     if (minor < (minminor))                                             \
730         m->capab_##kind##num = (dflt);                                  \
731     else {                                                              \
732         CHECK_AVAIL(msg, 1);                                            \
733         m->capab_##kind##num = buf_unprepend_uint8(msg);                \
734     }                                                                   \
735 } while (0)
736         MAYBE_READ_CAP(1, transform, CAPAB_BIT_ANCIENTTRANSFORM);
737 #undef MAYBE_READ_CAP
738     } while (0);
739     CHECK_AVAIL(msg,2);
740     m->pklen=buf_unprepend_uint16(msg);
741     CHECK_AVAIL(msg,m->pklen);
742     m->pk=buf_unprepend(msg,m->pklen);
743     m->hashlen=msg->start-m->hashstart;
744     CHECK_AVAIL(msg,2);
745     m->siglen=buf_unprepend_uint16(msg);
746     CHECK_AVAIL(msg,m->siglen);
747     m->sig=buf_unprepend(msg,m->siglen);
748     CHECK_EMPTY(msg);
749
750     /* In `process_msg3_msg4' below, we assume that we can write a nul
751      * terminator following the signature.  Make sure there's enough space.
752      */
753     if (msg->start >= msg->base + msg->alloclen)
754         return False;
755
756     return True;
757 }
758
759 static bool_t name_matches(const struct parsedname *nm, const char *expected)
760 {
761     int expected_len=strlen(expected);
762     return
763         nm->len == expected_len &&
764         !memcmp(nm->name, expected, expected_len);
765 }    
766
767 static bool_t check_msg(struct site *st, uint32_t type, struct msg *m,
768                         cstring_t *error)
769 {
770     if (type==LABEL_MSG1) return True;
771
772     /* Check that the site names and our nonce have been sent
773        back correctly, and then store our peer's nonce. */ 
774     if (!name_matches(&m->remote,st->remotename)) {
775         *error="wrong remote site name";
776         return False;
777     }
778     if (!name_matches(&m->local,st->localname)) {
779         *error="wrong local site name";
780         return False;
781     }
782     if (memcmp(m->nL,st->localN,NONCELEN)!=0) {
783         *error="wrong locally-generated nonce";
784         return False;
785     }
786     if (type==LABEL_MSG2) return True;
787     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN)) {
788         *error="wrong remotely-generated nonce";
789         return False;
790     }
791     /* MSG3 has complicated rules about capabilities, which are
792      * handled in process_msg3. */
793     if (MSGMAJOR(type) == 3) return True;
794     if (m->remote_capabilities!=st->remote_capabilities) {
795         *error="remote capabilities changed";
796         return False;
797     }
798     if (type==LABEL_MSG4) return True;
799     *error="unknown message type";
800     return False;
801 }
802
803 static bool_t generate_msg1(struct site *st)
804 {
805     st->random->generate(st->random->st,NONCELEN,st->localN);
806     return generate_msg(st,LABEL_MSG1,"site:MSG1");
807 }
808
809 static bool_t process_msg1(struct site *st, struct buffer_if *msg1,
810                            const struct comm_addr *src, struct msg *m)
811 {
812     /* We've already determined we're in an appropriate state to
813        process an incoming MSG1, and that the MSG1 has correct values
814        of A and B. */
815
816     st->setup_session_id=m->source;
817     st->remote_capabilities=m->remote_capabilities;
818     memcpy(st->remoteN,m->nR,NONCELEN);
819     return True;
820 }
821
822 static bool_t generate_msg2(struct site *st)
823 {
824     st->random->generate(st->random->st,NONCELEN,st->localN);
825     return generate_msg(st,LABEL_MSG2,"site:MSG2");
826 }
827
828 static bool_t process_msg2(struct site *st, struct buffer_if *msg2,
829                            const struct comm_addr *src)
830 {
831     struct msg m;
832     cstring_t err;
833
834     if (!unpick_msg(st,LABEL_MSG2,msg2,&m)) return False;
835     if (!check_msg(st,LABEL_MSG2,&m,&err)) {
836         slog(st,LOG_SEC,"msg2: %s",err);
837         return False;
838     }
839     st->setup_session_id=m.source;
840     st->remote_capabilities=m.remote_capabilities;
841
842     /* Select the transform to use */
843
844     uint32_t remote_crypto_caps = st->remote_capabilities & CAPAB_TRANSFORM_MASK;
845     if (!remote_crypto_caps)
846         /* old secnets only had this one transform */
847         remote_crypto_caps = 1UL << CAPAB_BIT_ANCIENTTRANSFORM;
848
849 #define CHOOSE_CRYPTO(kind, whats) do {                                 \
850     struct kind##_if *iface;                                            \
851     uint32_t bit, ours = 0;                                             \
852     int i;                                                              \
853     for (i= 0; i < st->n##kind##s; i++) {                               \
854         iface=st->kind##s[i];                                           \
855         bit = 1UL << iface->capab_bit;                                  \
856         if (bit & remote_crypto_caps) goto kind##_found;                \
857         ours |= bit;                                                    \
858     }                                                                   \
859     slog(st,LOG_ERROR,"no " whats " in common"                          \
860          " (us %#"PRIx32"; them: %#"PRIx32")",                          \
861          st->local_capabilities & ours, remote_crypto_caps);            \
862     return False;                                                       \
863 kind##_found:                                                           \
864     st->chosen_##kind = iface;                                          \
865 } while (0)
866
867     CHOOSE_CRYPTO(transform, "transforms");
868
869 #undef CHOOSE_CRYPTO
870
871     memcpy(st->remoteN,m.nR,NONCELEN);
872     return True;
873 }
874
875 static bool_t generate_msg3(struct site *st)
876 {
877     /* Now we have our nonce and their nonce. Think of a secret key,
878        and create message number 3. */
879     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
880     return generate_msg(st,
881                         (st->remote_capabilities & CAPAB_TRANSFORM_MASK)
882                         ? LABEL_MSG3BIS
883                         : LABEL_MSG3,
884                         "site:MSG3");
885 }
886
887 static bool_t process_msg3_msg4(struct site *st, struct msg *m)
888 {
889     uint8_t *hash;
890     void *hst;
891
892     /* Check signature and store g^x mod m */
893     hash=safe_malloc(st->hash->len, "process_msg3_msg4");
894     hst=st->hash->init();
895     st->hash->update(hst,m->hashstart,m->hashlen);
896     st->hash->final(hst,hash);
897     /* Terminate signature with a '0' - already checked that this will fit */
898     m->sig[m->siglen]=0;
899     if (!st->pubkey->check(st->pubkey->st,hash,st->hash->len,m->sig)) {
900         slog(st,LOG_SEC,"msg3/msg4 signature failed check!");
901         free(hash);
902         return False;
903     }
904     free(hash);
905
906     st->remote_adv_mtu=m->remote_mtu;
907
908     return True;
909 }
910
911 static bool_t process_msg3(struct site *st, struct buffer_if *msg3,
912                            const struct comm_addr *src, uint32_t msgtype)
913 {
914     struct msg m;
915     cstring_t err;
916
917     switch (msgtype) {
918         case CASES_MSG3_KNOWN: break;
919         default: assert(0);
920     }
921
922     if (!unpick_msg(st,msgtype,msg3,&m)) return False;
923     if (!check_msg(st,msgtype,&m,&err)) {
924         slog(st,LOG_SEC,"msg3: %s",err);
925         return False;
926     }
927     uint32_t capab_adv_late = m.remote_capabilities
928         & ~st->remote_capabilities & st->early_capabilities;
929     if (capab_adv_late) {
930         slog(st,LOG_SEC,"msg3 impermissibly adds early capability flag(s)"
931              " %#"PRIx32" (was %#"PRIx32", now %#"PRIx32")",
932              capab_adv_late, st->remote_capabilities, m.remote_capabilities);
933         return False;
934     }
935
936 #define CHOSE_CRYPTO(kind, what) do {                                   \
937     struct kind##_if *iface;                                            \
938     int i;                                                              \
939     for (i=0; i<st->n##kind##s; i++) {                                  \
940         iface=st->kind##s[i];                                           \
941         if (iface->capab_bit == m.capab_##kind##num)                    \
942             goto kind##_found;                                          \
943     }                                                                   \
944     slog(st,LOG_SEC,"peer chose unknown-to-us " what " %d!",            \
945          m.capab_##kind##num);                                                  \
946     return False;                                                       \
947 kind##_found:                                                           \
948     st->chosen_##kind=iface;                                            \
949 } while (0)
950
951     CHOSE_CRYPTO(transform, "transform");
952
953 #undef CHOSE_CRYPTO
954
955     if (!process_msg3_msg4(st,&m))
956         return False;
957
958     /* Update our idea of the remote site's capabilities, now that we've
959      * verified that its message was authentic.
960      *
961      * Our previous idea of the remote site's capabilities came from the
962      * unauthenticated MSG1.  We've already checked that this new message
963      * doesn't change any of the bits we relied upon in the past, but it may
964      * also have set additional capability bits.  We simply throw those away
965      * now, and use the authentic capabilities from this MSG3. */
966     st->remote_capabilities=m.remote_capabilities;
967
968     /* Terminate their DH public key with a '0' */
969     m.pk[m.pklen]=0;
970     /* Invent our DH secret key */
971     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
972
973     /* Generate the shared key and set up the transform */
974     if (!set_new_transform(st,m.pk)) return False;
975
976     return True;
977 }
978
979 static bool_t generate_msg4(struct site *st)
980 {
981     /* We have both nonces, their public key and our private key. Generate
982        our public key, sign it and send it to them. */
983     return generate_msg(st,LABEL_MSG4,"site:MSG4");
984 }
985
986 static bool_t process_msg4(struct site *st, struct buffer_if *msg4,
987                            const struct comm_addr *src)
988 {
989     struct msg m;
990     cstring_t err;
991
992     if (!unpick_msg(st,LABEL_MSG4,msg4,&m)) return False;
993     if (!check_msg(st,LABEL_MSG4,&m,&err)) {
994         slog(st,LOG_SEC,"msg4: %s",err);
995         return False;
996     }
997     
998     if (!process_msg3_msg4(st,&m))
999         return False;
1000
1001     /* Terminate their DH public key with a '0' */
1002     m.pk[m.pklen]=0;
1003
1004     /* Generate the shared key and set up the transform */
1005     if (!set_new_transform(st,m.pk)) return False;
1006
1007     return True;
1008 }
1009
1010 struct msg0 {
1011     uint32_t dest;
1012     uint32_t source;
1013     uint32_t type;
1014 };
1015
1016 static bool_t unpick_msg0(struct site *st, struct buffer_if *msg0,
1017                           struct msg0 *m)
1018 {
1019     CHECK_AVAIL(msg0,4);
1020     m->dest=buf_unprepend_uint32(msg0);
1021     CHECK_AVAIL(msg0,4);
1022     m->source=buf_unprepend_uint32(msg0);
1023     CHECK_AVAIL(msg0,4);
1024     m->type=buf_unprepend_uint32(msg0);
1025     return True;
1026     /* Leaves transformed part of buffer untouched */
1027 }
1028
1029 static bool_t generate_msg5(struct site *st)
1030 {
1031     cstring_t transform_err;
1032
1033     BUF_ALLOC(&st->buffer,"site:MSG5");
1034     /* We are going to add four words to the message */
1035     buffer_init(&st->buffer,calculate_max_start_pad());
1036     /* Give the netlink code an opportunity to put its own stuff in the
1037        message (configuration information, etc.) */
1038     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
1039     if (call_transform_forwards(st,st->new_transform,
1040                                 &st->buffer,&transform_err))
1041         return False;
1042     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
1043     buf_prepend_uint32(&st->buffer,st->index);
1044     buf_prepend_uint32(&st->buffer,st->setup_session_id);
1045
1046     st->retries=st->setup_retries;
1047     return True;
1048 }
1049
1050 static bool_t process_msg5(struct site *st, struct buffer_if *msg5,
1051                            const struct comm_addr *src,
1052                            struct transform_inst_if *transform)
1053 {
1054     struct msg0 m;
1055     cstring_t transform_err;
1056
1057     if (!unpick_msg0(st,msg5,&m)) return False;
1058
1059     if (call_transform_reverse(st,transform,msg5,&transform_err)) {
1060         /* There's a problem */
1061         slog(st,LOG_SEC,"process_msg5: transform: %s",transform_err);
1062         return False;
1063     }
1064     /* Buffer should now contain untransformed PING packet data */
1065     CHECK_AVAIL(msg5,4);
1066     if (buf_unprepend_uint32(msg5)!=LABEL_MSG5) {
1067         slog(st,LOG_SEC,"MSG5/PING packet contained wrong label");
1068         return False;
1069     }
1070     /* Older versions of secnet used to write some config data here
1071      * which we ignore.  So we don't CHECK_EMPTY */
1072     return True;
1073 }
1074
1075 static void create_msg6(struct site *st, struct transform_inst_if *transform,
1076                         uint32_t session_id)
1077 {
1078     cstring_t transform_err;
1079
1080     BUF_ALLOC(&st->buffer,"site:MSG6");
1081     /* We are going to add four words to the message */
1082     buffer_init(&st->buffer,calculate_max_start_pad());
1083     /* Give the netlink code an opportunity to put its own stuff in the
1084        message (configuration information, etc.) */
1085     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
1086     transform_apply_return problem =
1087         call_transform_forwards(st,transform,
1088                                 &st->buffer,&transform_err);
1089     assert(!problem);
1090     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
1091     buf_prepend_uint32(&st->buffer,st->index);
1092     buf_prepend_uint32(&st->buffer,session_id);
1093 }
1094
1095 static bool_t generate_msg6(struct site *st)
1096 {
1097     if (!is_transform_valid(st->new_transform))
1098         return False;
1099     create_msg6(st,st->new_transform,st->setup_session_id);
1100     st->retries=1; /* Peer will retransmit MSG5 if this packet gets lost */
1101     return True;
1102 }
1103
1104 static bool_t process_msg6(struct site *st, struct buffer_if *msg6,
1105                            const struct comm_addr *src)
1106 {
1107     struct msg0 m;
1108     cstring_t transform_err;
1109
1110     if (!unpick_msg0(st,msg6,&m)) return False;
1111
1112     if (call_transform_reverse(st,st->new_transform,msg6,&transform_err)) {
1113         /* There's a problem */
1114         slog(st,LOG_SEC,"process_msg6: transform: %s",transform_err);
1115         return False;
1116     }
1117     /* Buffer should now contain untransformed PING packet data */
1118     CHECK_AVAIL(msg6,4);
1119     if (buf_unprepend_uint32(msg6)!=LABEL_MSG6) {
1120         slog(st,LOG_SEC,"MSG6/PONG packet contained invalid data");
1121         return False;
1122     }
1123     /* Older versions of secnet used to write some config data here
1124      * which we ignore.  So we don't CHECK_EMPTY */
1125     return True;
1126 }
1127
1128 static transform_apply_return
1129 decrypt_msg0(struct site *st, struct buffer_if *msg0,
1130                            const struct comm_addr *src)
1131 {
1132     cstring_t transform_err, auxkey_err, newkey_err="n/a";
1133     struct msg0 m;
1134     transform_apply_return problem;
1135
1136     if (!unpick_msg0(st,msg0,&m)) return False;
1137
1138     /* Keep a copy so we can try decrypting it with multiple keys */
1139     buffer_copy(&st->scratch, msg0);
1140
1141     problem = call_transform_reverse(st,st->current.transform,
1142                                      msg0,&transform_err);
1143     if (!problem) {
1144         if (!st->auxiliary_is_new)
1145             delete_one_key(st,&st->auxiliary_key,
1146                            "peer has used new key","auxiliary key",LOG_SEC);
1147         return 0;
1148     }
1149     if (transform_apply_return_badseq(problem))
1150         goto badseq;
1151
1152     buffer_copy(msg0, &st->scratch);
1153     problem = call_transform_reverse(st,st->auxiliary_key.transform,
1154                                      msg0,&auxkey_err);
1155     if (!problem) {
1156         slog(st,LOG_DROP,"processing packet which uses auxiliary key");
1157         if (st->auxiliary_is_new) {
1158             /* We previously timed out in state SENTMSG5 but it turns
1159              * out that our peer did in fact get our MSG5 and is
1160              * using the new key.  So we should switch to it too. */
1161             /* This is a bit like activate_new_key. */
1162             struct data_key t;
1163             t=st->current;
1164             st->current=st->auxiliary_key;
1165             st->auxiliary_key=t;
1166
1167             delete_one_key(st,&st->auxiliary_key,"peer has used new key",
1168                            "previous key",LOG_SEC);
1169             st->auxiliary_is_new=0;
1170             st->renegotiate_key_time=st->auxiliary_renegotiate_key_time;
1171         }
1172         return 0;
1173     }
1174     if (transform_apply_return_badseq(problem))
1175         goto badseq;
1176
1177     if (st->state==SITE_SENTMSG5) {
1178         buffer_copy(msg0, &st->scratch);
1179         problem = call_transform_reverse(st,st->new_transform,
1180                                          msg0,&newkey_err);
1181         if (!problem) {
1182             /* It looks like we didn't get the peer's MSG6 */
1183             /* This is like a cut-down enter_new_state(SITE_RUN) */
1184             slog(st,LOG_STATE,"will enter state RUN (MSG0 with new key)");
1185             BUF_FREE(&st->buffer);
1186             st->timeout=0;
1187             activate_new_key(st);
1188             return 0; /* do process the data in this packet */
1189         }
1190         if (transform_apply_return_badseq(problem))
1191             goto badseq;
1192     }
1193
1194     slog(st,LOG_SEC,"transform: %s (aux: %s, new: %s)",
1195          transform_err,auxkey_err,newkey_err);
1196     initiate_key_setup(st,"incoming message would not decrypt",0);
1197     send_nak(src,m.dest,m.source,m.type,msg0,"message would not decrypt");
1198     assert(problem);
1199     return problem;
1200
1201  badseq:
1202     slog(st,LOG_DROP,"transform: %s (bad seq.)",transform_err);
1203     assert(problem);
1204     return problem;
1205 }
1206
1207 static bool_t process_msg0(struct site *st, struct buffer_if *msg0,
1208                            const struct comm_addr *src)
1209 {
1210     uint32_t type;
1211     transform_apply_return problem;
1212
1213     problem = decrypt_msg0(st,msg0,src);
1214     if (problem==transform_apply_seqdupe) {
1215         /* We recently received another copy of this packet, maybe due
1216          * to polypath.  That's not a problem; indeed, for the
1217          * purposes of transport address management it is a success.
1218          * But we don't want to process the packet. */
1219         transport_data_msgok(st,src);
1220         return False;
1221     }
1222     if (problem)
1223         return False;
1224
1225     CHECK_AVAIL(msg0,4);
1226     type=buf_unprepend_uint32(msg0);
1227     switch(type) {
1228     case LABEL_MSG7:
1229         /* We must forget about the current session. */
1230         delete_keys(st,"request from peer",LOG_SEC);
1231         /* probably, the peer is shutting down, and this is going to fail,
1232          * but we need to be trying to bring the link up again */
1233         if (st->keepalive)
1234             initiate_key_setup(st,"peer requested key teardown",0);
1235         return True;
1236     case LABEL_MSG9:
1237         /* Deliver to netlink layer */
1238         st->netlink->deliver(st->netlink->st,msg0);
1239         transport_data_msgok(st,src);
1240         /* See whether we should start negotiating a new key */
1241         if (st->now > st->renegotiate_key_time)
1242             initiate_key_setup(st,"incoming packet in renegotiation window",0);
1243         return True;
1244     default:
1245         slog(st,LOG_SEC,"incoming encrypted message of type %08x "
1246              "(unknown)",type);
1247         break;
1248     }
1249     return False;
1250 }
1251
1252 static void dump_packet(struct site *st, struct buffer_if *buf,
1253                         const struct comm_addr *addr, bool_t incoming,
1254                         bool_t ok)
1255 {
1256     uint32_t dest=get_uint32(buf->start);
1257     uint32_t source=get_uint32(buf->start+4);
1258     uint32_t msgtype=get_uint32(buf->start+8);
1259
1260     if (st->log_events & LOG_DUMP)
1261         slilog(st->log,M_DEBUG,"%s: %s: %08x<-%08x: %08x: %s%s",
1262                st->tunname,incoming?"incoming":"outgoing",
1263                dest,source,msgtype,comm_addr_to_string(addr),
1264                ok?"":" - fail");
1265 }
1266
1267 static bool_t comm_addr_sendmsg(struct site *st,
1268                                 const struct comm_addr *dest,
1269                                 struct buffer_if *buf)
1270 {
1271     int i;
1272     struct comm_clientinfo *commclientinfo = 0;
1273
1274     for (i=0; i < st->ncomms; i++) {
1275         if (st->comms[i] == dest->comm) {
1276             commclientinfo = st->commclientinfos[i];
1277             break;
1278         }
1279     }
1280     return dest->comm->sendmsg(dest->comm->st, buf, dest, commclientinfo);
1281 }
1282
1283 static uint32_t site_status(void *st)
1284 {
1285     return 0;
1286 }
1287
1288 static bool_t send_msg(struct site *st)
1289 {
1290     if (st->retries>0) {
1291         transport_xmit(st, &st->setup_peers, &st->buffer, True);
1292         st->timeout=st->now+st->setup_retry_interval;
1293         st->retries--;
1294         return True;
1295     } else if (st->state==SITE_SENTMSG5) {
1296         logtimeout(st,"timed out sending MSG5, stashing new key");
1297         /* We stash the key we have produced, in case it turns out that
1298          * our peer did see our MSG5 after all and starts using it. */
1299         /* This is a bit like some of activate_new_key */
1300         struct transform_inst_if *t;
1301         t=st->auxiliary_key.transform;
1302         st->auxiliary_key.transform=st->new_transform;
1303         st->new_transform=t;
1304         dispose_transform(&st->new_transform);
1305
1306         st->auxiliary_is_new=1;
1307         st->auxiliary_key.key_timeout=st->now+st->key_lifetime;
1308         st->auxiliary_renegotiate_key_time=st->now+st->key_renegotiate_time;
1309         st->auxiliary_key.remote_session_id=st->setup_session_id;
1310
1311         enter_state_wait(st);
1312         return False;
1313     } else {
1314         logtimeout(st,"timed out sending key setup packet "
1315             "(in state %s)",state_name(st->state));
1316         enter_state_wait(st);
1317         return False;
1318     }
1319 }
1320
1321 static void site_resolve_callback(void *sst, const struct comm_addr *addrs,
1322                                   int stored_naddrs, int all_naddrs,
1323                                   const char *address, const char *failwhy)
1324 {
1325     struct site *st=sst;
1326
1327     if (!stored_naddrs) {
1328         slog(st,LOG_ERROR,"resolution of %s failed: %s",address,failwhy);
1329     } else {
1330         slog(st,LOG_PEER_ADDRS,"resolution of %s completed, %d addrs, eg: %s",
1331              address, all_naddrs, comm_addr_to_string(&addrs[0]));;
1332
1333         int space=st->transport_peers_max-st->resolving_n_results_stored;
1334         int n_tocopy=MIN(stored_naddrs,space);
1335         COPY_ARRAY(st->resolving_results + st->resolving_n_results_stored,
1336                    addrs,
1337                    n_tocopy);
1338         st->resolving_n_results_stored += n_tocopy;
1339         st->resolving_n_results_all += all_naddrs;
1340     }
1341
1342     decrement_resolving_count(st,1);
1343 }
1344
1345 static void decrement_resolving_count(struct site *st, int by)
1346 {
1347     assert(st->resolving_count>0);
1348     st->resolving_count-=by;
1349
1350     if (st->resolving_count)
1351         return;
1352
1353     /* OK, we are done with them all.  Handle combined results. */
1354
1355     const struct comm_addr *addrs=st->resolving_results;
1356     int naddrs=st->resolving_n_results_stored;
1357     assert(naddrs<=st->transport_peers_max);
1358
1359     if (naddrs) {
1360         if (naddrs != st->resolving_n_results_all) {
1361             slog(st,LOG_SETUP_INIT,"resolution of supplied addresses/names"
1362                  " yielded too many results (%d > %d), some ignored",
1363                  st->resolving_n_results_all, naddrs);
1364         }
1365         slog(st,LOG_STATE,"resolution completed, %d addrs, eg: %s",
1366              naddrs, iaddr_to_string(&addrs[0].ia));;
1367     }
1368
1369     switch (st->state) {
1370     case SITE_RESOLVE:
1371         if (transport_compute_setupinit_peers(st,addrs,naddrs,0)) {
1372             enter_new_state(st,SITE_SENTMSG1);
1373         } else {
1374             /* Can't figure out who to try to to talk to */
1375             slog(st,LOG_SETUP_INIT,
1376                  "key exchange failed: cannot find peer address");
1377             enter_state_run(st);
1378         }
1379         break;
1380     case SITE_SENTMSG1: case SITE_SENTMSG2:
1381     case SITE_SENTMSG3: case SITE_SENTMSG4:
1382     case SITE_SENTMSG5:
1383         if (naddrs) {
1384             /* We start using the address immediately for data too.
1385              * It's best to store it in st->peers now because we might
1386              * go via SENTMSG5, WAIT, and a MSG0, straight into using
1387              * the new key (without updating the data peer addrs). */
1388             transport_resolve_complete(st,addrs,naddrs);
1389         } else if (st->local_mobile) {
1390             /* We can't let this rest because we may have a peer
1391              * address which will break in the future. */
1392             slog(st,LOG_SETUP_INIT,"resolution failed: "
1393                  "abandoning key exchange");
1394             enter_state_wait(st);
1395         } else {
1396             slog(st,LOG_SETUP_INIT,"resolution failed: "
1397                  " continuing to use source address of peer's packets"
1398                  " for key exchange and ultimately data");
1399         }
1400         break;
1401     case SITE_RUN:
1402         if (naddrs) {
1403             slog(st,LOG_SETUP_INIT,"resolution completed tardily,"
1404                  " updating peer address(es)");
1405             transport_resolve_complete_tardy(st,addrs,naddrs);
1406         } else if (st->local_mobile) {
1407             /* Not very good.  We should queue (another) renegotiation
1408              * so that we can update the peer address. */
1409             st->key_renegotiate_time=st->now+wait_timeout(st);
1410         } else {
1411             slog(st,LOG_SETUP_INIT,"resolution failed: "
1412                  " continuing to use source address of peer's packets");
1413         }
1414         break;
1415     case SITE_WAIT:
1416     case SITE_STOP:
1417         /* oh well */
1418         break;
1419     }
1420 }
1421
1422 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
1423                                  const struct comm_addr *prod_hint)
1424 {
1425     /* Reentrancy hazard: can call enter_new_state/enter_state_* */
1426     if (st->state!=SITE_RUN) return False;
1427     slog(st,LOG_SETUP_INIT,"initiating key exchange (%s)",reason);
1428     if (st->addresses) {
1429         slog(st,LOG_SETUP_INIT,"resolving peer address(es)");
1430         return enter_state_resolve(st);
1431     } else if (transport_compute_setupinit_peers(st,0,0,prod_hint)) {
1432         return enter_new_state(st,SITE_SENTMSG1);
1433     }
1434     slog(st,LOG_SETUP_INIT,"key exchange failed: no address for peer");
1435     return False;
1436 }
1437
1438 static void activate_new_key(struct site *st)
1439 {
1440     struct transform_inst_if *t;
1441
1442     /* We have three transform instances, which we swap between old,
1443        active and setup */
1444     t=st->auxiliary_key.transform;
1445     st->auxiliary_key.transform=st->current.transform;
1446     st->current.transform=st->new_transform;
1447     st->new_transform=t;
1448     dispose_transform(&st->new_transform);
1449
1450     st->timeout=0;
1451     st->auxiliary_is_new=0;
1452     st->auxiliary_key.key_timeout=st->current.key_timeout;
1453     st->current.key_timeout=st->now+st->key_lifetime;
1454     st->renegotiate_key_time=st->now+st->key_renegotiate_time;
1455     transport_peers_copy(st,&st->peers,&st->setup_peers);
1456     st->current.remote_session_id=st->setup_session_id;
1457
1458     /* Compute the inter-site MTU.  This is min( our_mtu, their_mtu ).
1459      * But their mtu be unspecified, in which case we just use ours. */
1460     uint32_t intersite_mtu=
1461         MIN(st->mtu_target, st->remote_adv_mtu ?: ~(uint32_t)0);
1462     st->netlink->set_mtu(st->netlink->st,intersite_mtu);
1463
1464     slog(st,LOG_ACTIVATE_KEY,"new key activated"
1465          " (mtu ours=%"PRId32" theirs=%"PRId32" intersite=%"PRId32")",
1466          st->mtu_target, st->remote_adv_mtu, intersite_mtu);
1467     enter_state_run(st);
1468 }
1469
1470 static void delete_one_key(struct site *st, struct data_key *key,
1471                            cstring_t reason, cstring_t which, uint32_t loglevel)
1472 {
1473     if (!is_transform_valid(key->transform)) return;
1474     if (reason) slog(st,loglevel,"%s deleted (%s)",which,reason);
1475     dispose_transform(&key->transform);
1476     key->key_timeout=0;
1477 }
1478
1479 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel)
1480 {
1481     if (current_valid(st)) {
1482         slog(st,loglevel,"session closed (%s)",reason);
1483
1484         delete_one_key(st,&st->current,0,0,0);
1485         set_link_quality(st);
1486     }
1487     delete_one_key(st,&st->auxiliary_key,0,0,0);
1488 }
1489
1490 static void state_assert(struct site *st, bool_t ok)
1491 {
1492     if (!ok) fatal("site:state_assert");
1493 }
1494
1495 static void enter_state_stop(struct site *st)
1496 {
1497     st->state=SITE_STOP;
1498     st->timeout=0;
1499     delete_keys(st,"entering state STOP",LOG_TIMEOUT_KEY);
1500     dispose_transform(&st->new_transform);
1501 }
1502
1503 static void set_link_quality(struct site *st)
1504 {
1505     uint32_t quality;
1506     if (current_valid(st))
1507         quality=LINK_QUALITY_UP;
1508     else if (st->state==SITE_WAIT || st->state==SITE_STOP)
1509         quality=LINK_QUALITY_DOWN;
1510     else if (st->addresses)
1511         quality=LINK_QUALITY_DOWN_CURRENT_ADDRESS;
1512     else if (transport_peers_valid(&st->peers))
1513         quality=LINK_QUALITY_DOWN_STALE_ADDRESS;
1514     else
1515         quality=LINK_QUALITY_DOWN;
1516
1517     st->netlink->set_quality(st->netlink->st,quality);
1518 }
1519
1520 static void enter_state_run(struct site *st)
1521 {
1522     slog(st,LOG_STATE,"entering state RUN%s",
1523          current_valid(st) ? " (keyed)" : " (unkeyed)");
1524     st->state=SITE_RUN;
1525     st->timeout=0;
1526
1527     st->setup_session_id=0;
1528     transport_peers_clear(st,&st->setup_peers);
1529     FILLZERO(st->localN);
1530     FILLZERO(st->remoteN);
1531     dispose_transform(&st->new_transform);
1532     memset(st->dhsecret,0,st->dh->len);
1533     if (st->sharedsecret) memset(st->sharedsecret,0,st->sharedsecretlen);
1534     set_link_quality(st);
1535
1536     if (st->keepalive && !current_valid(st))
1537         initiate_key_setup(st, "keepalive", 0);
1538 }
1539
1540 static bool_t ensure_resolving(struct site *st)
1541 {
1542     /* Reentrancy hazard: may call site_resolve_callback and hence
1543      * enter_new_state, enter_state_* and generate_msg*. */
1544     if (st->resolving_count)
1545         return True;
1546
1547     assert(st->addresses);
1548
1549     /* resolver->request might reentrantly call site_resolve_callback
1550      * which will decrement st->resolving, so we need to increment it
1551      * twice beforehand to prevent decrement from thinking we're
1552      * finished, and decrement it ourselves.  Alternatively if
1553      * everything fails then there are no callbacks due and we simply
1554      * set it to 0 and return false.. */
1555     st->resolving_n_results_stored=0;
1556     st->resolving_n_results_all=0;
1557     st->resolving_count+=2;
1558     const char **addrp=st->addresses;
1559     const char *address;
1560     bool_t anyok=False;
1561     for (; (address=*addrp++); ) {
1562         bool_t ok = st->resolver->request(st->resolver->st,address,
1563                                           st->remoteport,st->comms[0],
1564                                           site_resolve_callback,st);
1565         if (ok)
1566             st->resolving_count++;
1567         anyok|=ok;
1568     }
1569     if (!anyok) {
1570         st->resolving_count=0;
1571         return False;
1572     }
1573     decrement_resolving_count(st,2);
1574     return True;
1575 }
1576
1577 static bool_t enter_state_resolve(struct site *st)
1578 {
1579     /* Reentrancy hazard!  See ensure_resolving. */
1580     state_assert(st,st->state==SITE_RUN);
1581     slog(st,LOG_STATE,"entering state RESOLVE");
1582     st->state=SITE_RESOLVE;
1583     return ensure_resolving(st);
1584 }
1585
1586 static bool_t enter_new_state(struct site *st, uint32_t next)
1587 {
1588     bool_t (*gen)(struct site *st);
1589     int r;
1590
1591     slog(st,LOG_STATE,"entering state %s",state_name(next));
1592     switch(next) {
1593     case SITE_SENTMSG1:
1594         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE);
1595         gen=generate_msg1;
1596         st->msg1_crossed_logged = False;
1597         break;
1598     case SITE_SENTMSG2:
1599         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1600                      st->state==SITE_SENTMSG1 || st->state==SITE_WAIT);
1601         gen=generate_msg2;
1602         break;
1603     case SITE_SENTMSG3:
1604         state_assert(st,st->state==SITE_SENTMSG1);
1605         BUF_FREE(&st->buffer);
1606         gen=generate_msg3;
1607         break;
1608     case SITE_SENTMSG4:
1609         state_assert(st,st->state==SITE_SENTMSG2);
1610         BUF_FREE(&st->buffer);
1611         gen=generate_msg4;
1612         break;
1613     case SITE_SENTMSG5:
1614         state_assert(st,st->state==SITE_SENTMSG3);
1615         BUF_FREE(&st->buffer);
1616         gen=generate_msg5;
1617         break;
1618     case SITE_RUN:
1619         state_assert(st,st->state==SITE_SENTMSG4);
1620         BUF_FREE(&st->buffer);
1621         gen=generate_msg6;
1622         break;
1623     default:
1624         gen=NULL;
1625         fatal("enter_new_state(%s): invalid new state",state_name(next));
1626         break;
1627     }
1628
1629     if (hacky_par_start_failnow()) return False;
1630
1631     r= gen(st) && send_msg(st);
1632
1633     hacky_par_end(&r,
1634                   st->setup_retries, st->setup_retry_interval,
1635                   send_msg, st);
1636     
1637     if (r) {
1638         st->state=next;
1639         if (next==SITE_RUN) {
1640             BUF_FREE(&st->buffer); /* Never reused */
1641             st->timeout=0; /* Never retransmit */
1642             activate_new_key(st);
1643         }
1644         return True;
1645     }
1646     slog(st,LOG_ERROR,"error entering state %s",state_name(next));
1647     st->buffer.free=False; /* Unconditionally use the buffer; it may be
1648                               in either state, and enter_state_wait() will
1649                               do a BUF_FREE() */
1650     enter_state_wait(st);
1651     return False;
1652 }
1653
1654 /* msg7 tells our peer that we're about to forget our key */
1655 static bool_t send_msg7(struct site *st, cstring_t reason)
1656 {
1657     cstring_t transform_err;
1658
1659     if (current_valid(st) && st->buffer.free
1660         && transport_peers_valid(&st->peers)) {
1661         BUF_ALLOC(&st->buffer,"site:MSG7");
1662         buffer_init(&st->buffer,calculate_max_start_pad());
1663         buf_append_uint32(&st->buffer,LABEL_MSG7);
1664         buf_append_string(&st->buffer,reason);
1665         if (call_transform_forwards(st, st->current.transform,
1666                                     &st->buffer, &transform_err))
1667             goto free_out;
1668         buf_prepend_uint32(&st->buffer,LABEL_MSG0);
1669         buf_prepend_uint32(&st->buffer,st->index);
1670         buf_prepend_uint32(&st->buffer,st->current.remote_session_id);
1671         transport_xmit(st,&st->peers,&st->buffer,True);
1672         BUF_FREE(&st->buffer);
1673     free_out:
1674         return True;
1675     }
1676     return False;
1677 }
1678
1679 /* We go into this state if our peer becomes uncommunicative. Similar to
1680    the "stop" state, we forget all session keys for a while, before
1681    re-entering the "run" state. */
1682 static void enter_state_wait(struct site *st)
1683 {
1684     slog(st,LOG_STATE,"entering state WAIT");
1685     st->timeout=st->now+wait_timeout(st);
1686     st->state=SITE_WAIT;
1687     set_link_quality(st);
1688     BUF_FREE(&st->buffer); /* will have had an outgoing packet in it */
1689     /* XXX Erase keys etc. */
1690 }
1691
1692 static void generate_prod(struct site *st, struct buffer_if *buf)
1693 {
1694     buffer_init(buf,0);
1695     buf_append_uint32(buf,0);
1696     buf_append_uint32(buf,0);
1697     buf_append_uint32(buf,LABEL_PROD);
1698     buf_append_string(buf,st->localname);
1699     buf_append_string(buf,st->remotename);
1700 }
1701
1702 static void generate_send_prod(struct site *st,
1703                                const struct comm_addr *source)
1704 {
1705     if (!st->allow_send_prod) return; /* too soon */
1706     if (!(st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1707           st->state==SITE_WAIT)) return; /* we'd ignore peer's MSG1 */
1708
1709     slog(st,LOG_SETUP_INIT,"prodding peer for key exchange");
1710     st->allow_send_prod=0;
1711     generate_prod(st,&st->scratch);
1712     bool_t ok = comm_addr_sendmsg(st, source, &st->scratch);
1713     dump_packet(st,&st->scratch,source,False,ok);
1714 }
1715
1716 static inline void site_settimeout(uint64_t timeout, int *timeout_io)
1717 {
1718     if (timeout) {
1719         int64_t offset=timeout-*now;
1720         if (offset<0) offset=0;
1721         if (offset>INT_MAX) offset=INT_MAX;
1722         if (*timeout_io<0 || offset<*timeout_io)
1723             *timeout_io=offset;
1724     }
1725 }
1726
1727 static int site_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
1728                            int *timeout_io)
1729 {
1730     struct site *st=sst;
1731
1732     BEFOREPOLL_WANT_FDS(0); /* We don't use any file descriptors */
1733     st->now=*now;
1734
1735     /* Work out when our next timeout is. The earlier of 'timeout' or
1736        'current.key_timeout'. A stored value of '0' indicates no timeout
1737        active. */
1738     site_settimeout(st->timeout, timeout_io);
1739     site_settimeout(st->current.key_timeout, timeout_io);
1740     site_settimeout(st->auxiliary_key.key_timeout, timeout_io);
1741
1742     return 0; /* success */
1743 }
1744
1745 static void check_expiry(struct site *st, struct data_key *key,
1746                          const char *which)
1747 {
1748     if (key->key_timeout && *now>key->key_timeout) {
1749         delete_one_key(st,key,"maximum life exceeded",which,LOG_TIMEOUT_KEY);
1750     }
1751 }
1752
1753 /* NB site_afterpoll will be called before site_beforepoll is ever called */
1754 static void site_afterpoll(void *sst, struct pollfd *fds, int nfds)
1755 {
1756     struct site *st=sst;
1757
1758     st->now=*now;
1759     if (st->timeout && *now>st->timeout) {
1760         st->timeout=0;
1761         if (st->state>=SITE_SENTMSG1 && st->state<=SITE_SENTMSG5) {
1762             if (!hacky_par_start_failnow())
1763                 send_msg(st);
1764         } else if (st->state==SITE_WAIT) {
1765             enter_state_run(st);
1766         } else {
1767             slog(st,LOG_ERROR,"site_afterpoll: unexpected timeout, state=%d",
1768                  st->state);
1769         }
1770     }
1771     check_expiry(st,&st->current,"current key");
1772     check_expiry(st,&st->auxiliary_key,"auxiliary key");
1773 }
1774
1775 /* This function is called by the netlink device to deliver packets
1776    intended for the remote network. The packet is in "raw" wire
1777    format, but is guaranteed to be word-aligned. */
1778 static void site_outgoing(void *sst, struct buffer_if *buf)
1779 {
1780     struct site *st=sst;
1781     cstring_t transform_err;
1782     
1783     if (st->state==SITE_STOP) {
1784         BUF_FREE(buf);
1785         return;
1786     }
1787
1788     st->allow_send_prod=1;
1789
1790     /* In all other states we consider delivering the packet if we have
1791        a valid key and a valid address to send it to. */
1792     if (current_valid(st) && transport_peers_valid(&st->peers)) {
1793         /* Transform it and send it */
1794         if (buf->size>0) {
1795             buf_prepend_uint32(buf,LABEL_MSG9);
1796             if (call_transform_forwards(st, st->current.transform,
1797                                         buf, &transform_err))
1798                 goto free_out;
1799             buf_prepend_uint32(buf,LABEL_MSG0);
1800             buf_prepend_uint32(buf,st->index);
1801             buf_prepend_uint32(buf,st->current.remote_session_id);
1802             transport_xmit(st,&st->peers,buf,False);
1803         }
1804     free_out:
1805         BUF_FREE(buf);
1806         return;
1807     }
1808
1809     slog(st,LOG_DROP,"discarding outgoing packet of size %d",buf->size);
1810     BUF_FREE(buf);
1811     initiate_key_setup(st,"outgoing packet",0);
1812 }
1813
1814 static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in,
1815                            uint32_t type, struct msg *m)
1816     /* For packets which are identified by the local and remote names.
1817      * If it has our name and our peer's name in it it's for us. */
1818 {
1819     struct buffer_if buf[1];
1820     buffer_readonly_clone(buf,buf_in);
1821     return unpick_msg(st,type,buf,m)
1822         && name_matches(&m->remote,st->remotename)
1823         && name_matches(&m->local,st->localname);
1824 }
1825
1826 static bool_t we_have_priority(struct site *st, const struct msg *m) {
1827     if (st->local_capabilities & m->remote_capabilities &
1828         CAPAB_PRIORITY_MOBILE) {
1829         if (st->local_mobile) return True;
1830         if (st-> peer_mobile) return False;
1831     }
1832     return st->our_name_later;
1833 }
1834
1835 static bool_t setup_late_msg_ok(struct site *st, 
1836                                 const struct buffer_if *buf_in,
1837                                 uint32_t msgtype,
1838                                 const struct comm_addr *source) {
1839     /* For setup packets which seem from their type like they are
1840      * late.  Maybe they came via a different path.  All we do is make
1841      * a note of the sending address, iff they look like they are part
1842      * of the current key setup attempt. */
1843     struct msg m;
1844     if (!named_for_us(st,buf_in,msgtype,&m))
1845         /* named_for_us calls unpick_msg which gets the nonces */
1846         return False;
1847     if (!consttime_memeq(m.nR,st->remoteN,NONCELEN) ||
1848         !consttime_memeq(m.nL,st->localN, NONCELEN))
1849         /* spoof ?  from stale run ?  who knows */
1850         return False;
1851     transport_setup_msgok(st,source);
1852     return True;
1853 }
1854
1855 /* This function is called by the communication device to deliver
1856    packets from our peers.
1857    It should return True if the packet is recognised as being for
1858    this current site instance (and should therefore not be processed
1859    by other sites), even if the packet was otherwise ignored. */
1860 static bool_t site_incoming(void *sst, struct buffer_if *buf,
1861                             const struct comm_addr *source)
1862 {
1863     struct site *st=sst;
1864
1865     if (buf->size < 12) return False;
1866
1867     uint32_t dest=get_uint32(buf->start);
1868     uint32_t msgtype=get_uint32(buf->start+8);
1869     struct msg named_msg;
1870
1871     if (msgtype==LABEL_MSG1) {
1872         if (!named_for_us(st,buf,msgtype,&named_msg))
1873             return False;
1874         /* It's a MSG1 addressed to us. Decide what to do about it. */
1875         dump_packet(st,buf,source,True,True);
1876         if (st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1877             st->state==SITE_WAIT) {
1878             /* We should definitely process it */
1879             transport_compute_setupinit_peers(st,0,0,source);
1880             if (process_msg1(st,buf,source,&named_msg)) {
1881                 slog(st,LOG_SETUP_INIT,"key setup initiated by peer");
1882                 bool_t entered=enter_new_state(st,SITE_SENTMSG2);
1883                 if (entered && st->addresses && st->local_mobile)
1884                     /* We must do this as the very last thing, because
1885                        the resolver callback might reenter us. */
1886                     ensure_resolving(st);
1887             } else {
1888                 slog(st,LOG_ERROR,"failed to process incoming msg1");
1889             }
1890             BUF_FREE(buf);
1891             return True;
1892         } else if (st->state==SITE_SENTMSG1) {
1893             /* We've just sent a message 1! They may have crossed on
1894                the wire. If we have priority then we ignore the
1895                incoming one, otherwise we process it as usual. */
1896             if (we_have_priority(st,&named_msg)) {
1897                 BUF_FREE(buf);
1898                 if (!st->msg1_crossed_logged++)
1899                     slog(st,LOG_SETUP_INIT,"crossed msg1s; we are higher "
1900                          "priority => ignore incoming msg1");
1901                 return True;
1902             } else {
1903                 slog(st,LOG_SETUP_INIT,"crossed msg1s; we are lower "
1904                      "priority => use incoming msg1");
1905                 if (process_msg1(st,buf,source,&named_msg)) {
1906                     BUF_FREE(&st->buffer); /* Free our old message 1 */
1907                     transport_setup_msgok(st,source);
1908                     enter_new_state(st,SITE_SENTMSG2);
1909                 } else {
1910                     slog(st,LOG_ERROR,"failed to process an incoming "
1911                          "crossed msg1 (we have low priority)");
1912                 }
1913                 BUF_FREE(buf);
1914                 return True;
1915             }
1916         } else if (st->state==SITE_SENTMSG2 ||
1917                    st->state==SITE_SENTMSG4) {
1918             if (consttime_memeq(named_msg.nR,st->remoteN,NONCELEN)) {
1919                 /* We are ahead in the protocol, but that msg1 had the
1920                  * peer's nonce so presumably it is from this key
1921                  * exchange run, via a slower route */
1922                 transport_setup_msgok(st,source);
1923             } else {
1924                 slog(st,LOG_UNEXPECTED,"competing incoming message 1");
1925             }
1926             BUF_FREE(buf);
1927             return True;
1928         }
1929         /* The message 1 was received at an unexpected stage of the
1930            key setup.  Well, they lost the race. */
1931         slog(st,LOG_UNEXPECTED,"unexpected incoming message 1");
1932         BUF_FREE(buf);
1933         return True;
1934     }
1935     if (msgtype==LABEL_PROD) {
1936         if (!named_for_us(st,buf,msgtype,&named_msg))
1937             return False;
1938         dump_packet(st,buf,source,True,True);
1939         if (st->state!=SITE_RUN) {
1940             slog(st,LOG_DROP,"ignoring PROD when not in state RUN");
1941         } else if (current_valid(st)) {
1942             slog(st,LOG_DROP,"ignoring PROD when we think we have a key");
1943         } else {
1944             initiate_key_setup(st,"peer sent PROD packet",source);
1945         }
1946         BUF_FREE(buf);
1947         return True;
1948     }
1949     if (dest==st->index) {
1950         /* Explicitly addressed to us */
1951         if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True,True);
1952         switch (msgtype) {
1953         case LABEL_NAK:
1954             /* If the source is our current peer then initiate a key setup,
1955                because our peer's forgotten the key */
1956             if (get_uint32(buf->start+4)==st->current.remote_session_id) {
1957                 bool_t initiated;
1958                 initiated = initiate_key_setup(st,"received a NAK",source);
1959                 if (!initiated) generate_send_prod(st,source);
1960             } else {
1961                 slog(st,LOG_SEC,"bad incoming NAK");
1962             }
1963             break;
1964         case LABEL_MSG0:
1965             process_msg0(st,buf,source);
1966             break;
1967         case LABEL_MSG1:
1968             /* Setup packet: should not have been explicitly addressed
1969                to us */
1970             slog(st,LOG_SEC,"incoming explicitly addressed msg1");
1971             break;
1972         case LABEL_MSG2:
1973             /* Setup packet: expected only in state SENTMSG1 */
1974             if (st->state!=SITE_SENTMSG1) {
1975                 if ((st->state==SITE_SENTMSG3 ||
1976                      st->state==SITE_SENTMSG5) &&
1977                     setup_late_msg_ok(st,buf,msgtype,source))
1978                     break;
1979                 slog(st,LOG_UNEXPECTED,"unexpected MSG2");
1980             } else if (process_msg2(st,buf,source)) {
1981                 transport_setup_msgok(st,source);
1982                 enter_new_state(st,SITE_SENTMSG3);
1983             } else {
1984                 slog(st,LOG_SEC,"invalid MSG2");
1985             }
1986             break;
1987         case CASES_MSG3_KNOWN:
1988             /* Setup packet: expected only in state SENTMSG2 */
1989             if (st->state!=SITE_SENTMSG2) {
1990                 if ((st->state==SITE_SENTMSG4) &&
1991                     setup_late_msg_ok(st,buf,msgtype,source))
1992                     break;
1993                 slog(st,LOG_UNEXPECTED,"unexpected MSG3");
1994             } else if (process_msg3(st,buf,source,msgtype)) {
1995                 transport_setup_msgok(st,source);
1996                 enter_new_state(st,SITE_SENTMSG4);
1997             } else {
1998                 slog(st,LOG_SEC,"invalid MSG3");
1999             }
2000             break;
2001         case LABEL_MSG4:
2002             /* Setup packet: expected only in state SENTMSG3 */
2003             if (st->state!=SITE_SENTMSG3) {
2004                 if ((st->state==SITE_SENTMSG5) &&
2005                     setup_late_msg_ok(st,buf,msgtype,source))
2006                     break;
2007                 slog(st,LOG_UNEXPECTED,"unexpected MSG4");
2008             } else if (process_msg4(st,buf,source)) {
2009                 transport_setup_msgok(st,source);
2010                 enter_new_state(st,SITE_SENTMSG5);
2011             } else {
2012                 slog(st,LOG_SEC,"invalid MSG4");
2013             }
2014             break;
2015         case LABEL_MSG5:
2016             /* Setup packet: expected only in state SENTMSG4 */
2017             /* (may turn up in state RUN if our return MSG6 was lost
2018                and the new key has already been activated. In that
2019                case we discard it. The peer will realise that we
2020                are using the new key when they see our data packets.
2021                Until then the peer's data packets to us get discarded. */
2022             if (st->state==SITE_SENTMSG4) {
2023                 if (process_msg5(st,buf,source,st->new_transform)) {
2024                     transport_setup_msgok(st,source);
2025                     enter_new_state(st,SITE_RUN);
2026                 } else {
2027                     slog(st,LOG_SEC,"invalid MSG5");
2028                 }
2029             } else if (st->state==SITE_RUN) {
2030                 if (process_msg5(st,buf,source,st->current.transform)) {
2031                     slog(st,LOG_DROP,"got MSG5, retransmitting MSG6");
2032                     transport_setup_msgok(st,source);
2033                     create_msg6(st,st->current.transform,
2034                                 st->current.remote_session_id);
2035                     transport_xmit(st,&st->peers,&st->buffer,True);
2036                     BUF_FREE(&st->buffer);
2037                 } else {
2038                     slog(st,LOG_SEC,"invalid MSG5 (in state RUN)");
2039                 }
2040             } else {
2041                 slog(st,LOG_UNEXPECTED,"unexpected MSG5");
2042             }
2043             break;
2044         case LABEL_MSG6:
2045             /* Setup packet: expected only in state SENTMSG5 */
2046             if (st->state!=SITE_SENTMSG5) {
2047                 slog(st,LOG_UNEXPECTED,"unexpected MSG6");
2048             } else if (process_msg6(st,buf,source)) {
2049                 BUF_FREE(&st->buffer); /* Free message 5 */
2050                 transport_setup_msgok(st,source);
2051                 activate_new_key(st);
2052             } else {
2053                 slog(st,LOG_SEC,"invalid MSG6");
2054             }
2055             break;
2056         default:
2057             slog(st,LOG_SEC,"received message of unknown type 0x%08x",
2058                  msgtype);
2059             break;
2060         }
2061         BUF_FREE(buf);
2062         return True;
2063     }
2064
2065     return False;
2066 }
2067
2068 static void site_control(void *vst, bool_t run)
2069 {
2070     struct site *st=vst;
2071     if (run) enter_state_run(st);
2072     else enter_state_stop(st);
2073 }
2074
2075 static void site_phase_hook(void *sst, uint32_t newphase)
2076 {
2077     struct site *st=sst;
2078
2079     /* The program is shutting down; tell our peer */
2080     send_msg7(st,"shutting down");
2081 }
2082
2083 static void site_childpersist_clearkeys(void *sst, uint32_t newphase)
2084 {
2085     struct site *st=sst;
2086     dispose_transform(&st->current.transform);
2087     dispose_transform(&st->auxiliary_key.transform);
2088     dispose_transform(&st->new_transform);
2089     /* Not much point overwiting the signing key, since we loaded it
2090        from disk, and it is only valid prospectively if at all,
2091        anyway. */
2092     /* XXX it would be best to overwrite the DH state, because that
2093        _is_ relevant to forward secrecy.  However we have no
2094        convenient interface for doing that and in practice gmp has
2095        probably dribbled droppings all over the malloc arena.  A good
2096        way to fix this would be to have a privsep child for asymmetric
2097        crypto operations, but that's a task for another day. */
2098 }
2099
2100 static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
2101                           list_t *args)
2102 {
2103     static uint32_t index_sequence;
2104     struct site *st;
2105     item_t *item;
2106     dict_t *dict;
2107     int i;
2108
2109     NEW(st);
2110
2111     st->cl.description="site";
2112     st->cl.type=CL_SITE;
2113     st->cl.apply=NULL;
2114     st->cl.interface=&st->ops;
2115     st->ops.st=st;
2116     st->ops.control=site_control;
2117     st->ops.status=site_status;
2118
2119     /* First parameter must be a dict */
2120     item=list_elem(args,0);
2121     if (!item || item->type!=t_dict)
2122         cfgfatal(loc,"site","parameter must be a dictionary\n");
2123     
2124     dict=item->data.dict;
2125     st->localname=dict_read_string(dict, "local-name", True, "site", loc);
2126     st->remotename=dict_read_string(dict, "name", True, "site", loc);
2127
2128     st->keepalive=dict_read_bool(dict,"keepalive",False,"site",loc,False);
2129
2130     st->peer_mobile=dict_read_bool(dict,"mobile",False,"site",loc,False);
2131     st->local_mobile=
2132         dict_read_bool(dict,"local-mobile",False,"site",loc,False);
2133
2134     /* Sanity check (which also allows the 'sites' file to include
2135        site() closures for all sites including our own): refuse to
2136        talk to ourselves */
2137     if (strcmp(st->localname,st->remotename)==0) {
2138         Message(M_DEBUG,"site %s: local-name==name -> ignoring this site\n",
2139                 st->localname);
2140         if (st->peer_mobile != st->local_mobile)
2141             cfgfatal(loc,"site","site %s's peer-mobile=%d"
2142                     " but our local-mobile=%d\n",
2143                     st->localname, st->peer_mobile, st->local_mobile);
2144         free(st);
2145         return NULL;
2146     }
2147     if (st->peer_mobile && st->local_mobile) {
2148         Message(M_WARNING,"site %s: site is mobile but so are we"
2149                 " -> ignoring this site\n", st->remotename);
2150         free(st);
2151         return NULL;
2152     }
2153
2154     assert(index_sequence < 0xffffffffUL);
2155     st->index = ++index_sequence;
2156     st->local_capabilities = 0;
2157     st->early_capabilities = CAPAB_PRIORITY_MOBILE;
2158     st->netlink=find_cl_if(dict,"link",CL_NETLINK,True,"site",loc);
2159
2160 #define GET_CLOSURE_LIST(dictkey,things,nthings,CL_TYPE) do{            \
2161     list_t *things##_cfg=dict_lookup(dict,dictkey);                     \
2162     if (!things##_cfg)                                                  \
2163         cfgfatal(loc,"site","closure list \"%s\" not found\n",dictkey); \
2164     st->nthings=list_length(things##_cfg);                              \
2165     NEW_ARY(st->things,st->nthings);                                    \
2166     assert(st->nthings);                                                \
2167     for (i=0; i<st->nthings; i++) {                                     \
2168         item_t *item=list_elem(things##_cfg,i);                         \
2169         if (item->type!=t_closure)                                      \
2170             cfgfatal(loc,"site","%s is not a closure\n",dictkey);       \
2171         closure_t *cl=item->data.closure;                               \
2172         if (cl->type!=CL_TYPE)                                          \
2173             cfgfatal(loc,"site","%s closure wrong type\n",dictkey);     \
2174         st->things[i]=cl->interface;                                    \
2175     }                                                                   \
2176 }while(0)
2177
2178     GET_CLOSURE_LIST("comm",comms,ncomms,CL_COMM);
2179
2180     NEW_ARY(st->commclientinfos, st->ncomms);
2181     dict_t *comminfo = dict_read_dict(dict,"comm-info",False,"site",loc);
2182     for (i=0; i<st->ncomms; i++) {
2183         st->commclientinfos[i] =
2184             !comminfo ? 0 :
2185             st->comms[i]->clientinfo(st->comms[i],comminfo,loc);
2186     }
2187
2188     st->resolver=find_cl_if(dict,"resolver",CL_RESOLVER,True,"site",loc);
2189     st->log=find_cl_if(dict,"log",CL_LOG,True,"site",loc);
2190     st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc);
2191
2192     st->privkey=find_cl_if(dict,"local-key",CL_RSAPRIVKEY,True,"site",loc);
2193     st->addresses=dict_read_string_array(dict,"address",False,"site",loc,0);
2194     if (st->addresses)
2195         st->remoteport=dict_read_number(dict,"port",True,"site",loc,0);
2196     else st->remoteport=0;
2197     st->pubkey=find_cl_if(dict,"key",CL_RSAPUBKEY,True,"site",loc);
2198
2199     GET_CLOSURE_LIST("transform",transforms,ntransforms,CL_TRANSFORM);
2200
2201     st->dh=find_cl_if(dict,"dh",CL_DH,True,"site",loc);
2202     st->hash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc);
2203
2204 #define DEFAULT(D) (st->peer_mobile || st->local_mobile \
2205                     ? DEFAULT_MOBILE_##D : DEFAULT_##D)
2206 #define CFG_NUMBER(k,D) dict_read_number(dict,(k),False,"site",loc,DEFAULT(D));
2207
2208     st->key_lifetime=         CFG_NUMBER("key-lifetime",  KEY_LIFETIME);
2209     st->setup_retries=        CFG_NUMBER("setup-retries", SETUP_RETRIES);
2210     st->setup_retry_interval= CFG_NUMBER("setup-timeout", SETUP_RETRY_INTERVAL);
2211     st->wait_timeout_mean=    CFG_NUMBER("wait-time",     WAIT_TIME);
2212     st->mtu_target= dict_read_number(dict,"mtu-target",False,"site",loc,0);
2213
2214     st->mobile_peer_expiry= dict_read_number(
2215        dict,"mobile-peer-expiry",False,"site",loc,DEFAULT_MOBILE_PEER_EXPIRY);
2216
2217     const char *peerskey= st->peer_mobile
2218         ? "mobile-peers-max" : "static-peers-max";
2219     st->transport_peers_max= dict_read_number(
2220         dict,peerskey,False,"site",loc, st->addresses ? 4 : 3);
2221     if (st->transport_peers_max<1 ||
2222         st->transport_peers_max>MAX_PEER_ADDRS) {
2223         cfgfatal(loc,"site", "%s must be in range 1.."
2224                  STRING(MAX_PEER_ADDRS) "\n", peerskey);
2225     }
2226
2227     if (st->key_lifetime < DEFAULT(KEY_RENEGOTIATE_GAP)*2)
2228         st->key_renegotiate_time=st->key_lifetime/2;
2229     else
2230         st->key_renegotiate_time=st->key_lifetime-DEFAULT(KEY_RENEGOTIATE_GAP);
2231     st->key_renegotiate_time=dict_read_number(
2232         dict,"renegotiate-time",False,"site",loc,st->key_renegotiate_time);
2233     if (st->key_renegotiate_time > st->key_lifetime) {
2234         cfgfatal(loc,"site",
2235                  "renegotiate-time must be less than key-lifetime\n");
2236     }
2237
2238     st->log_events=string_list_to_word(dict_lookup(dict,"log-events"),
2239                                        log_event_table,"site");
2240
2241     st->resolving_count=0;
2242     st->allow_send_prod=0;
2243
2244     st->tunname=safe_malloc(strlen(st->localname)+strlen(st->remotename)+5,
2245                             "site_apply");
2246     sprintf(st->tunname,"%s<->%s",st->localname,st->remotename);
2247
2248     /* The information we expect to see in incoming messages of type 1 */
2249     /* fixme: lots of unchecked overflows here, but the results are only
2250        corrupted packets rather than undefined behaviour */
2251     st->our_name_later=(strcmp(st->localname,st->remotename)>0);
2252
2253     buffer_new(&st->buffer,SETUP_BUFFER_LEN);
2254
2255     buffer_new(&st->scratch,SETUP_BUFFER_LEN);
2256     BUF_ALLOC(&st->scratch,"site:scratch");
2257
2258     /* We are interested in poll(), but only for timeouts. We don't have
2259        any fds of our own. */
2260     register_for_poll(st, site_beforepoll, site_afterpoll, "site");
2261     st->timeout=0;
2262
2263     st->remote_capabilities=0;
2264     st->chosen_transform=0;
2265     st->current.key_timeout=0;
2266     st->auxiliary_key.key_timeout=0;
2267     transport_peers_clear(st,&st->peers);
2268     transport_peers_clear(st,&st->setup_peers);
2269     /* XXX mlock these */
2270     st->dhsecret=safe_malloc(st->dh->len,"site:dhsecret");
2271     st->sharedsecretlen=st->sharedsecretallocd=0;
2272     st->sharedsecret=0;
2273
2274 #define SET_CAPBIT(bit) do {                                            \
2275     uint32_t capflag = 1UL << (bit);                                    \
2276     if (st->local_capabilities & capflag)                               \
2277         slog(st,LOG_ERROR,"capability bit"                              \
2278              " %d (%#"PRIx32") reused", (bit), capflag);                \
2279     st->local_capabilities |= capflag;                                  \
2280 } while (0)
2281
2282     for (i=0; i<st->ntransforms; i++)
2283         SET_CAPBIT(st->transforms[i]->capab_bit);
2284
2285 #undef SET_CAPBIT
2286
2287     if (st->local_mobile || st->peer_mobile)
2288         st->local_capabilities |= CAPAB_PRIORITY_MOBILE;
2289
2290     /* We need to register the remote networks with the netlink device */
2291     uint32_t netlink_mtu; /* local virtual interface mtu */
2292     st->netlink->reg(st->netlink->st, site_outgoing, st, &netlink_mtu);
2293     if (!st->mtu_target)
2294         st->mtu_target=netlink_mtu;
2295     
2296     for (i=0; i<st->ncomms; i++)
2297         st->comms[i]->request_notify(st->comms[i]->st, st, site_incoming);
2298
2299     st->current.transform=0;
2300     st->auxiliary_key.transform=0;
2301     st->new_transform=0;
2302     st->auxiliary_is_new=0;
2303
2304     enter_state_stop(st);
2305
2306     add_hook(PHASE_SHUTDOWN,site_phase_hook,st);
2307     add_hook(PHASE_CHILDPERSIST,site_childpersist_clearkeys,st);
2308
2309     return new_closure(&st->cl);
2310 }
2311
2312 void site_module(dict_t *dict)
2313 {
2314     add_closure(dict,"site",site_apply);
2315 }
2316
2317
2318 /***** TRANSPORT PEERS definitions *****/
2319
2320 static void transport_peers_debug(struct site *st, transport_peers *dst,
2321                                   const char *didwhat,
2322                                   int nargs, const struct comm_addr *args,
2323                                   size_t stride) {
2324     int i;
2325     char *argp;
2326
2327     if (!(st->log_events & LOG_PEER_ADDRS))
2328         return; /* an optimisation */
2329
2330     slog(st, LOG_PEER_ADDRS, "peers (%s) %s nargs=%d => npeers=%d",
2331          (dst==&st->peers ? "data" :
2332           dst==&st->setup_peers ? "setup" : "UNKNOWN"),
2333          didwhat, nargs, dst->npeers);
2334
2335     for (i=0, argp=(void*)args;
2336          i<nargs;
2337          i++, (argp+=stride?stride:sizeof(*args))) {
2338         const struct comm_addr *ca=(void*)argp;
2339         slog(st, LOG_PEER_ADDRS, " args: addrs[%d]=%s",
2340              i, comm_addr_to_string(ca));
2341     }
2342     for (i=0; i<dst->npeers; i++) {
2343         struct timeval diff;
2344         timersub(tv_now,&dst->peers[i].last,&diff);
2345         const struct comm_addr *ca=&dst->peers[i].addr;
2346         slog(st, LOG_PEER_ADDRS, " peers: addrs[%d]=%s T-%ld.%06ld",
2347              i, comm_addr_to_string(ca),
2348              (unsigned long)diff.tv_sec, (unsigned long)diff.tv_usec);
2349     }
2350 }
2351
2352 static void transport_peers_expire(struct site *st, transport_peers *peers) {
2353     /* peers must be sorted first */
2354     int previous_peers=peers->npeers;
2355     struct timeval oldest;
2356     oldest.tv_sec  = tv_now->tv_sec - st->mobile_peer_expiry;
2357     oldest.tv_usec = tv_now->tv_usec;
2358     while (peers->npeers>1 &&
2359            timercmp(&peers->peers[peers->npeers-1].last, &oldest, <))
2360         peers->npeers--;
2361     if (peers->npeers != previous_peers)
2362         transport_peers_debug(st,peers,"expire", 0,0,0);
2363 }
2364
2365 static bool_t transport_peer_record_one(struct site *st, transport_peers *peers,
2366                                         const struct comm_addr *ca,
2367                                         const struct timeval *tv) {
2368     /* returns false if output is full */
2369     int search;
2370
2371     if (peers->npeers >= st->transport_peers_max)
2372         return 0;
2373
2374     for (search=0; search<peers->npeers; search++)
2375         if (comm_addr_equal(&peers->peers[search].addr, ca))
2376             return 1;
2377
2378     peers->peers[peers->npeers].addr = *ca;
2379     peers->peers[peers->npeers].last = *tv;
2380     peers->npeers++;
2381     return 1;
2382 }
2383
2384 static void transport_record_peers(struct site *st, transport_peers *peers,
2385                                    const struct comm_addr *addrs, int naddrs,
2386                                    const char *m) {
2387     /* We add addrs into peers.  The new entries end up at the front
2388      * and displace entries towards the end (perhaps even off the
2389      * end).  Any existing matching entries are moved up to the front.
2390      *
2391      * Caller must first call transport_peers_expire. */
2392
2393     if (naddrs==1) {
2394         /* avoids debug for uninteresting updates */
2395         int i;
2396         for (i=0; i<peers->npeers; i++) {
2397             if (comm_addr_equal(&addrs[0], &peers->peers[i].addr)) {
2398                 memmove(peers->peers+1, peers->peers,
2399                         sizeof(peers->peers[0]) * i);
2400                 peers->peers[0].addr = addrs[0];
2401                 peers->peers[0].last = *tv_now;
2402                 return;
2403             }
2404         }
2405     }
2406
2407     int old_npeers=peers->npeers;
2408     transport_peer old_peers[old_npeers];
2409     COPY_ARRAY(old_peers,peers->peers,old_npeers);
2410
2411     peers->npeers=0;
2412     int i;
2413     for (i=0; i<naddrs; i++) {
2414         if (!transport_peer_record_one(st,peers, &addrs[i], tv_now))
2415             break;
2416     }
2417     for (i=0; i<old_npeers; i++) {
2418         const transport_peer *old=&old_peers[i];
2419         if (!transport_peer_record_one(st,peers, &old->addr, &old->last))
2420             break;
2421     }
2422
2423     transport_peers_debug(st,peers,m, naddrs,addrs,0);
2424 }
2425
2426 static void transport_expire_record_peers(struct site *st,
2427                                           transport_peers *peers,
2428                                           const struct comm_addr *addrs,
2429                                           int naddrs, const char *m) {
2430     /* Convenience function */
2431     transport_peers_expire(st,peers);
2432     transport_record_peers(st,peers,addrs,naddrs,m);
2433 }
2434
2435 static bool_t transport_compute_setupinit_peers(struct site *st,
2436         const struct comm_addr *configured_addrs /* 0 if none or not found */,
2437         int n_configured_addrs /* 0 if none or not found */,
2438         const struct comm_addr *incoming_packet_addr /* 0 if none */) {
2439     if (!n_configured_addrs && !incoming_packet_addr &&
2440         !transport_peers_valid(&st->peers))
2441         return False;
2442
2443     slog(st,LOG_SETUP_INIT,
2444          "using: %d configured addr(s);%s %d old peer addrs(es)",
2445          n_configured_addrs,
2446          incoming_packet_addr ? " incoming packet address;" : "",
2447          st->peers.npeers);
2448
2449     /* Non-mobile peers try addresses until one is plausible.  The
2450      * effect is that this code always tries first the configured
2451      * address if supplied, or otherwise the address of the incoming
2452      * PROD, or finally the existing data peer if one exists; this is
2453      * as desired. */
2454
2455     transport_peers_copy(st,&st->setup_peers,&st->peers);
2456     transport_peers_expire(st,&st->setup_peers);
2457
2458     if (incoming_packet_addr)
2459         transport_record_peers(st,&st->setup_peers,
2460                                incoming_packet_addr,1, "incoming");
2461
2462     if (n_configured_addrs)
2463         transport_record_peers(st,&st->setup_peers,
2464                               configured_addrs,n_configured_addrs, "setupinit");
2465
2466     assert(transport_peers_valid(&st->setup_peers));
2467     return True;
2468 }
2469
2470 static void transport_setup_msgok(struct site *st, const struct comm_addr *a) {
2471     if (st->peer_mobile)
2472         transport_expire_record_peers(st,&st->setup_peers,a,1,"setupmsg");
2473 }
2474 static void transport_data_msgok(struct site *st, const struct comm_addr *a) {
2475     if (st->peer_mobile)
2476         transport_expire_record_peers(st,&st->peers,a,1,"datamsg");
2477 }
2478
2479 static int transport_peers_valid(transport_peers *peers) {
2480     return peers->npeers;
2481 }
2482 static void transport_peers_clear(struct site *st, transport_peers *peers) {
2483     peers->npeers= 0;
2484     transport_peers_debug(st,peers,"clear",0,0,0);
2485 }
2486 static void transport_peers_copy(struct site *st, transport_peers *dst,
2487                                  const transport_peers *src) {
2488     dst->npeers=src->npeers;
2489     COPY_ARRAY(dst->peers, src->peers, dst->npeers);
2490     transport_peers_debug(st,dst,"copy",
2491                           src->npeers, &src->peers->addr, sizeof(*src->peers));
2492 }
2493
2494 static void transport_resolve_complete(struct site *st,
2495                                        const struct comm_addr *addrs,
2496                                        int naddrs) {
2497     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2498                                   "resolved data");
2499     transport_expire_record_peers(st,&st->setup_peers,addrs,naddrs,
2500                                   "resolved setup");
2501 }
2502
2503 static void transport_resolve_complete_tardy(struct site *st,
2504                                              const struct comm_addr *addrs,
2505                                              int naddrs) {
2506     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2507                                   "resolved tardily");
2508 }
2509
2510 static void transport_peers__copy_by_mask(transport_peer *out, int *nout_io,
2511                                           unsigned mask,
2512                                           const transport_peers *inp) {
2513     /* out and in->peers may be the same region, or nonoverlapping */
2514     const transport_peer *in=inp->peers;
2515     int slot;
2516     for (slot=0; slot<inp->npeers; slot++) {
2517         if (!(mask & (1U << slot)))
2518             continue;
2519         if (!(out==in && slot==*nout_io))
2520             COPY_OBJ(out[*nout_io], in[slot]);
2521         (*nout_io)++;
2522     }
2523 }
2524
2525 void transport_xmit(struct site *st, transport_peers *peers,
2526                     struct buffer_if *buf, bool_t candebug) {
2527     int slot;
2528     transport_peers_expire(st, peers);
2529     unsigned failed=0; /* bitmask */
2530     assert(MAX_PEER_ADDRS < sizeof(unsigned)*CHAR_BIT);
2531
2532     int nfailed=0;
2533     for (slot=0; slot<peers->npeers; slot++) {
2534         transport_peer *peer=&peers->peers[slot];
2535         bool_t ok = comm_addr_sendmsg(st, &peer->addr, buf);
2536         if (candebug)
2537             dump_packet(st, buf, &peer->addr, False, ok);
2538         if (!ok) {
2539             failed |= 1U << slot;
2540             nfailed++;
2541         }
2542         if (ok && !st->peer_mobile)
2543             break;
2544     }
2545     /* Now we need to demote/delete failing addrs: if we are mobile we
2546      * merely demote them; otherwise we delete them. */
2547     if (st->local_mobile) {
2548         unsigned expected = ((1U << nfailed)-1) << (peers->npeers-nfailed);
2549         /* `expected' has all the failures at the end already */
2550         if (failed != expected) {
2551             int fslot=0;
2552             transport_peer failedpeers[nfailed];
2553             transport_peers__copy_by_mask(failedpeers, &fslot, failed,peers);
2554             assert(fslot == nfailed);
2555             int wslot=0;
2556             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2557             assert(wslot+nfailed == peers->npeers);
2558             COPY_ARRAY(peers->peers+wslot, failedpeers, nfailed);
2559             transport_peers_debug(st,peers,"mobile failure reorder",0,0,0);
2560         }
2561     } else {
2562         if (failed && peers->npeers > 1) {
2563             int wslot=0;
2564             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2565             peers->npeers=wslot;
2566             transport_peers_debug(st,peers,"non-mobile failure cleanup",0,0,0);
2567         }
2568     }
2569 }
2570
2571 /***** END of transport peers declarations *****/