]> git.proxmox.com Git - mirror_frr.git/blob - babeld/message.c
Merge pull request #7435 from sudhanshukumar22/bgp-peer-group-issue
[mirror_frr.git] / babeld / message.c
1 /*
2 Copyright (c) 2007, 2008 by Juliusz Chroboczek
3
4 Permission is hereby granted, free of charge, to any person obtaining a copy
5 of this software and associated documentation files (the "Software"), to deal
6 in the Software without restriction, including without limitation the rights
7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 copies of the Software, and to permit persons to whom the Software is
9 furnished to do so, subject to the following conditions:
10
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 THE SOFTWARE.
21 */
22
23 #include <zebra.h>
24 #include "if.h"
25
26 #include "babeld.h"
27 #include "util.h"
28 #include "net.h"
29 #include "babel_interface.h"
30 #include "source.h"
31 #include "neighbour.h"
32 #include "route.h"
33 #include "xroute.h"
34 #include "resend.h"
35 #include "message.h"
36 #include "kernel.h"
37 #include "babel_main.h"
38 #include "babel_errors.h"
39
40 static unsigned char packet_header[4] = {42, 2};
41
42 int split_horizon = 1;
43
44 unsigned short myseqno = 0;
45
46 #define UNICAST_BUFSIZE 1024
47 static int unicast_buffered = 0;
48 static unsigned char *unicast_buffer = NULL;
49 struct neighbour *unicast_neighbour = NULL;
50 struct timeval unicast_flush_timeout = {0, 0};
51
52 /* Minimum TLV _body_ length for TLVs of particular types (0 = no limit). */
53 static const unsigned char tlv_min_length[MESSAGE_MAX + 1] =
54 {
55 [ MESSAGE_PAD1 ] = 0,
56 [ MESSAGE_PADN ] = 0,
57 [ MESSAGE_ACK_REQ ] = 6,
58 [ MESSAGE_ACK ] = 2,
59 [ MESSAGE_HELLO ] = 6,
60 [ MESSAGE_IHU ] = 6,
61 [ MESSAGE_ROUTER_ID ] = 10,
62 [ MESSAGE_NH ] = 2,
63 [ MESSAGE_UPDATE ] = 10,
64 [ MESSAGE_REQUEST ] = 2,
65 [ MESSAGE_MH_REQUEST ] = 14,
66 };
67
68 /* Parse a network prefix, encoded in the somewhat baroque compressed
69 representation used by Babel. Return the number of bytes parsed. */
70 static int
71 network_prefix(int ae, int plen, unsigned int omitted,
72 const unsigned char *p, const unsigned char *dp,
73 unsigned int len, unsigned char *p_r)
74 {
75 unsigned pb;
76 unsigned char prefix[16];
77 int ret = -1;
78
79 if(plen >= 0)
80 pb = (plen + 7) / 8;
81 else if(ae == 1)
82 pb = 4;
83 else
84 pb = 16;
85
86 if(pb > 16)
87 return -1;
88
89 memset(prefix, 0, 16);
90
91 switch(ae) {
92 case 0:
93 ret = 0;
94 break;
95 case 1:
96 if(omitted > 4 || pb > 4 || (pb > omitted && len < pb - omitted))
97 return -1;
98 memcpy(prefix, v4prefix, 12);
99 if(omitted) {
100 if (dp == NULL || !v4mapped(dp)) return -1;
101 memcpy(prefix, dp, 12 + omitted);
102 }
103 if(pb > omitted) memcpy(prefix + 12 + omitted, p, pb - omitted);
104 ret = pb - omitted;
105 break;
106 case 2:
107 if(omitted > 16 || (pb > omitted && len < pb - omitted)) return -1;
108 if(omitted) {
109 if (dp == NULL || v4mapped(dp)) return -1;
110 memcpy(prefix, dp, omitted);
111 }
112 if(pb > omitted) memcpy(prefix + omitted, p, pb - omitted);
113 ret = pb - omitted;
114 break;
115 case 3:
116 if(pb > 8 && len < pb - 8) return -1;
117 prefix[0] = 0xfe;
118 prefix[1] = 0x80;
119 if(pb > 8) memcpy(prefix + 8, p, pb - 8);
120 ret = pb - 8;
121 break;
122 default:
123 return -1;
124 }
125
126 mask_prefix(p_r, prefix, plen < 0 ? 128 : ae == 1 ? plen + 96 : plen);
127 return ret;
128 }
129
130 static void
131 parse_update_subtlv(const unsigned char *a, int alen,
132 unsigned char *channels)
133 {
134 int type, len, i = 0;
135
136 while(i < alen) {
137 type = a[i];
138 if(type == SUBTLV_PAD1) {
139 i++;
140 continue;
141 }
142
143 if(i + 1 > alen) {
144 flog_err(EC_BABEL_PACKET, "Received truncated attributes.");
145 return;
146 }
147 len = a[i + 1];
148 if(i + len > alen) {
149 flog_err(EC_BABEL_PACKET, "Received truncated attributes.");
150 return;
151 }
152
153 if(type == SUBTLV_PADN) {
154 /* Nothing. */
155 } else if(type == SUBTLV_DIVERSITY) {
156 if(len > DIVERSITY_HOPS) {
157 flog_err(EC_BABEL_PACKET,
158 "Received overlong channel information (%d > %d).n",
159 len, DIVERSITY_HOPS);
160 len = DIVERSITY_HOPS;
161 }
162 if(memchr(a + i + 2, 0, len) != NULL) {
163 /* 0 is reserved. */
164 flog_err(EC_BABEL_PACKET, "Channel information contains 0!");
165 return;
166 }
167 memset(channels, 0, DIVERSITY_HOPS);
168 memcpy(channels, a + i + 2, len);
169 } else {
170 debugf(BABEL_DEBUG_COMMON,
171 "Received unknown route attribute %d.", type);
172 }
173
174 i += len + 2;
175 }
176 }
177
178 static int
179 parse_hello_subtlv(const unsigned char *a, int alen,
180 unsigned int *hello_send_us)
181 {
182 int type, len, i = 0, ret = 0;
183
184 while(i < alen) {
185 type = a[0];
186 if(type == SUBTLV_PAD1) {
187 i++;
188 continue;
189 }
190
191 if(i + 1 > alen) {
192 flog_err(EC_BABEL_PACKET,
193 "Received truncated sub-TLV on Hello message.");
194 return -1;
195 }
196 len = a[i + 1];
197 if(i + len > alen) {
198 flog_err(EC_BABEL_PACKET,
199 "Received truncated sub-TLV on Hello message.");
200 return -1;
201 }
202
203 if(type == SUBTLV_PADN) {
204 /* Nothing to do. */
205 } else if(type == SUBTLV_TIMESTAMP) {
206 if(len >= 4) {
207 DO_NTOHL(*hello_send_us, a + i + 2);
208 ret = 1;
209 } else {
210 flog_err(EC_BABEL_PACKET,
211 "Received incorrect RTT sub-TLV on Hello message.");
212 }
213 } else {
214 debugf(BABEL_DEBUG_COMMON,
215 "Received unknown Hello sub-TLV type %d.", type);
216 }
217
218 i += len + 2;
219 }
220 return ret;
221 }
222
223 static int
224 parse_ihu_subtlv(const unsigned char *a, int alen,
225 unsigned int *hello_send_us,
226 unsigned int *hello_rtt_receive_time)
227 {
228 int type, len, i = 0, ret = 0;
229
230 while(i < alen) {
231 type = a[0];
232 if(type == SUBTLV_PAD1) {
233 i++;
234 continue;
235 }
236
237 if(i + 1 > alen) {
238 flog_err(EC_BABEL_PACKET,
239 "Received truncated sub-TLV on IHU message.");
240 return -1;
241 }
242 len = a[i + 1];
243 if(i + len > alen) {
244 flog_err(EC_BABEL_PACKET,
245 "Received truncated sub-TLV on IHU message.");
246 return -1;
247 }
248
249 if(type == SUBTLV_PADN) {
250 /* Nothing to do. */
251 } else if(type == SUBTLV_TIMESTAMP) {
252 if(len >= 8) {
253 DO_NTOHL(*hello_send_us, a + i + 2);
254 DO_NTOHL(*hello_rtt_receive_time, a + i + 6);
255 ret = 1;
256 }
257 else {
258 flog_err(EC_BABEL_PACKET,
259 "Received incorrect RTT sub-TLV on IHU message.");
260 }
261 } else {
262 debugf(BABEL_DEBUG_COMMON,
263 "Received unknown IHU sub-TLV type %d.", type);
264 }
265
266 i += len + 2;
267 }
268 return ret;
269 }
270
271 static int
272 network_address(int ae, const unsigned char *a, unsigned int len,
273 unsigned char *a_r)
274 {
275 return network_prefix(ae, -1, 0, a, NULL, len, a_r);
276 }
277
278 static int
279 channels_len(unsigned char *channels)
280 {
281 unsigned char *p = memchr(channels, 0, DIVERSITY_HOPS);
282 return p ? (p - channels) : DIVERSITY_HOPS;
283 }
284
285 /* Check, that the provided frame consists of a valid Babel packet header
286 followed by a sequence of TLVs. TLVs of known types are also checked to meet
287 minimum length constraints defined for each. Return 0 for no errors. */
288 static int
289 babel_packet_examin(const unsigned char *packet, int packetlen)
290 {
291 unsigned i = 0, bodylen;
292 const unsigned char *message;
293 unsigned char type, len;
294
295 if(packetlen < 4 || packet[0] != 42 || packet[1] != 2)
296 return 1;
297 DO_NTOHS(bodylen, packet + 2);
298 while (i < bodylen){
299 message = packet + 4 + i;
300 type = message[0];
301 if(type == MESSAGE_PAD1) {
302 i++;
303 continue;
304 }
305 if(i + 1 > bodylen) {
306 debugf(BABEL_DEBUG_COMMON,"Received truncated message.");
307 return 1;
308 }
309 len = message[1];
310 if(i + len > bodylen) {
311 debugf(BABEL_DEBUG_COMMON,"Received truncated message.");
312 return 1;
313 }
314 /* not Pad1 */
315 if(type <= MESSAGE_MAX && tlv_min_length[type] && len < tlv_min_length[type]) {
316 debugf(BABEL_DEBUG_COMMON,"Undersized %u TLV", type);
317 return 1;
318 }
319 i += len + 2;
320 }
321 return 0;
322 }
323
324 void
325 parse_packet(const unsigned char *from, struct interface *ifp,
326 const unsigned char *packet, int packetlen)
327 {
328 int i;
329 const unsigned char *message;
330 unsigned char type, len;
331 int bodylen;
332 struct neighbour *neigh;
333 int have_router_id = 0, have_v4_prefix = 0, have_v6_prefix = 0,
334 have_v4_nh = 0, have_v6_nh = 0;
335 unsigned char router_id[8], v4_prefix[16], v6_prefix[16],
336 v4_nh[16], v6_nh[16];
337 int have_hello_rtt = 0;
338 /* Content of the RTT sub-TLV on IHU messages. */
339 unsigned int hello_send_us = 0, hello_rtt_receive_time = 0;
340 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
341
342 if(babel_ifp->flags & BABEL_IF_TIMESTAMPS) {
343 /* We want to track exactly when we received this packet. */
344 gettime(&babel_now);
345 }
346
347 if(!linklocal(from)) {
348 flog_err(EC_BABEL_PACKET,
349 "Received packet from non-local address %s.",
350 format_address(from));
351 return;
352 }
353
354 if (babel_packet_examin (packet, packetlen)) {
355 flog_err(EC_BABEL_PACKET,
356 "Received malformed packet on %s from %s.",
357 ifp->name, format_address(from));
358 return;
359 }
360
361 neigh = find_neighbour(from, ifp);
362 if(neigh == NULL) {
363 flog_err(EC_BABEL_PACKET, "Couldn't allocate neighbour.");
364 return;
365 }
366
367 DO_NTOHS(bodylen, packet + 2);
368
369 if(bodylen + 4 > packetlen) {
370 flog_err(EC_BABEL_PACKET, "Received truncated packet (%d + 4 > %d).",
371 bodylen, packetlen);
372 bodylen = packetlen - 4;
373 }
374
375 i = 0;
376 while(i < bodylen) {
377 message = packet + 4 + i;
378 type = message[0];
379 if(type == MESSAGE_PAD1) {
380 debugf(BABEL_DEBUG_COMMON,"Received pad1 from %s on %s.",
381 format_address(from), ifp->name);
382 i++;
383 continue;
384 }
385 len = message[1];
386
387 if(type == MESSAGE_PADN) {
388 debugf(BABEL_DEBUG_COMMON,"Received pad%d from %s on %s.",
389 len, format_address(from), ifp->name);
390 } else if(type == MESSAGE_ACK_REQ) {
391 unsigned short nonce, interval;
392 DO_NTOHS(nonce, message + 4);
393 DO_NTOHS(interval, message + 6);
394 debugf(BABEL_DEBUG_COMMON,"Received ack-req (%04X %d) from %s on %s.",
395 nonce, interval, format_address(from), ifp->name);
396 send_ack(neigh, nonce, interval);
397 } else if(type == MESSAGE_ACK) {
398 debugf(BABEL_DEBUG_COMMON,"Received ack from %s on %s.",
399 format_address(from), ifp->name);
400 /* Nothing right now */
401 } else if(type == MESSAGE_HELLO) {
402 unsigned short seqno, interval;
403 int changed;
404 unsigned int timestamp = 0;
405 DO_NTOHS(seqno, message + 4);
406 DO_NTOHS(interval, message + 6);
407 debugf(BABEL_DEBUG_COMMON,"Received hello %d (%d) from %s on %s.",
408 seqno, interval,
409 format_address(from), ifp->name);
410 changed = update_neighbour(neigh, seqno, interval);
411 update_neighbour_metric(neigh, changed);
412 if(interval > 0)
413 /* Multiply by 3/2 to allow hellos to expire. */
414 schedule_neighbours_check(interval * 15, 0);
415 /* Sub-TLV handling. */
416 if(len > 8) {
417 if(parse_hello_subtlv(message + 8, len - 6, &timestamp) > 0) {
418 neigh->hello_send_us = timestamp;
419 neigh->hello_rtt_receive_time = babel_now;
420 have_hello_rtt = 1;
421 }
422 }
423 } else if(type == MESSAGE_IHU) {
424 unsigned short txcost, interval;
425 unsigned char address[16];
426 int rc;
427 DO_NTOHS(txcost, message + 4);
428 DO_NTOHS(interval, message + 6);
429 rc = network_address(message[2], message + 8, len - 6, address);
430 if(rc < 0) goto fail;
431 debugf(BABEL_DEBUG_COMMON,"Received ihu %d (%d) from %s on %s for %s.",
432 txcost, interval,
433 format_address(from), ifp->name,
434 format_address(address));
435 if(message[2] == 0 || is_interface_ll_address(ifp, address)) {
436 int changed = txcost != neigh->txcost;
437 neigh->txcost = txcost;
438 neigh->ihu_time = babel_now;
439 neigh->ihu_interval = interval;
440 update_neighbour_metric(neigh, changed);
441 if(interval > 0)
442 /* Multiply by 3/2 to allow neighbours to expire. */
443 schedule_neighbours_check(interval * 45, 0);
444 /* RTT sub-TLV. */
445 if(len > 10 + rc)
446 parse_ihu_subtlv(message + 8 + rc, len - 6 - rc,
447 &hello_send_us, &hello_rtt_receive_time);
448 }
449 } else if(type == MESSAGE_ROUTER_ID) {
450 memcpy(router_id, message + 4, 8);
451 have_router_id = 1;
452 debugf(BABEL_DEBUG_COMMON,"Received router-id %s from %s on %s.",
453 format_eui64(router_id), format_address(from), ifp->name);
454 } else if(type == MESSAGE_NH) {
455 unsigned char nh[16];
456 int rc;
457 rc = network_address(message[2], message + 4, len - 2,
458 nh);
459 if(rc < 0) {
460 have_v4_nh = 0;
461 have_v6_nh = 0;
462 goto fail;
463 }
464 debugf(BABEL_DEBUG_COMMON,"Received nh %s (%d) from %s on %s.",
465 format_address(nh), message[2],
466 format_address(from), ifp->name);
467 if(message[2] == 1) {
468 memcpy(v4_nh, nh, 16);
469 have_v4_nh = 1;
470 } else {
471 memcpy(v6_nh, nh, 16);
472 have_v6_nh = 1;
473 }
474 } else if(type == MESSAGE_UPDATE) {
475 unsigned char prefix[16], *nh;
476 unsigned char plen;
477 unsigned char channels[DIVERSITY_HOPS];
478 unsigned short interval, seqno, metric;
479 int rc, parsed_len;
480 DO_NTOHS(interval, message + 6);
481 DO_NTOHS(seqno, message + 8);
482 DO_NTOHS(metric, message + 10);
483 if(message[5] == 0 ||
484 (message[2] == 1 ? have_v4_prefix : have_v6_prefix))
485 rc = network_prefix(message[2], message[4], message[5],
486 message + 12,
487 message[2] == 1 ? v4_prefix : v6_prefix,
488 len - 10, prefix);
489 else
490 rc = -1;
491 if(rc < 0) {
492 if(message[3] & 0x80)
493 have_v4_prefix = have_v6_prefix = 0;
494 goto fail;
495 }
496 parsed_len = 10 + rc;
497
498 plen = message[4] + (message[2] == 1 ? 96 : 0);
499
500 if(message[3] & 0x80) {
501 if(message[2] == 1) {
502 memcpy(v4_prefix, prefix, 16);
503 have_v4_prefix = 1;
504 } else {
505 memcpy(v6_prefix, prefix, 16);
506 have_v6_prefix = 1;
507 }
508 }
509 if(message[3] & 0x40) {
510 if(message[2] == 1) {
511 memset(router_id, 0, 4);
512 memcpy(router_id + 4, prefix + 12, 4);
513 } else {
514 memcpy(router_id, prefix + 8, 8);
515 }
516 have_router_id = 1;
517 }
518 if(!have_router_id && message[2] != 0) {
519 flog_err(EC_BABEL_PACKET,
520 "Received prefix with no router id.");
521 goto fail;
522 }
523 debugf(BABEL_DEBUG_COMMON,"Received update%s%s for %s from %s on %s.",
524 (message[3] & 0x80) ? "/prefix" : "",
525 (message[3] & 0x40) ? "/id" : "",
526 format_prefix(prefix, plen),
527 format_address(from), ifp->name);
528
529 if(message[2] == 0) {
530 if(metric < 0xFFFF) {
531 flog_err(EC_BABEL_PACKET,
532 "Received wildcard update with finite metric.");
533 goto done;
534 }
535 retract_neighbour_routes(neigh);
536 goto done;
537 } else if(message[2] == 1) {
538 if(!have_v4_nh)
539 goto fail;
540 nh = v4_nh;
541 } else if(have_v6_nh) {
542 nh = v6_nh;
543 } else {
544 nh = neigh->address;
545 }
546
547 if(message[2] == 1) {
548 if(!babel_get_if_nfo(ifp)->ipv4)
549 goto done;
550 }
551
552 if((babel_get_if_nfo(ifp)->flags & BABEL_IF_FARAWAY)) {
553 channels[0] = 0;
554 } else {
555 /* This will be overwritten by parse_update_subtlv below. */
556 if(metric < 256) {
557 /* Assume non-interfering (wired) link. */
558 channels[0] = 0;
559 } else {
560 /* Assume interfering. */
561 channels[0] = BABEL_IF_CHANNEL_INTERFERING;
562 channels[1] = 0;
563 }
564
565 if(parsed_len < len)
566 parse_update_subtlv(message + 2 + parsed_len,
567 len - parsed_len, channels);
568 }
569
570 update_route(router_id, prefix, plen, seqno, metric, interval,
571 neigh, nh,
572 channels, channels_len(channels));
573 } else if(type == MESSAGE_REQUEST) {
574 unsigned char prefix[16], plen;
575 int rc;
576 rc = network_prefix(message[2], message[3], 0,
577 message + 4, NULL, len - 2, prefix);
578 if(rc < 0) goto fail;
579 plen = message[3] + (message[2] == 1 ? 96 : 0);
580 debugf(BABEL_DEBUG_COMMON,"Received request for %s from %s on %s.",
581 message[2] == 0 ? "any" : format_prefix(prefix, plen),
582 format_address(from), ifp->name);
583 if(message[2] == 0) {
584 struct babel_interface *neigh_ifp =babel_get_if_nfo(neigh->ifp);
585 /* If a neighbour is requesting a full route dump from us,
586 we might as well send it an IHU. */
587 send_ihu(neigh, NULL);
588 /* Since nodes send wildcard requests on boot, booting
589 a large number of nodes at the same time may cause an
590 update storm. Ignore a wildcard request that happens
591 shortly after we sent a full update. */
592 if(neigh_ifp->last_update_time <
593 (time_t)(babel_now.tv_sec -
594 MAX(neigh_ifp->hello_interval / 100, 1)))
595 send_update(neigh->ifp, 0, NULL, 0);
596 } else {
597 send_update(neigh->ifp, 0, prefix, plen);
598 }
599 } else if(type == MESSAGE_MH_REQUEST) {
600 unsigned char prefix[16], plen;
601 unsigned short seqno;
602 int rc;
603 DO_NTOHS(seqno, message + 4);
604 rc = network_prefix(message[2], message[3], 0,
605 message + 16, NULL, len - 14, prefix);
606 if(rc < 0) goto fail;
607 plen = message[3] + (message[2] == 1 ? 96 : 0);
608 debugf(BABEL_DEBUG_COMMON,"Received request (%d) for %s from %s on %s (%s, %d).",
609 message[6],
610 format_prefix(prefix, plen),
611 format_address(from), ifp->name,
612 format_eui64(message + 8), seqno);
613 handle_request(neigh, prefix, plen, message[6],
614 seqno, message + 8);
615 } else {
616 debugf(BABEL_DEBUG_COMMON,"Received unknown packet type %d from %s on %s.",
617 type, format_address(from), ifp->name);
618 }
619 done:
620 i += len + 2;
621 continue;
622
623 fail:
624 flog_err(EC_BABEL_PACKET,
625 "Couldn't parse packet (%d, %d) from %s on %s.",
626 message[0], message[1], format_address(from), ifp->name);
627 goto done;
628 }
629
630 /* We can calculate the RTT to this neighbour. */
631 if(have_hello_rtt && hello_send_us && hello_rtt_receive_time) {
632 int remote_waiting_us, local_waiting_us;
633 unsigned int rtt, smoothed_rtt;
634 unsigned int old_rttcost;
635 int changed = 0;
636 remote_waiting_us = neigh->hello_send_us - hello_rtt_receive_time;
637 local_waiting_us = time_us(neigh->hello_rtt_receive_time) -
638 hello_send_us;
639
640 /* Sanity checks (validity window of 10 minutes). */
641 if(remote_waiting_us < 0 || local_waiting_us < 0 ||
642 remote_waiting_us > 600000000 || local_waiting_us > 600000000)
643 return;
644
645 rtt = MAX(0, local_waiting_us - remote_waiting_us);
646 debugf(BABEL_DEBUG_COMMON, "RTT to %s on %s sample result: %d us.",
647 format_address(from), ifp->name, rtt);
648
649 old_rttcost = neighbour_rttcost(neigh);
650 if (valid_rtt(neigh)) {
651 /* Running exponential average. */
652 smoothed_rtt = (babel_ifp->rtt_decay * rtt +
653 (256 - babel_ifp->rtt_decay) * neigh->rtt);
654 /* Rounding (up or down) to get closer to the sample. */
655 neigh->rtt = (neigh->rtt >= rtt) ? smoothed_rtt / 256 :
656 (smoothed_rtt + 255) / 256;
657 } else {
658 /* We prefer to be conservative with new neighbours
659 (higher RTT) */
660 assert(rtt <= 0x7FFFFFFF);
661 neigh->rtt = 2*rtt;
662 }
663 changed = (neighbour_rttcost(neigh) == old_rttcost ? 0 : 1);
664 update_neighbour_metric(neigh, changed);
665 neigh->rtt_time = babel_now;
666 }
667 return;
668 }
669
670 /* Under normal circumstances, there are enough moderation mechanisms
671 elsewhere in the protocol to make sure that this last-ditch check
672 should never trigger. But I'm superstitious. */
673
674 static int
675 check_bucket(struct interface *ifp)
676 {
677 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
678 if(babel_ifp->bucket == 0) {
679 int seconds = babel_now.tv_sec - babel_ifp->bucket_time;
680 if(seconds > 0) {
681 babel_ifp->bucket = MIN(BUCKET_TOKENS_MAX,
682 seconds * BUCKET_TOKENS_PER_SEC);
683 }
684 /* Reset bucket time unconditionally, in case clock is stepped. */
685 babel_ifp->bucket_time = babel_now.tv_sec;
686 }
687
688 if(babel_ifp->bucket > 0) {
689 babel_ifp->bucket--;
690 return 1;
691 } else {
692 return 0;
693 }
694 }
695
696 static int
697 fill_rtt_message(struct interface *ifp)
698 {
699 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
700 if((babel_ifp->flags & BABEL_IF_TIMESTAMPS) &&
701 (babel_ifp->buffered_hello >= 0)) {
702 if(babel_ifp->sendbuf[babel_ifp->buffered_hello + 8] == SUBTLV_PADN &&
703 babel_ifp->sendbuf[babel_ifp->buffered_hello + 9] == 4) {
704 unsigned int time;
705 /* Change the type of sub-TLV. */
706 babel_ifp->sendbuf[babel_ifp->buffered_hello + 8] =
707 SUBTLV_TIMESTAMP;
708 gettime(&babel_now);
709 time = time_us(babel_now);
710 DO_HTONL(babel_ifp->sendbuf + babel_ifp->buffered_hello + 10, time);
711 return 1;
712 } else {
713 flog_err(EC_BABEL_PACKET, "No space left for timestamp sub-TLV (this shouldn't happen)");
714 return -1;
715 }
716 }
717 return 0;
718 }
719
720 void
721 flushbuf(struct interface *ifp)
722 {
723 int rc;
724 struct sockaddr_in6 sin6;
725 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
726
727 assert(babel_ifp->buffered <= babel_ifp->bufsize);
728
729 flushupdates(ifp);
730
731 if(babel_ifp->buffered > 0) {
732 debugf(BABEL_DEBUG_COMMON," (flushing %d buffered bytes on %s)",
733 babel_ifp->buffered, ifp->name);
734 if(check_bucket(ifp)) {
735 memset(&sin6, 0, sizeof(sin6));
736 sin6.sin6_family = AF_INET6;
737 memcpy(&sin6.sin6_addr, protocol_group, 16);
738 sin6.sin6_port = htons(protocol_port);
739 sin6.sin6_scope_id = ifp->ifindex;
740 DO_HTONS(packet_header + 2, babel_ifp->buffered);
741 fill_rtt_message(ifp);
742 rc = babel_send(protocol_socket,
743 packet_header, sizeof(packet_header),
744 babel_ifp->sendbuf, babel_ifp->buffered,
745 (struct sockaddr*)&sin6, sizeof(sin6));
746 if(rc < 0)
747 flog_err(EC_BABEL_PACKET, "send: %s", safe_strerror(errno));
748 } else {
749 flog_err(EC_BABEL_PACKET,
750 "Warning: bucket full, dropping packet to %s.",
751 ifp->name);
752 }
753 }
754 VALGRIND_MAKE_MEM_UNDEFINED(babel_ifp->sendbuf, babel_ifp->bufsize);
755 babel_ifp->buffered = 0;
756 babel_ifp->buffered_hello = -1;
757 babel_ifp->have_buffered_id = 0;
758 babel_ifp->have_buffered_nh = 0;
759 babel_ifp->have_buffered_prefix = 0;
760 babel_ifp->flush_timeout.tv_sec = 0;
761 babel_ifp->flush_timeout.tv_usec = 0;
762 }
763
764 static void
765 schedule_flush(struct interface *ifp)
766 {
767 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
768 unsigned msecs = jitter(babel_ifp, 0);
769 if(babel_ifp->flush_timeout.tv_sec != 0 &&
770 timeval_minus_msec(&babel_ifp->flush_timeout, &babel_now) < msecs)
771 return;
772 set_timeout(&babel_ifp->flush_timeout, msecs);
773 }
774
775 static void
776 schedule_flush_now(struct interface *ifp)
777 {
778 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
779 /* Almost now */
780 unsigned msecs = roughly(10);
781 if(babel_ifp->flush_timeout.tv_sec != 0 &&
782 timeval_minus_msec(&babel_ifp->flush_timeout, &babel_now) < msecs)
783 return;
784 set_timeout(&babel_ifp->flush_timeout, msecs);
785 }
786
787 static void
788 schedule_unicast_flush(unsigned msecs)
789 {
790 if(!unicast_neighbour)
791 return;
792 if(unicast_flush_timeout.tv_sec != 0 &&
793 timeval_minus_msec(&unicast_flush_timeout, &babel_now) < msecs)
794 return;
795 unicast_flush_timeout.tv_usec = (babel_now.tv_usec + msecs * 1000) %1000000;
796 unicast_flush_timeout.tv_sec =
797 babel_now.tv_sec + (babel_now.tv_usec / 1000 + msecs) / 1000;
798 }
799
800 static void
801 ensure_space(struct interface *ifp, int space)
802 {
803 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
804 if(babel_ifp->bufsize - babel_ifp->buffered < space)
805 flushbuf(ifp);
806 }
807
808 static void
809 start_message(struct interface *ifp, int type, int len)
810 {
811 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
812 if(babel_ifp->bufsize - babel_ifp->buffered < len + 2)
813 flushbuf(ifp);
814 babel_ifp->sendbuf[babel_ifp->buffered++] = type;
815 babel_ifp->sendbuf[babel_ifp->buffered++] = len;
816 }
817
818 static void
819 end_message(struct interface *ifp, int type, int bytes)
820 {
821 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
822 assert(babel_ifp->buffered >= bytes + 2 &&
823 babel_ifp->sendbuf[babel_ifp->buffered - bytes - 2] == type &&
824 babel_ifp->sendbuf[babel_ifp->buffered - bytes - 1] == bytes);
825 schedule_flush(ifp);
826 }
827
828 static void
829 accumulate_byte(struct interface *ifp, unsigned char value)
830 {
831 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
832 babel_ifp->sendbuf[babel_ifp->buffered++] = value;
833 }
834
835 static void
836 accumulate_short(struct interface *ifp, unsigned short value)
837 {
838 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
839 DO_HTONS(babel_ifp->sendbuf + babel_ifp->buffered, value);
840 babel_ifp->buffered += 2;
841 }
842
843 static void
844 accumulate_int(struct interface *ifp, unsigned int value)
845 {
846 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
847 DO_HTONL(babel_ifp->sendbuf + babel_ifp->buffered, value);
848 babel_ifp->buffered += 4;
849 }
850
851 static void
852 accumulate_bytes(struct interface *ifp,
853 const unsigned char *value, unsigned len)
854 {
855 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
856 memcpy(babel_ifp->sendbuf + babel_ifp->buffered, value, len);
857 babel_ifp->buffered += len;
858 }
859
860 static int
861 start_unicast_message(struct neighbour *neigh, int type, int len)
862 {
863 if(unicast_neighbour) {
864 if(neigh != unicast_neighbour ||
865 unicast_buffered + len + 2 >=
866 MIN(UNICAST_BUFSIZE, babel_get_if_nfo(neigh->ifp)->bufsize))
867 flush_unicast(0);
868 }
869 if(!unicast_buffer)
870 unicast_buffer = malloc(UNICAST_BUFSIZE);
871 if(!unicast_buffer) {
872 flog_err(EC_BABEL_MEMORY, "malloc(unicast_buffer): %s",
873 safe_strerror(errno));
874 return -1;
875 }
876
877 unicast_neighbour = neigh;
878
879 unicast_buffer[unicast_buffered++] = type;
880 unicast_buffer[unicast_buffered++] = len;
881 return 1;
882 }
883
884 static void
885 end_unicast_message(struct neighbour *neigh, int type, int bytes)
886 {
887 assert(unicast_neighbour == neigh && unicast_buffered >= bytes + 2 &&
888 unicast_buffer[unicast_buffered - bytes - 2] == type &&
889 unicast_buffer[unicast_buffered - bytes - 1] == bytes);
890 schedule_unicast_flush(jitter(babel_get_if_nfo(neigh->ifp), 0));
891 }
892
893 static void
894 accumulate_unicast_byte(struct neighbour *neigh, unsigned char value)
895 {
896 unicast_buffer[unicast_buffered++] = value;
897 }
898
899 static void
900 accumulate_unicast_short(struct neighbour *neigh, unsigned short value)
901 {
902 DO_HTONS(unicast_buffer + unicast_buffered, value);
903 unicast_buffered += 2;
904 }
905
906 static void
907 accumulate_unicast_int(struct neighbour *neigh, unsigned int value)
908 {
909 DO_HTONL(unicast_buffer + unicast_buffered, value);
910 unicast_buffered += 4;
911 }
912
913 static void
914 accumulate_unicast_bytes(struct neighbour *neigh,
915 const unsigned char *value, unsigned len)
916 {
917 memcpy(unicast_buffer + unicast_buffered, value, len);
918 unicast_buffered += len;
919 }
920
921 void
922 send_ack(struct neighbour *neigh, unsigned short nonce, unsigned short interval)
923 {
924 int rc;
925 debugf(BABEL_DEBUG_COMMON,"Sending ack (%04x) to %s on %s.",
926 nonce, format_address(neigh->address), neigh->ifp->name);
927 rc = start_unicast_message(neigh, MESSAGE_ACK, 2); if(rc < 0) return;
928 accumulate_unicast_short(neigh, nonce);
929 end_unicast_message(neigh, MESSAGE_ACK, 2);
930 /* Roughly yields a value no larger than 3/2, so this meets the deadline */
931 schedule_unicast_flush(roughly(interval * 6));
932 }
933
934 void
935 send_hello_noupdate(struct interface *ifp, unsigned interval)
936 {
937 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
938 /* This avoids sending multiple hellos in a single packet, which breaks
939 link quality estimation. */
940 if(babel_ifp->buffered_hello >= 0)
941 flushbuf(ifp);
942
943 babel_ifp->hello_seqno = seqno_plus(babel_ifp->hello_seqno, 1);
944 set_timeout(&babel_ifp->hello_timeout, babel_ifp->hello_interval);
945
946 if(!if_up(ifp))
947 return;
948
949 debugf(BABEL_DEBUG_COMMON,"Sending hello %d (%d) to %s.",
950 babel_ifp->hello_seqno, interval, ifp->name);
951
952 start_message(ifp, MESSAGE_HELLO,
953 (babel_ifp->flags & BABEL_IF_TIMESTAMPS) ? 12 : 6);
954 babel_ifp->buffered_hello = babel_ifp->buffered - 2;
955 accumulate_short(ifp, 0);
956 accumulate_short(ifp, babel_ifp->hello_seqno);
957 accumulate_short(ifp, interval > 0xFFFF ? 0xFFFF : interval);
958 if(babel_ifp->flags & BABEL_IF_TIMESTAMPS) {
959 /* Sub-TLV containing the local time of emission. We use a
960 Pad4 sub-TLV, which we'll fill just before sending. */
961 accumulate_byte(ifp, SUBTLV_PADN);
962 accumulate_byte(ifp, 4);
963 accumulate_int(ifp, 0);
964 }
965 end_message(ifp, MESSAGE_HELLO,
966 (babel_ifp->flags & BABEL_IF_TIMESTAMPS) ? 12 : 6);
967 }
968
969 void
970 send_hello(struct interface *ifp)
971 {
972 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
973 send_hello_noupdate(ifp, (babel_ifp->hello_interval + 9) / 10);
974 /* Send full IHU every 3 hellos, and marginal IHU each time */
975 if(babel_ifp->hello_seqno % 3 == 0)
976 send_ihu(NULL, ifp);
977 else
978 send_marginal_ihu(ifp);
979 }
980
981 void
982 flush_unicast(int dofree)
983 {
984 struct sockaddr_in6 sin6;
985 int rc;
986
987 if(unicast_buffered == 0)
988 goto done;
989
990 if(!if_up(unicast_neighbour->ifp))
991 goto done;
992
993 /* Preserve ordering of messages */
994 flushbuf(unicast_neighbour->ifp);
995
996 if(check_bucket(unicast_neighbour->ifp)) {
997 memset(&sin6, 0, sizeof(sin6));
998 sin6.sin6_family = AF_INET6;
999 memcpy(&sin6.sin6_addr, unicast_neighbour->address, 16);
1000 sin6.sin6_port = htons(protocol_port);
1001 sin6.sin6_scope_id = unicast_neighbour->ifp->ifindex;
1002 DO_HTONS(packet_header + 2, unicast_buffered);
1003 fill_rtt_message(unicast_neighbour->ifp);
1004 rc = babel_send(protocol_socket,
1005 packet_header, sizeof(packet_header),
1006 unicast_buffer, unicast_buffered,
1007 (struct sockaddr*)&sin6, sizeof(sin6));
1008 if(rc < 0)
1009 flog_err(EC_BABEL_PACKET, "send(unicast): %s",
1010 safe_strerror(errno));
1011 } else {
1012 flog_err(EC_BABEL_PACKET,
1013 "Warning: bucket full, dropping unicast packet to %s if %s.",
1014 format_address(unicast_neighbour->address),
1015 unicast_neighbour->ifp->name);
1016 }
1017
1018 done:
1019 VALGRIND_MAKE_MEM_UNDEFINED(unicast_buffer, UNICAST_BUFSIZE);
1020 unicast_buffered = 0;
1021 if(dofree && unicast_buffer) {
1022 free(unicast_buffer);
1023 unicast_buffer = NULL;
1024 }
1025 unicast_neighbour = NULL;
1026 unicast_flush_timeout.tv_sec = 0;
1027 unicast_flush_timeout.tv_usec = 0;
1028 }
1029
1030 static void
1031 really_send_update(struct interface *ifp,
1032 const unsigned char *id,
1033 const unsigned char *prefix, unsigned char plen,
1034 unsigned short seqno, unsigned short metric,
1035 unsigned char *channels, int channels_len)
1036 {
1037 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
1038 int add_metric, v4, real_plen, omit = 0;
1039 const unsigned char *real_prefix;
1040 unsigned short flags = 0;
1041 int channels_size;
1042
1043 if(diversity_kind != DIVERSITY_CHANNEL)
1044 channels_len = -1;
1045
1046 channels_size = channels_len >= 0 ? channels_len + 2 : 0;
1047
1048 if(!if_up(ifp))
1049 return;
1050
1051 add_metric = output_filter(id, prefix, plen, ifp->ifindex);
1052 if(add_metric >= INFINITY)
1053 return;
1054
1055 metric = MIN(metric + add_metric, INFINITY);
1056 /* Worst case */
1057 ensure_space(ifp, 20 + 12 + 28);
1058
1059 v4 = plen >= 96 && v4mapped(prefix);
1060
1061 if(v4) {
1062 if(!babel_ifp->ipv4)
1063 return;
1064 if(!babel_ifp->have_buffered_nh ||
1065 memcmp(babel_ifp->buffered_nh, babel_ifp->ipv4, 4) != 0) {
1066 start_message(ifp, MESSAGE_NH, 6);
1067 accumulate_byte(ifp, 1);
1068 accumulate_byte(ifp, 0);
1069 accumulate_bytes(ifp, babel_ifp->ipv4, 4);
1070 end_message(ifp, MESSAGE_NH, 6);
1071 memcpy(babel_ifp->buffered_nh, babel_ifp->ipv4, 4);
1072 babel_ifp->have_buffered_nh = 1;
1073 }
1074
1075 real_prefix = prefix + 12;
1076 real_plen = plen - 96;
1077 } else {
1078 if(babel_ifp->have_buffered_prefix) {
1079 while(omit < plen / 8 &&
1080 babel_ifp->buffered_prefix[omit] == prefix[omit])
1081 omit++;
1082 }
1083 if(!babel_ifp->have_buffered_prefix || plen >= 48)
1084 flags |= 0x80;
1085 real_prefix = prefix;
1086 real_plen = plen;
1087 }
1088
1089 if(!babel_ifp->have_buffered_id
1090 || memcmp(id, babel_ifp->buffered_id, 8) != 0) {
1091 if(real_plen == 128 && memcmp(real_prefix + 8, id, 8) == 0) {
1092 flags |= 0x40;
1093 } else {
1094 start_message(ifp, MESSAGE_ROUTER_ID, 10);
1095 accumulate_short(ifp, 0);
1096 accumulate_bytes(ifp, id, 8);
1097 end_message(ifp, MESSAGE_ROUTER_ID, 10);
1098 }
1099 memcpy(babel_ifp->buffered_id, id, sizeof(babel_ifp->buffered_id));
1100 babel_ifp->have_buffered_id = 1;
1101 }
1102
1103 start_message(ifp, MESSAGE_UPDATE, 10 + (real_plen + 7) / 8 - omit +
1104 channels_size);
1105 accumulate_byte(ifp, v4 ? 1 : 2);
1106 accumulate_byte(ifp, flags);
1107 accumulate_byte(ifp, real_plen);
1108 accumulate_byte(ifp, omit);
1109 accumulate_short(ifp, (babel_ifp->update_interval + 5) / 10);
1110 accumulate_short(ifp, seqno);
1111 accumulate_short(ifp, metric);
1112 accumulate_bytes(ifp, real_prefix + omit, (real_plen + 7) / 8 - omit);
1113 /* Note that an empty channels TLV is different from no such TLV. */
1114 if(channels_len >= 0) {
1115 accumulate_byte(ifp, 2);
1116 accumulate_byte(ifp, channels_len);
1117
1118 if (channels && channels_len > 0)
1119 accumulate_bytes(ifp, channels, channels_len);
1120 }
1121 end_message(ifp, MESSAGE_UPDATE, 10 + (real_plen + 7) / 8 - omit +
1122 channels_size);
1123
1124 if(flags & 0x80) {
1125 memcpy(babel_ifp->buffered_prefix, prefix, 16);
1126 babel_ifp->have_buffered_prefix = 1;
1127 }
1128 }
1129
1130 static int
1131 compare_buffered_updates(const void *av, const void *bv)
1132 {
1133 const struct buffered_update *a = av, *b = bv;
1134 int rc, v4a, v4b, ma, mb;
1135
1136 rc = memcmp(a->id, b->id, 8);
1137 if(rc != 0)
1138 return rc;
1139
1140 v4a = (a->plen >= 96 && v4mapped(a->prefix));
1141 v4b = (b->plen >= 96 && v4mapped(b->prefix));
1142
1143 if(v4a > v4b)
1144 return 1;
1145 else if(v4a < v4b)
1146 return -1;
1147
1148 ma = (!v4a && a->plen == 128 && memcmp(a->prefix + 8, a->id, 8) == 0);
1149 mb = (!v4b && b->plen == 128 && memcmp(b->prefix + 8, b->id, 8) == 0);
1150
1151 if(ma > mb)
1152 return -1;
1153 else if(mb > ma)
1154 return 1;
1155
1156 if(a->plen < b->plen)
1157 return 1;
1158 else if(a->plen > b->plen)
1159 return -1;
1160
1161 return memcmp(a->prefix, b->prefix, 16);
1162 }
1163
1164 void
1165 flushupdates(struct interface *ifp)
1166 {
1167 babel_interface_nfo *babel_ifp = NULL;
1168 struct xroute *xroute;
1169 struct babel_route *route;
1170 const unsigned char *last_prefix = NULL;
1171 unsigned char last_plen = 0xFF;
1172 int i;
1173
1174 if(ifp == NULL) {
1175 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1176 struct interface *ifp_aux;
1177 FOR_ALL_INTERFACES(vrf, ifp_aux)
1178 flushupdates(ifp_aux);
1179 return;
1180 }
1181
1182 babel_ifp = babel_get_if_nfo(ifp);
1183 if(babel_ifp->num_buffered_updates > 0) {
1184 struct buffered_update *b = babel_ifp->buffered_updates;
1185 int n = babel_ifp->num_buffered_updates;
1186
1187 babel_ifp->buffered_updates = NULL;
1188 babel_ifp->update_bufsize = 0;
1189 babel_ifp->num_buffered_updates = 0;
1190
1191 if(!if_up(ifp))
1192 goto done;
1193
1194 debugf(BABEL_DEBUG_COMMON," (flushing %d buffered updates on %s (%d))",
1195 n, ifp->name, ifp->ifindex);
1196
1197 /* In order to send fewer update messages, we want to send updates
1198 with the same router-id together, with IPv6 going out before IPv4. */
1199
1200 for(i = 0; i < n; i++) {
1201 route = find_installed_route(b[i].prefix, b[i].plen);
1202 if(route)
1203 memcpy(b[i].id, route->src->id, 8);
1204 else
1205 memcpy(b[i].id, myid, 8);
1206 }
1207
1208 qsort(b, n, sizeof(struct buffered_update), compare_buffered_updates);
1209
1210 for(i = 0; i < n; i++) {
1211 /* The same update may be scheduled multiple times before it is
1212 sent out. Since our buffer is now sorted, it is enough to
1213 compare with the previous update. */
1214
1215 if(last_prefix) {
1216 if(b[i].plen == last_plen &&
1217 memcmp(b[i].prefix, last_prefix, 16) == 0)
1218 continue;
1219 }
1220
1221 xroute = find_xroute(b[i].prefix, b[i].plen);
1222 route = find_installed_route(b[i].prefix, b[i].plen);
1223
1224 if(xroute && (!route || xroute->metric <= kernel_metric)) {
1225 really_send_update(ifp, myid,
1226 xroute->prefix, xroute->plen,
1227 myseqno, xroute->metric,
1228 NULL, 0);
1229 last_prefix = xroute->prefix;
1230 last_plen = xroute->plen;
1231 } else if(route) {
1232 unsigned char channels[DIVERSITY_HOPS];
1233 int chlen;
1234 struct interface *route_ifp = route->neigh->ifp;
1235 struct babel_interface *babel_route_ifp = NULL;
1236 unsigned short metric;
1237 unsigned short seqno;
1238
1239 seqno = route->seqno;
1240 metric =
1241 route_interferes(route, ifp) ?
1242 route_metric(route) :
1243 route_metric_noninterfering(route);
1244
1245 if(metric < INFINITY)
1246 satisfy_request(route->src->prefix, route->src->plen,
1247 seqno, route->src->id, ifp);
1248 if((babel_ifp->flags & BABEL_IF_SPLIT_HORIZON) &&
1249 route->neigh->ifp == ifp)
1250 continue;
1251
1252 babel_route_ifp = babel_get_if_nfo(route_ifp);
1253 if(babel_route_ifp->channel ==BABEL_IF_CHANNEL_NONINTERFERING) {
1254 memcpy(channels, route->channels, DIVERSITY_HOPS);
1255 } else {
1256 if(babel_route_ifp->channel == BABEL_IF_CHANNEL_UNKNOWN)
1257 channels[0] = BABEL_IF_CHANNEL_INTERFERING;
1258 else {
1259 assert(babel_route_ifp->channel > 0 &&
1260 babel_route_ifp->channel <= 255);
1261 channels[0] = babel_route_ifp->channel;
1262 }
1263 memcpy(channels + 1, route->channels, DIVERSITY_HOPS - 1);
1264 }
1265
1266 chlen = channels_len(channels);
1267 really_send_update(ifp, route->src->id,
1268 route->src->prefix,
1269 route->src->plen,
1270 seqno, metric,
1271 channels, chlen);
1272 update_source(route->src, seqno, metric);
1273 last_prefix = route->src->prefix;
1274 last_plen = route->src->plen;
1275 } else {
1276 /* There's no route for this prefix. This can happen shortly
1277 after an xroute has been retracted, so send a retraction. */
1278 really_send_update(ifp, myid, b[i].prefix, b[i].plen,
1279 myseqno, INFINITY, NULL, -1);
1280 }
1281 }
1282 schedule_flush_now(ifp);
1283 done:
1284 free(b);
1285 }
1286 babel_ifp->update_flush_timeout.tv_sec = 0;
1287 babel_ifp->update_flush_timeout.tv_usec = 0;
1288 }
1289
1290 static void
1291 schedule_update_flush(struct interface *ifp, int urgent)
1292 {
1293 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
1294 unsigned msecs;
1295 msecs = update_jitter(babel_ifp, urgent);
1296 if(babel_ifp->update_flush_timeout.tv_sec != 0 &&
1297 timeval_minus_msec(&babel_ifp->update_flush_timeout, &babel_now) < msecs)
1298 return;
1299 set_timeout(&babel_ifp->update_flush_timeout, msecs);
1300 }
1301
1302 static void
1303 buffer_update(struct interface *ifp,
1304 const unsigned char *prefix, unsigned char plen)
1305 {
1306 babel_interface_nfo *babel_ifp = babel_get_if_nfo(ifp);
1307 if(babel_ifp->num_buffered_updates > 0 &&
1308 babel_ifp->num_buffered_updates >= babel_ifp->update_bufsize)
1309 flushupdates(ifp);
1310
1311 if(babel_ifp->update_bufsize == 0) {
1312 int n;
1313 assert(babel_ifp->buffered_updates == NULL);
1314 /* Allocate enough space to hold a full update. Since the
1315 number of installed routes will grow over time, make sure we
1316 have enough space to send a full-ish frame. */
1317 n = installed_routes_estimate() + xroutes_estimate() + 4;
1318 n = MAX(n, babel_ifp->bufsize / 16);
1319 again:
1320 babel_ifp->buffered_updates = malloc(n *sizeof(struct buffered_update));
1321 if(babel_ifp->buffered_updates == NULL) {
1322 flog_err(EC_BABEL_MEMORY, "malloc(buffered_updates): %s",
1323 safe_strerror(errno));
1324 if(n > 4) {
1325 /* Try again with a tiny buffer. */
1326 n = 4;
1327 goto again;
1328 }
1329 return;
1330 }
1331 babel_ifp->update_bufsize = n;
1332 babel_ifp->num_buffered_updates = 0;
1333 }
1334
1335 memcpy(babel_ifp->buffered_updates[babel_ifp->num_buffered_updates].prefix,
1336 prefix, 16);
1337 babel_ifp->buffered_updates[babel_ifp->num_buffered_updates].plen = plen;
1338 babel_ifp->num_buffered_updates++;
1339 }
1340
1341 void
1342 send_update(struct interface *ifp, int urgent,
1343 const unsigned char *prefix, unsigned char plen)
1344 {
1345 babel_interface_nfo *babel_ifp = NULL;
1346
1347 if(ifp == NULL) {
1348 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1349 struct interface *ifp_aux;
1350 struct babel_route *route;
1351 FOR_ALL_INTERFACES(vrf, ifp_aux)
1352 send_update(ifp_aux, urgent, prefix, plen);
1353 if(prefix) {
1354 /* Since flushupdates only deals with non-wildcard interfaces, we
1355 need to do this now. */
1356 route = find_installed_route(prefix, plen);
1357 if(route && route_metric(route) < INFINITY)
1358 satisfy_request(prefix, plen, route->src->seqno, route->src->id,
1359 NULL);
1360 }
1361 return;
1362 }
1363
1364 if(!if_up(ifp))
1365 return;
1366
1367 babel_ifp = babel_get_if_nfo(ifp);
1368 if(prefix) {
1369 debugf(BABEL_DEBUG_COMMON,"Sending update to %s for %s.",
1370 ifp->name, format_prefix(prefix, plen));
1371 buffer_update(ifp, prefix, plen);
1372 } else {
1373 struct route_stream *routes = NULL;
1374 send_self_update(ifp);
1375 debugf(BABEL_DEBUG_COMMON,"Sending update to %s for any.", ifp->name);
1376 routes = route_stream(1);
1377 if(routes) {
1378 while(1) {
1379 struct babel_route *route = route_stream_next(routes);
1380 if(route == NULL)
1381 break;
1382 buffer_update(ifp, route->src->prefix, route->src->plen);
1383 }
1384 route_stream_done(routes);
1385 } else {
1386 flog_err(EC_BABEL_MEMORY, "Couldn't allocate route stream.");
1387 }
1388 set_timeout(&babel_ifp->update_timeout, babel_ifp->update_interval);
1389 babel_ifp->last_update_time = babel_now.tv_sec;
1390 }
1391 schedule_update_flush(ifp, urgent);
1392 }
1393
1394 void
1395 send_update_resend(struct interface *ifp,
1396 const unsigned char *prefix, unsigned char plen)
1397 {
1398 assert(prefix != NULL);
1399
1400 send_update(ifp, 1, prefix, plen);
1401 record_resend(RESEND_UPDATE, prefix, plen, 0, NULL, NULL, resend_delay);
1402 }
1403
1404 void
1405 send_wildcard_retraction(struct interface *ifp)
1406 {
1407 babel_interface_nfo *babel_ifp = NULL;
1408 if(ifp == NULL) {
1409 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1410 struct interface *ifp_aux;
1411 FOR_ALL_INTERFACES(vrf, ifp_aux)
1412 send_wildcard_retraction(ifp_aux);
1413 return;
1414 }
1415
1416 if(!if_up(ifp))
1417 return;
1418
1419 babel_ifp = babel_get_if_nfo(ifp);
1420 start_message(ifp, MESSAGE_UPDATE, 10);
1421 accumulate_byte(ifp, 0);
1422 accumulate_byte(ifp, 0x40);
1423 accumulate_byte(ifp, 0);
1424 accumulate_byte(ifp, 0);
1425 accumulate_short(ifp, 0xFFFF);
1426 accumulate_short(ifp, myseqno);
1427 accumulate_short(ifp, 0xFFFF);
1428 end_message(ifp, MESSAGE_UPDATE, 10);
1429
1430 babel_ifp->have_buffered_id = 0;
1431 }
1432
1433 void
1434 update_myseqno(void)
1435 {
1436 myseqno = seqno_plus(myseqno, 1);
1437 }
1438
1439 void
1440 send_self_update(struct interface *ifp)
1441 {
1442 struct xroute_stream *xroutes;
1443 if(ifp == NULL) {
1444 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1445 struct interface *ifp_aux;
1446 FOR_ALL_INTERFACES(vrf, ifp_aux) {
1447 if(!if_up(ifp_aux))
1448 continue;
1449 send_self_update(ifp_aux);
1450 }
1451 return;
1452 }
1453
1454 debugf(BABEL_DEBUG_COMMON,"Sending self update to %s.", ifp->name);
1455 xroutes = xroute_stream();
1456 if(xroutes) {
1457 while(1) {
1458 struct xroute *xroute = xroute_stream_next(xroutes);
1459 if(xroute == NULL) break;
1460 send_update(ifp, 0, xroute->prefix, xroute->plen);
1461 }
1462 xroute_stream_done(xroutes);
1463 } else {
1464 flog_err(EC_BABEL_MEMORY, "Couldn't allocate xroute stream.");
1465 }
1466 }
1467
1468 void
1469 send_ihu(struct neighbour *neigh, struct interface *ifp)
1470 {
1471 babel_interface_nfo *babel_ifp = NULL;
1472 int rxcost, interval;
1473 int ll;
1474 int send_rtt_data;
1475 int msglen;
1476
1477 if(neigh == NULL && ifp == NULL) {
1478 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1479 struct interface *ifp_aux;
1480 FOR_ALL_INTERFACES(vrf, ifp_aux) {
1481 if(if_up(ifp_aux))
1482 continue;
1483 send_ihu(NULL, ifp_aux);
1484 }
1485 return;
1486 }
1487
1488 if(neigh == NULL) {
1489 struct neighbour *ngh;
1490 FOR_ALL_NEIGHBOURS(ngh) {
1491 if(ngh->ifp == ifp)
1492 send_ihu(ngh, ifp);
1493 }
1494 return;
1495 }
1496
1497
1498 if(ifp && neigh->ifp != ifp)
1499 return;
1500
1501 ifp = neigh->ifp;
1502 babel_ifp = babel_get_if_nfo(ifp);
1503 if(!if_up(ifp))
1504 return;
1505
1506 rxcost = neighbour_rxcost(neigh);
1507 interval = (babel_ifp->hello_interval * 3 + 9) / 10;
1508
1509 /* Conceptually, an IHU is a unicast message. We usually send them as
1510 multicast, since this allows aggregation into a single packet and
1511 avoids an ARP exchange. If we already have a unicast message queued
1512 for this neighbour, however, we might as well piggyback the IHU. */
1513 debugf(BABEL_DEBUG_COMMON,"Sending %sihu %d on %s to %s.",
1514 unicast_neighbour == neigh ? "unicast " : "",
1515 rxcost,
1516 neigh->ifp->name,
1517 format_address(neigh->address));
1518
1519 ll = linklocal(neigh->address);
1520
1521 if((babel_ifp->flags & BABEL_IF_TIMESTAMPS) && neigh->hello_send_us
1522 /* Checks whether the RTT data is not too old to be sent. */
1523 && timeval_minus_msec(&babel_now,
1524 &neigh->hello_rtt_receive_time) < 1000000) {
1525 send_rtt_data = 1;
1526 } else {
1527 neigh->hello_send_us = 0;
1528 send_rtt_data = 0;
1529 }
1530
1531 /* The length depends on the format of the address, and then an
1532 optional 10-bytes sub-TLV for timestamps (used to compute a RTT). */
1533 msglen = (ll ? 14 : 22) + (send_rtt_data ? 10 : 0);
1534
1535 if(unicast_neighbour != neigh) {
1536 start_message(ifp, MESSAGE_IHU, msglen);
1537 accumulate_byte(ifp, ll ? 3 : 2);
1538 accumulate_byte(ifp, 0);
1539 accumulate_short(ifp, rxcost);
1540 accumulate_short(ifp, interval);
1541 if(ll)
1542 accumulate_bytes(ifp, neigh->address + 8, 8);
1543 else
1544 accumulate_bytes(ifp, neigh->address, 16);
1545 if (send_rtt_data) {
1546 accumulate_byte(ifp, SUBTLV_TIMESTAMP);
1547 accumulate_byte(ifp, 8);
1548 accumulate_int(ifp, neigh->hello_send_us);
1549 accumulate_int(ifp, time_us(neigh->hello_rtt_receive_time));
1550 }
1551 end_message(ifp, MESSAGE_IHU, msglen);
1552 } else {
1553 int rc;
1554 rc = start_unicast_message(neigh, MESSAGE_IHU, msglen);
1555 if(rc < 0) return;
1556 accumulate_unicast_byte(neigh, ll ? 3 : 2);
1557 accumulate_unicast_byte(neigh, 0);
1558 accumulate_unicast_short(neigh, rxcost);
1559 accumulate_unicast_short(neigh, interval);
1560 if(ll)
1561 accumulate_unicast_bytes(neigh, neigh->address + 8, 8);
1562 else
1563 accumulate_unicast_bytes(neigh, neigh->address, 16);
1564 if (send_rtt_data) {
1565 accumulate_unicast_byte(neigh, SUBTLV_TIMESTAMP);
1566 accumulate_unicast_byte(neigh, 8);
1567 accumulate_unicast_int(neigh, neigh->hello_send_us);
1568 accumulate_unicast_int(neigh,
1569 time_us(neigh->hello_rtt_receive_time));
1570 }
1571 end_unicast_message(neigh, MESSAGE_IHU, msglen);
1572 }
1573 }
1574
1575 /* Send IHUs to all marginal neighbours */
1576 void
1577 send_marginal_ihu(struct interface *ifp)
1578 {
1579 struct neighbour *neigh;
1580 FOR_ALL_NEIGHBOURS(neigh) {
1581 if(ifp && neigh->ifp != ifp)
1582 continue;
1583 if(neigh->txcost >= 384 || (neigh->reach & 0xF000) != 0xF000)
1584 send_ihu(neigh, ifp);
1585 }
1586 }
1587
1588 void
1589 send_request(struct interface *ifp,
1590 const unsigned char *prefix, unsigned char plen)
1591 {
1592 int v4, pb, len;
1593
1594 if(ifp == NULL) {
1595 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1596 struct interface *ifp_aux;
1597 FOR_ALL_INTERFACES(vrf, ifp_aux) {
1598 if(if_up(ifp_aux))
1599 continue;
1600 send_request(ifp_aux, prefix, plen);
1601 }
1602 return;
1603 }
1604
1605 /* make sure any buffered updates go out before this request. */
1606 flushupdates(ifp);
1607
1608 if(!if_up(ifp))
1609 return;
1610
1611 debugf(BABEL_DEBUG_COMMON,"sending request to %s for %s.",
1612 ifp->name, prefix ? format_prefix(prefix, plen) : "any");
1613 v4 = plen >= 96 && v4mapped(prefix);
1614 pb = v4 ? ((plen - 96) + 7) / 8 : (plen + 7) / 8;
1615 len = !prefix ? 2 : 2 + pb;
1616
1617 start_message(ifp, MESSAGE_REQUEST, len);
1618 accumulate_byte(ifp, !prefix ? 0 : v4 ? 1 : 2);
1619 accumulate_byte(ifp, !prefix ? 0 : v4 ? plen - 96 : plen);
1620 if(prefix) {
1621 if(v4)
1622 accumulate_bytes(ifp, prefix + 12, pb);
1623 else
1624 accumulate_bytes(ifp, prefix, pb);
1625 }
1626 end_message(ifp, MESSAGE_REQUEST, len);
1627 }
1628
1629 void
1630 send_unicast_request(struct neighbour *neigh,
1631 const unsigned char *prefix, unsigned char plen)
1632 {
1633 int rc, v4, pb, len;
1634
1635 /* make sure any buffered updates go out before this request. */
1636 flushupdates(neigh->ifp);
1637
1638 debugf(BABEL_DEBUG_COMMON,"sending unicast request to %s for %s.",
1639 format_address(neigh->address),
1640 prefix ? format_prefix(prefix, plen) : "any");
1641 v4 = plen >= 96 && v4mapped(prefix);
1642 pb = v4 ? ((plen - 96) + 7) / 8 : (plen + 7) / 8;
1643 len = !prefix ? 2 : 2 + pb;
1644
1645 rc = start_unicast_message(neigh, MESSAGE_REQUEST, len);
1646 if(rc < 0) return;
1647 accumulate_unicast_byte(neigh, !prefix ? 0 : v4 ? 1 : 2);
1648 accumulate_unicast_byte(neigh, !prefix ? 0 : v4 ? plen - 96 : plen);
1649 if(prefix) {
1650 if(v4)
1651 accumulate_unicast_bytes(neigh, prefix + 12, pb);
1652 else
1653 accumulate_unicast_bytes(neigh, prefix, pb);
1654 }
1655 end_unicast_message(neigh, MESSAGE_REQUEST, len);
1656 }
1657
1658 void
1659 send_multihop_request(struct interface *ifp,
1660 const unsigned char *prefix, unsigned char plen,
1661 unsigned short seqno, const unsigned char *id,
1662 unsigned short hop_count)
1663 {
1664 int v4, pb, len;
1665
1666 /* Make sure any buffered updates go out before this request. */
1667 flushupdates(ifp);
1668
1669 if(ifp == NULL) {
1670 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
1671 struct interface *ifp_aux;
1672 FOR_ALL_INTERFACES(vrf, ifp_aux) {
1673 if(!if_up(ifp_aux))
1674 continue;
1675 send_multihop_request(ifp_aux, prefix, plen, seqno, id, hop_count);
1676 }
1677 return;
1678 }
1679
1680 if(!if_up(ifp))
1681 return;
1682
1683 debugf(BABEL_DEBUG_COMMON,"Sending request (%d) on %s for %s.",
1684 hop_count, ifp->name, format_prefix(prefix, plen));
1685 v4 = plen >= 96 && v4mapped(prefix);
1686 pb = v4 ? ((plen - 96) + 7) / 8 : (plen + 7) / 8;
1687 len = 6 + 8 + pb;
1688
1689 start_message(ifp, MESSAGE_MH_REQUEST, len);
1690 accumulate_byte(ifp, v4 ? 1 : 2);
1691 accumulate_byte(ifp, v4 ? plen - 96 : plen);
1692 accumulate_short(ifp, seqno);
1693 accumulate_byte(ifp, hop_count);
1694 accumulate_byte(ifp, 0);
1695 accumulate_bytes(ifp, id, 8);
1696 if(prefix) {
1697 if(v4)
1698 accumulate_bytes(ifp, prefix + 12, pb);
1699 else
1700 accumulate_bytes(ifp, prefix, pb);
1701 }
1702 end_message(ifp, MESSAGE_MH_REQUEST, len);
1703 }
1704
1705 void
1706 send_unicast_multihop_request(struct neighbour *neigh,
1707 const unsigned char *prefix, unsigned char plen,
1708 unsigned short seqno, const unsigned char *id,
1709 unsigned short hop_count)
1710 {
1711 int rc, v4, pb, len;
1712
1713 /* Make sure any buffered updates go out before this request. */
1714 flushupdates(neigh->ifp);
1715
1716 debugf(BABEL_DEBUG_COMMON,"Sending multi-hop request to %s for %s (%d hops).",
1717 format_address(neigh->address),
1718 format_prefix(prefix, plen), hop_count);
1719 v4 = plen >= 96 && v4mapped(prefix);
1720 pb = v4 ? ((plen - 96) + 7) / 8 : (plen + 7) / 8;
1721 len = 6 + 8 + pb;
1722
1723 rc = start_unicast_message(neigh, MESSAGE_MH_REQUEST, len);
1724 if(rc < 0) return;
1725 accumulate_unicast_byte(neigh, v4 ? 1 : 2);
1726 accumulate_unicast_byte(neigh, v4 ? plen - 96 : plen);
1727 accumulate_unicast_short(neigh, seqno);
1728 accumulate_unicast_byte(neigh, hop_count);
1729 accumulate_unicast_byte(neigh, 0);
1730 accumulate_unicast_bytes(neigh, id, 8);
1731 if(prefix) {
1732 if(v4)
1733 accumulate_unicast_bytes(neigh, prefix + 12, pb);
1734 else
1735 accumulate_unicast_bytes(neigh, prefix, pb);
1736 }
1737 end_unicast_message(neigh, MESSAGE_MH_REQUEST, len);
1738 }
1739
1740 void
1741 send_request_resend(struct neighbour *neigh,
1742 const unsigned char *prefix, unsigned char plen,
1743 unsigned short seqno, unsigned char *id)
1744 {
1745 if(neigh)
1746 send_unicast_multihop_request(neigh, prefix, plen, seqno, id, 127);
1747 else
1748 send_multihop_request(NULL, prefix, plen, seqno, id, 127);
1749
1750 record_resend(RESEND_REQUEST, prefix, plen, seqno, id,
1751 neigh ? neigh->ifp : NULL, resend_delay);
1752 }
1753
1754 void
1755 handle_request(struct neighbour *neigh, const unsigned char *prefix,
1756 unsigned char plen, unsigned char hop_count,
1757 unsigned short seqno, const unsigned char *id)
1758 {
1759 struct xroute *xroute;
1760 struct babel_route *route;
1761 struct neighbour *successor = NULL;
1762
1763 xroute = find_xroute(prefix, plen);
1764 route = find_installed_route(prefix, plen);
1765
1766 if(xroute && (!route || xroute->metric <= kernel_metric)) {
1767 if(hop_count > 0 && memcmp(id, myid, 8) == 0) {
1768 if(seqno_compare(seqno, myseqno) > 0) {
1769 if(seqno_minus(seqno, myseqno) > 100) {
1770 /* Hopelessly out-of-date request */
1771 return;
1772 }
1773 update_myseqno();
1774 }
1775 }
1776 send_update(neigh->ifp, 1, prefix, plen);
1777 return;
1778 }
1779
1780 if(route &&
1781 (memcmp(id, route->src->id, 8) != 0 ||
1782 seqno_compare(seqno, route->seqno) <= 0)) {
1783 send_update(neigh->ifp, 1, prefix, plen);
1784 return;
1785 }
1786
1787 if(hop_count <= 1)
1788 return;
1789
1790 if(route && memcmp(id, route->src->id, 8) == 0 &&
1791 seqno_minus(seqno, route->seqno) > 100) {
1792 /* Hopelessly out-of-date */
1793 return;
1794 }
1795
1796 if(request_redundant(neigh->ifp, prefix, plen, seqno, id))
1797 return;
1798
1799 /* Let's try to forward this request. */
1800 if(route && route_metric(route) < INFINITY)
1801 successor = route->neigh;
1802
1803 if(!successor || successor == neigh) {
1804 /* We were about to forward a request to its requestor. Try to
1805 find a different neighbour to forward the request to. */
1806 struct babel_route *other_route;
1807
1808 other_route = find_best_route(prefix, plen, 0, neigh);
1809 if(other_route && route_metric(other_route) < INFINITY)
1810 successor = other_route->neigh;
1811 }
1812
1813 if(!successor || successor == neigh)
1814 /* Give up */
1815 return;
1816
1817 send_unicast_multihop_request(successor, prefix, plen, seqno, id,
1818 hop_count - 1);
1819 record_resend(RESEND_REQUEST, prefix, plen, seqno, id,
1820 neigh->ifp, 0);
1821 }