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