mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 17:18:56 +00:00
Merge pull request #140 from opensourcerouting/fixes/isis-subtlv
isisd: parse TE-IP reachability and IPv6 reachability subtlvs
This commit is contained in:
commit
681ca8cc52
@ -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;
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user