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