chiark / gitweb /
0a0278592c52c12e63de2148aadcf249d07c0e8f
[secnet.git] / site.c
1 /* site.c - manage communication with a remote network site */
2
3 /* The 'site' code doesn't know anything about the structure of the
4    packets it's transmitting.  In fact, under the new netlink
5    configuration scheme it doesn't need to know anything at all about
6    IP addresses, except how to contact its peer.  This means it could
7    potentially be used to tunnel other protocols too (IPv6, IPX, plain
8    old Ethernet frames) if appropriate netlink code can be written
9    (and that ought not to be too hard, eg. using the TUN/TAP device to
10    pretend to be an Ethernet interface).  */
11
12 /* At some point in the future the netlink code will be asked for
13    configuration information to go in the PING/PONG packets at the end
14    of the key exchange. */
15
16 #include "secnet.h"
17 #include <stdio.h>
18 #include <string.h>
19 #include <limits.h>
20 #include <assert.h>
21 #include <sys/socket.h>
22
23 #include <sys/mman.h>
24 #include "util.h"
25 #include "unaligned.h"
26 #include "magic.h"
27
28 #define SETUP_BUFFER_LEN 2048
29
30 #define DEFAULT_KEY_LIFETIME                  (3600*1000) /* [ms] */
31 #define DEFAULT_KEY_RENEGOTIATE_GAP           (5*60*1000) /* [ms] */
32 #define DEFAULT_SETUP_RETRIES 5
33 #define DEFAULT_SETUP_RETRY_INTERVAL             (2*1000) /* [ms] */
34 #define DEFAULT_WAIT_TIME                       (20*1000) /* [ms] */
35
36 #define DEFAULT_MOBILE_KEY_LIFETIME      (2*24*3600*1000) /* [ms] */
37 #define DEFAULT_MOBILE_KEY_RENEGOTIATE_GAP (12*3600*1000) /* [ms] */
38 #define DEFAULT_MOBILE_SETUP_RETRIES 30
39 #define DEFAULT_MOBILE_SETUP_RETRY_INTERVAL      (1*1000) /* [ms] */
40 #define DEFAULT_MOBILE_WAIT_TIME                (10*1000) /* [ms] */
41
42 #define DEFAULT_MOBILE_PEER_EXPIRY            (2*60)      /* [s] */
43 #define DEFAULT_MOBILE_PEERS_MAX 3 /* send at most this many copies (default) */
44
45 /* Each site can be in one of several possible states. */
46
47 /* States:
48    SITE_STOP         - nothing is allowed to happen; tunnel is down;
49                        all session keys have been erased
50      -> SITE_RUN upon external instruction
51    SITE_RUN          - site up, maybe with valid key
52      -> SITE_RESOLVE upon outgoing packet and no valid key
53          we start name resolution for the other end of the tunnel
54      -> SITE_SENTMSG2 upon valid incoming message 1 and suitable time
55          we send an appropriate message 2
56    SITE_RESOLVE      - waiting for name resolution
57      -> SITE_SENTMSG1 upon successful resolution
58          we send an appropriate message 1
59      -> SITE_SENTMSG2 upon valid incoming message 1 (then abort resolution)
60          we abort resolution and 
61      -> SITE_WAIT on timeout or resolution failure
62    SITE_SENTMSG1
63      -> SITE_SENTMSG2 upon valid incoming message 1 from higher priority end
64      -> SITE_SENTMSG3 upon valid incoming message 2
65      -> SITE_WAIT on timeout
66    SITE_SENTMSG2
67      -> SITE_SENTMSG4 upon valid incoming message 3
68      -> SITE_WAIT on timeout
69    SITE_SENTMSG3
70      -> SITE_SENTMSG5 upon valid incoming message 4
71      -> SITE_WAIT on timeout
72    SITE_SENTMSG4
73      -> SITE_RUN upon valid incoming message 5
74      -> SITE_WAIT on timeout
75    SITE_SENTMSG5
76      -> SITE_RUN upon valid incoming message 6
77      -> SITE_WAIT on timeout
78    SITE_WAIT         - failed to establish key; do nothing for a while
79      -> SITE_RUN on timeout
80    */
81
82 #define SITE_STOP     0
83 #define SITE_RUN      1
84 #define SITE_RESOLVE  2
85 #define SITE_SENTMSG1 3
86 #define SITE_SENTMSG2 4
87 #define SITE_SENTMSG3 5
88 #define SITE_SENTMSG4 6
89 #define SITE_SENTMSG5 7
90 #define SITE_WAIT     8
91
92 static cstring_t state_name(uint32_t state)
93 {
94     switch (state) {
95     case 0: return "STOP";
96     case 1: return "RUN";
97     case 2: return "RESOLVE";
98     case 3: return "SENTMSG1";
99     case 4: return "SENTMSG2";
100     case 5: return "SENTMSG3";
101     case 6: return "SENTMSG4";
102     case 7: return "SENTMSG5";
103     case 8: return "WAIT";
104     default: return "*bad state*";
105     }
106 }
107
108 #define NONCELEN 8
109
110 #define LOG_UNEXPECTED    0x00000001
111 #define LOG_SETUP_INIT    0x00000002
112 #define LOG_SETUP_TIMEOUT 0x00000004
113 #define LOG_ACTIVATE_KEY  0x00000008
114 #define LOG_TIMEOUT_KEY   0x00000010
115 #define LOG_SEC           0x00000020
116 #define LOG_STATE         0x00000040
117 #define LOG_DROP          0x00000080
118 #define LOG_DUMP          0x00000100
119 #define LOG_ERROR         0x00000400
120 #define LOG_PEER_ADDRS    0x00000800
121
122 static struct flagstr log_event_table[]={
123     { "unexpected", LOG_UNEXPECTED },
124     { "setup-init", LOG_SETUP_INIT },
125     { "setup-timeout", LOG_SETUP_TIMEOUT },
126     { "activate-key", LOG_ACTIVATE_KEY },
127     { "timeout-key", LOG_TIMEOUT_KEY },
128     { "security", LOG_SEC },
129     { "state-change", LOG_STATE },
130     { "packet-drop", LOG_DROP },
131     { "dump-packets", LOG_DUMP },
132     { "errors", LOG_ERROR },
133     { "peer-addrs", LOG_PEER_ADDRS },
134     { "default", LOG_SETUP_INIT|LOG_SETUP_TIMEOUT|
135       LOG_ACTIVATE_KEY|LOG_TIMEOUT_KEY|LOG_SEC|LOG_ERROR },
136     { "all", 0xffffffff },
137     { NULL, 0 }
138 };
139
140
141 /***** TRANSPORT PEERS declarations *****/
142
143 /* Details of "mobile peer" semantics:
144    
145    - We record mobile_peers_max peer address/port numbers ("peers")
146      for key setup, and separately mobile_peers_max for data
147      transfer.  If these lists fill up, we retain the newest peers.
148      (For non-mobile peers we only record one of each.)
149
150    - Outgoing packets are sent to every recorded peer in the
151      applicable list.
152
153    - Data transfer peers are straightforward: whenever we successfully
154      process a data packet, we record the peer.  Also, whenever we
155      successfully complete a key setup, we merge the key setup
156      peers into the data transfer peers.
157
158      (For "non-mobile" peers we simply copy the peer used for
159      successful key setup, and don't change the peer otherwise.)
160
161    - Key setup peers are slightly more complicated.
162
163      Whenever we receive and successfully process a key exchange
164      packet, we record the peer.
165
166      Whenever we try to initiate a key setup, we copy the list of data
167      transfer peers and use it for key setup.  But we also look to see
168      if the config supplies an address and port number and if so we
169      add that as a key setup peer (possibly evicting one of the data
170      transfer peers we just copied).
171
172      (For "non-mobile" peers, if we if we have a configured peer
173      address and port, we always use that; otherwise if we have a
174      current data peer address we use that; otherwise we do not
175      attempt to initiate a key setup for lack of a peer address.)
176
177    "Record the peer" means
178     1. expire any peers last seen >120s ("mobile-peer-expiry") ago
179     2. add the peer of the just received packet to the applicable list
180        (possibly evicting older entries)
181    NB that we do not expire peers until an incoming packet arrives.
182
183    */
184
185 #define MAX_MOBILE_PEERS_MAX 5 /* send at most this many copies, compiled max */
186
187 typedef struct {
188     struct timeval last;
189     struct comm_addr addr;
190 } transport_peer;
191
192 typedef struct {
193 /* configuration information */
194 /* runtime information */
195     int npeers;
196     transport_peer peers[MAX_MOBILE_PEERS_MAX];
197 } transport_peers;
198
199 static void transport_peers_clear(struct site *st, transport_peers *peers);
200 static int transport_peers_valid(transport_peers *peers);
201 static void transport_peers_copy(struct site *st, transport_peers *dst,
202                                  const transport_peers *src);
203
204 static void transport_setup_msgok(struct site *st, const struct comm_addr *a);
205 static void transport_data_msgok(struct site *st, const struct comm_addr *a);
206 static bool_t transport_compute_setupinit_peers(struct site *st,
207         const struct comm_addr *configured_addr /* 0 if none or not found */);
208 static void transport_record_peer(struct site *st, transport_peers *peers,
209                                   const struct comm_addr *addr, const char *m);
210
211 static void transport_xmit(struct site *st, transport_peers *peers,
212                            struct buffer_if *buf, bool_t candebug);
213
214  /***** END of transport peers declarations *****/
215
216
217 struct data_key {
218     struct transform_inst_if *transform;
219     uint64_t key_timeout; /* End of life of current key */
220     uint32_t remote_session_id;
221 };
222
223 struct site {
224     closure_t cl;
225     struct site_if ops;
226 /* configuration information */
227     string_t localname;
228     string_t remotename;
229     bool_t peer_mobile; /* Mobile client support */
230     int32_t transport_peers_max;
231     string_t tunname; /* localname<->remotename by default, used in logs */
232     string_t address; /* DNS name for bootstrapping, optional */
233     int remoteport; /* Port for bootstrapping, optional */
234     struct netlink_if *netlink;
235     struct comm_if **comms;
236     int ncomms;
237     struct resolver_if *resolver;
238     struct log_if *log;
239     struct random_if *random;
240     struct rsaprivkey_if *privkey;
241     struct rsapubkey_if *pubkey;
242     struct transform_if *transform;
243     struct dh_if *dh;
244     struct hash_if *hash;
245
246     uint32_t index; /* Index of this site */
247     uint32_t local_capabilities;
248     int32_t setup_retries; /* How many times to send setup packets */
249     int32_t setup_retry_interval; /* Initial timeout for setup packets */
250     int32_t wait_timeout; /* How long to wait if setup unsuccessful */
251     int32_t mobile_peer_expiry; /* How long to remember 2ary addresses */
252     int32_t key_lifetime; /* How long a key lasts once set up */
253     int32_t key_renegotiate_time; /* If we see traffic (or a keepalive)
254                                       after this time, initiate a new
255                                       key exchange */
256
257     bool_t setup_priority; /* Do we have precedence if both sites emit
258                               message 1 simultaneously? */
259     uint32_t log_events;
260
261 /* runtime information */
262     uint32_t state;
263     uint64_t now; /* Most recently seen time */
264
265     /* The currently established session */
266     struct data_key current;
267     struct data_key auxiliary_key;
268     bool_t auxiliary_is_new;
269     uint64_t renegotiate_key_time; /* When we can negotiate a new key */
270     uint64_t auxiliary_renegotiate_key_time;
271     transport_peers peers; /* Current address(es) of peer for data traffic */
272
273     /* The current key setup protocol exchange.  We can only be
274        involved in one of these at a time.  There's a potential for
275        denial of service here (the attacker keeps sending a setup
276        packet; we keep trying to continue the exchange, and have to
277        timeout before we can listen for another setup packet); perhaps
278        we should keep a list of 'bad' sources for setup packets. */
279     uint32_t remote_capabilities;
280     uint32_t setup_session_id;
281     transport_peers setup_peers;
282     uint8_t localN[NONCELEN]; /* Nonces for key exchange */
283     uint8_t remoteN[NONCELEN];
284     struct buffer_if buffer; /* Current outgoing key exchange packet */
285     struct buffer_if scratch;
286     int32_t retries; /* Number of retries remaining */
287     uint64_t timeout; /* Timeout for current state */
288     uint8_t *dhsecret;
289     uint8_t *sharedsecret;
290     uint32_t sharedsecretlen;
291     struct transform_inst_if *new_transform; /* For key setup/verify */
292 };
293
294 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
295 {
296     va_list ap;
297     char buf[240];
298     uint32_t class;
299
300     va_start(ap,msg);
301
302     if (event&st->log_events) {
303         switch(event) {
304         case LOG_UNEXPECTED: class=M_INFO; break;
305         case LOG_SETUP_INIT: class=M_INFO; break;
306         case LOG_SETUP_TIMEOUT: class=M_NOTICE; break;
307         case LOG_ACTIVATE_KEY: class=M_INFO; break;
308         case LOG_TIMEOUT_KEY: class=M_INFO; break;
309         case LOG_SEC: class=M_SECURITY; break;
310         case LOG_STATE: class=M_DEBUG; break;
311         case LOG_DROP: class=M_DEBUG; break;
312         case LOG_DUMP: class=M_DEBUG; break;
313         case LOG_ERROR: class=M_ERR; break;
314         case LOG_PEER_ADDRS: class=M_DEBUG; break;
315         default: class=M_ERR; break;
316         }
317
318         vsnprintf(buf,sizeof(buf),msg,ap);
319         st->log->log(st->log->st,class,"%s: %s",st->tunname,buf);
320     }
321     va_end(ap);
322 }
323
324 static void set_link_quality(struct site *st);
325 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel);
326 static void delete_one_key(struct site *st, struct data_key *key,
327                            const char *reason /* may be 0 meaning don't log*/,
328                            const char *which /* ignored if !reasonn */,
329                            uint32_t loglevel /* ignored if !reasonn */);
330 static bool_t initiate_key_setup(struct site *st, cstring_t reason);
331 static void enter_state_run(struct site *st);
332 static bool_t enter_state_resolve(struct site *st);
333 static bool_t enter_new_state(struct site *st,uint32_t next);
334 static void enter_state_wait(struct site *st);
335 static void activate_new_key(struct site *st);
336
337 static bool_t current_valid(struct site *st)
338 {
339     return st->current.transform->valid(st->current.transform->st);
340 }
341
342 #define CHECK_AVAIL(b,l) do { if ((b)->size<(l)) return False; } while(0)
343 #define CHECK_EMPTY(b) do { if ((b)->size!=0) return False; } while(0)
344 #define CHECK_TYPE(b,t) do { uint32_t type; \
345     CHECK_AVAIL((b),4); \
346     type=buf_unprepend_uint32((b)); \
347     if (type!=(t)) return False; } while(0)
348
349 struct parsedname {
350     int32_t len;
351     uint8_t *name;
352     struct buffer_if extrainfo;
353 };
354
355 struct msg {
356     uint8_t *hashstart;
357     uint32_t dest;
358     uint32_t source;
359     struct parsedname remote;
360     struct parsedname local;
361     uint32_t remote_capabilities;
362     uint8_t *nR;
363     uint8_t *nL;
364     int32_t pklen;
365     char *pk;
366     int32_t hashlen;
367     int32_t siglen;
368     char *sig;
369 };
370
371 struct xinfoadd {
372     int32_t lenpos, afternul;
373 };
374 static void append_string_xinfo_start(struct buffer_if *buf,
375                                       struct xinfoadd *xia,
376                                       const char *str)
377     /* Helps construct one of the names with additional info as found
378      * in MSG1..4.  Call this function first, then append all the
379      * desired extra info (not including the nul byte) to the buffer,
380      * then call append_string_xinfo_done. */
381 {
382     xia->lenpos = buf->size;
383     buf_append_string(buf,str);
384     buf_append_uint8(buf,0);
385     xia->afternul = buf->size;
386 }
387 static void append_string_xinfo_done(struct buffer_if *buf,
388                                      struct xinfoadd *xia)
389 {
390     /* we just need to adjust the string length */
391     if (buf->size == xia->afternul) {
392         /* no extra info, strip the nul too */
393         buf_unappend_uint8(buf);
394     } else {
395         put_uint16(buf->start+xia->lenpos, buf->size-(xia->lenpos+2));
396     }
397 }
398
399 /* Build any of msg1 to msg4. msg5 and msg6 are built from the inside
400    out using a transform of config data supplied by netlink */
401 static bool_t generate_msg(struct site *st, uint32_t type, cstring_t what)
402 {
403     void *hst;
404     uint8_t *hash;
405     string_t dhpub, sig;
406
407     st->retries=st->setup_retries;
408     BUF_ALLOC(&st->buffer,what);
409     buffer_init(&st->buffer,0);
410     buf_append_uint32(&st->buffer,
411         (type==LABEL_MSG1?0:st->setup_session_id));
412     buf_append_uint32(&st->buffer,st->index);
413     buf_append_uint32(&st->buffer,type);
414
415     struct xinfoadd xia;
416     append_string_xinfo_start(&st->buffer,&xia,st->localname);
417     if ((st->local_capabilities & CAPAB_EARLY) || (type != LABEL_MSG1)) {
418         buf_append_uint32(&st->buffer,st->local_capabilities);
419     }
420     append_string_xinfo_done(&st->buffer,&xia);
421
422     buf_append_string(&st->buffer,st->remotename);
423     memcpy(buf_append(&st->buffer,NONCELEN),st->localN,NONCELEN);
424     if (type==LABEL_MSG1) return True;
425     memcpy(buf_append(&st->buffer,NONCELEN),st->remoteN,NONCELEN);
426     if (type==LABEL_MSG2) return True;
427
428     if (hacky_par_mid_failnow()) return False;
429
430     dhpub=st->dh->makepublic(st->dh->st,st->dhsecret,st->dh->len);
431     buf_append_string(&st->buffer,dhpub);
432     free(dhpub);
433     hash=safe_malloc(st->hash->len, "generate_msg");
434     hst=st->hash->init();
435     st->hash->update(hst,st->buffer.start,st->buffer.size);
436     st->hash->final(hst,hash);
437     sig=st->privkey->sign(st->privkey->st,hash,st->hash->len);
438     buf_append_string(&st->buffer,sig);
439     free(sig);
440     free(hash);
441     return True;
442 }
443
444 static bool_t unpick_name(struct buffer_if *msg, struct parsedname *nm)
445 {
446     CHECK_AVAIL(msg,2);
447     nm->len=buf_unprepend_uint16(msg);
448     CHECK_AVAIL(msg,nm->len);
449     nm->name=buf_unprepend(msg,nm->len);
450     uint8_t *nul=memchr(nm->name,0,nm->len);
451     if (!nul) {
452         buffer_readonly_view(&nm->extrainfo,0,0);
453     } else {
454         buffer_readonly_view(&nm->extrainfo, nul+1, msg->start-(nul+1));
455         nm->len=nul-nm->name;
456     }
457     return True;
458 }
459
460 static bool_t unpick_msg(struct site *st, uint32_t type,
461                          struct buffer_if *msg, struct msg *m)
462 {
463     m->hashstart=msg->start;
464     CHECK_AVAIL(msg,4);
465     m->dest=buf_unprepend_uint32(msg);
466     CHECK_AVAIL(msg,4);
467     m->source=buf_unprepend_uint32(msg);
468     CHECK_TYPE(msg,type);
469     if (!unpick_name(msg,&m->remote)) return False;
470     m->remote_capabilities=0;
471     if (m->remote.extrainfo.size) {
472         CHECK_AVAIL(&m->remote.extrainfo,4);
473         m->remote_capabilities=buf_unprepend_uint32(&m->remote.extrainfo);
474     }
475     if (!unpick_name(msg,&m->local)) return False;
476     CHECK_AVAIL(msg,NONCELEN);
477     m->nR=buf_unprepend(msg,NONCELEN);
478     if (type==LABEL_MSG1) {
479         CHECK_EMPTY(msg);
480         return True;
481     }
482     CHECK_AVAIL(msg,NONCELEN);
483     m->nL=buf_unprepend(msg,NONCELEN);
484     if (type==LABEL_MSG2) {
485         CHECK_EMPTY(msg);
486         return True;
487     }
488     CHECK_AVAIL(msg,2);
489     m->pklen=buf_unprepend_uint16(msg);
490     CHECK_AVAIL(msg,m->pklen);
491     m->pk=buf_unprepend(msg,m->pklen);
492     m->hashlen=msg->start-m->hashstart;
493     CHECK_AVAIL(msg,2);
494     m->siglen=buf_unprepend_uint16(msg);
495     CHECK_AVAIL(msg,m->siglen);
496     m->sig=buf_unprepend(msg,m->siglen);
497     CHECK_EMPTY(msg);
498     return True;
499 }
500
501 static bool_t name_matches(const struct parsedname *nm, const char *expected)
502 {
503     int expected_len=strlen(expected);
504     return
505         nm->len == expected_len &&
506         !memcmp(nm->name, expected, expected_len);
507 }    
508
509 static bool_t check_msg(struct site *st, uint32_t type, struct msg *m,
510                         cstring_t *error)
511 {
512     if (type==LABEL_MSG1) return True;
513
514     /* Check that the site names and our nonce have been sent
515        back correctly, and then store our peer's nonce. */ 
516     if (!name_matches(&m->remote,st->remotename)) {
517         *error="wrong remote site name";
518         return False;
519     }
520     if (!name_matches(&m->local,st->localname)) {
521         *error="wrong local site name";
522         return False;
523     }
524     if (memcmp(m->nL,st->localN,NONCELEN)!=0) {
525         *error="wrong locally-generated nonce";
526         return False;
527     }
528     if (type==LABEL_MSG2) return True;
529     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN)!=0) {
530         *error="wrong remotely-generated nonce";
531         return False;
532     }
533     /* MSG3 has complicated rules about capabilities, which are
534      * handled in process_msg3. */
535     if (type==LABEL_MSG3) return True;
536     if (m->remote_capabilities!=st->remote_capabilities) {
537         *error="remote capabilities changed";
538         return False;
539     }
540     if (type==LABEL_MSG4) return True;
541     *error="unknown message type";
542     return False;
543 }
544
545 static bool_t generate_msg1(struct site *st)
546 {
547     st->random->generate(st->random->st,NONCELEN,st->localN);
548     return generate_msg(st,LABEL_MSG1,"site:MSG1");
549 }
550
551 static bool_t process_msg1(struct site *st, struct buffer_if *msg1,
552                            const struct comm_addr *src, struct msg *m)
553 {
554     /* We've already determined we're in an appropriate state to
555        process an incoming MSG1, and that the MSG1 has correct values
556        of A and B. */
557
558     transport_record_peer(st,&st->setup_peers,src,"msg1");
559     st->setup_session_id=m->source;
560     st->remote_capabilities=m->remote_capabilities;
561     memcpy(st->remoteN,m->nR,NONCELEN);
562     return True;
563 }
564
565 static bool_t generate_msg2(struct site *st)
566 {
567     st->random->generate(st->random->st,NONCELEN,st->localN);
568     return generate_msg(st,LABEL_MSG2,"site:MSG2");
569 }
570
571 static bool_t process_msg2(struct site *st, struct buffer_if *msg2,
572                            const struct comm_addr *src)
573 {
574     struct msg m;
575     cstring_t err;
576
577     if (!unpick_msg(st,LABEL_MSG2,msg2,&m)) return False;
578     if (!check_msg(st,LABEL_MSG2,&m,&err)) {
579         slog(st,LOG_SEC,"msg2: %s",err);
580         return False;
581     }
582     st->setup_session_id=m.source;
583     st->remote_capabilities=m.remote_capabilities;
584     memcpy(st->remoteN,m.nR,NONCELEN);
585     return True;
586 }
587
588 static bool_t generate_msg3(struct site *st)
589 {
590     /* Now we have our nonce and their nonce. Think of a secret key,
591        and create message number 3. */
592     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
593     return generate_msg(st,LABEL_MSG3,"site:MSG3");
594 }
595
596 static bool_t process_msg3(struct site *st, struct buffer_if *msg3,
597                            const struct comm_addr *src)
598 {
599     struct msg m;
600     uint8_t *hash;
601     void *hst;
602     cstring_t err;
603
604     if (!unpick_msg(st,LABEL_MSG3,msg3,&m)) return False;
605     if (!check_msg(st,LABEL_MSG3,&m,&err)) {
606         slog(st,LOG_SEC,"msg3: %s",err);
607         return False;
608     }
609     uint32_t capab_adv_late = m.remote_capabilities
610         & ~st->remote_capabilities & CAPAB_EARLY;
611     if (capab_adv_late) {
612         slog(st,LOG_SEC,"msg3 impermissibly adds early capability flag(s)"
613              " %#"PRIx32" (was %#"PRIx32", now %#"PRIx32")",
614              capab_adv_late, st->remote_capabilities, m.remote_capabilities);
615         return False;
616     }
617     st->remote_capabilities|=m.remote_capabilities;
618
619     /* Check signature and store g^x mod m */
620     hash=safe_malloc(st->hash->len, "process_msg3");
621     hst=st->hash->init();
622     st->hash->update(hst,m.hashstart,m.hashlen);
623     st->hash->final(hst,hash);
624     /* Terminate signature with a '0' - cheating, but should be ok */
625     m.sig[m.siglen]=0;
626     if (!st->pubkey->check(st->pubkey->st,hash,st->hash->len,m.sig)) {
627         slog(st,LOG_SEC,"msg3 signature failed check!");
628         free(hash);
629         return False;
630     }
631     free(hash);
632
633     /* Terminate their DH public key with a '0' */
634     m.pk[m.pklen]=0;
635     /* Invent our DH secret key */
636     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
637
638     /* Generate the shared key */
639     st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->len,m.pk,
640                        st->sharedsecret,st->sharedsecretlen);
641
642     /* Set up the transform */
643     st->new_transform->setkey(st->new_transform->st,st->sharedsecret,
644                               st->sharedsecretlen,st->setup_priority);
645
646     return True;
647 }
648
649 static bool_t generate_msg4(struct site *st)
650 {
651     /* We have both nonces, their public key and our private key. Generate
652        our public key, sign it and send it to them. */
653     return generate_msg(st,LABEL_MSG4,"site:MSG4");
654 }
655
656 static bool_t process_msg4(struct site *st, struct buffer_if *msg4,
657                            const struct comm_addr *src)
658 {
659     struct msg m;
660     uint8_t *hash;
661     void *hst;
662     cstring_t err;
663
664     if (!unpick_msg(st,LABEL_MSG4,msg4,&m)) return False;
665     if (!check_msg(st,LABEL_MSG4,&m,&err)) {
666         slog(st,LOG_SEC,"msg4: %s",err);
667         return False;
668     }
669     
670     /* Check signature and store g^x mod m */
671     hash=safe_malloc(st->hash->len, "process_msg4");
672     hst=st->hash->init();
673     st->hash->update(hst,m.hashstart,m.hashlen);
674     st->hash->final(hst,hash);
675     /* Terminate signature with a '0' - cheating, but should be ok */
676     m.sig[m.siglen]=0;
677     if (!st->pubkey->check(st->pubkey->st,hash,st->hash->len,m.sig)) {
678         slog(st,LOG_SEC,"msg4 signature failed check!");
679         free(hash);
680         return False;
681     }
682     free(hash);
683
684     /* Terminate their DH public key with a '0' */
685     m.pk[m.pklen]=0;
686     /* Generate the shared key */
687     st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->len,m.pk,
688                        st->sharedsecret,st->sharedsecretlen);
689     /* Set up the transform */
690     st->new_transform->setkey(st->new_transform->st,st->sharedsecret,
691                               st->sharedsecretlen,st->setup_priority);
692
693     return True;
694 }
695
696 struct msg0 {
697     uint32_t dest;
698     uint32_t source;
699     uint32_t type;
700 };
701
702 static bool_t unpick_msg0(struct site *st, struct buffer_if *msg0,
703                           struct msg0 *m)
704 {
705     CHECK_AVAIL(msg0,4);
706     m->dest=buf_unprepend_uint32(msg0);
707     CHECK_AVAIL(msg0,4);
708     m->source=buf_unprepend_uint32(msg0);
709     CHECK_AVAIL(msg0,4);
710     m->type=buf_unprepend_uint32(msg0);
711     return True;
712     /* Leaves transformed part of buffer untouched */
713 }
714
715 static bool_t generate_msg5(struct site *st)
716 {
717     cstring_t transform_err;
718
719     BUF_ALLOC(&st->buffer,"site:MSG5");
720     /* We are going to add four words to the message */
721     buffer_init(&st->buffer,st->transform->max_start_pad+(4*4));
722     /* Give the netlink code an opportunity to put its own stuff in the
723        message (configuration information, etc.) */
724     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
725     st->new_transform->forwards(st->new_transform->st,&st->buffer,
726                                 &transform_err);
727     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
728     buf_prepend_uint32(&st->buffer,st->index);
729     buf_prepend_uint32(&st->buffer,st->setup_session_id);
730
731     st->retries=st->setup_retries;
732     return True;
733 }
734
735 static bool_t process_msg5(struct site *st, struct buffer_if *msg5,
736                            const struct comm_addr *src,
737                            struct transform_inst_if *transform)
738 {
739     struct msg0 m;
740     cstring_t transform_err;
741
742     if (!unpick_msg0(st,msg5,&m)) return False;
743
744     if (transform->reverse(transform->st,msg5,&transform_err)) {
745         /* There's a problem */
746         slog(st,LOG_SEC,"process_msg5: transform: %s",transform_err);
747         return False;
748     }
749     /* Buffer should now contain untransformed PING packet data */
750     CHECK_AVAIL(msg5,4);
751     if (buf_unprepend_uint32(msg5)!=LABEL_MSG5) {
752         slog(st,LOG_SEC,"MSG5/PING packet contained wrong label");
753         return False;
754     }
755     /* Older versions of secnet used to write some config data here
756      * which we ignore.  So we don't CHECK_EMPTY */
757     return True;
758 }
759
760 static void create_msg6(struct site *st, struct transform_inst_if *transform,
761                         uint32_t session_id)
762 {
763     cstring_t transform_err;
764
765     BUF_ALLOC(&st->buffer,"site:MSG6");
766     /* We are going to add four words to the message */
767     buffer_init(&st->buffer,st->transform->max_start_pad+(4*4));
768     /* Give the netlink code an opportunity to put its own stuff in the
769        message (configuration information, etc.) */
770     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
771     transform->forwards(transform->st,&st->buffer,&transform_err);
772     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
773     buf_prepend_uint32(&st->buffer,st->index);
774     buf_prepend_uint32(&st->buffer,session_id);
775 }
776
777 static bool_t generate_msg6(struct site *st)
778 {
779     create_msg6(st,st->new_transform,st->setup_session_id);
780     st->retries=1; /* Peer will retransmit MSG5 if this packet gets lost */
781     return True;
782 }
783
784 static bool_t process_msg6(struct site *st, struct buffer_if *msg6,
785                            const struct comm_addr *src)
786 {
787     struct msg0 m;
788     cstring_t transform_err;
789
790     if (!unpick_msg0(st,msg6,&m)) return False;
791
792     if (st->new_transform->reverse(st->new_transform->st,
793                                    msg6,&transform_err)) {
794         /* There's a problem */
795         slog(st,LOG_SEC,"process_msg6: transform: %s",transform_err);
796         return False;
797     }
798     /* Buffer should now contain untransformed PING packet data */
799     CHECK_AVAIL(msg6,4);
800     if (buf_unprepend_uint32(msg6)!=LABEL_MSG6) {
801         slog(st,LOG_SEC,"MSG6/PONG packet contained invalid data");
802         return False;
803     }
804     /* Older versions of secnet used to write some config data here
805      * which we ignore.  So we don't CHECK_EMPTY */
806     return True;
807 }
808
809 static bool_t decrypt_msg0(struct site *st, struct buffer_if *msg0,
810                            const struct comm_addr *src)
811 {
812     cstring_t transform_err, auxkey_err, newkey_err="n/a";
813     struct msg0 m;
814     uint32_t problem;
815
816     if (!unpick_msg0(st,msg0,&m)) return False;
817
818     /* Keep a copy so we can try decrypting it with multiple keys */
819     buffer_copy(&st->scratch, msg0);
820
821     problem = st->current.transform->reverse(st->current.transform->st,
822                                              msg0,&transform_err);
823     if (!problem) {
824         if (!st->auxiliary_is_new)
825             delete_one_key(st,&st->auxiliary_key,
826                            "peer has used new key","auxiliary key",LOG_SEC);
827         return True;
828     }
829     if (problem==2)
830         goto skew;
831
832     buffer_copy(msg0, &st->scratch);
833     problem = st->auxiliary_key.transform->reverse
834         (st->auxiliary_key.transform->st,msg0,&auxkey_err);
835     if (problem==0) {
836         slog(st,LOG_DROP,"processing packet which uses auxiliary key");
837         if (st->auxiliary_is_new) {
838             /* We previously timed out in state SENTMSG5 but it turns
839              * out that our peer did in fact get our MSG5 and is
840              * using the new key.  So we should switch to it too. */
841             /* This is a bit like activate_new_key. */
842             struct data_key t;
843             t=st->current;
844             st->current=st->auxiliary_key;
845             st->auxiliary_key=t;
846
847             delete_one_key(st,&st->auxiliary_key,"peer has used new key",
848                            "previous key",LOG_SEC);
849             st->auxiliary_is_new=0;
850             st->renegotiate_key_time=st->auxiliary_renegotiate_key_time;
851         }
852         return True;
853     }
854     if (problem==2)
855         goto skew;
856
857     if (st->state==SITE_SENTMSG5) {
858         buffer_copy(msg0, &st->scratch);
859         problem = st->new_transform->reverse(st->new_transform->st,
860                                              msg0,&newkey_err);
861         if (!problem) {
862             /* It looks like we didn't get the peer's MSG6 */
863             /* This is like a cut-down enter_new_state(SITE_RUN) */
864             slog(st,LOG_STATE,"will enter state RUN (MSG0 with new key)");
865             BUF_FREE(&st->buffer);
866             st->timeout=0;
867             activate_new_key(st);
868             return True; /* do process the data in this packet */
869         }
870         if (problem==2)
871             goto skew;
872     }
873
874     slog(st,LOG_SEC,"transform: %s (aux: %s, new: %s)",
875          transform_err,auxkey_err,newkey_err);
876     initiate_key_setup(st,"incoming message would not decrypt");
877     send_nak(src,m.dest,m.source,m.type,msg0,"message would not decrypt");
878     return False;
879
880  skew:
881     slog(st,LOG_DROP,"transform: %s (merely skew)",transform_err);
882     return False;
883 }
884
885 static bool_t process_msg0(struct site *st, struct buffer_if *msg0,
886                            const struct comm_addr *src)
887 {
888     uint32_t type;
889
890     if (!decrypt_msg0(st,msg0,src))
891         return False;
892
893     CHECK_AVAIL(msg0,4);
894     type=buf_unprepend_uint32(msg0);
895     switch(type) {
896     case LABEL_MSG7:
897         /* We must forget about the current session. */
898         delete_keys(st,"request from peer",LOG_SEC);
899         return True;
900     case LABEL_MSG9:
901         /* Deliver to netlink layer */
902         st->netlink->deliver(st->netlink->st,msg0);
903         transport_data_msgok(st,src);
904         /* See whether we should start negotiating a new key */
905         if (st->now > st->renegotiate_key_time)
906             initiate_key_setup(st,"incoming packet in renegotiation window");
907         return True;
908     default:
909         slog(st,LOG_SEC,"incoming encrypted message of type %08x "
910              "(unknown)",type);
911         break;
912     }
913     return False;
914 }
915
916 static void dump_packet(struct site *st, struct buffer_if *buf,
917                         const struct comm_addr *addr, bool_t incoming)
918 {
919     uint32_t dest=get_uint32(buf->start);
920     uint32_t source=get_uint32(buf->start+4);
921     uint32_t msgtype=get_uint32(buf->start+8);
922
923     if (st->log_events & LOG_DUMP)
924         slilog(st->log,M_DEBUG,"%s: %s: %08x<-%08x: %08x:",
925                st->tunname,incoming?"incoming":"outgoing",
926                dest,source,msgtype);
927 }
928
929 static uint32_t site_status(void *st)
930 {
931     return 0;
932 }
933
934 static bool_t send_msg(struct site *st)
935 {
936     if (st->retries>0) {
937         transport_xmit(st, &st->setup_peers, &st->buffer, True);
938         st->timeout=st->now+st->setup_retry_interval;
939         st->retries--;
940         return True;
941     } else if (st->state==SITE_SENTMSG5) {
942         slog(st,LOG_SETUP_TIMEOUT,"timed out sending MSG5, stashing new key");
943         /* We stash the key we have produced, in case it turns out that
944          * our peer did see our MSG5 after all and starts using it. */
945         /* This is a bit like some of activate_new_key */
946         struct transform_inst_if *t;
947         t=st->auxiliary_key.transform;
948         st->auxiliary_key.transform=st->new_transform;
949         st->new_transform=t;
950
951         t->delkey(t->st);
952         st->auxiliary_is_new=1;
953         st->auxiliary_key.key_timeout=st->now+st->key_lifetime;
954         st->auxiliary_renegotiate_key_time=st->now+st->key_renegotiate_time;
955         st->auxiliary_key.remote_session_id=st->setup_session_id;
956
957         enter_state_wait(st);
958         return False;
959     } else {
960         slog(st,LOG_SETUP_TIMEOUT,"timed out sending key setup packet "
961             "(in state %s)",state_name(st->state));
962         enter_state_wait(st);
963         return False;
964     }
965 }
966
967 static void site_resolve_callback(void *sst, struct in_addr *address)
968 {
969     struct site *st=sst;
970     struct comm_addr ca_buf, *ca_use;
971
972     if (st->state!=SITE_RESOLVE) {
973         slog(st,LOG_UNEXPECTED,"site_resolve_callback called unexpectedly");
974         return;
975     }
976     if (address) {
977         FILLZERO(ca_buf);
978         ca_buf.comm=st->comms[0];
979         ca_buf.sin.sin_family=AF_INET;
980         ca_buf.sin.sin_port=htons(st->remoteport);
981         ca_buf.sin.sin_addr=*address;
982         ca_use=&ca_buf;
983     } else {
984         slog(st,LOG_ERROR,"resolution of %s failed",st->address);
985         ca_use=0;
986     }
987     if (transport_compute_setupinit_peers(st,ca_use)) {
988         enter_new_state(st,SITE_SENTMSG1);
989     } else {
990         /* Can't figure out who to try to to talk to */
991         slog(st,LOG_SETUP_INIT,"key exchange failed: cannot find peer address");
992         enter_state_run(st);
993     }
994 }
995
996 static bool_t initiate_key_setup(struct site *st, cstring_t reason)
997 {
998     if (st->state!=SITE_RUN) return False;
999     slog(st,LOG_SETUP_INIT,"initiating key exchange (%s)",reason);
1000     if (st->address) {
1001         slog(st,LOG_SETUP_INIT,"resolving peer address");
1002         return enter_state_resolve(st);
1003     } else if (transport_compute_setupinit_peers(st,0)) {
1004         return enter_new_state(st,SITE_SENTMSG1);
1005     }
1006     slog(st,LOG_SETUP_INIT,"key exchange failed: no address for peer");
1007     return False;
1008 }
1009
1010 static void activate_new_key(struct site *st)
1011 {
1012     struct transform_inst_if *t;
1013
1014     /* We have three transform instances, which we swap between old,
1015        active and setup */
1016     t=st->auxiliary_key.transform;
1017     st->auxiliary_key.transform=st->current.transform;
1018     st->current.transform=st->new_transform;
1019     st->new_transform=t;
1020
1021     t->delkey(t->st);
1022     st->timeout=0;
1023     st->auxiliary_is_new=0;
1024     st->auxiliary_key.key_timeout=st->current.key_timeout;
1025     st->current.key_timeout=st->now+st->key_lifetime;
1026     st->renegotiate_key_time=st->now+st->key_renegotiate_time;
1027     transport_peers_copy(st,&st->peers,&st->setup_peers);
1028     st->current.remote_session_id=st->setup_session_id;
1029
1030     slog(st,LOG_ACTIVATE_KEY,"new key activated");
1031     enter_state_run(st);
1032 }
1033
1034 static void delete_one_key(struct site *st, struct data_key *key,
1035                            cstring_t reason, cstring_t which, uint32_t loglevel)
1036 {
1037     if (!key->transform->valid(key->transform->st)) return;
1038     if (reason) slog(st,loglevel,"%s deleted (%s)",which,reason);
1039     key->transform->delkey(key->transform->st);
1040     key->key_timeout=0;
1041 }
1042
1043 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel)
1044 {
1045     if (current_valid(st)) {
1046         slog(st,loglevel,"session closed (%s)",reason);
1047
1048         delete_one_key(st,&st->current,0,0,0);
1049         set_link_quality(st);
1050     }
1051     delete_one_key(st,&st->auxiliary_key,0,0,0);
1052 }
1053
1054 static void state_assert(struct site *st, bool_t ok)
1055 {
1056     if (!ok) fatal("site:state_assert");
1057 }
1058
1059 static void enter_state_stop(struct site *st)
1060 {
1061     st->state=SITE_STOP;
1062     st->timeout=0;
1063     delete_keys(st,"entering state STOP",LOG_TIMEOUT_KEY);
1064     st->new_transform->delkey(st->new_transform->st);
1065 }
1066
1067 static void set_link_quality(struct site *st)
1068 {
1069     uint32_t quality;
1070     if (current_valid(st))
1071         quality=LINK_QUALITY_UP;
1072     else if (st->state==SITE_WAIT || st->state==SITE_STOP)
1073         quality=LINK_QUALITY_DOWN;
1074     else if (st->address)
1075         quality=LINK_QUALITY_DOWN_CURRENT_ADDRESS;
1076     else if (transport_peers_valid(&st->peers))
1077         quality=LINK_QUALITY_DOWN_STALE_ADDRESS;
1078     else
1079         quality=LINK_QUALITY_DOWN;
1080
1081     st->netlink->set_quality(st->netlink->st,quality);
1082 }
1083
1084 static void enter_state_run(struct site *st)
1085 {
1086     slog(st,LOG_STATE,"entering state RUN");
1087     st->state=SITE_RUN;
1088     st->timeout=0;
1089
1090     st->setup_session_id=0;
1091     transport_peers_clear(st,&st->setup_peers);
1092     memset(st->localN,0,NONCELEN);
1093     memset(st->remoteN,0,NONCELEN);
1094     st->new_transform->delkey(st->new_transform->st);
1095     memset(st->dhsecret,0,st->dh->len);
1096     memset(st->sharedsecret,0,st->sharedsecretlen);
1097     set_link_quality(st);
1098 }
1099
1100 static bool_t enter_state_resolve(struct site *st)
1101 {
1102     state_assert(st,st->state==SITE_RUN);
1103     slog(st,LOG_STATE,"entering state RESOLVE");
1104     st->state=SITE_RESOLVE;
1105     st->resolver->request(st->resolver->st,st->address,
1106                           site_resolve_callback,st);
1107     return True;
1108 }
1109
1110 static bool_t enter_new_state(struct site *st, uint32_t next)
1111 {
1112     bool_t (*gen)(struct site *st);
1113     int r;
1114
1115     slog(st,LOG_STATE,"entering state %s",state_name(next));
1116     switch(next) {
1117     case SITE_SENTMSG1:
1118         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE);
1119         gen=generate_msg1;
1120         break;
1121     case SITE_SENTMSG2:
1122         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1123                      st->state==SITE_SENTMSG1 || st->state==SITE_WAIT);
1124         gen=generate_msg2;
1125         break;
1126     case SITE_SENTMSG3:
1127         state_assert(st,st->state==SITE_SENTMSG1);
1128         BUF_FREE(&st->buffer);
1129         gen=generate_msg3;
1130         break;
1131     case SITE_SENTMSG4:
1132         state_assert(st,st->state==SITE_SENTMSG2);
1133         BUF_FREE(&st->buffer);
1134         gen=generate_msg4;
1135         break;
1136     case SITE_SENTMSG5:
1137         state_assert(st,st->state==SITE_SENTMSG3);
1138         BUF_FREE(&st->buffer);
1139         gen=generate_msg5;
1140         break;
1141     case SITE_RUN:
1142         state_assert(st,st->state==SITE_SENTMSG4);
1143         BUF_FREE(&st->buffer);
1144         gen=generate_msg6;
1145         break;
1146     default:
1147         gen=NULL;
1148         fatal("enter_new_state(%s): invalid new state",state_name(next));
1149         break;
1150     }
1151
1152     if (hacky_par_start_failnow()) return False;
1153
1154     r= gen(st) && send_msg(st);
1155
1156     hacky_par_end(&r,
1157                   st->setup_retries, st->setup_retry_interval,
1158                   send_msg, st);
1159     
1160     if (r) {
1161         st->state=next;
1162         if (next==SITE_RUN) {
1163             BUF_FREE(&st->buffer); /* Never reused */
1164             st->timeout=0; /* Never retransmit */
1165             activate_new_key(st);
1166         }
1167         return True;
1168     }
1169     slog(st,LOG_ERROR,"error entering state %s",state_name(next));
1170     st->buffer.free=False; /* Unconditionally use the buffer; it may be
1171                               in either state, and enter_state_wait() will
1172                               do a BUF_FREE() */
1173     enter_state_wait(st);
1174     return False;
1175 }
1176
1177 /* msg7 tells our peer that we're about to forget our key */
1178 static bool_t send_msg7(struct site *st, cstring_t reason)
1179 {
1180     cstring_t transform_err;
1181
1182     if (current_valid(st) && st->buffer.free
1183         && transport_peers_valid(&st->peers)) {
1184         BUF_ALLOC(&st->buffer,"site:MSG7");
1185         buffer_init(&st->buffer,st->transform->max_start_pad+(4*3));
1186         buf_append_uint32(&st->buffer,LABEL_MSG7);
1187         buf_append_string(&st->buffer,reason);
1188         st->current.transform->forwards(st->current.transform->st,
1189                                         &st->buffer, &transform_err);
1190         buf_prepend_uint32(&st->buffer,LABEL_MSG0);
1191         buf_prepend_uint32(&st->buffer,st->index);
1192         buf_prepend_uint32(&st->buffer,st->current.remote_session_id);
1193         transport_xmit(st,&st->peers,&st->buffer,True);
1194         BUF_FREE(&st->buffer);
1195         return True;
1196     }
1197     return False;
1198 }
1199
1200 /* We go into this state if our peer becomes uncommunicative. Similar to
1201    the "stop" state, we forget all session keys for a while, before
1202    re-entering the "run" state. */
1203 static void enter_state_wait(struct site *st)
1204 {
1205     slog(st,LOG_STATE,"entering state WAIT");
1206     st->timeout=st->now+st->wait_timeout;
1207     st->state=SITE_WAIT;
1208     set_link_quality(st);
1209     BUF_FREE(&st->buffer); /* will have had an outgoing packet in it */
1210     /* XXX Erase keys etc. */
1211 }
1212
1213 static inline void site_settimeout(uint64_t timeout, int *timeout_io)
1214 {
1215     if (timeout) {
1216         int64_t offset=timeout-*now;
1217         if (offset<0) offset=0;
1218         if (offset>INT_MAX) offset=INT_MAX;
1219         if (*timeout_io<0 || offset<*timeout_io)
1220             *timeout_io=offset;
1221     }
1222 }
1223
1224 static int site_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
1225                            int *timeout_io)
1226 {
1227     struct site *st=sst;
1228
1229     *nfds_io=0; /* We don't use any file descriptors */
1230     st->now=*now;
1231
1232     /* Work out when our next timeout is. The earlier of 'timeout' or
1233        'current.key_timeout'. A stored value of '0' indicates no timeout
1234        active. */
1235     site_settimeout(st->timeout, timeout_io);
1236     site_settimeout(st->current.key_timeout, timeout_io);
1237     site_settimeout(st->auxiliary_key.key_timeout, timeout_io);
1238
1239     return 0; /* success */
1240 }
1241
1242 static void check_expiry(struct site *st, struct data_key *key,
1243                          const char *which)
1244 {
1245     if (key->key_timeout && *now>key->key_timeout) {
1246         delete_one_key(st,key,"maximum life exceeded",which,LOG_TIMEOUT_KEY);
1247     }
1248 }
1249
1250 /* NB site_afterpoll will be called before site_beforepoll is ever called */
1251 static void site_afterpoll(void *sst, struct pollfd *fds, int nfds)
1252 {
1253     struct site *st=sst;
1254
1255     st->now=*now;
1256     if (st->timeout && *now>st->timeout) {
1257         st->timeout=0;
1258         if (st->state>=SITE_SENTMSG1 && st->state<=SITE_SENTMSG5) {
1259             if (!hacky_par_start_failnow())
1260                 send_msg(st);
1261         } else if (st->state==SITE_WAIT) {
1262             enter_state_run(st);
1263         } else {
1264             slog(st,LOG_ERROR,"site_afterpoll: unexpected timeout, state=%d",
1265                  st->state);
1266         }
1267     }
1268     check_expiry(st,&st->current,"current key");
1269     check_expiry(st,&st->auxiliary_key,"auxiliary key");
1270 }
1271
1272 /* This function is called by the netlink device to deliver packets
1273    intended for the remote network. The packet is in "raw" wire
1274    format, but is guaranteed to be word-aligned. */
1275 static void site_outgoing(void *sst, struct buffer_if *buf)
1276 {
1277     struct site *st=sst;
1278     cstring_t transform_err;
1279     
1280     if (st->state==SITE_STOP) {
1281         BUF_FREE(buf);
1282         return;
1283     }
1284
1285     /* In all other states we consider delivering the packet if we have
1286        a valid key and a valid address to send it to. */
1287     if (current_valid(st) && transport_peers_valid(&st->peers)) {
1288         /* Transform it and send it */
1289         if (buf->size>0) {
1290             buf_prepend_uint32(buf,LABEL_MSG9);
1291             st->current.transform->forwards(st->current.transform->st,
1292                                             buf, &transform_err);
1293             buf_prepend_uint32(buf,LABEL_MSG0);
1294             buf_prepend_uint32(buf,st->index);
1295             buf_prepend_uint32(buf,st->current.remote_session_id);
1296             transport_xmit(st,&st->peers,buf,False);
1297         }
1298         BUF_FREE(buf);
1299         return;
1300     }
1301
1302     slog(st,LOG_DROP,"discarding outgoing packet of size %d",buf->size);
1303     BUF_FREE(buf);
1304     initiate_key_setup(st,"outgoing packet");
1305 }
1306
1307 static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in,
1308                            uint32_t type, struct msg *m)
1309     /* For packets which are identified by the local and remote names.
1310      * If it has our name and our peer's name in it it's for us. */
1311 {
1312     struct buffer_if buf[1];
1313     buffer_readonly_clone(buf,buf_in);
1314     return unpick_msg(st,type,buf,m)
1315         && name_matches(&m->remote,st->remotename)
1316         && name_matches(&m->local,st->localname);
1317 }
1318
1319 /* This function is called by the communication device to deliver
1320    packets from our peers. */
1321 static bool_t site_incoming(void *sst, struct buffer_if *buf,
1322                             const struct comm_addr *source)
1323 {
1324     struct site *st=sst;
1325
1326     if (buf->size < 12) return False;
1327
1328     uint32_t dest=get_uint32(buf->start);
1329     uint32_t msgtype=get_uint32(buf->start+8);
1330     struct msg named_msg;
1331
1332     if (msgtype==LABEL_MSG1) {
1333         if (!named_for_us(st,buf,msgtype,&named_msg))
1334             return False;
1335         /* It's a MSG1 addressed to us. Decide what to do about it. */
1336         dump_packet(st,buf,source,True);
1337         if (st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1338             st->state==SITE_WAIT) {
1339             /* We should definitely process it */
1340             if (process_msg1(st,buf,source,&named_msg)) {
1341                 slog(st,LOG_SETUP_INIT,"key setup initiated by peer");
1342                 enter_new_state(st,SITE_SENTMSG2);
1343             } else {
1344                 slog(st,LOG_ERROR,"failed to process incoming msg1");
1345             }
1346             BUF_FREE(buf);
1347             return True;
1348         } else if (st->state==SITE_SENTMSG1) {
1349             /* We've just sent a message 1! They may have crossed on
1350                the wire. If we have priority then we ignore the
1351                incoming one, otherwise we process it as usual. */
1352             if (st->setup_priority) {
1353                 BUF_FREE(buf);
1354                 slog(st,LOG_DUMP,"crossed msg1s; we are higher "
1355                      "priority => ignore incoming msg1");
1356                 return True;
1357             } else {
1358                 slog(st,LOG_DUMP,"crossed msg1s; we are lower "
1359                      "priority => use incoming msg1");
1360                 if (process_msg1(st,buf,source,&named_msg)) {
1361                     BUF_FREE(&st->buffer); /* Free our old message 1 */
1362                     enter_new_state(st,SITE_SENTMSG2);
1363                 } else {
1364                     slog(st,LOG_ERROR,"failed to process an incoming "
1365                          "crossed msg1 (we have low priority)");
1366                 }
1367                 BUF_FREE(buf);
1368                 return True;
1369             }
1370         }
1371         /* The message 1 was received at an unexpected stage of the
1372            key setup. XXX POLICY - what do we do? */
1373         slog(st,LOG_UNEXPECTED,"unexpected incoming message 1");
1374         BUF_FREE(buf);
1375         return True;
1376     }
1377     if (dest==st->index) {
1378         /* Explicitly addressed to us */
1379         if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True);
1380         switch (msgtype) {
1381         case LABEL_NAK:
1382             /* If the source is our current peer then initiate a key setup,
1383                because our peer's forgotten the key */
1384             if (get_uint32(buf->start+4)==st->current.remote_session_id) {
1385                 initiate_key_setup(st,"received a NAK");
1386             } else {
1387                 slog(st,LOG_SEC,"bad incoming NAK");
1388             }
1389             break;
1390         case LABEL_MSG0:
1391             process_msg0(st,buf,source);
1392             break;
1393         case LABEL_MSG1:
1394             /* Setup packet: should not have been explicitly addressed
1395                to us */
1396             slog(st,LOG_SEC,"incoming explicitly addressed msg1");
1397             break;
1398         case LABEL_MSG2:
1399             /* Setup packet: expected only in state SENTMSG1 */
1400             if (st->state!=SITE_SENTMSG1) {
1401                 slog(st,LOG_UNEXPECTED,"unexpected MSG2");
1402             } else if (process_msg2(st,buf,source)) {
1403                 transport_setup_msgok(st,source);
1404                 enter_new_state(st,SITE_SENTMSG3);
1405             } else {
1406                 slog(st,LOG_SEC,"invalid MSG2");
1407             }
1408             break;
1409         case LABEL_MSG3:
1410             /* Setup packet: expected only in state SENTMSG2 */
1411             if (st->state!=SITE_SENTMSG2) {
1412                 slog(st,LOG_UNEXPECTED,"unexpected MSG3");
1413             } else if (process_msg3(st,buf,source)) {
1414                 transport_setup_msgok(st,source);
1415                 enter_new_state(st,SITE_SENTMSG4);
1416             } else {
1417                 slog(st,LOG_SEC,"invalid MSG3");
1418             }
1419             break;
1420         case LABEL_MSG4:
1421             /* Setup packet: expected only in state SENTMSG3 */
1422             if (st->state!=SITE_SENTMSG3) {
1423                 slog(st,LOG_UNEXPECTED,"unexpected MSG4");
1424             } else if (process_msg4(st,buf,source)) {
1425                 transport_setup_msgok(st,source);
1426                 enter_new_state(st,SITE_SENTMSG5);
1427             } else {
1428                 slog(st,LOG_SEC,"invalid MSG4");
1429             }
1430             break;
1431         case LABEL_MSG5:
1432             /* Setup packet: expected only in state SENTMSG4 */
1433             /* (may turn up in state RUN if our return MSG6 was lost
1434                and the new key has already been activated. In that
1435                case we discard it. The peer will realise that we
1436                are using the new key when they see our data packets.
1437                Until then the peer's data packets to us get discarded. */
1438             if (st->state==SITE_SENTMSG4) {
1439                 if (process_msg5(st,buf,source,st->new_transform)) {
1440                     transport_setup_msgok(st,source);
1441                     enter_new_state(st,SITE_RUN);
1442                 } else {
1443                     slog(st,LOG_SEC,"invalid MSG5");
1444                 }
1445             } else if (st->state==SITE_RUN) {
1446                 if (process_msg5(st,buf,source,st->current.transform)) {
1447                     slog(st,LOG_DROP,"got MSG5, retransmitting MSG6");
1448                     transport_setup_msgok(st,source);
1449                     create_msg6(st,st->current.transform,
1450                                 st->current.remote_session_id);
1451                     transport_xmit(st,&st->peers,&st->buffer,True);
1452                     BUF_FREE(&st->buffer);
1453                 } else {
1454                     slog(st,LOG_SEC,"invalid MSG5 (in state RUN)");
1455                 }
1456             } else {
1457                 slog(st,LOG_UNEXPECTED,"unexpected MSG5");
1458             }
1459             break;
1460         case LABEL_MSG6:
1461             /* Setup packet: expected only in state SENTMSG5 */
1462             if (st->state!=SITE_SENTMSG5) {
1463                 slog(st,LOG_UNEXPECTED,"unexpected MSG6");
1464             } else if (process_msg6(st,buf,source)) {
1465                 BUF_FREE(&st->buffer); /* Free message 5 */
1466                 transport_setup_msgok(st,source);
1467                 activate_new_key(st);
1468             } else {
1469                 slog(st,LOG_SEC,"invalid MSG6");
1470             }
1471             break;
1472         default:
1473             slog(st,LOG_SEC,"received message of unknown type 0x%08x",
1474                  msgtype);
1475             break;
1476         }
1477         BUF_FREE(buf);
1478         return True;
1479     }
1480
1481     return False;
1482 }
1483
1484 static void site_control(void *vst, bool_t run)
1485 {
1486     struct site *st=vst;
1487     if (run) enter_state_run(st);
1488     else enter_state_stop(st);
1489 }
1490
1491 static void site_phase_hook(void *sst, uint32_t newphase)
1492 {
1493     struct site *st=sst;
1494
1495     /* The program is shutting down; tell our peer */
1496     send_msg7(st,"shutting down");
1497 }
1498
1499 static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
1500                           list_t *args)
1501 {
1502     static uint32_t index_sequence;
1503     struct site *st;
1504     item_t *item;
1505     dict_t *dict;
1506     int i;
1507
1508     st=safe_malloc(sizeof(*st),"site_apply");
1509
1510     st->cl.description="site";
1511     st->cl.type=CL_SITE;
1512     st->cl.apply=NULL;
1513     st->cl.interface=&st->ops;
1514     st->ops.st=st;
1515     st->ops.control=site_control;
1516     st->ops.status=site_status;
1517
1518     /* First parameter must be a dict */
1519     item=list_elem(args,0);
1520     if (!item || item->type!=t_dict)
1521         cfgfatal(loc,"site","parameter must be a dictionary\n");
1522     
1523     dict=item->data.dict;
1524     st->localname=dict_read_string(dict, "local-name", True, "site", loc);
1525     st->remotename=dict_read_string(dict, "name", True, "site", loc);
1526
1527     st->peer_mobile=dict_read_bool(dict,"mobile",False,"site",loc,False);
1528     bool_t local_mobile=
1529         dict_read_bool(dict,"local-mobile",False,"site",loc,False);
1530
1531     /* Sanity check (which also allows the 'sites' file to include
1532        site() closures for all sites including our own): refuse to
1533        talk to ourselves */
1534     if (strcmp(st->localname,st->remotename)==0) {
1535         Message(M_DEBUG,"site %s: local-name==name -> ignoring this site\n",
1536                 st->localname);
1537         if (st->peer_mobile != local_mobile)
1538             cfgfatal(loc,"site","site %s's peer-mobile=%d"
1539                     " but our local-mobile=%d\n",
1540                     st->localname, st->peer_mobile, local_mobile);
1541         free(st);
1542         return NULL;
1543     }
1544     if (st->peer_mobile && local_mobile) {
1545         Message(M_WARNING,"site %s: site is mobile but so are we"
1546                 " -> ignoring this site\n", st->remotename);
1547         free(st);
1548         return NULL;
1549     }
1550
1551     assert(index_sequence < 0xffffffffUL);
1552     st->index = ++index_sequence;
1553     st->local_capabilities = 0;
1554     st->netlink=find_cl_if(dict,"link",CL_NETLINK,True,"site",loc);
1555
1556     list_t *comms_cfg=dict_lookup(dict,"comm");
1557     if (!comms_cfg) cfgfatal(loc,"site","closure list \"comm\" not found\n");
1558     st->ncomms=list_length(comms_cfg);
1559     st->comms=safe_malloc_ary(sizeof(*st->comms),st->ncomms,"comms");
1560     assert(st->ncomms);
1561     for (i=0; i<st->ncomms; i++) {
1562         item_t *item=list_elem(comms_cfg,i);
1563         if (item->type!=t_closure)
1564             cfgfatal(loc,"site","comm is not a closure\n");
1565         closure_t *cl=item->data.closure;
1566         if (cl->type!=CL_COMM) cfgfatal(loc,"site","comm closure wrong type\n");
1567         st->comms[i]=cl->interface;
1568     }
1569
1570     st->resolver=find_cl_if(dict,"resolver",CL_RESOLVER,True,"site",loc);
1571     st->log=find_cl_if(dict,"log",CL_LOG,True,"site",loc);
1572     st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc);
1573
1574     st->privkey=find_cl_if(dict,"local-key",CL_RSAPRIVKEY,True,"site",loc);
1575     st->address=dict_read_string(dict, "address", False, "site", loc);
1576     if (st->address)
1577         st->remoteport=dict_read_number(dict,"port",True,"site",loc,0);
1578     else st->remoteport=0;
1579     st->pubkey=find_cl_if(dict,"key",CL_RSAPUBKEY,True,"site",loc);
1580
1581     st->transform=
1582         find_cl_if(dict,"transform",CL_TRANSFORM,True,"site",loc);
1583
1584     st->dh=find_cl_if(dict,"dh",CL_DH,True,"site",loc);
1585     st->hash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc);
1586
1587 #define DEFAULT(D) (st->peer_mobile || local_mobile     \
1588                     ? DEFAULT_MOBILE_##D : DEFAULT_##D)
1589 #define CFG_NUMBER(k,D) dict_read_number(dict,(k),False,"site",loc,DEFAULT(D));
1590
1591     st->key_lifetime=         CFG_NUMBER("key-lifetime",  KEY_LIFETIME);
1592     st->setup_retries=        CFG_NUMBER("setup-retries", SETUP_RETRIES);
1593     st->setup_retry_interval= CFG_NUMBER("setup-timeout", SETUP_RETRY_INTERVAL);
1594     st->wait_timeout=         CFG_NUMBER("wait-time",     WAIT_TIME);
1595
1596     st->mobile_peer_expiry= dict_read_number(
1597        dict,"mobile-peer-expiry",False,"site",loc,DEFAULT_MOBILE_PEER_EXPIRY);
1598
1599     st->transport_peers_max= !st->peer_mobile ? 1 : dict_read_number(
1600         dict,"mobile-peers-max",False,"site",loc,DEFAULT_MOBILE_PEERS_MAX);
1601     if (st->transport_peers_max<1 ||
1602         st->transport_peers_max>=MAX_MOBILE_PEERS_MAX) {
1603         cfgfatal(loc,"site","mobile-peers-max must be in range 1.."
1604                  STRING(MAX_MOBILE_PEERS_MAX) "\n");
1605     }
1606
1607     if (st->key_lifetime < DEFAULT(KEY_RENEGOTIATE_GAP)*2)
1608         st->key_renegotiate_time=st->key_lifetime/2;
1609     else
1610         st->key_renegotiate_time=st->key_lifetime-DEFAULT(KEY_RENEGOTIATE_GAP);
1611     st->key_renegotiate_time=dict_read_number(
1612         dict,"renegotiate-time",False,"site",loc,st->key_renegotiate_time);
1613     if (st->key_renegotiate_time > st->key_lifetime) {
1614         cfgfatal(loc,"site",
1615                  "renegotiate-time must be less than key-lifetime\n");
1616     }
1617
1618     st->log_events=string_list_to_word(dict_lookup(dict,"log-events"),
1619                                        log_event_table,"site");
1620
1621     st->tunname=safe_malloc(strlen(st->localname)+strlen(st->remotename)+5,
1622                             "site_apply");
1623     sprintf(st->tunname,"%s<->%s",st->localname,st->remotename);
1624
1625     /* The information we expect to see in incoming messages of type 1 */
1626     /* fixme: lots of unchecked overflows here, but the results are only
1627        corrupted packets rather than undefined behaviour */
1628     st->setup_priority=(strcmp(st->localname,st->remotename)>0);
1629
1630     buffer_new(&st->buffer,SETUP_BUFFER_LEN);
1631
1632     buffer_new(&st->scratch,0);
1633     BUF_ALLOC(&st->scratch,"site:scratch");
1634
1635     /* We are interested in poll(), but only for timeouts. We don't have
1636        any fds of our own. */
1637     register_for_poll(st, site_beforepoll, site_afterpoll, 0, "site");
1638     st->timeout=0;
1639
1640     st->remote_capabilities=0;
1641     st->current.key_timeout=0;
1642     st->auxiliary_key.key_timeout=0;
1643     transport_peers_clear(st,&st->peers);
1644     transport_peers_clear(st,&st->setup_peers);
1645     /* XXX mlock these */
1646     st->dhsecret=safe_malloc(st->dh->len,"site:dhsecret");
1647     st->sharedsecretlen=st->transform->keylen?:st->dh->ceil_len;
1648     st->sharedsecret=safe_malloc(st->sharedsecretlen,"site:sharedsecret");
1649
1650     /* We need to compute some properties of our comms */
1651 #define COMPUTE_WORST(pad)                      \
1652     int worst_##pad=0;                          \
1653     for (i=0; i<st->ncomms; i++) {              \
1654         int thispad=st->comms[i]->pad;          \
1655         if (thispad > worst_##pad)              \
1656             worst_##pad=thispad;                \
1657     }
1658     COMPUTE_WORST(min_start_pad)
1659     COMPUTE_WORST(min_end_pad)
1660
1661     /* We need to register the remote networks with the netlink device */
1662     st->netlink->reg(st->netlink->st, site_outgoing, st,
1663                      st->transform->max_start_pad+(4*4)+
1664                      worst_min_start_pad,
1665                      st->transform->max_end_pad+worst_min_end_pad);
1666     
1667     for (i=0; i<st->ncomms; i++)
1668         st->comms[i]->request_notify(st->comms[i]->st, st, site_incoming);
1669
1670     st->current.transform=st->transform->create(st->transform->st);
1671     st->auxiliary_key.transform=st->transform->create(st->transform->st);
1672     st->new_transform=st->transform->create(st->transform->st);
1673     st->auxiliary_is_new=0;
1674
1675     enter_state_stop(st);
1676
1677     add_hook(PHASE_SHUTDOWN,site_phase_hook,st);
1678
1679     return new_closure(&st->cl);
1680 }
1681
1682 void site_module(dict_t *dict)
1683 {
1684     add_closure(dict,"site",site_apply);
1685 }
1686
1687
1688 /***** TRANSPORT PEERS definitions *****/
1689
1690 static void transport_peers_debug(struct site *st, transport_peers *dst,
1691                                   const char *didwhat,
1692                                   int nargs, const struct comm_addr *args,
1693                                   size_t stride) {
1694     int i;
1695     char *argp;
1696
1697     if (!(st->log_events & LOG_PEER_ADDRS))
1698         return; /* an optimisation */
1699
1700     slog(st, LOG_PEER_ADDRS, "peers (%s) %s nargs=%d => npeers=%d",
1701          (dst==&st->peers ? "data" :
1702           dst==&st->setup_peers ? "setup" : "UNKNOWN"),
1703          didwhat, nargs, dst->npeers);
1704
1705     for (i=0, argp=(void*)args;
1706          i<nargs;
1707          i++, (argp+=stride?stride:sizeof(*args))) {
1708         const struct comm_addr *ca=(void*)argp;
1709         slog(st, LOG_PEER_ADDRS, " args: addrs[%d]=%s",
1710              i, ca->comm->addr_to_string(ca->comm->st,ca));
1711     }
1712     for (i=0; i<dst->npeers; i++) {
1713         struct timeval diff;
1714         timersub(tv_now,&dst->peers[i].last,&diff);
1715         const struct comm_addr *ca=&dst->peers[i].addr;
1716         slog(st, LOG_PEER_ADDRS, " peers: addrs[%d]=%s T-%ld.%06ld",
1717              i, ca->comm->addr_to_string(ca->comm->st,ca),
1718              (unsigned long)diff.tv_sec, (unsigned long)diff.tv_usec);
1719     }
1720 }
1721
1722 static int transport_peer_compar(const void *av, const void *bv) {
1723     const transport_peer *a=av;
1724     const transport_peer *b=bv;
1725     /* put most recent first in the array */
1726     if (timercmp(&a->last, &b->last, <)) return +1;
1727     if (timercmp(&a->last, &b->last, >)) return -11;
1728     return 0;
1729 }
1730
1731 static void transport_peers_expire(struct site *st, transport_peers *peers) {
1732     /* peers must be sorted first */
1733     int previous_peers=peers->npeers;
1734     struct timeval oldest;
1735     oldest.tv_sec  = tv_now->tv_sec - st->mobile_peer_expiry;
1736     oldest.tv_usec = tv_now->tv_usec;
1737     while (peers->npeers>1 &&
1738            timercmp(&peers->peers[peers->npeers-1].last, &oldest, <))
1739         peers->npeers--;
1740     if (peers->npeers != previous_peers)
1741         transport_peers_debug(st,peers,"expire", 0,0,0);
1742 }
1743
1744 static void transport_record_peer(struct site *st, transport_peers *peers,
1745                                   const struct comm_addr *addr, const char *m) {
1746     int slot, changed=0;
1747
1748     for (slot=0; slot<peers->npeers; slot++)
1749         if (!memcmp(&peers->peers[slot].addr, addr, sizeof(*addr)))
1750             goto found;
1751
1752     changed=1;
1753     if (peers->npeers==st->transport_peers_max)
1754         slot=st->transport_peers_max;
1755     else
1756         slot=peers->npeers++;
1757
1758  found:
1759     peers->peers[slot].addr=*addr;
1760     peers->peers[slot].last=*tv_now;
1761
1762     if (peers->npeers>1)
1763         qsort(peers->peers, peers->npeers,
1764               sizeof(*peers->peers), transport_peer_compar);
1765
1766     if (changed || peers->npeers!=1)
1767         transport_peers_debug(st,peers,m, 1,addr,0);
1768     transport_peers_expire(st, peers);
1769 }
1770
1771 static bool_t transport_compute_setupinit_peers(struct site *st,
1772         const struct comm_addr *configured_addr /* 0 if none or not found */) {
1773
1774     if (!configured_addr && !transport_peers_valid(&st->peers))
1775         return False;
1776
1777     slog(st,LOG_SETUP_INIT,
1778          (!configured_addr ? "using only %d old peer address(es)"
1779           : "using configured address, and/or perhaps %d old peer address(es)"),
1780          st->peers);
1781
1782     /* Non-mobile peers havve st->peers.npeers==0 or ==1, since they
1783      * have transport_peers_max==1.  The effect is that this code
1784      * always uses the configured address if supplied, or otherwise
1785      * the existing data peer if one exists; this is as desired. */
1786
1787     transport_peers_copy(st,&st->setup_peers,&st->peers);
1788
1789     if (configured_addr)
1790         transport_record_peer(st,&st->setup_peers,configured_addr,"setupinit");
1791
1792     assert(transport_peers_valid(&st->setup_peers));
1793     return True;
1794 }
1795
1796 static void transport_setup_msgok(struct site *st, const struct comm_addr *a) {
1797     if (st->peer_mobile)
1798         transport_record_peer(st,&st->setup_peers,a,"setupmsg");
1799 }
1800 static void transport_data_msgok(struct site *st, const struct comm_addr *a) {
1801     if (st->peer_mobile)
1802         transport_record_peer(st,&st->peers,a,"datamsg");
1803 }
1804
1805 static int transport_peers_valid(transport_peers *peers) {
1806     return peers->npeers;
1807 }
1808 static void transport_peers_clear(struct site *st, transport_peers *peers) {
1809     peers->npeers= 0;
1810     transport_peers_debug(st,peers,"clear",0,0,0);
1811 }
1812 static void transport_peers_copy(struct site *st, transport_peers *dst,
1813                                  const transport_peers *src) {
1814     dst->npeers=src->npeers;
1815     memcpy(dst->peers, src->peers, sizeof(*dst->peers) * dst->npeers);
1816     transport_peers_debug(st,dst,"copy",
1817                           src->npeers, &src->peers->addr, sizeof(*src->peers));
1818 }
1819
1820 void transport_xmit(struct site *st, transport_peers *peers,
1821                     struct buffer_if *buf, bool_t candebug) {
1822     int slot;
1823     transport_peers_expire(st, peers);
1824     for (slot=0; slot<peers->npeers; slot++) {
1825         transport_peer *peer=&peers->peers[slot];
1826         if (candebug)
1827             dump_packet(st, buf, &peer->addr, False);
1828         peer->addr.comm->sendmsg(peer->addr.comm->st, buf, &peer->addr);
1829     }
1830 }
1831
1832 /***** END of transport peers declarations *****/