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