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