Annotation of embedaddon/bird2/proto/babel/packets.c, revision 1.1.1.1
1.1 misho 1: /*
2: * BIRD -- The Babel protocol
3: *
4: * Copyright (c) 2015--2016 Toke Hoiland-Jorgensen
5: * (c) 2016--2017 Ondrej Zajicek <santiago@crfreenet.org>
6: * (c) 2016--2017 CZ.NIC z.s.p.o.
7: *
8: * Can be freely distributed and used under the terms of the GNU GPL.
9: *
10: * This file contains the packet and TLV handling code for the protocol.
11: */
12:
13: #include "babel.h"
14:
15:
16: struct babel_pkt_header {
17: u8 magic;
18: u8 version;
19: u16 length;
20: } PACKED;
21:
22: struct babel_tlv {
23: u8 type;
24: u8 length;
25: u8 value[0];
26: } PACKED;
27:
28: struct babel_tlv_ack_req {
29: u8 type;
30: u8 length;
31: u16 reserved;
32: u16 nonce;
33: u16 interval;
34: } PACKED;
35:
36: struct babel_tlv_ack {
37: u8 type;
38: u8 length;
39: u16 nonce;
40: } PACKED;
41:
42: struct babel_tlv_hello {
43: u8 type;
44: u8 length;
45: u16 flags;
46: u16 seqno;
47: u16 interval;
48: } PACKED;
49:
50: struct babel_tlv_ihu {
51: u8 type;
52: u8 length;
53: u8 ae;
54: u8 reserved;
55: u16 rxcost;
56: u16 interval;
57: u8 addr[0];
58: } PACKED;
59:
60: struct babel_tlv_router_id {
61: u8 type;
62: u8 length;
63: u16 reserved;
64: u64 router_id;
65: } PACKED;
66:
67: struct babel_tlv_next_hop {
68: u8 type;
69: u8 length;
70: u8 ae;
71: u8 reserved;
72: u8 addr[0];
73: } PACKED;
74:
75: struct babel_tlv_update {
76: u8 type;
77: u8 length;
78: u8 ae;
79: u8 flags;
80: u8 plen;
81: u8 omitted;
82: u16 interval;
83: u16 seqno;
84: u16 metric;
85: u8 addr[0];
86: } PACKED;
87:
88: struct babel_tlv_route_request {
89: u8 type;
90: u8 length;
91: u8 ae;
92: u8 plen;
93: u8 addr[0];
94: } PACKED;
95:
96: struct babel_tlv_seqno_request {
97: u8 type;
98: u8 length;
99: u8 ae;
100: u8 plen;
101: u16 seqno;
102: u8 hop_count;
103: u8 reserved;
104: u64 router_id;
105: u8 addr[0];
106: } PACKED;
107:
108: struct babel_subtlv_source_prefix {
109: u8 type;
110: u8 length;
111: u8 plen;
112: u8 addr[0];
113: } PACKED;
114:
115:
116: /* Hello flags */
117: #define BABEL_HF_UNICAST 0x8000
118:
119: /* Update flags */
120: #define BABEL_UF_DEF_PREFIX 0x80
121: #define BABEL_UF_ROUTER_ID 0x40
122:
123:
124: struct babel_parse_state {
125: struct babel_proto *proto;
126: struct babel_iface *ifa;
127: ip_addr saddr;
128: ip_addr next_hop_ip4;
129: ip_addr next_hop_ip6;
130: u64 router_id; /* Router ID used in subsequent updates */
131: u8 def_ip6_prefix[16]; /* Implicit IPv6 prefix in network order */
132: u8 def_ip4_prefix[4]; /* Implicit IPv4 prefix in network order */
133: u8 router_id_seen; /* router_id field is valid */
134: u8 def_ip6_prefix_seen; /* def_ip6_prefix is valid */
135: u8 def_ip4_prefix_seen; /* def_ip4_prefix is valid */
136: u8 current_tlv_endpos; /* End of self-terminating TLVs (offset from start) */
137: u8 sadr_enabled;
138: };
139:
140: enum parse_result {
141: PARSE_SUCCESS,
142: PARSE_ERROR,
143: PARSE_IGNORE,
144: };
145:
146: struct babel_write_state {
147: u64 router_id;
148: u8 router_id_seen;
149: ip_addr next_hop_ip4;
150: ip_addr next_hop_ip6;
151: u8 def_ip6_prefix[16]; /* Implicit IPv6 prefix in network order */
152: u8 def_ip6_pxlen;
153: };
154:
155:
156: #define DROP(DSC,VAL) do { err_dsc = DSC; err_val = VAL; goto drop; } while(0)
157: #define DROP1(DSC) do { err_dsc = DSC; goto drop; } while(0)
158: #define LOG_PKT(msg, args...) \
159: log_rl(&p->log_pkt_tbf, L_REMOTE "%s: " msg, p->p.name, args)
160:
161: #define FIRST_TLV(p) ((struct babel_tlv *) (((struct babel_pkt_header *) p) + 1))
162: #define NEXT_TLV(t) ((struct babel_tlv *) (((byte *) t) + TLV_LENGTH(t)))
163: #define TLV_LENGTH(t) (t->type == BABEL_TLV_PAD1 ? 1 : t->length + sizeof(struct babel_tlv))
164: #define TLV_OPT_LENGTH(t) (t->length + sizeof(struct babel_tlv) - sizeof(*t))
165: #define TLV_HDR(tlv,t,l) ({ tlv->type = t; tlv->length = l - sizeof(struct babel_tlv); })
166: #define TLV_HDR0(tlv,t) TLV_HDR(tlv, t, tlv_data[t].min_length)
167:
168: #define NET_SIZE(n) BYTES(net_pxlen(n))
169:
170: static inline uint
171: bytes_equal(u8 *b1, u8 *b2, uint maxlen)
172: {
173: uint i;
174: for (i = 0; (i < maxlen) && (*b1 == *b2); i++, b1++, b2++)
175: ;
176: return i;
177: }
178:
179: static inline uint
180: get_time16(const void *p)
181: {
182: uint v = get_u16(p) * BABEL_TIME_UNITS;
183: return MAX(BABEL_MIN_INTERVAL, v);
184: }
185:
186: static inline void
187: put_time16(void *p, uint v)
188: {
189: put_u16(p, v / BABEL_TIME_UNITS);
190: }
191:
192: static inline void
193: read_ip4_px(net_addr *n, const void *p, uint plen)
194: {
195: ip4_addr addr = {0};
196: memcpy(&addr, p, BYTES(plen));
197: net_fill_ip4(n, ip4_ntoh(addr), plen);
198: }
199:
200: static inline void
201: put_ip4_px(void *p, net_addr *n)
202: {
203: ip4_addr addr = ip4_hton(net4_prefix(n));
204: memcpy(p, &addr, NET_SIZE(n));
205: }
206:
207: static inline void
208: read_ip6_px(net_addr *n, const void *p, uint plen)
209: {
210: ip6_addr addr = IPA_NONE;
211: memcpy(&addr, p, BYTES(plen));
212: net_fill_ip6(n, ip6_ntoh(addr), plen);
213: }
214:
215: static inline void
216: put_ip6_px(void *p, net_addr *n)
217: {
218: ip6_addr addr = ip6_hton(net6_prefix(n));
219: memcpy(p, &addr, NET_SIZE(n));
220: }
221:
222: static inline ip6_addr
223: get_ip6_ll(const void *p)
224: {
225: return ip6_build(0xfe800000, 0, get_u32(p+0), get_u32(p+4));
226: }
227:
228: static inline void
229: put_ip6_ll(void *p, ip6_addr addr)
230: {
231: put_u32(p+0, _I2(addr));
232: put_u32(p+4, _I3(addr));
233: }
234:
235:
236: /*
237: * TLV read/write functions
238: */
239:
240: static int babel_read_ack_req(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
241: static int babel_read_hello(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
242: static int babel_read_ihu(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
243: static int babel_read_router_id(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
244: static int babel_read_next_hop(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
245: static int babel_read_update(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
246: static int babel_read_route_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
247: static int babel_read_seqno_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
248: static int babel_read_source_prefix(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
249:
250: static uint babel_write_ack(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
251: static uint babel_write_hello(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
252: static uint babel_write_ihu(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
253: static uint babel_write_update(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
254: static uint babel_write_route_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
255: static uint babel_write_seqno_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
256: static int babel_write_source_prefix(struct babel_tlv *hdr, net_addr *net, uint max_len);
257:
258: struct babel_tlv_data {
259: u8 min_length;
260: int (*read_tlv)(struct babel_tlv *hdr, union babel_msg *m, struct babel_parse_state *state);
261: uint (*write_tlv)(struct babel_tlv *hdr, union babel_msg *m, struct babel_write_state *state, uint max_len);
262: void (*handle_tlv)(union babel_msg *m, struct babel_iface *ifa);
263: };
264:
265: static const struct babel_tlv_data tlv_data[BABEL_TLV_MAX] = {
266: [BABEL_TLV_ACK_REQ] = {
267: sizeof(struct babel_tlv_ack_req),
268: babel_read_ack_req,
269: NULL,
270: babel_handle_ack_req
271: },
272: [BABEL_TLV_ACK] = {
273: sizeof(struct babel_tlv_ack),
274: NULL,
275: babel_write_ack,
276: NULL
277: },
278: [BABEL_TLV_HELLO] = {
279: sizeof(struct babel_tlv_hello),
280: babel_read_hello,
281: babel_write_hello,
282: babel_handle_hello
283: },
284: [BABEL_TLV_IHU] = {
285: sizeof(struct babel_tlv_ihu),
286: babel_read_ihu,
287: babel_write_ihu,
288: babel_handle_ihu
289: },
290: [BABEL_TLV_ROUTER_ID] = {
291: sizeof(struct babel_tlv_router_id),
292: babel_read_router_id,
293: NULL,
294: NULL
295: },
296: [BABEL_TLV_NEXT_HOP] = {
297: sizeof(struct babel_tlv_next_hop),
298: babel_read_next_hop,
299: NULL,
300: NULL
301: },
302: [BABEL_TLV_UPDATE] = {
303: sizeof(struct babel_tlv_update),
304: babel_read_update,
305: babel_write_update,
306: babel_handle_update
307: },
308: [BABEL_TLV_ROUTE_REQUEST] = {
309: sizeof(struct babel_tlv_route_request),
310: babel_read_route_request,
311: babel_write_route_request,
312: babel_handle_route_request
313: },
314: [BABEL_TLV_SEQNO_REQUEST] = {
315: sizeof(struct babel_tlv_seqno_request),
316: babel_read_seqno_request,
317: babel_write_seqno_request,
318: babel_handle_seqno_request
319: },
320: };
321:
322: static int
323: babel_read_ack_req(struct babel_tlv *hdr, union babel_msg *m,
324: struct babel_parse_state *state)
325: {
326: struct babel_tlv_ack_req *tlv = (void *) hdr;
327: struct babel_msg_ack_req *msg = &m->ack_req;
328:
329: msg->type = BABEL_TLV_ACK_REQ;
330: msg->nonce = get_u16(&tlv->nonce);
331: msg->interval = get_time16(&tlv->interval);
332: msg->sender = state->saddr;
333:
334: if (!msg->interval)
335: return PARSE_ERROR;
336:
337: return PARSE_SUCCESS;
338: }
339:
340: static uint
341: babel_write_ack(struct babel_tlv *hdr, union babel_msg *m,
342: struct babel_write_state *state UNUSED, uint max_len UNUSED)
343: {
344: struct babel_tlv_ack *tlv = (void *) hdr;
345: struct babel_msg_ack *msg = &m->ack;
346:
347: TLV_HDR0(tlv, BABEL_TLV_ACK);
348: put_u16(&tlv->nonce, msg->nonce);
349:
350: return sizeof(struct babel_tlv_ack);
351: }
352:
353: static int
354: babel_read_hello(struct babel_tlv *hdr, union babel_msg *m,
355: struct babel_parse_state *state)
356: {
357: struct babel_tlv_hello *tlv = (void *) hdr;
358: struct babel_msg_hello *msg = &m->hello;
359:
360: /* We currently don't support unicast Hello */
361: u16 flags = get_u16(&tlv->flags);
362: if (flags & BABEL_HF_UNICAST)
363: return PARSE_IGNORE;
364:
365: msg->type = BABEL_TLV_HELLO;
366: msg->seqno = get_u16(&tlv->seqno);
367: msg->interval = get_time16(&tlv->interval);
368: msg->sender = state->saddr;
369:
370: return PARSE_SUCCESS;
371: }
372:
373: static uint
374: babel_write_hello(struct babel_tlv *hdr, union babel_msg *m,
375: struct babel_write_state *state UNUSED, uint max_len UNUSED)
376: {
377: struct babel_tlv_hello *tlv = (void *) hdr;
378: struct babel_msg_hello *msg = &m->hello;
379:
380: TLV_HDR0(tlv, BABEL_TLV_HELLO);
381: put_u16(&tlv->seqno, msg->seqno);
382: put_time16(&tlv->interval, msg->interval);
383:
384: return sizeof(struct babel_tlv_hello);
385: }
386:
387: static int
388: babel_read_ihu(struct babel_tlv *hdr, union babel_msg *m,
389: struct babel_parse_state *state)
390: {
391: struct babel_tlv_ihu *tlv = (void *) hdr;
392: struct babel_msg_ihu *msg = &m->ihu;
393:
394: msg->type = BABEL_TLV_IHU;
395: msg->ae = tlv->ae;
396: msg->rxcost = get_u16(&tlv->rxcost);
397: msg->interval = get_time16(&tlv->interval);
398: msg->addr = IPA_NONE;
399: msg->sender = state->saddr;
400:
401: if (msg->ae >= BABEL_AE_MAX)
402: return PARSE_IGNORE;
403:
404: /*
405: * We only actually read link-local IPs. In every other case, the addr field
406: * will be 0 but validation will succeed. The handler takes care of these
407: * cases. We handle them here anyway because we need the length for parsing
408: * subtlvs.
409: */
410: switch (msg->ae)
411: {
412: case BABEL_AE_IP4:
413: if (TLV_OPT_LENGTH(tlv) < 4)
414: return PARSE_ERROR;
415: state->current_tlv_endpos += 4;
416: break;
417:
418: case BABEL_AE_IP6:
419: if (TLV_OPT_LENGTH(tlv) < 16)
420: return PARSE_ERROR;
421: state->current_tlv_endpos += 16;
422: break;
423:
424: case BABEL_AE_IP6_LL:
425: if (TLV_OPT_LENGTH(tlv) < 8)
426: return PARSE_ERROR;
427:
428: msg->addr = ipa_from_ip6(get_ip6_ll(&tlv->addr));
429: state->current_tlv_endpos += 8;
430: break;
431: }
432:
433: return PARSE_SUCCESS;
434: }
435:
436: static uint
437: babel_write_ihu(struct babel_tlv *hdr, union babel_msg *m,
438: struct babel_write_state *state UNUSED, uint max_len)
439: {
440: struct babel_tlv_ihu *tlv = (void *) hdr;
441: struct babel_msg_ihu *msg = &m->ihu;
442:
443: if (ipa_is_link_local(msg->addr) && max_len < sizeof(struct babel_tlv_ihu) + 8)
444: return 0;
445:
446: TLV_HDR0(tlv, BABEL_TLV_IHU);
447: put_u16(&tlv->rxcost, msg->rxcost);
448: put_time16(&tlv->interval, msg->interval);
449:
450: if (!ipa_is_link_local(msg->addr))
451: {
452: tlv->ae = BABEL_AE_WILDCARD;
453: return sizeof(struct babel_tlv_ihu);
454: }
455: put_ip6_ll(&tlv->addr, msg->addr);
456: tlv->ae = BABEL_AE_IP6_LL;
457: hdr->length += 8;
458: return sizeof(struct babel_tlv_ihu) + 8;
459: }
460:
461: static int
462: babel_read_router_id(struct babel_tlv *hdr, union babel_msg *m UNUSED,
463: struct babel_parse_state *state)
464: {
465: struct babel_tlv_router_id *tlv = (void *) hdr;
466:
467: state->router_id = get_u64(&tlv->router_id);
468: state->router_id_seen = 1;
469:
470: return PARSE_IGNORE;
471: }
472:
473: /* This is called directly from babel_write_update() */
474: static uint
475: babel_write_router_id(struct babel_tlv *hdr, u64 router_id,
476: struct babel_write_state *state, uint max_len UNUSED)
477: {
478: struct babel_tlv_router_id *tlv = (void *) hdr;
479:
480: /* We still assume that first min_length bytes are available and zeroed */
481:
482: TLV_HDR0(tlv, BABEL_TLV_ROUTER_ID);
483: put_u64(&tlv->router_id, router_id);
484:
485: state->router_id = router_id;
486: state->router_id_seen = 1;
487:
488: return sizeof(struct babel_tlv_router_id);
489: }
490:
491: static int
492: babel_read_next_hop(struct babel_tlv *hdr, union babel_msg *m UNUSED,
493: struct babel_parse_state *state)
494: {
495: struct babel_tlv_next_hop *tlv = (void *) hdr;
496:
497: switch (tlv->ae)
498: {
499: case BABEL_AE_WILDCARD:
500: return PARSE_ERROR;
501:
502: case BABEL_AE_IP4:
503: if (TLV_OPT_LENGTH(tlv) < sizeof(ip4_addr))
504: return PARSE_ERROR;
505:
506: state->next_hop_ip4 = ipa_from_ip4(get_ip4(&tlv->addr));
507: state->current_tlv_endpos += sizeof(ip4_addr);
508: return PARSE_IGNORE;
509:
510: case BABEL_AE_IP6:
511: if (TLV_OPT_LENGTH(tlv) < sizeof(ip6_addr))
512: return PARSE_ERROR;
513:
514: state->next_hop_ip6 = ipa_from_ip6(get_ip6(&tlv->addr));
515: state->current_tlv_endpos += sizeof(ip6_addr);
516: return PARSE_IGNORE;
517:
518: case BABEL_AE_IP6_LL:
519: if (TLV_OPT_LENGTH(tlv) < 8)
520: return PARSE_ERROR;
521:
522: state->next_hop_ip6 = ipa_from_ip6(get_ip6_ll(&tlv->addr));
523: state->current_tlv_endpos += 8;
524: return PARSE_IGNORE;
525:
526: default:
527: return PARSE_IGNORE;
528: }
529:
530: return PARSE_IGNORE;
531: }
532:
533: /* This is called directly from babel_write_update() and returns -1 if a next
534: hop should be written but there is not enough space. */
535: static int
536: babel_write_next_hop(struct babel_tlv *hdr, ip_addr addr,
537: struct babel_write_state *state, uint max_len)
538: {
539: struct babel_tlv_next_hop *tlv = (void *) hdr;
540:
541: if (ipa_zero(addr))
542: {
543: /* Should not happen */
544: return 0;
545: }
546: else if (ipa_is_ip4(addr) && !ipa_equal(addr, state->next_hop_ip4))
547: {
548: uint len = sizeof(struct babel_tlv_next_hop) + sizeof(ip4_addr);
549: if (len > max_len)
550: return -1;
551:
552: TLV_HDR(tlv, BABEL_TLV_NEXT_HOP, len);
553:
554: tlv->ae = BABEL_AE_IP4;
555: put_ip4(&tlv->addr, ipa_to_ip4(addr));
556: state->next_hop_ip4 = addr;
557:
558: return len;
559: }
560: else if (ipa_is_ip6(addr) && !ipa_equal(addr, state->next_hop_ip6))
561: {
562: uint len = sizeof(struct babel_tlv_next_hop) + sizeof(ip6_addr);
563: if (len > max_len)
564: return -1;
565:
566: TLV_HDR(tlv, BABEL_TLV_NEXT_HOP, len);
567:
568: tlv->ae = BABEL_AE_IP6;
569: put_ip6(&tlv->addr, ipa_to_ip6(addr));
570: state->next_hop_ip6 = addr;
571:
572: return len;
573: }
574:
575: return 0;
576: }
577:
578: static int
579: babel_read_update(struct babel_tlv *hdr, union babel_msg *m,
580: struct babel_parse_state *state)
581: {
582: struct babel_tlv_update *tlv = (void *) hdr;
583: struct babel_msg_update *msg = &m->update;
584:
585: msg->type = BABEL_TLV_UPDATE;
586: msg->interval = get_time16(&tlv->interval);
587: msg->seqno = get_u16(&tlv->seqno);
588: msg->metric = get_u16(&tlv->metric);
589:
590: /* Length of received prefix data without omitted part */
591: int len = BYTES(tlv->plen) - (int) tlv->omitted;
592: u8 buf[16] = {};
593:
594: if ((len < 0) || ((uint) len > TLV_OPT_LENGTH(tlv)))
595: return PARSE_ERROR;
596:
597: switch (tlv->ae)
598: {
599: case BABEL_AE_WILDCARD:
600: if (tlv->plen > 0)
601: return PARSE_ERROR;
602:
603: if (msg->metric != 65535)
604: return PARSE_ERROR;
605:
606: msg->wildcard = 1;
607: break;
608:
609: case BABEL_AE_IP4:
610: if (tlv->plen > IP4_MAX_PREFIX_LENGTH)
611: return PARSE_ERROR;
612:
613: /* Cannot omit data if there is no saved prefix */
614: if (tlv->omitted && !state->def_ip4_prefix_seen)
615: return PARSE_ERROR;
616:
617: /* Update must have next hop, unless it is retraction */
618: if (ipa_zero(state->next_hop_ip4) && (msg->metric != BABEL_INFINITY))
619: return PARSE_IGNORE;
620:
621: /* Merge saved prefix and received prefix parts */
622: memcpy(buf, state->def_ip4_prefix, tlv->omitted);
623: memcpy(buf + tlv->omitted, tlv->addr, len);
624:
625: ip4_addr prefix4 = get_ip4(buf);
626: net_fill_ip4(&msg->net, prefix4, tlv->plen);
627:
628: if (tlv->flags & BABEL_UF_DEF_PREFIX)
629: {
630: put_ip4(state->def_ip4_prefix, prefix4);
631: state->def_ip4_prefix_seen = 1;
632: }
633:
634: msg->next_hop = state->next_hop_ip4;
635:
636: break;
637:
638: case BABEL_AE_IP6:
639: if (tlv->plen > IP6_MAX_PREFIX_LENGTH)
640: return PARSE_ERROR;
641:
642: /* Cannot omit data if there is no saved prefix */
643: if (tlv->omitted && !state->def_ip6_prefix_seen)
644: return PARSE_ERROR;
645:
646: /* Merge saved prefix and received prefix parts */
647: memcpy(buf, state->def_ip6_prefix, tlv->omitted);
648: memcpy(buf + tlv->omitted, tlv->addr, len);
649:
650: ip6_addr prefix6 = get_ip6(buf);
651: net_fill_ip6(&msg->net, prefix6, tlv->plen);
652:
653: if (state->sadr_enabled)
654: net_make_ip6_sadr(&msg->net);
655:
656: if (tlv->flags & BABEL_UF_DEF_PREFIX)
657: {
658: put_ip6(state->def_ip6_prefix, prefix6);
659: state->def_ip6_prefix_seen = 1;
660: }
661:
662: if (tlv->flags & BABEL_UF_ROUTER_ID)
663: {
664: state->router_id = ((u64) _I2(prefix6)) << 32 | _I3(prefix6);
665: state->router_id_seen = 1;
666: }
667:
668: msg->next_hop = state->next_hop_ip6;
669:
670: break;
671:
672: case BABEL_AE_IP6_LL:
673: /* ??? */
674: return PARSE_IGNORE;
675:
676: default:
677: return PARSE_IGNORE;
678: }
679:
680: /* Update must have Router ID, unless it is retraction */
681: if (!state->router_id_seen && (msg->metric != BABEL_INFINITY))
682: {
683: DBG("Babel: No router ID seen before update\n");
684: return PARSE_ERROR;
685: }
686:
687: msg->router_id = state->router_id;
688: msg->sender = state->saddr;
689: state->current_tlv_endpos += len;
690:
691: return PARSE_SUCCESS;
692: }
693:
694: static uint
695: babel_write_update(struct babel_tlv *hdr, union babel_msg *m,
696: struct babel_write_state *state, uint max_len)
697: {
698: struct babel_msg_update *msg = &m->update;
699: uint len0 = 0;
700:
701: /*
702: * When needed, we write Router-ID TLV before Update TLV and return size of
703: * both of them. There is enough space for the Router-ID TLV, because
704: * sizeof(struct babel_tlv_router_id) == sizeof(struct babel_tlv_update).
705: *
706: * Router ID is not used for retractions, so do not use it in such case.
707: */
708: if ((msg->metric < BABEL_INFINITY) &&
709: (!state->router_id_seen || (msg->router_id != state->router_id)))
710: {
711: len0 = babel_write_router_id(hdr, msg->router_id, state, max_len);
712: hdr = NEXT_TLV(hdr);
713: }
714:
715: /*
716: * We also may add Next Hop TLV for regular updates. It may fail for not
717: * enough space or it may be unnecessary as the next hop is the same as the
718: * last one already announced. So we handle all three cases.
719: */
720: if (msg->metric < BABEL_INFINITY)
721: {
722: int l = babel_write_next_hop(hdr, msg->next_hop, state, max_len - len0);
723: if (l < 0)
724: return 0;
725:
726: if (l)
727: {
728: len0 += l;
729: hdr = NEXT_TLV(hdr);
730: }
731: }
732:
733: struct babel_tlv_update *tlv = (void *) hdr;
734: uint len = sizeof(struct babel_tlv_update) + NET_SIZE(&msg->net);
735:
736: if (len0 + len > max_len)
737: return 0;
738:
739: memset(tlv, 0, sizeof(struct babel_tlv_update));
740: TLV_HDR(tlv, BABEL_TLV_UPDATE, len);
741:
742: if (msg->wildcard)
743: {
744: tlv->ae = BABEL_AE_WILDCARD;
745: tlv->plen = 0;
746: }
747: else if (msg->net.type == NET_IP4)
748: {
749: tlv->ae = BABEL_AE_IP4;
750: tlv->plen = net4_pxlen(&msg->net);
751: put_ip4_px(tlv->addr, &msg->net);
752: }
753: else
754: {
755: tlv->ae = BABEL_AE_IP6;
756: tlv->plen = net6_pxlen(&msg->net);
757:
758: /* Address compression - omit initial matching bytes */
759: u8 buf[16], omit;
760: put_ip6(buf, net6_prefix(&msg->net));
761: omit = bytes_equal(buf, state->def_ip6_prefix,
762: MIN(tlv->plen, state->def_ip6_pxlen) / 8);
763:
764: if (omit > 0)
765: {
766: memcpy(tlv->addr, buf + omit, NET_SIZE(&msg->net) - omit);
767:
768: tlv->omitted = omit;
769: tlv->length -= omit;
770: len -= omit;
771: }
772: else
773: {
774: put_ip6_px(tlv->addr, &msg->net);
775: tlv->flags |= BABEL_UF_DEF_PREFIX;
776:
777: put_ip6(state->def_ip6_prefix, net6_prefix(&msg->net));
778: state->def_ip6_pxlen = tlv->plen;
779: }
780: }
781:
782: put_time16(&tlv->interval, msg->interval);
783: put_u16(&tlv->seqno, msg->seqno);
784: put_u16(&tlv->metric, msg->metric);
785:
786: if (msg->net.type == NET_IP6_SADR)
787: {
788: int l = babel_write_source_prefix(hdr, &msg->net, max_len - (len0 + len));
789: if (l < 0)
790: return 0;
791:
792: len += l;
793: }
794:
795: return len0 + len;
796: }
797:
798: static int
799: babel_read_route_request(struct babel_tlv *hdr, union babel_msg *m,
800: struct babel_parse_state *state)
801: {
802: struct babel_tlv_route_request *tlv = (void *) hdr;
803: struct babel_msg_route_request *msg = &m->route_request;
804:
805: msg->type = BABEL_TLV_ROUTE_REQUEST;
806:
807: switch (tlv->ae)
808: {
809: case BABEL_AE_WILDCARD:
810: /* Wildcard requests must have plen 0 */
811: if (tlv->plen > 0)
812: return PARSE_ERROR;
813:
814: msg->full = 1;
815: return PARSE_SUCCESS;
816:
817: case BABEL_AE_IP4:
818: if (tlv->plen > IP4_MAX_PREFIX_LENGTH)
819: return PARSE_ERROR;
820:
821: if (TLV_OPT_LENGTH(tlv) < BYTES(tlv->plen))
822: return PARSE_ERROR;
823:
824: read_ip4_px(&msg->net, tlv->addr, tlv->plen);
825: state->current_tlv_endpos += BYTES(tlv->plen);
826: return PARSE_SUCCESS;
827:
828: case BABEL_AE_IP6:
829: if (tlv->plen > IP6_MAX_PREFIX_LENGTH)
830: return PARSE_ERROR;
831:
832: if (TLV_OPT_LENGTH(tlv) < BYTES(tlv->plen))
833: return PARSE_ERROR;
834:
835: read_ip6_px(&msg->net, tlv->addr, tlv->plen);
836: state->current_tlv_endpos += BYTES(tlv->plen);
837:
838: if (state->sadr_enabled)
839: net_make_ip6_sadr(&msg->net);
840:
841: return PARSE_SUCCESS;
842:
843: case BABEL_AE_IP6_LL:
844: return PARSE_ERROR;
845:
846: default:
847: return PARSE_IGNORE;
848: }
849:
850: return PARSE_IGNORE;
851: }
852:
853: static uint
854: babel_write_route_request(struct babel_tlv *hdr, union babel_msg *m,
855: struct babel_write_state *state UNUSED, uint max_len)
856: {
857: struct babel_tlv_route_request *tlv = (void *) hdr;
858: struct babel_msg_route_request *msg = &m->route_request;
859:
860: uint len = sizeof(struct babel_tlv_route_request) + NET_SIZE(&msg->net);
861:
862: if (len > max_len)
863: return 0;
864:
865: TLV_HDR(tlv, BABEL_TLV_ROUTE_REQUEST, len);
866:
867: if (msg->full)
868: {
869: tlv->ae = BABEL_AE_WILDCARD;
870: tlv->plen = 0;
871: }
872: else if (msg->net.type == NET_IP4)
873: {
874: tlv->ae = BABEL_AE_IP4;
875: tlv->plen = net4_pxlen(&msg->net);
876: put_ip4_px(tlv->addr, &msg->net);
877: }
878: else
879: {
880: tlv->ae = BABEL_AE_IP6;
881: tlv->plen = net6_pxlen(&msg->net);
882: put_ip6_px(tlv->addr, &msg->net);
883: }
884:
885: if (msg->net.type == NET_IP6_SADR)
886: {
887: int l = babel_write_source_prefix(hdr, &msg->net, max_len - len);
888: if (l < 0)
889: return 0;
890:
891: len += l;
892: }
893:
894: return len;
895: }
896:
897: static int
898: babel_read_seqno_request(struct babel_tlv *hdr, union babel_msg *m,
899: struct babel_parse_state *state)
900: {
901: struct babel_tlv_seqno_request *tlv = (void *) hdr;
902: struct babel_msg_seqno_request *msg = &m->seqno_request;
903:
904: msg->type = BABEL_TLV_SEQNO_REQUEST;
905: msg->seqno = get_u16(&tlv->seqno);
906: msg->hop_count = tlv->hop_count;
907: msg->router_id = get_u64(&tlv->router_id);
908: msg->sender = state->saddr;
909:
910: if (tlv->hop_count == 0)
911: return PARSE_ERROR;
912:
913: switch (tlv->ae)
914: {
915: case BABEL_AE_WILDCARD:
916: return PARSE_ERROR;
917:
918: case BABEL_AE_IP4:
919: if (tlv->plen > IP4_MAX_PREFIX_LENGTH)
920: return PARSE_ERROR;
921:
922: if (TLV_OPT_LENGTH(tlv) < BYTES(tlv->plen))
923: return PARSE_ERROR;
924:
925: read_ip4_px(&msg->net, tlv->addr, tlv->plen);
926: state->current_tlv_endpos += BYTES(tlv->plen);
927: return PARSE_SUCCESS;
928:
929: case BABEL_AE_IP6:
930: if (tlv->plen > IP6_MAX_PREFIX_LENGTH)
931: return PARSE_ERROR;
932:
933: if (TLV_OPT_LENGTH(tlv) < BYTES(tlv->plen))
934: return PARSE_ERROR;
935:
936: read_ip6_px(&msg->net, tlv->addr, tlv->plen);
937: state->current_tlv_endpos += BYTES(tlv->plen);
938:
939: if (state->sadr_enabled)
940: net_make_ip6_sadr(&msg->net);
941:
942: return PARSE_SUCCESS;
943:
944: case BABEL_AE_IP6_LL:
945: return PARSE_ERROR;
946:
947: default:
948: return PARSE_IGNORE;
949: }
950:
951: return PARSE_IGNORE;
952: }
953:
954: static uint
955: babel_write_seqno_request(struct babel_tlv *hdr, union babel_msg *m,
956: struct babel_write_state *state UNUSED, uint max_len)
957: {
958: struct babel_tlv_seqno_request *tlv = (void *) hdr;
959: struct babel_msg_seqno_request *msg = &m->seqno_request;
960:
961: uint len = sizeof(struct babel_tlv_seqno_request) + NET_SIZE(&msg->net);
962:
963: if (len > max_len)
964: return 0;
965:
966: TLV_HDR(tlv, BABEL_TLV_SEQNO_REQUEST, len);
967:
968: if (msg->net.type == NET_IP4)
969: {
970: tlv->ae = BABEL_AE_IP4;
971: tlv->plen = net4_pxlen(&msg->net);
972: put_ip4_px(tlv->addr, &msg->net);
973: }
974: else
975: {
976: tlv->ae = BABEL_AE_IP6;
977: tlv->plen = net6_pxlen(&msg->net);
978: put_ip6_px(tlv->addr, &msg->net);
979: }
980:
981: put_u16(&tlv->seqno, msg->seqno);
982: tlv->hop_count = msg->hop_count;
983: put_u64(&tlv->router_id, msg->router_id);
984:
985: if (msg->net.type == NET_IP6_SADR)
986: {
987: int l = babel_write_source_prefix(hdr, &msg->net, max_len - len);
988: if (l < 0)
989: return 0;
990:
991: len += l;
992: }
993:
994: return len;
995: }
996:
997: static int
998: babel_read_source_prefix(struct babel_tlv *hdr, union babel_msg *msg,
999: struct babel_parse_state *state UNUSED)
1000: {
1001: struct babel_subtlv_source_prefix *tlv = (void *) hdr;
1002: net_addr_ip6_sadr *net;
1003:
1004: /*
1005: * We would like to skip the sub-TLV if SADR is not enabled, but we do not
1006: * know AF of the enclosing TLV yet. We will do that later.
1007: */
1008:
1009: /* Check internal consistency */
1010: if ((tlv->length < 1) ||
1011: (tlv->plen > IP6_MAX_PREFIX_LENGTH) ||
1012: (tlv->length < (1 + BYTES(tlv->plen))))
1013: return PARSE_ERROR;
1014:
1015: /* Plen MUST NOT be 0 */
1016: if (tlv->plen == 0)
1017: return PARSE_ERROR;
1018:
1019: switch(msg->type)
1020: {
1021: case BABEL_TLV_UPDATE:
1022: /* Wildcard updates with source prefix MUST be silently ignored */
1023: if (msg->update.wildcard)
1024: return PARSE_IGNORE;
1025:
1026: net = (void *) &msg->update.net;
1027: break;
1028:
1029: case BABEL_TLV_ROUTE_REQUEST:
1030: /* Wildcard requests with source addresses MUST be silently ignored */
1031: if (msg->route_request.full)
1032: return PARSE_IGNORE;
1033:
1034: net = (void *) &msg->route_request.net;
1035: break;
1036:
1037: case BABEL_TLV_SEQNO_REQUEST:
1038: net = (void *) &msg->seqno_request.net;
1039: break;
1040:
1041: default:
1042: return PARSE_ERROR;
1043: }
1044:
1045: /* If SADR is active, the net has appropriate type */
1046: if (net->type != NET_IP6_SADR)
1047: return PARSE_IGNORE;
1048:
1049: /* Duplicate Source Prefix sub-TLV; SHOULD ignore whole TLV */
1050: if (net->src_pxlen > 0)
1051: return PARSE_IGNORE;
1052:
1053: net_addr_ip6 src;
1054: read_ip6_px((void *) &src, tlv->addr, tlv->plen);
1055: net->src_prefix = src.prefix;
1056: net->src_pxlen = src.pxlen;
1057:
1058: return PARSE_SUCCESS;
1059: }
1060:
1061: static int
1062: babel_write_source_prefix(struct babel_tlv *hdr, net_addr *n, uint max_len)
1063: {
1064: struct babel_subtlv_source_prefix *tlv = (void *) NEXT_TLV(hdr);
1065: net_addr_ip6_sadr *net = (void *) n;
1066:
1067: /* Do not use this sub-TLV for default prefix */
1068: if (net->src_pxlen == 0)
1069: return 0;
1070:
1071: uint len = sizeof(*tlv) + BYTES(net->src_pxlen);
1072:
1073: if (len > max_len)
1074: return -1;
1075:
1076: TLV_HDR(tlv, BABEL_SUBTLV_SOURCE_PREFIX, len);
1077: hdr->length += len;
1078:
1079: net_addr_ip6 src = NET_ADDR_IP6(net->src_prefix, net->src_pxlen);
1080: tlv->plen = src.pxlen;
1081: put_ip6_px(tlv->addr, (void *) &src);
1082:
1083: return len;
1084: }
1085:
1086:
1087: static inline int
1088: babel_read_subtlvs(struct babel_tlv *hdr,
1089: union babel_msg *msg,
1090: struct babel_parse_state *state)
1091: {
1092: struct babel_tlv *tlv;
1093: byte *pos, *end = (byte *) hdr + TLV_LENGTH(hdr);
1094: int res;
1095:
1096: for (tlv = (void *) hdr + state->current_tlv_endpos;
1097: (byte *) tlv < end;
1098: tlv = NEXT_TLV(tlv))
1099: {
1100: /* Ugly special case */
1101: if (tlv->type == BABEL_TLV_PAD1)
1102: continue;
1103:
1104: /* The end of the common TLV header */
1105: pos = (byte *)tlv + sizeof(struct babel_tlv);
1106: if ((pos > end) || (pos + tlv->length > end))
1107: return PARSE_ERROR;
1108:
1109: /*
1110: * The subtlv type space is non-contiguous (due to the mandatory bit), so
1111: * use a switch for dispatch instead of the mapping array we use for TLVs
1112: */
1113: switch (tlv->type)
1114: {
1115: case BABEL_SUBTLV_SOURCE_PREFIX:
1116: res = babel_read_source_prefix(tlv, msg, state);
1117: if (res != PARSE_SUCCESS)
1118: return res;
1119: break;
1120:
1121: case BABEL_SUBTLV_PADN:
1122: default:
1123: /* Unknown mandatory subtlv; PARSE_IGNORE ignores the whole TLV */
1124: if (tlv->type >= 128)
1125: return PARSE_IGNORE;
1126: break;
1127: }
1128: }
1129:
1130: return PARSE_SUCCESS;
1131: }
1132:
1133: static inline int
1134: babel_read_tlv(struct babel_tlv *hdr,
1135: union babel_msg *msg,
1136: struct babel_parse_state *state)
1137: {
1138: if ((hdr->type <= BABEL_TLV_PADN) ||
1139: (hdr->type >= BABEL_TLV_MAX) ||
1140: !tlv_data[hdr->type].read_tlv)
1141: return PARSE_IGNORE;
1142:
1143: if (TLV_LENGTH(hdr) < tlv_data[hdr->type].min_length)
1144: return PARSE_ERROR;
1145:
1146: state->current_tlv_endpos = tlv_data[hdr->type].min_length;
1147: memset(msg, 0, sizeof(*msg));
1148:
1149: int res = tlv_data[hdr->type].read_tlv(hdr, msg, state);
1150: if (res != PARSE_SUCCESS)
1151: return res;
1152:
1153: return babel_read_subtlvs(hdr, msg, state);
1154: }
1155:
1156: static uint
1157: babel_write_tlv(struct babel_tlv *hdr,
1158: union babel_msg *msg,
1159: struct babel_write_state *state,
1160: uint max_len)
1161: {
1162: if ((msg->type <= BABEL_TLV_PADN) ||
1163: (msg->type >= BABEL_TLV_MAX) ||
1164: !tlv_data[msg->type].write_tlv)
1165: return 0;
1166:
1167: if (tlv_data[msg->type].min_length > max_len)
1168: return 0;
1169:
1170: memset(hdr, 0, tlv_data[msg->type].min_length);
1171: return tlv_data[msg->type].write_tlv(hdr, msg, state, max_len);
1172: }
1173:
1174:
1175: /*
1176: * Packet RX/TX functions
1177: */
1178:
1179: static int
1180: babel_send_to(struct babel_iface *ifa, ip_addr dest)
1181: {
1182: sock *sk = ifa->sk;
1183: struct babel_pkt_header *hdr = (void *) sk->tbuf;
1184: int len = get_u16(&hdr->length) + sizeof(struct babel_pkt_header);
1185:
1186: DBG("Babel: Sending %d bytes to %I\n", len, dest);
1187: return sk_send_to(sk, len, dest, 0);
1188: }
1189:
1190: /**
1191: * babel_write_queue - Write a TLV queue to a transmission buffer
1192: * @ifa: Interface holding the transmission buffer
1193: * @queue: TLV queue to write (containing internal-format TLVs)
1194: *
1195: * This function writes a packet to the interface transmission buffer with as
1196: * many TLVs from the &queue as will fit in the buffer. It returns the number of
1197: * bytes written (NOT counting the packet header). The function is called by
1198: * babel_send_queue() and babel_send_unicast() to construct packets for
1199: * transmission, and uses per-TLV helper functions to convert the
1200: * internal-format TLVs to their wire representations.
1201: *
1202: * The TLVs in the queue are freed after they are written to the buffer.
1203: */
1204: static uint
1205: babel_write_queue(struct babel_iface *ifa, list *queue)
1206: {
1207: struct babel_proto *p = ifa->proto;
1208: struct babel_write_state state = { .next_hop_ip6 = ifa->addr };
1209:
1210: if (EMPTY_LIST(*queue))
1211: return 0;
1212:
1213: byte *pos = ifa->sk->tbuf;
1214: byte *end = pos + ifa->tx_length;
1215:
1216: struct babel_pkt_header *pkt = (void *) pos;
1217: pkt->magic = BABEL_MAGIC;
1218: pkt->version = BABEL_VERSION;
1219: pkt->length = 0;
1220: pos += sizeof(struct babel_pkt_header);
1221:
1222: struct babel_msg_node *msg;
1223: WALK_LIST_FIRST(msg, *queue)
1224: {
1225: if (pos >= end)
1226: break;
1227:
1228: int len = babel_write_tlv((struct babel_tlv *) pos, &msg->msg, &state, end - pos);
1229:
1230: if (!len)
1231: break;
1232:
1233: pos += len;
1234: rem_node(NODE msg);
1235: sl_free(p->msg_slab, msg);
1236: }
1237:
1238: uint plen = pos - (byte *) pkt;
1239: put_u16(&pkt->length, plen - sizeof(struct babel_pkt_header));
1240:
1241: return plen;
1242: }
1243:
1244: void
1245: babel_send_queue(void *arg)
1246: {
1247: struct babel_iface *ifa = arg;
1248: while ((babel_write_queue(ifa, &ifa->msg_queue) > 0) &&
1249: (babel_send_to(ifa, IP6_BABEL_ROUTERS) > 0));
1250: }
1251:
1252: static inline void
1253: babel_kick_queue(struct babel_iface *ifa)
1254: {
1255: /*
1256: * Only schedule send event if there is not already data in the socket buffer.
1257: * Otherwise we may overwrite the data already in the buffer.
1258: */
1259:
1260: if ((ifa->sk->tpos == ifa->sk->tbuf) && !ev_active(ifa->send_event))
1261: ev_schedule(ifa->send_event);
1262: }
1263:
1264: /**
1265: * babel_send_unicast - send a single TLV via unicast to a destination
1266: * @msg: TLV to send
1267: * @ifa: Interface to send via
1268: * @dest: Destination of the TLV
1269: *
1270: * This function is used to send a single TLV via unicast to a designated
1271: * receiver. This is used for replying to certain incoming requests, and for
1272: * sending unicast requests to refresh routes before they expire.
1273: */
1274: void
1275: babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest)
1276: {
1277: struct babel_proto *p = ifa->proto;
1278: struct babel_msg_node *msgn = sl_alloc(p->msg_slab);
1279: list queue;
1280:
1281: msgn->msg = *msg;
1282: init_list(&queue);
1283: add_tail(&queue, NODE msgn);
1284: babel_write_queue(ifa, &queue);
1285: babel_send_to(ifa, dest);
1286:
1287: /* We could overwrite waiting packet here, we may have to kick TX queue */
1288: if (!EMPTY_LIST(ifa->msg_queue))
1289: babel_kick_queue(ifa);
1290: }
1291:
1292: /**
1293: * babel_enqueue - enqueue a TLV for transmission on an interface
1294: * @msg: TLV to enqueue (in internal TLV format)
1295: * @ifa: Interface to enqueue to
1296: *
1297: * This function is called to enqueue a TLV for subsequent transmission on an
1298: * interface. The transmission event is triggered whenever a TLV is enqueued;
1299: * this ensures that TLVs will be transmitted in a timely manner, but that TLVs
1300: * which are enqueued in rapid succession can be transmitted together in one
1301: * packet.
1302: */
1303: void
1304: babel_enqueue(union babel_msg *msg, struct babel_iface *ifa)
1305: {
1306: struct babel_proto *p = ifa->proto;
1307: struct babel_msg_node *msgn = sl_alloc(p->msg_slab);
1308: msgn->msg = *msg;
1309: add_tail(&ifa->msg_queue, NODE msgn);
1310: babel_kick_queue(ifa);
1311: }
1312:
1313: /**
1314: * babel_process_packet - process incoming data packet
1315: * @pkt: Pointer to the packet data
1316: * @len: Length of received packet
1317: * @saddr: Address of packet sender
1318: * @ifa: Interface packet was received on.
1319: *
1320: * This function is the main processing hook of incoming Babel packets. It
1321: * checks that the packet header is well-formed, then processes the TLVs
1322: * contained in the packet. This is done in two passes: First all TLVs are
1323: * parsed into the internal TLV format. If a TLV parser fails, processing of the
1324: * rest of the packet is aborted.
1325: *
1326: * After the parsing step, the TLV handlers are called for each parsed TLV in
1327: * order.
1328: */
1329: static void
1330: babel_process_packet(struct babel_pkt_header *pkt, int len,
1331: ip_addr saddr, struct babel_iface *ifa)
1332: {
1333: struct babel_proto *p = ifa->proto;
1334: struct babel_tlv *tlv;
1335: struct babel_msg_node *msg;
1336: list msgs;
1337: int res;
1338:
1339: int plen = sizeof(struct babel_pkt_header) + get_u16(&pkt->length);
1340: byte *pos;
1341: byte *end = (byte *)pkt + plen;
1342:
1343: struct babel_parse_state state = {
1344: .proto = p,
1345: .ifa = ifa,
1346: .saddr = saddr,
1347: .next_hop_ip6 = saddr,
1348: .sadr_enabled = babel_sadr_enabled(p),
1349: };
1350:
1351: if ((pkt->magic != BABEL_MAGIC) || (pkt->version != BABEL_VERSION))
1352: {
1353: TRACE(D_PACKETS, "Strange packet from %I via %s - magic %d version %d",
1354: saddr, ifa->iface->name, pkt->magic, pkt->version);
1355: return;
1356: }
1357:
1358: if (plen > len)
1359: {
1360: LOG_PKT("Bad packet from %I via %s - %s (%u)",
1361: saddr, ifa->iface->name, "length mismatch", plen);
1362: return;
1363: }
1364:
1365: TRACE(D_PACKETS, "Packet received from %I via %s",
1366: saddr, ifa->iface->name);
1367:
1368: init_list(&msgs);
1369:
1370: /* First pass through the packet TLV by TLV, parsing each into internal data
1371: structures. */
1372: for (tlv = FIRST_TLV(pkt);
1373: (byte *)tlv < end;
1374: tlv = NEXT_TLV(tlv))
1375: {
1376: /* Ugly special case */
1377: if (tlv->type == BABEL_TLV_PAD1)
1378: continue;
1379:
1380: /* The end of the common TLV header */
1381: pos = (byte *)tlv + sizeof(struct babel_tlv);
1382: if ((pos > end) || (pos + tlv->length > end))
1383: {
1384: LOG_PKT("Bad TLV from %I via %s type %d pos %d - framing error",
1385: saddr, ifa->iface->name, tlv->type, (byte *)tlv - (byte *)pkt);
1386: break;
1387: }
1388:
1389: msg = sl_alloc(p->msg_slab);
1390: res = babel_read_tlv(tlv, &msg->msg, &state);
1391: if (res == PARSE_SUCCESS)
1392: {
1393: add_tail(&msgs, NODE msg);
1394: }
1395: else if (res == PARSE_IGNORE)
1396: {
1397: DBG("Babel: Ignoring TLV of type %d\n", tlv->type);
1398: sl_free(p->msg_slab, msg);
1399: }
1400: else /* PARSE_ERROR */
1401: {
1402: LOG_PKT("Bad TLV from %I via %s type %d pos %d - parse error",
1403: saddr, ifa->iface->name, tlv->type, (byte *)tlv - (byte *)pkt);
1404: sl_free(p->msg_slab, msg);
1405: break;
1406: }
1407: }
1408:
1409: /* Parsing done, handle all parsed TLVs */
1410: WALK_LIST_FIRST(msg, msgs)
1411: {
1412: if (tlv_data[msg->msg.type].handle_tlv)
1413: tlv_data[msg->msg.type].handle_tlv(&msg->msg, ifa);
1414: rem_node(NODE msg);
1415: sl_free(p->msg_slab, msg);
1416: }
1417: }
1418:
1419: static void
1420: babel_err_hook(sock *sk, int err)
1421: {
1422: struct babel_iface *ifa = sk->data;
1423: struct babel_proto *p = ifa->proto;
1424:
1425: log(L_ERR "%s: Socket error on %s: %M", p->p.name, ifa->iface->name, err);
1426: /* FIXME: Drop queued TLVs here? */
1427: }
1428:
1429:
1430: static void
1431: babel_tx_hook(sock *sk)
1432: {
1433: struct babel_iface *ifa = sk->data;
1434:
1435: DBG("Babel: TX hook called (iface %s, src %I, dst %I)\n",
1436: sk->iface->name, sk->saddr, sk->daddr);
1437:
1438: babel_send_queue(ifa);
1439: }
1440:
1441:
1442: static int
1443: babel_rx_hook(sock *sk, uint len)
1444: {
1445: struct babel_iface *ifa = sk->data;
1446: struct babel_proto *p = ifa->proto;
1447: const char *err_dsc = NULL;
1448: uint err_val = 0;
1449:
1450: if (sk->lifindex != ifa->iface->index)
1451: return 1;
1452:
1453: DBG("Babel: RX hook called (iface %s, src %I, dst %I)\n",
1454: sk->iface->name, sk->faddr, sk->laddr);
1455:
1456: /* Silently ignore my own packets */
1457: if (ipa_equal(sk->faddr, sk->saddr))
1458: return 1;
1459:
1460: if (!ipa_is_link_local(sk->faddr))
1461: DROP1("wrong src address");
1462:
1463: if (sk->fport != ifa->cf->port)
1464: DROP("wrong src port", sk->fport);
1465:
1466: if (len < sizeof(struct babel_pkt_header))
1467: DROP("too short", len);
1468:
1469: if (sk->flags & SKF_TRUNCATED)
1470: DROP("truncated", len);
1471:
1472: babel_process_packet((struct babel_pkt_header *) sk->rbuf, len, sk->faddr, ifa);
1473: return 1;
1474:
1475: drop:
1476: LOG_PKT("Bad packet from %I via %s - %s (%u)",
1477: sk->faddr, sk->iface->name, err_dsc, err_val);
1478: return 1;
1479: }
1480:
1481: int
1482: babel_open_socket(struct babel_iface *ifa)
1483: {
1484: struct babel_proto *p = ifa->proto;
1485:
1486: sock *sk;
1487: sk = sk_new(ifa->pool);
1488: sk->type = SK_UDP;
1489: sk->sport = ifa->cf->port;
1490: sk->dport = ifa->cf->port;
1491: sk->iface = ifa->iface;
1492: sk->saddr = ifa->addr;
1493: sk->vrf = p->p.vrf;
1494:
1495: sk->rx_hook = babel_rx_hook;
1496: sk->tx_hook = babel_tx_hook;
1497: sk->err_hook = babel_err_hook;
1498: sk->data = ifa;
1499:
1500: sk->tos = ifa->cf->tx_tos;
1501: sk->priority = ifa->cf->tx_priority;
1502: sk->ttl = 1;
1503: sk->flags = SKF_LADDR_RX;
1504:
1505: if (sk_open(sk) < 0)
1506: goto err;
1507:
1508: if (sk_setup_multicast(sk) < 0)
1509: goto err;
1510:
1511: if (sk_join_group(sk, IP6_BABEL_ROUTERS) < 0)
1512: goto err;
1513:
1514: ifa->sk = sk;
1515: return 1;
1516:
1517: err:
1518: sk_log_error(sk, p->p.name);
1519: rfree(sk);
1520: return 0;
1521: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>