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