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