forked from Mirror/frr
zebra: Add multipath parsing to V6
In the near future it will be possible to recieve v6 multipath netlink messages. This code change is in prep for it. In the meantime the v6 code path will continue to work as per normal. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
89a9069abb
commit
a2ca67d1d2
|
@ -241,26 +241,46 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
|
|||
p.family = AF_INET;
|
||||
memcpy (&p.u.prefix4, dest, 4);
|
||||
p.prefixlen = rtm->rtm_dst_len;
|
||||
}
|
||||
else if (rtm->rtm_family == AF_INET6)
|
||||
{
|
||||
p.family = AF_INET6;
|
||||
memcpy (&p.u.prefix6, dest, 16);
|
||||
p.prefixlen = rtm->rtm_dst_len;
|
||||
|
||||
src_p.family = AF_INET6;
|
||||
memcpy (&src_p.prefix, src, 16);
|
||||
src_p.prefixlen = rtm->rtm_src_len;
|
||||
}
|
||||
|
||||
if (rtm->rtm_src_len != 0)
|
||||
{
|
||||
zlog_warn ("unsupported IPv4 sourcedest route (dest %s/%d)",
|
||||
inet_ntoa (p.u.prefix4), p.prefixlen);
|
||||
char buf[PREFIX_STRLEN];
|
||||
zlog_warn ("unsupported IPv[4|6] sourcedest route (dest %s vrf %u)",
|
||||
prefix2str (&p, buf, sizeof(buf)), vrf_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||
{
|
||||
char buf[PREFIX_STRLEN];
|
||||
zlog_debug ("%s %s vrf %u",
|
||||
char buf2[PREFIX_STRLEN];
|
||||
zlog_debug ("%s %s%s%s vrf %u",
|
||||
nl_msg_type_to_str (h->nlmsg_type),
|
||||
prefix2str (&p, buf, sizeof(buf)), vrf_id);
|
||||
prefix2str (&p, buf, sizeof(buf)),
|
||||
src_p.prefixlen ? " from " : "",
|
||||
src_p.prefixlen ? prefix2str(&src_p, buf2, sizeof(buf2)) : "",
|
||||
vrf_id);
|
||||
}
|
||||
|
||||
afi_t afi = AFI_IP;
|
||||
if (rtm->rtm_family == AF_INET6)
|
||||
afi = AFI_IP6;
|
||||
|
||||
if (h->nlmsg_type == RTM_NEWROUTE)
|
||||
{
|
||||
if (!tb[RTA_MULTIPATH])
|
||||
rib_add (AFI_IP, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL,
|
||||
rib_add (afi, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL,
|
||||
0, flags, &p, NULL, gate, prefsrc, index,
|
||||
table, metric, mtu, 0);
|
||||
else
|
||||
|
@ -301,12 +321,22 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
|
|||
}
|
||||
|
||||
if (gate)
|
||||
{
|
||||
if (rtm->rtm_family == AF_INET)
|
||||
{
|
||||
if (index)
|
||||
rib_nexthop_ipv4_ifindex_add (rib, gate, prefsrc, index);
|
||||
else
|
||||
rib_nexthop_ipv4_add (rib, gate, prefsrc);
|
||||
}
|
||||
else if (rtm->rtm_family == AF_INET6)
|
||||
{
|
||||
if (index)
|
||||
rib_nexthop_ipv6_ifindex_add (rib, gate, index);
|
||||
else
|
||||
rib_nexthop_ipv6_add (rib,gate);
|
||||
}
|
||||
}
|
||||
else
|
||||
rib_nexthop_ifindex_add (rib, index);
|
||||
|
||||
|
@ -323,39 +353,8 @@ netlink_route_change_read_unicast (struct sockaddr_nl *snl, struct nlmsghdr *h,
|
|||
}
|
||||
}
|
||||
else
|
||||
rib_delete (AFI_IP, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL, 0, flags,
|
||||
rib_delete (afi, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL, 0, flags,
|
||||
&p, NULL, gate, index, table);
|
||||
}
|
||||
if (rtm->rtm_family == AF_INET6)
|
||||
{
|
||||
p.family = AF_INET6;
|
||||
memcpy (&p.u.prefix6, dest, 16);
|
||||
p.prefixlen = rtm->rtm_dst_len;
|
||||
|
||||
src_p.family = AF_INET6;
|
||||
memcpy (&src_p.prefix, src, 16);
|
||||
src_p.prefixlen = rtm->rtm_src_len;
|
||||
|
||||
if (IS_ZEBRA_DEBUG_KERNEL)
|
||||
{
|
||||
char buf[PREFIX_STRLEN];
|
||||
char buf2[PREFIX_STRLEN];
|
||||
zlog_debug ("%s %s%s%s vrf %u",
|
||||
nl_msg_type_to_str (h->nlmsg_type),
|
||||
prefix2str (&p, buf, sizeof(buf)),
|
||||
src_p.prefixlen ? " from " : "",
|
||||
src_p.prefixlen ? prefix2str(&src_p, buf2, sizeof(buf2)) : "",
|
||||
vrf_id);
|
||||
}
|
||||
|
||||
if (h->nlmsg_type == RTM_NEWROUTE)
|
||||
rib_add (AFI_IP6, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL,
|
||||
0, flags, &p, &src_p, gate, prefsrc, index,
|
||||
table, metric, mtu, 0);
|
||||
else
|
||||
rib_delete (AFI_IP6, SAFI_UNICAST, vrf_id, ZEBRA_ROUTE_KERNEL,
|
||||
0, flags, &p, &src_p, gate, index, table);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue