Commit 1e8721e2 authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

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.
parent 9ba4b4a6
Loading
Loading
Loading
Loading
+14 −5
Original line number Diff line number Diff line
@@ -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;