Merge pull request #140 from opensourcerouting/fixes/isis-subtlv

isisd: parse TE-IP reachability and IPv6 reachability subtlvs
This commit is contained in:
Donald Sharp 2017-01-31 12:28:40 -05:00 committed by GitHub
commit 681ca8cc52
2 changed files with 51 additions and 7 deletions

View File

@ -614,12 +614,32 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected,
if (!tlvs->te_ipv4_reachs) if (!tlvs->te_ipv4_reachs)
tlvs->te_ipv4_reachs = list_new (); tlvs->te_ipv4_reachs = list_new ();
listnode_add (tlvs->te_ipv4_reachs, te_ipv4_reach); listnode_add (tlvs->te_ipv4_reachs, te_ipv4_reach);
/* this trickery is permitable since no subtlvs are defined */
value_len += 5 + ((te_ipv4_reach->control & 0x3F) ? /* Metric + Control-Byte + Prefix */
((((te_ipv4_reach->control & 0x3F) - unsigned int entry_len = 5 + PSIZE(te_ipv4_reach->control & 0x3F);
1) >> 3) + 1) : 0); value_len += entry_len;
pnt += 5 + ((te_ipv4_reach->control & 0x3F) ? pnt += entry_len;
((((te_ipv4_reach->control & 0x3F) - 1) >> 3) + 1) : 0);
if (te_ipv4_reach->control & TE_IPV4_HAS_SUBTLV)
{
if (length <= value_len)
{
zlog_warn("ISIS-TLV (%s): invalid IPv4 extended reachability SubTLV missing",
areatag);
retval = ISIS_WARNING;
break;
}
u_char subtlv_len = *pnt;
value_len += subtlv_len + 1;
pnt += subtlv_len + 1;
if (length < value_len)
{
zlog_warn("ISIS-TLV (%s): invalid IPv4 extended reachability SubTLVs have oversize",
areatag);
retval = ISIS_WARNING;
break;
}
}
} }
} }
@ -687,6 +707,27 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected,
prefix_octets = ((ipv6_reach->prefix_len + 7) / 8); prefix_octets = ((ipv6_reach->prefix_len + 7) / 8);
value_len += prefix_octets + 6; value_len += prefix_octets + 6;
pnt += prefix_octets + 6; pnt += prefix_octets + 6;
if (ipv6_reach->control_info & CTRL_INFO_SUBTLVS)
{
if (length <= value_len)
{
zlog_warn("ISIS-TLV (%s): invalid IPv6 extended reachability SubTLV missing",
areatag);
retval = ISIS_WARNING;
break;
}
u_char subtlv_len = *pnt;
value_len += subtlv_len + 1;
pnt += subtlv_len + 1;
if (length < value_len)
{
zlog_warn("ISIS-TLV (%s): invalid IPv6 extended reachability SubTLVs have oversize",
areatag);
retval = ISIS_WARNING;
break;
}
}
/* FIXME: sub-tlvs */ /* FIXME: sub-tlvs */
if (!tlvs->ipv6_reachs) if (!tlvs->ipv6_reachs)
tlvs->ipv6_reachs = list_new (); tlvs->ipv6_reachs = list_new ();
@ -758,6 +799,9 @@ parse_tlvs (char *areatag, u_char * stream, int size, u_int32_t * expected,
pnt += length; pnt += length;
break; break;
} }
/* Abort Parsing if error occured */
if (retval != ISIS_OK)
return retval;
} }
return retval; return retval;

View File

@ -223,7 +223,7 @@ struct te_ipv4_reachability
u_char prefix_start; /* since this is variable length by nature it only */ u_char prefix_start; /* since this is variable length by nature it only */
}; /* points to an approximate location */ }; /* points to an approximate location */
#define TE_IPV4_HAS_SUBTLV (0x40)
struct idrp_info struct idrp_info
{ {