Babel: Parse flags in Hello TLV

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.
This commit is contained in:
Ondrej Zajicek (work) 2017-11-28 19:33:33 +01:00
parent 9ba4b4a63d
commit 1e8721e2ae

View file

@ -40,7 +40,7 @@ struct babel_tlv_ack {
struct babel_tlv_hello { struct babel_tlv_hello {
u8 type; u8 type;
u8 length; u8 length;
u16 reserved; u16 flags;
u16 seqno; u16 seqno;
u16 interval; u16 interval;
} PACKED; } PACKED;
@ -104,8 +104,12 @@ struct babel_tlv_seqno_request {
} PACKED; } PACKED;
#define BABEL_FLAG_DEF_PREFIX 0x80 /* Hello flags */
#define BABEL_FLAG_ROUTER_ID 0x40 #define BABEL_HF_UNICAST 0x8000
/* Update flags */
#define BABEL_UF_DEF_PREFIX 0x80
#define BABEL_UF_ROUTER_ID 0x40
struct babel_parse_state { 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_tlv_hello *tlv = (void *) hdr;
struct babel_msg_hello *msg = &m->hello; 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->type = BABEL_TLV_HELLO;
msg->seqno = get_u16(&tlv->seqno); msg->seqno = get_u16(&tlv->seqno);
msg->interval = get_time16(&tlv->interval); 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->plen = tlv->plen;
msg->prefix = ipa_from_ip6(get_ip6(buf)); 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); put_ip6(state->def_ip6_prefix, msg->prefix);
state->def_ip6_prefix_seen = 1; 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 = ((u64) _I2(msg->prefix)) << 32 | _I3(msg->prefix);
state->router_id_seen = 1; state->router_id_seen = 1;