mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 13:27:53 +00:00
Merge pull request #1210 from opensourcerouting/misc-mpls-bgp-lu-fixes
Misc BGP-LU fixes
This commit is contained in:
commit
5d920111b9
@ -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);
|
||||||
|
@ -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++;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user