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