Annotation of embedaddon/bird/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: *
6: * Can be freely distributed and used under the terms of the GNU GPL.
7: *
8: * This file contains the packet and TLV handling code for the protocol.
9: */
10:
11: #include "babel.h"
12:
13:
14: struct babel_pkt_header {
15: u8 magic;
16: u8 version;
17: u16 length;
18: } PACKED;
19:
20: struct babel_tlv {
21: u8 type;
22: u8 length;
23: u8 value[0];
24: } PACKED;
25:
26: struct babel_tlv_ack_req {
27: u8 type;
28: u8 length;
29: u16 reserved;
30: u16 nonce;
31: u16 interval;
32: } PACKED;
33:
34: struct babel_tlv_ack {
35: u8 type;
36: u8 length;
37: u16 nonce;
38: } PACKED;
39:
40: struct babel_tlv_hello {
41: u8 type;
42: u8 length;
43: u16 reserved;
44: u16 seqno;
45: u16 interval;
46: } PACKED;
47:
48: struct babel_tlv_ihu {
49: u8 type;
50: u8 length;
51: u8 ae;
52: u8 reserved;
53: u16 rxcost;
54: u16 interval;
55: u8 addr[0];
56: } PACKED;
57:
58: struct babel_tlv_router_id {
59: u8 type;
60: u8 length;
61: u16 reserved;
62: u64 router_id;
63: } PACKED;
64:
65: struct babel_tlv_next_hop {
66: u8 type;
67: u8 length;
68: u8 ae;
69: u8 reserved;
70: u8 addr[0];
71: } PACKED;
72:
73: struct babel_tlv_update {
74: u8 type;
75: u8 length;
76: u8 ae;
77: u8 flags;
78: u8 plen;
79: u8 omitted;
80: u16 interval;
81: u16 seqno;
82: u16 metric;
83: u8 addr[0];
84: } PACKED;
85:
86: struct babel_tlv_route_request {
87: u8 type;
88: u8 length;
89: u8 ae;
90: u8 plen;
91: u8 addr[0];
92: } PACKED;
93:
94: struct babel_tlv_seqno_request {
95: u8 type;
96: u8 length;
97: u8 ae;
98: u8 plen;
99: u16 seqno;
100: u8 hop_count;
101: u8 reserved;
102: u64 router_id;
103: u8 addr[0];
104: } PACKED;
105:
106:
107: #define BABEL_FLAG_DEF_PREFIX 0x80
108: #define BABEL_FLAG_ROUTER_ID 0x40
109:
110:
111: struct babel_parse_state {
112: struct babel_proto *proto;
113: struct babel_iface *ifa;
114: ip_addr saddr;
115: ip_addr next_hop;
116: u64 router_id; /* Router ID used in subsequent updates */
117: u8 def_ip6_prefix[16]; /* Implicit IPv6 prefix in network order */
118: u8 def_ip4_prefix[4]; /* Implicit IPv4 prefix in network order */
119: u8 router_id_seen; /* router_id field is valid */
120: u8 def_ip6_prefix_seen; /* def_ip6_prefix is valid */
121: u8 def_ip4_prefix_seen; /* def_ip4_prefix is valid */
122: };
123:
124: enum parse_result {
125: PARSE_SUCCESS,
126: PARSE_ERROR,
127: PARSE_IGNORE,
128: };
129:
130: struct babel_write_state {
131: u64 router_id;
132: u8 router_id_seen;
133: // ip_addr next_hop;
134: };
135:
136:
137: #define DROP(DSC,VAL) do { err_dsc = DSC; err_val = VAL; goto drop; } while(0)
138: #define DROP1(DSC) do { err_dsc = DSC; goto drop; } while(0)
139: #define LOG_PKT(msg, args...) \
140: log_rl(&p->log_pkt_tbf, L_REMOTE "%s: " msg, p->p.name, args)
141:
142: #define FIRST_TLV(p) ((struct babel_tlv *) (((struct babel_pkt_header *) p) + 1))
143: #define NEXT_TLV(t) ((struct babel_tlv *) (((byte *) t) + TLV_LENGTH(t)))
144: #define TLV_LENGTH(t) (t->type == BABEL_TLV_PAD1 ? 1 : t->length + sizeof(struct babel_tlv))
145: #define TLV_OPT_LENGTH(t) (t->length + sizeof(struct babel_tlv) - sizeof(*t))
146: #define TLV_HDR(tlv,t,l) ({ tlv->type = t; tlv->length = l - sizeof(struct babel_tlv); })
147: #define TLV_HDR0(tlv,t) TLV_HDR(tlv, t, tlv_data[t].min_length)
148:
149: #define BYTES(n) ((((uint) n) + 7) / 8)
150:
151: static inline u16
152: get_time16(const void *p)
153: {
154: u16 v = get_u16(p) / BABEL_TIME_UNITS;
155: return MAX(1, v);
156: }
157:
158: static inline void
159: put_time16(void *p, u16 v)
160: {
161: put_u16(p, v * BABEL_TIME_UNITS);
162: }
163:
164: static inline ip6_addr
165: get_ip6_px(const void *p, uint plen)
166: {
167: ip6_addr addr = IPA_NONE;
168: memcpy(&addr, p, BYTES(plen));
169: return ip6_ntoh(addr);
170: }
171:
172: static inline void
173: put_ip6_px(void *p, ip6_addr addr, uint plen)
174: {
175: addr = ip6_hton(addr);
176: memcpy(p, &addr, BYTES(plen));
177: }
178:
179: static inline ip6_addr
180: get_ip6_ll(const void *p)
181: {
182: return ip6_build(0xfe800000, 0, get_u32(p+0), get_u32(p+4));
183: }
184:
185: static inline void
186: put_ip6_ll(void *p, ip6_addr addr)
187: {
188: put_u32(p+0, _I2(addr));
189: put_u32(p+4, _I3(addr));
190: }
191:
192:
193: /*
194: * TLV read/write functions
195: */
196:
197: static int babel_read_ack_req(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
198: static int babel_read_hello(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
199: static int babel_read_ihu(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
200: static int babel_read_router_id(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
201: static int babel_read_next_hop(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
202: static int babel_read_update(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
203: static int babel_read_route_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
204: static int babel_read_seqno_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_parse_state *state);
205:
206: static uint babel_write_ack(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
207: static uint babel_write_hello(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
208: static uint babel_write_ihu(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
209: static uint babel_write_update(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
210: static uint babel_write_route_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
211: static uint babel_write_seqno_request(struct babel_tlv *hdr, union babel_msg *msg, struct babel_write_state *state, uint max_len);
212:
213: struct babel_tlv_data {
214: u8 min_length;
215: int (*read_tlv)(struct babel_tlv *hdr, union babel_msg *m, struct babel_parse_state *state);
216: uint (*write_tlv)(struct babel_tlv *hdr, union babel_msg *m, struct babel_write_state *state, uint max_len);
217: void (*handle_tlv)(union babel_msg *m, struct babel_iface *ifa);
218: };
219:
220: static const struct babel_tlv_data tlv_data[BABEL_TLV_MAX] = {
221: [BABEL_TLV_ACK_REQ] = {
222: sizeof(struct babel_tlv_ack_req),
223: babel_read_ack_req,
224: NULL,
225: babel_handle_ack_req
226: },
227: [BABEL_TLV_ACK] = {
228: sizeof(struct babel_tlv_ack),
229: NULL,
230: babel_write_ack,
231: NULL
232: },
233: [BABEL_TLV_HELLO] = {
234: sizeof(struct babel_tlv_hello),
235: babel_read_hello,
236: babel_write_hello,
237: babel_handle_hello
238: },
239: [BABEL_TLV_IHU] = {
240: sizeof(struct babel_tlv_ihu),
241: babel_read_ihu,
242: babel_write_ihu,
243: babel_handle_ihu
244: },
245: [BABEL_TLV_ROUTER_ID] = {
246: sizeof(struct babel_tlv_router_id),
247: babel_read_router_id,
248: NULL,
249: NULL
250: },
251: [BABEL_TLV_NEXT_HOP] = {
252: sizeof(struct babel_tlv_next_hop),
253: babel_read_next_hop,
254: NULL,
255: NULL
256: },
257: [BABEL_TLV_UPDATE] = {
258: sizeof(struct babel_tlv_update),
259: babel_read_update,
260: babel_write_update,
261: babel_handle_update
262: },
263: [BABEL_TLV_ROUTE_REQUEST] = {
264: sizeof(struct babel_tlv_route_request),
265: babel_read_route_request,
266: babel_write_route_request,
267: babel_handle_route_request
268: },
269: [BABEL_TLV_SEQNO_REQUEST] = {
270: sizeof(struct babel_tlv_seqno_request),
271: babel_read_seqno_request,
272: babel_write_seqno_request,
273: babel_handle_seqno_request
274: },
275: };
276:
277: static int
278: babel_read_ack_req(struct babel_tlv *hdr, union babel_msg *m,
279: struct babel_parse_state *state)
280: {
281: struct babel_tlv_ack_req *tlv = (void *) hdr;
282: struct babel_msg_ack_req *msg = &m->ack_req;
283:
284: msg->type = BABEL_TLV_ACK_REQ;
285: msg->nonce = get_u16(&tlv->nonce);
286: msg->interval = get_time16(&tlv->interval);
287: msg->sender = state->saddr;
288:
289: if (!msg->interval)
290: return PARSE_ERROR;
291:
292: return PARSE_SUCCESS;
293: }
294:
295: static uint
296: babel_write_ack(struct babel_tlv *hdr, union babel_msg *m,
297: struct babel_write_state *state UNUSED, uint max_len UNUSED)
298: {
299: struct babel_tlv_ack *tlv = (void *) hdr;
300: struct babel_msg_ack *msg = &m->ack;
301:
302: TLV_HDR0(tlv, BABEL_TLV_ACK);
303: put_u16(&tlv->nonce, msg->nonce);
304:
305: return sizeof(struct babel_tlv_ack);
306: }
307:
308: static int
309: babel_read_hello(struct babel_tlv *hdr, union babel_msg *m,
310: struct babel_parse_state *state)
311: {
312: struct babel_tlv_hello *tlv = (void *) hdr;
313: struct babel_msg_hello *msg = &m->hello;
314:
315: msg->type = BABEL_TLV_HELLO;
316: msg->seqno = get_u16(&tlv->seqno);
317: msg->interval = get_time16(&tlv->interval);
318: msg->sender = state->saddr;
319:
320: return PARSE_SUCCESS;
321: }
322:
323: static uint
324: babel_write_hello(struct babel_tlv *hdr, union babel_msg *m,
325: struct babel_write_state *state UNUSED, uint max_len UNUSED)
326: {
327: struct babel_tlv_hello *tlv = (void *) hdr;
328: struct babel_msg_hello *msg = &m->hello;
329:
330: TLV_HDR0(tlv, BABEL_TLV_HELLO);
331: put_u16(&tlv->seqno, msg->seqno);
332: put_time16(&tlv->interval, msg->interval);
333:
334: return sizeof(struct babel_tlv_hello);
335: }
336:
337: static int
338: babel_read_ihu(struct babel_tlv *hdr, union babel_msg *m,
339: struct babel_parse_state *state)
340: {
341: struct babel_tlv_ihu *tlv = (void *) hdr;
342: struct babel_msg_ihu *msg = &m->ihu;
343:
344: msg->type = BABEL_TLV_IHU;
345: msg->ae = tlv->ae;
346: msg->rxcost = get_u16(&tlv->rxcost);
347: msg->interval = get_time16(&tlv->interval);
348: msg->addr = IPA_NONE;
349: msg->sender = state->saddr;
350:
351: if (msg->ae >= BABEL_AE_MAX)
352: return PARSE_IGNORE;
353:
354: // We handle link-local IPs. In every other case, the addr field will be 0 but
355: // validation will succeed. The handler takes care of these cases.
356: if (msg->ae == BABEL_AE_IP6_LL)
357: {
358: if (TLV_OPT_LENGTH(tlv) < 8)
359: return PARSE_ERROR;
360:
361: msg->addr = ipa_from_ip6(get_ip6_ll(&tlv->addr));
362: }
363:
364: return PARSE_SUCCESS;
365: }
366:
367: static uint
368: babel_write_ihu(struct babel_tlv *hdr, union babel_msg *m,
369: struct babel_write_state *state UNUSED, uint max_len)
370: {
371: struct babel_tlv_ihu *tlv = (void *) hdr;
372: struct babel_msg_ihu *msg = &m->ihu;
373:
374: if (ipa_is_link_local(msg->addr) && max_len < sizeof(struct babel_tlv_ihu) + 8)
375: return 0;
376:
377: TLV_HDR0(tlv, BABEL_TLV_IHU);
378: put_u16(&tlv->rxcost, msg->rxcost);
379: put_time16(&tlv->interval, msg->interval);
380:
381: if (!ipa_is_link_local(msg->addr))
382: {
383: tlv->ae = BABEL_AE_WILDCARD;
384: return sizeof(struct babel_tlv_ihu);
385: }
386: put_ip6_ll(&tlv->addr, msg->addr);
387: tlv->ae = BABEL_AE_IP6_LL;
388: hdr->length += 8;
389: return sizeof(struct babel_tlv_ihu) + 8;
390: }
391:
392: static int
393: babel_read_router_id(struct babel_tlv *hdr, union babel_msg *m UNUSED,
394: struct babel_parse_state *state)
395: {
396: struct babel_tlv_router_id *tlv = (void *) hdr;
397:
398: state->router_id = get_u64(&tlv->router_id);
399: state->router_id_seen = 1;
400:
401: return PARSE_IGNORE;
402: }
403:
404: /* This is called directly from babel_write_update() */
405: static uint
406: babel_write_router_id(struct babel_tlv *hdr, u64 router_id,
407: struct babel_write_state *state, uint max_len UNUSED)
408: {
409: struct babel_tlv_router_id *tlv = (void *) hdr;
410:
411: /* We still assume that first min_length bytes are available and zeroed */
412:
413: TLV_HDR0(tlv, BABEL_TLV_ROUTER_ID);
414: put_u64(&tlv->router_id, router_id);
415:
416: state->router_id = router_id;
417: state->router_id_seen = 1;
418:
419: return sizeof(struct babel_tlv_router_id);
420: }
421:
422: static int
423: babel_read_next_hop(struct babel_tlv *hdr, union babel_msg *m UNUSED,
424: struct babel_parse_state *state)
425: {
426: struct babel_tlv_next_hop *tlv = (void *) hdr;
427:
428: switch (tlv->ae)
429: {
430: case BABEL_AE_WILDCARD:
431: return PARSE_ERROR;
432:
433: case BABEL_AE_IP4:
434: /* TODO */
435: return PARSE_IGNORE;
436:
437: case BABEL_AE_IP6:
438: if (TLV_OPT_LENGTH(tlv) < sizeof(ip6_addr))
439: return PARSE_ERROR;
440:
441: state->next_hop = ipa_from_ip6(get_ip6(&tlv->addr));
442: return PARSE_IGNORE;
443:
444: case BABEL_AE_IP6_LL:
445: if (TLV_OPT_LENGTH(tlv) < 8)
446: return PARSE_ERROR;
447:
448: state->next_hop = ipa_from_ip6(get_ip6_ll(&tlv->addr));
449: return PARSE_IGNORE;
450:
451: default:
452: return PARSE_IGNORE;
453: }
454:
455: return PARSE_IGNORE;
456: }
457:
458: static int
459: babel_read_update(struct babel_tlv *hdr, union babel_msg *m,
460: struct babel_parse_state *state)
461: {
462: struct babel_tlv_update *tlv = (void *) hdr;
463: struct babel_msg_update *msg = &m->update;
464:
465: msg->type = BABEL_TLV_UPDATE;
466: msg->interval = get_time16(&tlv->interval);
467: msg->seqno = get_u16(&tlv->seqno);
468: msg->metric = get_u16(&tlv->metric);
469:
470: /* Length of received prefix data without omitted part */
471: int len = BYTES(tlv->plen) - (int) tlv->omitted;
472: u8 buf[16] = {};
473:
474: if ((len < 0) || ((uint) len > TLV_OPT_LENGTH(tlv)))
475: return PARSE_ERROR;
476:
477: switch (tlv->ae)
478: {
479: case BABEL_AE_WILDCARD:
480: if (tlv->plen > 0)
481: return PARSE_ERROR;
482:
483: msg->wildcard = 1;
484: break;
485:
486: case BABEL_AE_IP4:
487: /* TODO */
488: return PARSE_IGNORE;
489:
490: case BABEL_AE_IP6:
491: if (tlv->plen > MAX_PREFIX_LENGTH)
492: return PARSE_ERROR;
493:
494: /* Cannot omit data if there is no saved prefix */
495: if (tlv->omitted && !state->def_ip6_prefix_seen)
496: return PARSE_ERROR;
497:
498: /* Merge saved prefix and received prefix parts */
499: memcpy(buf, state->def_ip6_prefix, tlv->omitted);
500: memcpy(buf + tlv->omitted, tlv->addr, len);
501:
502: msg->plen = tlv->plen;
503: msg->prefix = ipa_from_ip6(get_ip6(buf));
504:
505: if (tlv->flags & BABEL_FLAG_DEF_PREFIX)
506: {
507: put_ip6(state->def_ip6_prefix, msg->prefix);
508: state->def_ip6_prefix_seen = 1;
509: }
510:
511: if (tlv->flags & BABEL_FLAG_ROUTER_ID)
512: {
513: state->router_id = ((u64) _I2(msg->prefix)) << 32 | _I3(msg->prefix);
514: state->router_id_seen = 1;
515: }
516: break;
517:
518: case BABEL_AE_IP6_LL:
519: /* ??? */
520: return PARSE_IGNORE;
521:
522: default:
523: return PARSE_IGNORE;
524: }
525:
526: /* Update must have Router ID, unless it is retraction */
527: if (!state->router_id_seen && (msg->metric != BABEL_INFINITY))
528: {
529: DBG("Babel: No router ID seen before update\n");
530: return PARSE_ERROR;
531: }
532:
533: msg->router_id = state->router_id;
534: msg->next_hop = state->next_hop;
535: msg->sender = state->saddr;
536:
537: return PARSE_SUCCESS;
538: }
539:
540: static uint
541: babel_write_update(struct babel_tlv *hdr, union babel_msg *m,
542: struct babel_write_state *state, uint max_len)
543: {
544: struct babel_tlv_update *tlv = (void *) hdr;
545: struct babel_msg_update *msg = &m->update;
546: uint len0 = 0;
547:
548: /*
549: * When needed, we write Router-ID TLV before Update TLV and return size of
550: * both of them. There is enough space for the Router-ID TLV, because
551: * sizeof(struct babel_tlv_router_id) == sizeof(struct babel_tlv_update).
552: *
553: * Router ID is not used for retractions, so do not us it in such case.
554: */
555: if ((msg->metric < BABEL_INFINITY) &&
556: (!state->router_id_seen || (msg->router_id != state->router_id)))
557: {
558: len0 = babel_write_router_id(hdr, msg->router_id, state, max_len);
559: tlv = (struct babel_tlv_update *) NEXT_TLV(tlv);
560: }
561:
562: uint len = sizeof(struct babel_tlv_update) + BYTES(msg->plen);
563:
564: if (len0 + len > max_len)
565: return 0;
566:
567: memset(tlv, 0, sizeof(struct babel_tlv_update));
568: TLV_HDR(tlv, BABEL_TLV_UPDATE, len);
569:
570: if (msg->wildcard)
571: {
572: tlv->ae = BABEL_AE_WILDCARD;
573: tlv->plen = 0;
574: }
575: else
576: {
577: tlv->ae = BABEL_AE_IP6;
578: tlv->plen = msg->plen;
579: put_ip6_px(tlv->addr, msg->prefix, msg->plen);
580: }
581:
582: put_time16(&tlv->interval, msg->interval);
583: put_u16(&tlv->seqno, msg->seqno);
584: put_u16(&tlv->metric, msg->metric);
585:
586: return len0 + len;
587: }
588:
589: static int
590: babel_read_route_request(struct babel_tlv *hdr, union babel_msg *m,
591: struct babel_parse_state *state UNUSED)
592: {
593: struct babel_tlv_route_request *tlv = (void *) hdr;
594: struct babel_msg_route_request *msg = &m->route_request;
595:
596: msg->type = BABEL_TLV_ROUTE_REQUEST;
597:
598: switch (tlv->ae)
599: {
600: case BABEL_AE_WILDCARD:
601: /* Wildcard requests must have plen 0 */
602: if (tlv->plen > 0)
603: return PARSE_ERROR;
604:
605: msg->full = 1;
606: return PARSE_SUCCESS;
607:
608: case BABEL_AE_IP4:
609: /* TODO */
610: return PARSE_IGNORE;
611:
612: case BABEL_AE_IP6:
613: if (tlv->plen > MAX_PREFIX_LENGTH)
614: return PARSE_ERROR;
615:
616: if (TLV_OPT_LENGTH(tlv) < BYTES(tlv->plen))
617: return PARSE_ERROR;
618:
619: msg->plen = tlv->plen;
620: msg->prefix = get_ip6_px(tlv->addr, tlv->plen);
621: return PARSE_SUCCESS;
622:
623: case BABEL_AE_IP6_LL:
624: return PARSE_ERROR;
625:
626: default:
627: return PARSE_IGNORE;
628: }
629:
630: return PARSE_IGNORE;
631: }
632:
633: static uint
634: babel_write_route_request(struct babel_tlv *hdr, union babel_msg *m,
635: struct babel_write_state *state UNUSED, uint max_len)
636: {
637: struct babel_tlv_route_request *tlv = (void *) hdr;
638: struct babel_msg_route_request *msg = &m->route_request;
639:
640: uint len = sizeof(struct babel_tlv_route_request) + BYTES(msg->plen);
641:
642: if (len > max_len)
643: return 0;
644:
645: TLV_HDR(tlv, BABEL_TLV_ROUTE_REQUEST, len);
646:
647: if (msg->full)
648: {
649: tlv->ae = BABEL_AE_WILDCARD;
650: tlv->plen = 0;
651: }
652: else
653: {
654: tlv->ae = BABEL_AE_IP6;
655: tlv->plen = msg->plen;
656: put_ip6_px(tlv->addr, msg->prefix, msg->plen);
657: }
658:
659: return len;
660: }
661:
662: static int
663: babel_read_seqno_request(struct babel_tlv *hdr, union babel_msg *m,
664: struct babel_parse_state *state)
665: {
666: struct babel_tlv_seqno_request *tlv = (void *) hdr;
667: struct babel_msg_seqno_request *msg = &m->seqno_request;
668:
669: msg->type = BABEL_TLV_SEQNO_REQUEST;
670: msg->seqno = get_u16(&tlv->seqno);
671: msg->hop_count = tlv->hop_count;
672: msg->router_id = get_u64(&tlv->router_id);
673: msg->sender = state->saddr;
674:
675: if (tlv->hop_count == 0)
676: return PARSE_ERROR;
677:
678: switch (tlv->ae)
679: {
680: case BABEL_AE_WILDCARD:
681: return PARSE_ERROR;
682:
683: case BABEL_AE_IP4:
684: /* TODO */
685: return PARSE_IGNORE;
686:
687: case BABEL_AE_IP6:
688: if (tlv->plen > MAX_PREFIX_LENGTH)
689: return PARSE_ERROR;
690:
691: if (TLV_OPT_LENGTH(tlv) < BYTES(tlv->plen))
692: return PARSE_ERROR;
693:
694: msg->plen = tlv->plen;
695: msg->prefix = get_ip6_px(tlv->addr, tlv->plen);
696: return PARSE_SUCCESS;
697:
698: case BABEL_AE_IP6_LL:
699: return PARSE_ERROR;
700:
701: default:
702: return PARSE_IGNORE;
703: }
704:
705: return PARSE_IGNORE;
706: }
707:
708: static uint
709: babel_write_seqno_request(struct babel_tlv *hdr, union babel_msg *m,
710: struct babel_write_state *state UNUSED, uint max_len)
711: {
712: struct babel_tlv_seqno_request *tlv = (void *) hdr;
713: struct babel_msg_seqno_request *msg = &m->seqno_request;
714:
715: uint len = sizeof(struct babel_tlv_seqno_request) + BYTES(msg->plen);
716:
717: if (len > max_len)
718: return 0;
719:
720: TLV_HDR(tlv, BABEL_TLV_SEQNO_REQUEST, len);
721: tlv->ae = BABEL_AE_IP6;
722: tlv->plen = msg->plen;
723: put_u16(&tlv->seqno, msg->seqno);
724: tlv->hop_count = msg->hop_count;
725: put_u64(&tlv->router_id, msg->router_id);
726: put_ip6_px(tlv->addr, msg->prefix, msg->plen);
727:
728: return len;
729: }
730:
731: static inline int
732: babel_read_tlv(struct babel_tlv *hdr,
733: union babel_msg *msg,
734: struct babel_parse_state *state)
735: {
736: if ((hdr->type <= BABEL_TLV_PADN) ||
737: (hdr->type >= BABEL_TLV_MAX) ||
738: !tlv_data[hdr->type].read_tlv)
739: return PARSE_IGNORE;
740:
741: if (TLV_LENGTH(hdr) < tlv_data[hdr->type].min_length)
742: return PARSE_ERROR;
743:
744: memset(msg, 0, sizeof(*msg));
745: return tlv_data[hdr->type].read_tlv(hdr, msg, state);
746: }
747:
748: static uint
749: babel_write_tlv(struct babel_tlv *hdr,
750: union babel_msg *msg,
751: struct babel_write_state *state,
752: uint max_len)
753: {
754: if ((msg->type <= BABEL_TLV_PADN) ||
755: (msg->type >= BABEL_TLV_MAX) ||
756: !tlv_data[msg->type].write_tlv)
757: return 0;
758:
759: if (tlv_data[msg->type].min_length > max_len)
760: return 0;
761:
762: memset(hdr, 0, tlv_data[msg->type].min_length);
763: return tlv_data[msg->type].write_tlv(hdr, msg, state, max_len);
764: }
765:
766:
767: /*
768: * Packet RX/TX functions
769: */
770:
771: static int
772: babel_send_to(struct babel_iface *ifa, ip_addr dest)
773: {
774: sock *sk = ifa->sk;
775: struct babel_pkt_header *hdr = (void *) sk->tbuf;
776: int len = get_u16(&hdr->length) + sizeof(struct babel_pkt_header);
777:
778: DBG("Babel: Sending %d bytes to %I\n", len, dest);
779: return sk_send_to(sk, len, dest, 0);
780: }
781:
782: /**
783: * babel_write_queue - Write a TLV queue to a transmission buffer
784: * @ifa: Interface holding the transmission buffer
785: * @queue: TLV queue to write (containing internal-format TLVs)
786: *
787: * This function writes a packet to the interface transmission buffer with as
788: * many TLVs from the &queue as will fit in the buffer. It returns the number of
789: * bytes written (NOT counting the packet header). The function is called by
790: * babel_send_queue() and babel_send_unicast() to construct packets for
791: * transmission, and uses per-TLV helper functions to convert the
792: * internal-format TLVs to their wire representations.
793: *
794: * The TLVs in the queue are freed after they are written to the buffer.
795: */
796: static uint
797: babel_write_queue(struct babel_iface *ifa, list *queue)
798: {
799: struct babel_proto *p = ifa->proto;
800: struct babel_write_state state = {};
801:
802: if (EMPTY_LIST(*queue))
803: return 0;
804:
805: byte *pos = ifa->sk->tbuf;
806: byte *end = pos + ifa->tx_length;
807:
808: struct babel_pkt_header *pkt = (void *) pos;
809: pkt->magic = BABEL_MAGIC;
810: pkt->version = BABEL_VERSION;
811: pkt->length = 0;
812: pos += sizeof(struct babel_pkt_header);
813:
814: struct babel_msg_node *msg;
815: WALK_LIST_FIRST(msg, *queue)
816: {
817: if (pos >= end)
818: break;
819:
820: int len = babel_write_tlv((struct babel_tlv *) pos, &msg->msg, &state, end - pos);
821:
822: if (!len)
823: break;
824:
825: pos += len;
826: rem_node(NODE msg);
827: sl_free(p->msg_slab, msg);
828: }
829:
830: uint plen = pos - (byte *) pkt;
831: put_u16(&pkt->length, plen - sizeof(struct babel_pkt_header));
832:
833: return plen;
834: }
835:
836: void
837: babel_send_queue(void *arg)
838: {
839: struct babel_iface *ifa = arg;
840: while ((babel_write_queue(ifa, &ifa->msg_queue) > 0) &&
841: (babel_send_to(ifa, IP6_BABEL_ROUTERS) > 0));
842: }
843:
844: static inline void
845: babel_kick_queue(struct babel_iface *ifa)
846: {
847: /*
848: * Only schedule send event if there is not already data in the socket buffer.
849: * Otherwise we may overwrite the data already in the buffer.
850: */
851:
852: if ((ifa->sk->tpos == ifa->sk->tbuf) && !ev_active(ifa->send_event))
853: ev_schedule(ifa->send_event);
854: }
855:
856: /**
857: * babel_send_unicast - send a single TLV via unicast to a destination
858: * @msg: TLV to send
859: * @ifa: Interface to send via
860: * @dest: Destination of the TLV
861: *
862: * This function is used to send a single TLV via unicast to a designated
863: * receiver. This is used for replying to certain incoming requests, and for
864: * sending unicast requests to refresh routes before they expire.
865: */
866: void
867: babel_send_unicast(union babel_msg *msg, struct babel_iface *ifa, ip_addr dest)
868: {
869: struct babel_proto *p = ifa->proto;
870: struct babel_msg_node *msgn = sl_alloc(p->msg_slab);
871: list queue;
872:
873: msgn->msg = *msg;
874: init_list(&queue);
875: add_tail(&queue, NODE msgn);
876: babel_write_queue(ifa, &queue);
877: babel_send_to(ifa, dest);
878:
879: /* We could overwrite waiting packet here, we may have to kick TX queue */
880: if (!EMPTY_LIST(ifa->msg_queue))
881: babel_kick_queue(ifa);
882: }
883:
884: /**
885: * babel_enqueue - enqueue a TLV for transmission on an interface
886: * @msg: TLV to enqueue (in internal TLV format)
887: * @ifa: Interface to enqueue to
888: *
889: * This function is called to enqueue a TLV for subsequent transmission on an
890: * interface. The transmission event is triggered whenever a TLV is enqueued;
891: * this ensures that TLVs will be transmitted in a timely manner, but that TLVs
892: * which are enqueued in rapid succession can be transmitted together in one
893: * packet.
894: */
895: void
896: babel_enqueue(union babel_msg *msg, struct babel_iface *ifa)
897: {
898: struct babel_proto *p = ifa->proto;
899: struct babel_msg_node *msgn = sl_alloc(p->msg_slab);
900: msgn->msg = *msg;
901: add_tail(&ifa->msg_queue, NODE msgn);
902: babel_kick_queue(ifa);
903: }
904:
905: /**
906: * babel_process_packet - process incoming data packet
907: * @pkt: Pointer to the packet data
908: * @len: Length of received packet
909: * @saddr: Address of packet sender
910: * @ifa: Interface packet was received on.
911: *
912: * This function is the main processing hook of incoming Babel packets. It
913: * checks that the packet header is well-formed, then processes the TLVs
914: * contained in the packet. This is done in two passes: First all TLVs are
915: * parsed into the internal TLV format. If a TLV parser fails, processing of the
916: * rest of the packet is aborted.
917: *
918: * After the parsing step, the TLV handlers are called for each parsed TLV in
919: * order.
920: */
921: static void
922: babel_process_packet(struct babel_pkt_header *pkt, int len,
923: ip_addr saddr, struct babel_iface *ifa)
924: {
925: struct babel_proto *p = ifa->proto;
926: struct babel_tlv *tlv;
927: struct babel_msg_node *msg;
928: list msgs;
929: int res;
930:
931: int plen = sizeof(struct babel_pkt_header) + get_u16(&pkt->length);
932: byte *pos;
933: byte *end = (byte *)pkt + plen;
934:
935: struct babel_parse_state state = {
936: .proto = p,
937: .ifa = ifa,
938: .saddr = saddr,
939: .next_hop = saddr,
940: };
941:
942: if ((pkt->magic != BABEL_MAGIC) || (pkt->version != BABEL_VERSION))
943: {
944: TRACE(D_PACKETS, "Strange packet from %I via %s - magic %d version %d",
945: saddr, ifa->iface->name, pkt->magic, pkt->version);
946: return;
947: }
948:
949: if (plen > len)
950: {
951: LOG_PKT("Bad packet from %I via %s - %s (%u)",
952: saddr, ifa->iface->name, "length mismatch", plen);
953: return;
954: }
955:
956: TRACE(D_PACKETS, "Packet received from %I via %s",
957: saddr, ifa->iface->name);
958:
959: init_list(&msgs);
960:
961: /* First pass through the packet TLV by TLV, parsing each into internal data
962: structures. */
963: for (tlv = FIRST_TLV(pkt);
964: (byte *)tlv < end;
965: tlv = NEXT_TLV(tlv))
966: {
967: /* Ugly special case */
968: if (tlv->type == BABEL_TLV_PAD1)
969: continue;
970:
971: /* The end of the common TLV header */
972: pos = (byte *)tlv + sizeof(struct babel_tlv);
973: if ((pos > end) || (pos + tlv->length > end))
974: {
975: LOG_PKT("Bad TLV from %I via %s type %d pos %d - framing error",
976: saddr, ifa->iface->name, tlv->type, (byte *)tlv - (byte *)pkt);
977: break;
978: }
979:
980: msg = sl_alloc(p->msg_slab);
981: res = babel_read_tlv(tlv, &msg->msg, &state);
982: if (res == PARSE_SUCCESS)
983: {
984: add_tail(&msgs, NODE msg);
985: }
986: else if (res == PARSE_IGNORE)
987: {
988: DBG("Babel: Ignoring TLV of type %d\n", tlv->type);
989: sl_free(p->msg_slab, msg);
990: }
991: else /* PARSE_ERROR */
992: {
993: LOG_PKT("Bad TLV from %I via %s type %d pos %d - parse error",
994: saddr, ifa->iface->name, tlv->type, (byte *)tlv - (byte *)pkt);
995: sl_free(p->msg_slab, msg);
996: break;
997: }
998: }
999:
1000: /* Parsing done, handle all parsed TLVs */
1001: WALK_LIST_FIRST(msg, msgs)
1002: {
1003: if (tlv_data[msg->msg.type].handle_tlv)
1004: tlv_data[msg->msg.type].handle_tlv(&msg->msg, ifa);
1005: rem_node(NODE msg);
1006: sl_free(p->msg_slab, msg);
1007: }
1008: }
1009:
1010: static void
1011: babel_err_hook(sock *sk, int err)
1012: {
1013: struct babel_iface *ifa = sk->data;
1014: struct babel_proto *p = ifa->proto;
1015:
1016: log(L_ERR "%s: Socket error on %s: %M", p->p.name, ifa->iface->name, err);
1017: /* FIXME: Drop queued TLVs here? */
1018: }
1019:
1020:
1021: static void
1022: babel_tx_hook(sock *sk)
1023: {
1024: struct babel_iface *ifa = sk->data;
1025:
1026: DBG("Babel: TX hook called (iface %s, src %I, dst %I)\n",
1027: sk->iface->name, sk->saddr, sk->daddr);
1028:
1029: babel_send_queue(ifa);
1030: }
1031:
1032:
1033: static int
1034: babel_rx_hook(sock *sk, uint len)
1035: {
1036: struct babel_iface *ifa = sk->data;
1037: struct babel_proto *p = ifa->proto;
1038: const char *err_dsc = NULL;
1039: uint err_val = 0;
1040:
1041: if (sk->lifindex != ifa->iface->index)
1042: return 1;
1043:
1044: DBG("Babel: RX hook called (iface %s, src %I, dst %I)\n",
1045: sk->iface->name, sk->faddr, sk->laddr);
1046:
1047: /* Silently ignore my own packets */
1048: if (ipa_equal(ifa->iface->addr->ip, sk->faddr))
1049: return 1;
1050:
1051: if (!ipa_is_link_local(sk->faddr))
1052: DROP1("wrong src address");
1053:
1054: if (sk->fport != ifa->cf->port)
1055: DROP("wrong src port", sk->fport);
1056:
1057: if (len < sizeof(struct babel_pkt_header))
1058: DROP("too short", len);
1059:
1060: if (sk->flags & SKF_TRUNCATED)
1061: DROP("truncated", len);
1062:
1063: babel_process_packet((struct babel_pkt_header *) sk->rbuf, len, sk->faddr, ifa);
1064: return 1;
1065:
1066: drop:
1067: LOG_PKT("Bad packet from %I via %s - %s (%u)",
1068: sk->faddr, sk->iface->name, err_dsc, err_val);
1069: return 1;
1070: }
1071:
1072: int
1073: babel_open_socket(struct babel_iface *ifa)
1074: {
1075: struct babel_proto *p = ifa->proto;
1076:
1077: sock *sk;
1078: sk = sk_new(ifa->pool);
1079: sk->type = SK_UDP;
1080: sk->sport = ifa->cf->port;
1081: sk->dport = ifa->cf->port;
1082: sk->iface = ifa->iface;
1083:
1084: sk->rx_hook = babel_rx_hook;
1085: sk->tx_hook = babel_tx_hook;
1086: sk->err_hook = babel_err_hook;
1087: sk->data = ifa;
1088:
1089: sk->tos = ifa->cf->tx_tos;
1090: sk->priority = ifa->cf->tx_priority;
1091: sk->ttl = 1;
1092: sk->flags = SKF_LADDR_RX;
1093:
1094: if (sk_open(sk) < 0)
1095: goto err;
1096:
1097: if (sk_setup_multicast(sk) < 0)
1098: goto err;
1099:
1100: if (sk_join_group(sk, IP6_BABEL_ROUTERS) < 0)
1101: goto err;
1102:
1103: ifa->sk = sk;
1104: return 1;
1105:
1106: err:
1107: sk_log_error(sk, p->p.name);
1108: rfree(sk);
1109: return 0;
1110: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>