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:
parent
9ba4b4a63d
commit
1e8721e2ae
1 changed files with 14 additions and 5 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue