Merge pull request #1210 from opensourcerouting/misc-mpls-bgp-lu-fixes

Misc BGP-LU fixes
This commit is contained in:
Donald Sharp 2017-10-10 12:19:37 -04:00 committed by GitHub
commit 5d920111b9
4 changed files with 35 additions and 35 deletions

View File

@ -11464,12 +11464,6 @@ void bgp_route_init(void)
install_element(BGP_IPV6M_NODE, &ipv6_bgp_network_cmd); install_element(BGP_IPV6M_NODE, &ipv6_bgp_network_cmd);
install_element(BGP_IPV6M_NODE, &no_ipv6_bgp_network_cmd); install_element(BGP_IPV6M_NODE, &no_ipv6_bgp_network_cmd);
install_element(BGP_IPV6L_NODE, &bgp_table_map_cmd);
install_element(BGP_IPV6L_NODE, &ipv6_bgp_network_cmd);
install_element(BGP_IPV6L_NODE, &ipv6_bgp_network_route_map_cmd);
install_element(BGP_IPV6L_NODE, &no_bgp_table_map_cmd);
install_element(BGP_IPV6L_NODE, &no_ipv6_bgp_network_cmd);
install_element(BGP_NODE, &bgp_distance_cmd); install_element(BGP_NODE, &bgp_distance_cmd);
install_element(BGP_NODE, &no_bgp_distance_cmd); install_element(BGP_NODE, &no_bgp_distance_cmd);
install_element(BGP_NODE, &bgp_distance_source_cmd); install_element(BGP_NODE, &bgp_distance_source_cmd);

View File

@ -845,7 +845,7 @@ static void _netlink_route_build_singlepath(const char *routedesc, int bytelen,
{ {
struct nexthop_label *nh_label; struct nexthop_label *nh_label;
mpls_lse_t out_lse[MPLS_MAX_LABELS]; mpls_lse_t out_lse[MPLS_MAX_LABELS];
char label_buf[100]; char label_buf[256];
/* /*
* label_buf is *only* currently used within debugging. * label_buf is *only* currently used within debugging.
@ -876,12 +876,13 @@ static void _netlink_route_build_singlepath(const char *routedesc, int bytelen,
0, 0, bos); 0, 0, bos);
if (IS_ZEBRA_DEBUG_KERNEL) { if (IS_ZEBRA_DEBUG_KERNEL) {
if (!num_labels) if (!num_labels)
sprintf(label_buf, "label %d", sprintf(label_buf, "label %u",
nh_label->label[i]); nh_label->label[i]);
else { else {
sprintf(label_buf1, "/%d", sprintf(label_buf1, "/%u",
nh_label->label[i]); nh_label->label[i]);
strcat(label_buf, label_buf1); strlcat(label_buf, label_buf1,
sizeof(label_buf));
} }
} }
num_labels++; num_labels++;
@ -1044,7 +1045,7 @@ static void _netlink_route_build_multipath(const char *routedesc, int bytelen,
{ {
struct nexthop_label *nh_label; struct nexthop_label *nh_label;
mpls_lse_t out_lse[MPLS_MAX_LABELS]; mpls_lse_t out_lse[MPLS_MAX_LABELS];
char label_buf[100]; char label_buf[256];
rtnh->rtnh_len = sizeof(*rtnh); rtnh->rtnh_len = sizeof(*rtnh);
rtnh->rtnh_flags = 0; rtnh->rtnh_flags = 0;
@ -1080,12 +1081,13 @@ static void _netlink_route_build_multipath(const char *routedesc, int bytelen,
0, 0, bos); 0, 0, bos);
if (IS_ZEBRA_DEBUG_KERNEL) { if (IS_ZEBRA_DEBUG_KERNEL) {
if (!num_labels) if (!num_labels)
sprintf(label_buf, "label %d", sprintf(label_buf, "label %u",
nh_label->label[i]); nh_label->label[i]);
else { else {
sprintf(label_buf1, "/%d", sprintf(label_buf1, "/%u",
nh_label->label[i]); nh_label->label[i]);
strcat(label_buf, label_buf1); strlcat(label_buf, label_buf1,
sizeof(label_buf));
} }
} }
num_labels++; num_labels++;

View File

@ -325,9 +325,11 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
resolved_hop = nexthop_new(); resolved_hop = nexthop_new();
SET_FLAG(resolved_hop->flags, NEXTHOP_FLAG_ACTIVE); SET_FLAG(resolved_hop->flags, NEXTHOP_FLAG_ACTIVE);
switch (newhop->type) {
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
/* If the resolving route specifies a gateway, use it */ /* If the resolving route specifies a gateway, use it */
if (newhop->type == NEXTHOP_TYPE_IPV4
|| newhop->type == NEXTHOP_TYPE_IPV4_IFINDEX) {
resolved_hop->type = newhop->type; resolved_hop->type = newhop->type;
resolved_hop->gate.ipv4 = newhop->gate.ipv4; resolved_hop->gate.ipv4 = newhop->gate.ipv4;
@ -337,9 +339,9 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
if (newhop->flags & NEXTHOP_FLAG_ONLINK) if (newhop->flags & NEXTHOP_FLAG_ONLINK)
resolved_hop->flags |= NEXTHOP_FLAG_ONLINK; resolved_hop->flags |= NEXTHOP_FLAG_ONLINK;
} }
} break;
if (newhop->type == NEXTHOP_TYPE_IPV6 case NEXTHOP_TYPE_IPV6:
|| newhop->type == NEXTHOP_TYPE_IPV6_IFINDEX) { case NEXTHOP_TYPE_IPV6_IFINDEX:
resolved_hop->type = newhop->type; resolved_hop->type = newhop->type;
resolved_hop->gate.ipv6 = newhop->gate.ipv6; resolved_hop->gate.ipv6 = newhop->gate.ipv6;
@ -347,8 +349,8 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
resolved_hop->type = NEXTHOP_TYPE_IPV6_IFINDEX; resolved_hop->type = NEXTHOP_TYPE_IPV6_IFINDEX;
resolved_hop->ifindex = newhop->ifindex; resolved_hop->ifindex = newhop->ifindex;
} }
} break;
case NEXTHOP_TYPE_IFINDEX:
/* If the resolving route is an interface route, /* If the resolving route is an interface route,
* it means the gateway we are looking up is connected * it means the gateway we are looking up is connected
* to that interface. (The actual network is _not_ onlink). * to that interface. (The actual network is _not_ onlink).
@ -358,7 +360,6 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
* On Linux, we have to set the onlink netlink flag because * On Linux, we have to set the onlink netlink flag because
* otherwise, the kernel won't accept the route. * otherwise, the kernel won't accept the route.
*/ */
if (newhop->type == NEXTHOP_TYPE_IFINDEX) {
resolved_hop->flags |= NEXTHOP_FLAG_ONLINK; resolved_hop->flags |= NEXTHOP_FLAG_ONLINK;
if (afi == AFI_IP) { if (afi == AFI_IP) {
resolved_hop->type = NEXTHOP_TYPE_IPV4_IFINDEX; resolved_hop->type = NEXTHOP_TYPE_IPV4_IFINDEX;
@ -368,12 +369,13 @@ static void nexthop_set_resolved(afi_t afi, struct nexthop *newhop,
resolved_hop->gate.ipv6 = nexthop->gate.ipv6; resolved_hop->gate.ipv6 = nexthop->gate.ipv6;
} }
resolved_hop->ifindex = newhop->ifindex; resolved_hop->ifindex = newhop->ifindex;
} break;
case NEXTHOP_TYPE_BLACKHOLE:
if (newhop->type == NEXTHOP_TYPE_BLACKHOLE) {
resolved_hop->type = NEXTHOP_TYPE_BLACKHOLE; resolved_hop->type = NEXTHOP_TYPE_BLACKHOLE;
resolved_hop->bh_type = nexthop->bh_type; resolved_hop->bh_type = nexthop->bh_type;
break;
} }
resolved_hop->rparent = nexthop; resolved_hop->rparent = nexthop;
nexthop_add(&nexthop->resolved, resolved_hop); nexthop_add(&nexthop->resolved, resolved_hop);
} }

View File

@ -825,6 +825,7 @@ static int zserv_fec_register(struct zserv *client, int sock, u_short length)
while (l < length) { while (l < length) {
flags = stream_getw(s); flags = stream_getw(s);
memset(&p, 0, sizeof(p));
p.family = stream_getw(s); p.family = stream_getw(s);
if (p.family != AF_INET && p.family != AF_INET6) { if (p.family != AF_INET && p.family != AF_INET6) {
zlog_err( zlog_err(
@ -875,6 +876,7 @@ static int zserv_fec_unregister(struct zserv *client, int sock, u_short length)
while (l < length) { while (l < length) {
// flags = stream_getw(s); // flags = stream_getw(s);
(void)stream_getw(s); (void)stream_getw(s);
memset(&p, 0, sizeof(p));
p.family = stream_getw(s); p.family = stream_getw(s);
if (p.family != AF_INET && p.family != AF_INET6) { if (p.family != AF_INET && p.family != AF_INET6) {
zlog_err( zlog_err(