]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Babel: Parse flags in Hello TLV
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 28 Nov 2017 18:33:33 +0000 (19:33 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 28 Nov 2017 18:33:33 +0000 (19:33 +0100)
RFC6126bis introduces a flags field for the Hello TLV, and adds a unicast flag
that is used to signify that a hello was sent as unicast. This adds parsing of
the flags field and ignores such unicast hellos, which preserves compatibility
until we can add a proper implementation of the unicast hello mechanism.

Thanks to Toke Hoiland-Jorgensen for the patch.

proto/babel/packets.c

index e9c6d51d1a29af298662f8d0e9e5168c14c0a9eb..768858d03fa9c4db864b43ea1bca2b65c036e88c 100644 (file)
@@ -40,7 +40,7 @@ struct babel_tlv_ack {
 struct babel_tlv_hello {
   u8 type;
   u8 length;
-  u16 reserved;
+  u16 flags;
   u16 seqno;
   u16 interval;
 } PACKED;
@@ -104,8 +104,12 @@ struct babel_tlv_seqno_request {
 } PACKED;
 
 
-#define BABEL_FLAG_DEF_PREFIX  0x80
-#define BABEL_FLAG_ROUTER_ID   0x40
+/* Hello flags */
+#define BABEL_HF_UNICAST       0x8000
+
+/* Update flags */
+#define BABEL_UF_DEF_PREFIX    0x80
+#define BABEL_UF_ROUTER_ID     0x40
 
 
 struct babel_parse_state {
@@ -310,6 +314,11 @@ babel_read_hello(struct babel_tlv *hdr, union babel_msg *m,
   struct babel_tlv_hello *tlv = (void *) hdr;
   struct babel_msg_hello *msg = &m->hello;
 
+  /* We currently don't support unicast Hello */
+  u16 flags = get_u16(&tlv->flags);
+  if (flags & BABEL_HF_UNICAST)
+    return PARSE_IGNORE;
+
   msg->type = BABEL_TLV_HELLO;
   msg->seqno = get_u16(&tlv->seqno);
   msg->interval = get_time16(&tlv->interval);
@@ -500,13 +509,13 @@ babel_read_update(struct babel_tlv *hdr, union babel_msg *m,
     msg->plen = tlv->plen;
     msg->prefix = ipa_from_ip6(get_ip6(buf));
 
-    if (tlv->flags & BABEL_FLAG_DEF_PREFIX)
+    if (tlv->flags & BABEL_UF_DEF_PREFIX)
     {
       put_ip6(state->def_ip6_prefix, msg->prefix);
       state->def_ip6_prefix_seen = 1;
     }
 
-    if (tlv->flags & BABEL_FLAG_ROUTER_ID)
+    if (tlv->flags & BABEL_UF_ROUTER_ID)
     {
       state->router_id = ((u64) _I2(msg->prefix)) << 32 | _I3(msg->prefix);
       state->router_id_seen = 1;