chiark / gitweb /
subdirmk: Change stub force target to `run-main.mk'
[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         priomsg_update_fixed(whynot, comm_notify_whynot_unpick, "malformed");
1834         return False;
1835     }
1836 #define NAME_MATCHES(lr)                                                \
1837     if (!name_matches(&m->lr, st->lr##name)) {                          \
1838         if (priomsg_update_fixed(whynot, comm_notify_whynot_name_##lr,  \
1839                                  "unknown " #lr " name: ")) {           \
1840             truncmsg_add_packet_string(&whynot->m, m->lr.len, m->lr.name); \
1841         }                                                               \
1842         return False;                                                   \
1843     }
1844     NAME_MATCHES(remote);
1845     NAME_MATCHES(local );
1846 #undef NAME_MATCHES
1847
1848     return True;
1849 }
1850
1851 static bool_t we_have_priority(struct site *st, const struct msg *m) {
1852     if (st->local_capabilities & m->remote_capabilities &
1853         CAPAB_PRIORITY_MOBILE) {
1854         if (st->local_mobile) return True;
1855         if (st-> peer_mobile) return False;
1856     }
1857     return st->our_name_later;
1858 }
1859
1860 static bool_t setup_late_msg_ok(struct site *st, 
1861                                 const struct buffer_if *buf_in,
1862                                 uint32_t msgtype,
1863                                 const struct comm_addr *source,
1864                                 struct msg *m /* returned */) {
1865     /* For setup packets which seem from their type like they are
1866      * late.  Maybe they came via a different path.  All we do is make
1867      * a note of the sending address, iff they look like they are part
1868      * of the current key setup attempt. */
1869     if (!named_for_us(st,buf_in,msgtype,m,0))
1870         /* named_for_us calls unpick_msg which gets the nonces */
1871         return False;
1872     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN) ||
1873         !consttime_memeq(m->nL,st->localN, NONCELEN))
1874         /* spoof ?  from stale run ?  who knows */
1875         return False;
1876     transport_setup_msgok(st,source);
1877     return True;
1878 }
1879
1880 /* This function is called by the communication device to deliver
1881    packets from our peers.
1882    It should return True if the packet is recognised as being for
1883    this current site instance (and should therefore not be processed
1884    by other sites), even if the packet was otherwise ignored. */
1885 static bool_t site_incoming(void *sst, struct buffer_if *buf,
1886                             const struct comm_addr *source,
1887                             struct priomsg *whynot)
1888 {
1889     struct site *st=sst;
1890
1891     if (buf->size < 12) return False;
1892
1893     uint32_t dest=get_uint32(buf->start);
1894     uint32_t msgtype=get_uint32(buf->start+8);
1895     struct msg msg;
1896       /* initialised by named_for_us, or process_msgN for N!=1 */
1897
1898     if (msgtype==LABEL_MSG1) {
1899         if (!named_for_us(st,buf,msgtype,&msg,whynot))
1900             return False;
1901         /* It's a MSG1 addressed to us. Decide what to do about it. */
1902         dump_packet(st,buf,source,True,True);
1903         if (st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1904             st->state==SITE_WAIT) {
1905             /* We should definitely process it */
1906             transport_compute_setupinit_peers(st,0,0,source);
1907             if (process_msg1(st,buf,source,&msg)) {
1908                 slog(st,LOG_SETUP_INIT,"key setup initiated by peer");
1909                 bool_t entered=enter_new_state(st,SITE_SENTMSG2,&msg);
1910                 if (entered && st->addresses && st->local_mobile)
1911                     /* We must do this as the very last thing, because
1912                        the resolver callback might reenter us. */
1913                     ensure_resolving(st);
1914             } else {
1915                 slog(st,LOG_ERROR,"failed to process incoming msg1");
1916             }
1917             BUF_FREE(buf);
1918             return True;
1919         } else if (st->state==SITE_SENTMSG1) {
1920             /* We've just sent a message 1! They may have crossed on
1921                the wire. If we have priority then we ignore the
1922                incoming one, otherwise we process it as usual. */
1923             if (we_have_priority(st,&msg)) {
1924                 BUF_FREE(buf);
1925                 if (!st->msg1_crossed_logged++)
1926                     slog(st,LOG_SETUP_INIT,"crossed msg1s; we are higher "
1927                          "priority => ignore incoming msg1");
1928                 return True;
1929             } else {
1930                 slog(st,LOG_SETUP_INIT,"crossed msg1s; we are lower "
1931                      "priority => use incoming msg1");
1932                 if (process_msg1(st,buf,source,&msg)) {
1933                     BUF_FREE(&st->buffer); /* Free our old message 1 */
1934                     transport_setup_msgok(st,source);
1935                     enter_new_state(st,SITE_SENTMSG2,&msg);
1936                 } else {
1937                     slog(st,LOG_ERROR,"failed to process an incoming "
1938                          "crossed msg1 (we have low priority)");
1939                 }
1940                 BUF_FREE(buf);
1941                 return True;
1942             }
1943         } else if (st->state==SITE_SENTMSG2 ||
1944                    st->state==SITE_SENTMSG4) {
1945             if (consttime_memeq(msg.nR,st->remoteN,NONCELEN)) {
1946                 /* We are ahead in the protocol, but that msg1 had the
1947                  * peer's nonce so presumably it is from this key
1948                  * exchange run, via a slower route */
1949                 transport_setup_msgok(st,source);
1950             } else {
1951                 slog(st,LOG_UNEXPECTED,"competing incoming message 1");
1952             }
1953             BUF_FREE(buf);
1954             return True;
1955         }
1956         /* The message 1 was received at an unexpected stage of the
1957            key setup.  Well, they lost the race. */
1958         slog(st,LOG_UNEXPECTED,"unexpected incoming message 1");
1959         BUF_FREE(buf);
1960         return True;
1961     }
1962     if (msgtype==LABEL_PROD) {
1963         if (!named_for_us(st,buf,msgtype,&msg,whynot))
1964             return False;
1965         dump_packet(st,buf,source,True,True);
1966         if (st->state!=SITE_RUN) {
1967             slog(st,LOG_DROP,"ignoring PROD when not in state RUN");
1968         } else if (current_valid(st)) {
1969             slog(st,LOG_DROP,"ignoring PROD when we think we have a key");
1970         } else {
1971             initiate_key_setup(st,"peer sent PROD packet",source);
1972         }
1973         BUF_FREE(buf);
1974         return True;
1975     }
1976     if (dest==st->index) {
1977         /* Explicitly addressed to us */
1978         if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True,True);
1979         switch (msgtype) {
1980         case LABEL_NAK:
1981             /* If the source is our current peer then initiate a key setup,
1982                because our peer's forgotten the key */
1983             if (get_uint32(buf->start+4)==st->current.remote_session_id) {
1984                 bool_t initiated;
1985                 initiated = initiate_key_setup(st,"received a NAK",source);
1986                 if (!initiated) generate_send_prod(st,source);
1987             } else {
1988                 slog(st,LOG_SEC,"bad incoming NAK");
1989             }
1990             break;
1991         case LABEL_MSG0:
1992             process_msg0(st,buf,source);
1993             break;
1994         case LABEL_MSG1:
1995             /* Setup packet: should not have been explicitly addressed
1996                to us */
1997             slog(st,LOG_SEC,"incoming explicitly addressed msg1");
1998             break;
1999         case LABEL_MSG2:
2000             /* Setup packet: expected only in state SENTMSG1 */
2001             if (st->state!=SITE_SENTMSG1) {
2002                 if ((st->state==SITE_SENTMSG3 ||
2003                      st->state==SITE_SENTMSG5) &&
2004                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2005                     break;
2006                 slog(st,LOG_UNEXPECTED,"unexpected MSG2");
2007             } else if (process_msg2(st,buf,source,&msg)) {
2008                 transport_setup_msgok(st,source);
2009                 enter_new_state(st,SITE_SENTMSG3,&msg);
2010             } else {
2011                 slog(st,LOG_SEC,"invalid MSG2");
2012             }
2013             break;
2014         case CASES_MSG3_KNOWN:
2015             /* Setup packet: expected only in state SENTMSG2 */
2016             if (st->state!=SITE_SENTMSG2) {
2017                 if ((st->state==SITE_SENTMSG4) &&
2018                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2019                     break;
2020                 slog(st,LOG_UNEXPECTED,"unexpected MSG3");
2021             } else if (process_msg3(st,buf,source,msgtype,&msg)) {
2022                 transport_setup_msgok(st,source);
2023                 enter_new_state(st,SITE_SENTMSG4,&msg);
2024             } else {
2025                 slog(st,LOG_SEC,"invalid MSG3");
2026             }
2027             break;
2028         case LABEL_MSG4:
2029             /* Setup packet: expected only in state SENTMSG3 */
2030             if (st->state!=SITE_SENTMSG3) {
2031                 if ((st->state==SITE_SENTMSG5) &&
2032                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2033                     break;
2034                 slog(st,LOG_UNEXPECTED,"unexpected MSG4");
2035             } else if (process_msg4(st,buf,source,&msg)) {
2036                 transport_setup_msgok(st,source);
2037                 enter_new_state(st,SITE_SENTMSG5,&msg);
2038             } else {
2039                 slog(st,LOG_SEC,"invalid MSG4");
2040             }
2041             break;
2042         case LABEL_MSG5:
2043             /* Setup packet: expected only in state SENTMSG4 */
2044             /* (may turn up in state RUN if our return MSG6 was lost
2045                and the new key has already been activated. In that
2046                case we discard it. The peer will realise that we
2047                are using the new key when they see our data packets.
2048                Until then the peer's data packets to us get discarded. */
2049             if (st->state==SITE_SENTMSG4) {
2050                 if (process_msg5(st,buf,source,st->new_transform)) {
2051                     transport_setup_msgok(st,source);
2052                     enter_new_state(st,SITE_RUN,&msg);
2053                 } else {
2054                     slog(st,LOG_SEC,"invalid MSG5");
2055                 }
2056             } else if (st->state==SITE_RUN) {
2057                 if (process_msg5(st,buf,source,st->current.transform)) {
2058                     slog(st,LOG_DROP,"got MSG5, retransmitting MSG6");
2059                     transport_setup_msgok(st,source);
2060                     create_msg6(st,st->current.transform,
2061                                 st->current.remote_session_id);
2062                     transport_xmit(st,&st->peers,&st->buffer,True);
2063                     BUF_FREE(&st->buffer);
2064                 } else {
2065                     slog(st,LOG_SEC,"invalid MSG5 (in state RUN)");
2066                 }
2067             } else {
2068                 slog(st,LOG_UNEXPECTED,"unexpected MSG5");
2069             }
2070             break;
2071         case LABEL_MSG6:
2072             /* Setup packet: expected only in state SENTMSG5 */
2073             if (st->state!=SITE_SENTMSG5) {
2074                 slog(st,LOG_UNEXPECTED,"unexpected MSG6");
2075             } else if (process_msg6(st,buf,source)) {
2076                 BUF_FREE(&st->buffer); /* Free message 5 */
2077                 transport_setup_msgok(st,source);
2078                 activate_new_key(st);
2079             } else {
2080                 slog(st,LOG_SEC,"invalid MSG6");
2081             }
2082             break;
2083         default:
2084             slog(st,LOG_SEC,"received message of unknown type 0x%08x",
2085                  msgtype);
2086             break;
2087         }
2088         BUF_FREE(buf);
2089         return True;
2090     }
2091
2092     priomsg_update_fixed(whynot, comm_notify_whynot_general,
2093                          "not MSG1 or PROD; unknown dest index");
2094     return False;
2095 }
2096
2097 static void site_control(void *vst, bool_t run)
2098 {
2099     struct site *st=vst;
2100     if (run) enter_state_run(st);
2101     else enter_state_stop(st);
2102 }
2103
2104 static void site_phase_hook(void *sst, uint32_t newphase)
2105 {
2106     struct site *st=sst;
2107
2108     /* The program is shutting down; tell our peer */
2109     send_msg7(st,"shutting down");
2110 }
2111
2112 static void site_childpersist_clearkeys(void *sst, uint32_t newphase)
2113 {
2114     struct site *st=sst;
2115     dispose_transform(&st->current.transform);
2116     dispose_transform(&st->auxiliary_key.transform);
2117     dispose_transform(&st->new_transform);
2118     /* Not much point overwiting the signing key, since we loaded it
2119        from disk, and it is only valid prospectively if at all,
2120        anyway. */
2121     /* XXX it would be best to overwrite the DH state, because that
2122        _is_ relevant to forward secrecy.  However we have no
2123        convenient interface for doing that and in practice gmp has
2124        probably dribbled droppings all over the malloc arena.  A good
2125        way to fix this would be to have a privsep child for asymmetric
2126        crypto operations, but that's a task for another day. */
2127 }
2128
2129 static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
2130                           list_t *args)
2131 {
2132     static uint32_t index_sequence;
2133     struct site *st;
2134     item_t *item;
2135     dict_t *dict;
2136     int i;
2137
2138     NEW(st);
2139
2140     st->cl.description="site";
2141     st->cl.type=CL_SITE;
2142     st->cl.apply=NULL;
2143     st->cl.interface=&st->ops;
2144     st->ops.st=st;
2145     st->ops.control=site_control;
2146     st->ops.status=site_status;
2147
2148     /* First parameter must be a dict */
2149     item=list_elem(args,0);
2150     if (!item || item->type!=t_dict)
2151         cfgfatal(loc,"site","parameter must be a dictionary\n");
2152     
2153     dict=item->data.dict;
2154     st->localname=dict_read_string(dict, "local-name", True, "site", loc);
2155     st->remotename=dict_read_string(dict, "name", True, "site", loc);
2156
2157     st->keepalive=dict_read_bool(dict,"keepalive",False,"site",loc,False);
2158
2159     st->peer_mobile=dict_read_bool(dict,"mobile",False,"site",loc,False);
2160     st->local_mobile=
2161         dict_read_bool(dict,"local-mobile",False,"site",loc,False);
2162
2163     /* Sanity check (which also allows the 'sites' file to include
2164        site() closures for all sites including our own): refuse to
2165        talk to ourselves */
2166     if (strcmp(st->localname,st->remotename)==0) {
2167         Message(M_DEBUG,"site %s: local-name==name -> ignoring this site\n",
2168                 st->localname);
2169         if (st->peer_mobile != st->local_mobile)
2170             cfgfatal(loc,"site","site %s's peer-mobile=%d"
2171                     " but our local-mobile=%d\n",
2172                     st->localname, st->peer_mobile, st->local_mobile);
2173         free(st);
2174         return NULL;
2175     }
2176     if (st->peer_mobile && st->local_mobile) {
2177         Message(M_WARNING,"site %s: site is mobile but so are we"
2178                 " -> ignoring this site\n", st->remotename);
2179         free(st);
2180         return NULL;
2181     }
2182
2183     assert(index_sequence < 0xffffffffUL);
2184     st->index = ++index_sequence;
2185     st->local_capabilities = 0;
2186     st->early_capabilities = CAPAB_PRIORITY_MOBILE;
2187     st->netlink=find_cl_if(dict,"link",CL_NETLINK,True,"site",loc);
2188
2189 #define GET_CLOSURE_LIST(dictkey,things,nthings,CL_TYPE) do{            \
2190     list_t *things##_cfg=dict_lookup(dict,dictkey);                     \
2191     if (!things##_cfg)                                                  \
2192         cfgfatal(loc,"site","closure list \"%s\" not found\n",dictkey); \
2193     st->nthings=list_length(things##_cfg);                              \
2194     NEW_ARY(st->things,st->nthings);                                    \
2195     assert(st->nthings);                                                \
2196     for (i=0; i<st->nthings; i++) {                                     \
2197         item_t *item=list_elem(things##_cfg,i);                         \
2198         if (item->type!=t_closure)                                      \
2199             cfgfatal(loc,"site","%s is not a closure\n",dictkey);       \
2200         closure_t *cl=item->data.closure;                               \
2201         if (cl->type!=CL_TYPE)                                          \
2202             cfgfatal(loc,"site","%s closure wrong type\n",dictkey);     \
2203         st->things[i]=cl->interface;                                    \
2204     }                                                                   \
2205 }while(0)
2206
2207     GET_CLOSURE_LIST("comm",comms,ncomms,CL_COMM);
2208
2209     NEW_ARY(st->commclientinfos, st->ncomms);
2210     dict_t *comminfo = dict_read_dict(dict,"comm-info",False,"site",loc);
2211     for (i=0; i<st->ncomms; i++) {
2212         st->commclientinfos[i] =
2213             !comminfo ? 0 :
2214             st->comms[i]->clientinfo(st->comms[i],comminfo,loc);
2215     }
2216
2217     st->resolver=find_cl_if(dict,"resolver",CL_RESOLVER,True,"site",loc);
2218     st->log=find_cl_if(dict,"log",CL_LOG,True,"site",loc);
2219     st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc);
2220
2221     st->privkey=find_cl_if(dict,"local-key",CL_SIGPRIVKEY,True,"site",loc);
2222     st->addresses=dict_read_string_array(dict,"address",False,"site",loc,0);
2223     if (st->addresses)
2224         st->remoteport=dict_read_number(dict,"port",True,"site",loc,0);
2225     else st->remoteport=0;
2226     st->pubkey=find_cl_if(dict,"key",CL_SIGPUBKEY,True,"site",loc);
2227
2228     GET_CLOSURE_LIST("transform",transforms,ntransforms,CL_TRANSFORM);
2229
2230     st->dh=find_cl_if(dict,"dh",CL_DH,True,"site",loc);
2231
2232     if (st->privkey->sethash || st->pubkey->sethash) {
2233         struct hash_if *hash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc);
2234         if (st->privkey->sethash) st->privkey->sethash(st->privkey->st,hash);
2235         if (st->pubkey->sethash) st->pubkey->sethash(st->pubkey->st,hash);
2236     }
2237
2238 #define DEFAULT(D) (st->peer_mobile || st->local_mobile \
2239                     ? DEFAULT_MOBILE_##D : DEFAULT_##D)
2240 #define CFG_NUMBER(k,D) dict_read_number(dict,(k),False,"site",loc,DEFAULT(D));
2241
2242     st->key_lifetime=         CFG_NUMBER("key-lifetime",  KEY_LIFETIME);
2243     st->setup_retries=        CFG_NUMBER("setup-retries", SETUP_RETRIES);
2244     st->setup_retry_interval= CFG_NUMBER("setup-timeout", SETUP_RETRY_INTERVAL);
2245     st->wait_timeout_mean=    CFG_NUMBER("wait-time",     WAIT_TIME);
2246     st->mtu_target= dict_read_number(dict,"mtu-target",False,"site",loc,0);
2247
2248     st->mobile_peer_expiry= dict_read_number(
2249        dict,"mobile-peer-expiry",False,"site",loc,DEFAULT_MOBILE_PEER_EXPIRY);
2250
2251     const char *peerskey= st->peer_mobile
2252         ? "mobile-peers-max" : "static-peers-max";
2253     st->transport_peers_max= dict_read_number(
2254         dict,peerskey,False,"site",loc, st->addresses ? 4 : 3);
2255     if (st->transport_peers_max<1 ||
2256         st->transport_peers_max>MAX_PEER_ADDRS) {
2257         cfgfatal(loc,"site", "%s must be in range 1.."
2258                  STRING(MAX_PEER_ADDRS) "\n", peerskey);
2259     }
2260
2261     if (st->key_lifetime < DEFAULT(KEY_RENEGOTIATE_GAP)*2)
2262         st->key_renegotiate_time=st->key_lifetime/2;
2263     else
2264         st->key_renegotiate_time=st->key_lifetime-DEFAULT(KEY_RENEGOTIATE_GAP);
2265     st->key_renegotiate_time=dict_read_number(
2266         dict,"renegotiate-time",False,"site",loc,st->key_renegotiate_time);
2267     if (st->key_renegotiate_time > st->key_lifetime) {
2268         cfgfatal(loc,"site",
2269                  "renegotiate-time must be less than key-lifetime\n");
2270     }
2271
2272     st->log_events=string_list_to_word(dict_lookup(dict,"log-events"),
2273                                        log_event_table,"site");
2274
2275     st->resolving_count=0;
2276     st->allow_send_prod=0;
2277
2278     st->tunname=safe_malloc(strlen(st->localname)+strlen(st->remotename)+5,
2279                             "site_apply");
2280     sprintf(st->tunname,"%s<->%s",st->localname,st->remotename);
2281
2282     /* The information we expect to see in incoming messages of type 1 */
2283     /* fixme: lots of unchecked overflows here, but the results are only
2284        corrupted packets rather than undefined behaviour */
2285     st->our_name_later=(strcmp(st->localname,st->remotename)>0);
2286
2287     buffer_new(&st->buffer,SETUP_BUFFER_LEN);
2288
2289     buffer_new(&st->scratch,SETUP_BUFFER_LEN);
2290     BUF_ALLOC(&st->scratch,"site:scratch");
2291
2292     /* We are interested in poll(), but only for timeouts. We don't have
2293        any fds of our own. */
2294     register_for_poll(st, site_beforepoll, site_afterpoll, "site");
2295     st->timeout=0;
2296
2297     st->remote_capabilities=0;
2298     st->chosen_transform=0;
2299     st->current.key_timeout=0;
2300     st->auxiliary_key.key_timeout=0;
2301     transport_peers_clear(st,&st->peers);
2302     transport_peers_clear(st,&st->setup_peers);
2303     /* XXX mlock these */
2304     st->dhsecret=safe_malloc(st->dh->len,"site:dhsecret");
2305     st->sharedsecretlen=st->sharedsecretallocd=0;
2306     st->sharedsecret=0;
2307
2308 #define SET_CAPBIT(bit) do {                                            \
2309     uint32_t capflag = 1UL << (bit);                                    \
2310     if (st->local_capabilities & capflag)                               \
2311         slog(st,LOG_ERROR,"capability bit"                              \
2312              " %d (%#"PRIx32") reused", (bit), capflag);                \
2313     st->local_capabilities |= capflag;                                  \
2314 } while (0)
2315
2316     for (i=0; i<st->ntransforms; i++)
2317         SET_CAPBIT(st->transforms[i]->capab_bit);
2318
2319 #undef SET_CAPBIT
2320
2321     if (st->local_mobile || st->peer_mobile)
2322         st->local_capabilities |= CAPAB_PRIORITY_MOBILE;
2323
2324     /* We need to register the remote networks with the netlink device */
2325     uint32_t netlink_mtu; /* local virtual interface mtu */
2326     st->netlink->reg(st->netlink->st, site_outgoing, st, &netlink_mtu);
2327     if (!st->mtu_target)
2328         st->mtu_target=netlink_mtu;
2329     
2330     for (i=0; i<st->ncomms; i++)
2331         st->comms[i]->request_notify(st->comms[i]->st, st, site_incoming);
2332
2333     st->current.transform=0;
2334     st->auxiliary_key.transform=0;
2335     st->new_transform=0;
2336     st->auxiliary_is_new=0;
2337
2338     enter_state_stop(st);
2339
2340     add_hook(PHASE_SHUTDOWN,site_phase_hook,st);
2341     add_hook(PHASE_CHILDPERSIST,site_childpersist_clearkeys,st);
2342
2343     return new_closure(&st->cl);
2344 }
2345
2346 void site_module(dict_t *dict)
2347 {
2348     add_closure(dict,"site",site_apply);
2349 }
2350
2351
2352 /***** TRANSPORT PEERS definitions *****/
2353
2354 static void transport_peers_debug(struct site *st, transport_peers *dst,
2355                                   const char *didwhat,
2356                                   int nargs, const struct comm_addr *args,
2357                                   size_t stride) {
2358     int i;
2359     char *argp;
2360
2361     if (!(st->log_events & LOG_PEER_ADDRS))
2362         return; /* an optimisation */
2363
2364     slog(st, LOG_PEER_ADDRS, "peers (%s) %s nargs=%d => npeers=%d",
2365          (dst==&st->peers ? "data" :
2366           dst==&st->setup_peers ? "setup" : "UNKNOWN"),
2367          didwhat, nargs, dst->npeers);
2368
2369     for (i=0, argp=(void*)args;
2370          i<nargs;
2371          i++, (argp+=stride?stride:sizeof(*args))) {
2372         const struct comm_addr *ca=(void*)argp;
2373         slog(st, LOG_PEER_ADDRS, " args: addrs[%d]=%s",
2374              i, comm_addr_to_string(ca));
2375     }
2376     for (i=0; i<dst->npeers; i++) {
2377         struct timeval diff;
2378         timersub(tv_now,&dst->peers[i].last,&diff);
2379         const struct comm_addr *ca=&dst->peers[i].addr;
2380         slog(st, LOG_PEER_ADDRS, " peers: addrs[%d]=%s T-%ld.%06ld",
2381              i, comm_addr_to_string(ca),
2382              (unsigned long)diff.tv_sec, (unsigned long)diff.tv_usec);
2383     }
2384 }
2385
2386 static void transport_peers_expire(struct site *st, transport_peers *peers) {
2387     /* peers must be sorted first */
2388     int previous_peers=peers->npeers;
2389     struct timeval oldest;
2390     oldest.tv_sec  = tv_now->tv_sec - st->mobile_peer_expiry;
2391     oldest.tv_usec = tv_now->tv_usec;
2392     while (peers->npeers>1 &&
2393            timercmp(&peers->peers[peers->npeers-1].last, &oldest, <))
2394         peers->npeers--;
2395     if (peers->npeers != previous_peers)
2396         transport_peers_debug(st,peers,"expire", 0,0,0);
2397 }
2398
2399 static bool_t transport_peer_record_one(struct site *st, transport_peers *peers,
2400                                         const struct comm_addr *ca,
2401                                         const struct timeval *tv) {
2402     /* returns false if output is full */
2403     int search;
2404
2405     if (peers->npeers >= st->transport_peers_max)
2406         return 0;
2407
2408     for (search=0; search<peers->npeers; search++)
2409         if (comm_addr_equal(&peers->peers[search].addr, ca))
2410             return 1;
2411
2412     peers->peers[peers->npeers].addr = *ca;
2413     peers->peers[peers->npeers].last = *tv;
2414     peers->npeers++;
2415     return 1;
2416 }
2417
2418 static void transport_record_peers(struct site *st, transport_peers *peers,
2419                                    const struct comm_addr *addrs, int naddrs,
2420                                    const char *m) {
2421     /* We add addrs into peers.  The new entries end up at the front
2422      * and displace entries towards the end (perhaps even off the
2423      * end).  Any existing matching entries are moved up to the front.
2424      *
2425      * Caller must first call transport_peers_expire. */
2426
2427     if (naddrs==1) {
2428         /* avoids debug for uninteresting updates */
2429         int i;
2430         for (i=0; i<peers->npeers; i++) {
2431             if (comm_addr_equal(&addrs[0], &peers->peers[i].addr)) {
2432                 memmove(peers->peers+1, peers->peers,
2433                         sizeof(peers->peers[0]) * i);
2434                 peers->peers[0].addr = addrs[0];
2435                 peers->peers[0].last = *tv_now;
2436                 return;
2437             }
2438         }
2439     }
2440
2441     int old_npeers=peers->npeers;
2442     transport_peer old_peers[old_npeers];
2443     COPY_ARRAY(old_peers,peers->peers,old_npeers);
2444
2445     peers->npeers=0;
2446     int i;
2447     for (i=0; i<naddrs; i++) {
2448         if (!transport_peer_record_one(st,peers, &addrs[i], tv_now))
2449             break;
2450     }
2451     for (i=0; i<old_npeers; i++) {
2452         const transport_peer *old=&old_peers[i];
2453         if (!transport_peer_record_one(st,peers, &old->addr, &old->last))
2454             break;
2455     }
2456
2457     transport_peers_debug(st,peers,m, naddrs,addrs,0);
2458 }
2459
2460 static void transport_expire_record_peers(struct site *st,
2461                                           transport_peers *peers,
2462                                           const struct comm_addr *addrs,
2463                                           int naddrs, const char *m) {
2464     /* Convenience function */
2465     transport_peers_expire(st,peers);
2466     transport_record_peers(st,peers,addrs,naddrs,m);
2467 }
2468
2469 static bool_t transport_compute_setupinit_peers(struct site *st,
2470         const struct comm_addr *configured_addrs /* 0 if none or not found */,
2471         int n_configured_addrs /* 0 if none or not found */,
2472         const struct comm_addr *incoming_packet_addr /* 0 if none */) {
2473     if (!n_configured_addrs && !incoming_packet_addr &&
2474         !transport_peers_valid(&st->peers))
2475         return False;
2476
2477     slog(st,LOG_SETUP_INIT,
2478          "using: %d configured addr(s);%s %d old peer addrs(es)",
2479          n_configured_addrs,
2480          incoming_packet_addr ? " incoming packet address;" : "",
2481          st->peers.npeers);
2482
2483     /* Non-mobile peers try addresses until one is plausible.  The
2484      * effect is that this code always tries first the configured
2485      * address if supplied, or otherwise the address of the incoming
2486      * PROD, or finally the existing data peer if one exists; this is
2487      * as desired. */
2488
2489     transport_peers_copy(st,&st->setup_peers,&st->peers);
2490     transport_peers_expire(st,&st->setup_peers);
2491
2492     if (incoming_packet_addr)
2493         transport_record_peers(st,&st->setup_peers,
2494                                incoming_packet_addr,1, "incoming");
2495
2496     if (n_configured_addrs)
2497         transport_record_peers(st,&st->setup_peers,
2498                               configured_addrs,n_configured_addrs, "setupinit");
2499
2500     assert(transport_peers_valid(&st->setup_peers));
2501     return True;
2502 }
2503
2504 static void transport_setup_msgok(struct site *st, const struct comm_addr *a) {
2505     if (st->peer_mobile)
2506         transport_expire_record_peers(st,&st->setup_peers,a,1,"setupmsg");
2507 }
2508 static void transport_data_msgok(struct site *st, const struct comm_addr *a) {
2509     if (st->peer_mobile)
2510         transport_expire_record_peers(st,&st->peers,a,1,"datamsg");
2511 }
2512
2513 static int transport_peers_valid(transport_peers *peers) {
2514     return peers->npeers;
2515 }
2516 static void transport_peers_clear(struct site *st, transport_peers *peers) {
2517     peers->npeers= 0;
2518     transport_peers_debug(st,peers,"clear",0,0,0);
2519 }
2520 static void transport_peers_copy(struct site *st, transport_peers *dst,
2521                                  const transport_peers *src) {
2522     dst->npeers=src->npeers;
2523     COPY_ARRAY(dst->peers, src->peers, dst->npeers);
2524     transport_peers_debug(st,dst,"copy",
2525                           src->npeers, &src->peers->addr, sizeof(*src->peers));
2526 }
2527
2528 static void transport_resolve_complete(struct site *st,
2529                                        const struct comm_addr *addrs,
2530                                        int naddrs) {
2531     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2532                                   "resolved data");
2533     transport_expire_record_peers(st,&st->setup_peers,addrs,naddrs,
2534                                   "resolved setup");
2535 }
2536
2537 static void transport_resolve_complete_tardy(struct site *st,
2538                                              const struct comm_addr *addrs,
2539                                              int naddrs) {
2540     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2541                                   "resolved tardily");
2542 }
2543
2544 static void transport_peers__copy_by_mask(transport_peer *out, int *nout_io,
2545                                           unsigned mask,
2546                                           const transport_peers *inp) {
2547     /* out and in->peers may be the same region, or nonoverlapping */
2548     const transport_peer *in=inp->peers;
2549     int slot;
2550     for (slot=0; slot<inp->npeers; slot++) {
2551         if (!(mask & (1U << slot)))
2552             continue;
2553         if (!(out==in && slot==*nout_io))
2554             COPY_OBJ(out[*nout_io], in[slot]);
2555         (*nout_io)++;
2556     }
2557 }
2558
2559 void transport_xmit(struct site *st, transport_peers *peers,
2560                     struct buffer_if *buf, bool_t candebug) {
2561     int slot;
2562     transport_peers_expire(st, peers);
2563     unsigned failed=0; /* bitmask */
2564     assert(MAX_PEER_ADDRS < sizeof(unsigned)*CHAR_BIT);
2565
2566     int nfailed=0;
2567     for (slot=0; slot<peers->npeers; slot++) {
2568         transport_peer *peer=&peers->peers[slot];
2569         bool_t ok = comm_addr_sendmsg(st, &peer->addr, buf);
2570         if (candebug)
2571             dump_packet(st, buf, &peer->addr, False, ok);
2572         if (!ok) {
2573             failed |= 1U << slot;
2574             nfailed++;
2575         }
2576         if (ok && !st->peer_mobile)
2577             break;
2578     }
2579     /* Now we need to demote/delete failing addrs: if we are mobile we
2580      * merely demote them; otherwise we delete them. */
2581     if (st->local_mobile) {
2582         unsigned expected = ((1U << nfailed)-1) << (peers->npeers-nfailed);
2583         /* `expected' has all the failures at the end already */
2584         if (failed != expected) {
2585             int fslot=0;
2586             transport_peer failedpeers[nfailed];
2587             transport_peers__copy_by_mask(failedpeers, &fslot, failed,peers);
2588             assert(fslot == nfailed);
2589             int wslot=0;
2590             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2591             assert(wslot+nfailed == peers->npeers);
2592             COPY_ARRAY(peers->peers+wslot, failedpeers, nfailed);
2593             transport_peers_debug(st,peers,"mobile failure reorder",0,0,0);
2594         }
2595     } else {
2596         if (failed && peers->npeers > 1) {
2597             int wslot=0;
2598             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2599             peers->npeers=wslot;
2600             transport_peers_debug(st,peers,"non-mobile failure cleanup",0,0,0);
2601         }
2602     }
2603 }
2604
2605 /***** END of transport peers declarations *****/