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