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