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