Merge pull request #615 from dslicenc/cm16531

zebra: add bgp unnumbered labeled-unicast to zserv
This commit is contained in:
Renato Westphal 2017-05-29 19:32:38 -03:00 committed by GitHub
commit cf4e348abb

View File

@ -1397,7 +1397,7 @@ zread_ipv4_route_ipv6_nexthop_add (struct zserv *client, u_short length, struct
{ {
unsigned int i; unsigned int i;
struct stream *s; struct stream *s;
struct in6_addr nexthop; struct in6_addr nhop_addr;
struct rib *rib; struct rib *rib;
u_char message; u_char message;
u_char nexthop_num; u_char nexthop_num;
@ -1407,11 +1407,14 @@ zread_ipv4_route_ipv6_nexthop_add (struct zserv *client, u_short length, struct
static struct in6_addr nexthops[MULTIPATH_NUM]; static struct in6_addr nexthops[MULTIPATH_NUM];
static unsigned int ifindices[MULTIPATH_NUM]; static unsigned int ifindices[MULTIPATH_NUM];
int ret; int ret;
static mpls_label_t labels[MULTIPATH_NUM];
mpls_label_t label;
struct nexthop *nexthop;
/* Get input stream. */ /* Get input stream. */
s = client->ibuf; s = client->ibuf;
memset (&nexthop, 0, sizeof (struct in6_addr)); memset (&nhop_addr, 0, sizeof (struct in6_addr));
/* Allocate new rib. */ /* Allocate new rib. */
rib = XCALLOC (MTYPE_RIB, sizeof (struct rib)); rib = XCALLOC (MTYPE_RIB, sizeof (struct rib));
@ -1452,9 +1455,17 @@ zread_ipv4_route_ipv6_nexthop_add (struct zserv *client, u_short length, struct
switch (nexthop_type) switch (nexthop_type)
{ {
case NEXTHOP_TYPE_IPV6: case NEXTHOP_TYPE_IPV6:
stream_get (&nexthop, s, 16); stream_get (&nhop_addr, s, 16);
if (nh_count < multipath_num) { if (nh_count < MULTIPATH_NUM)
nexthops[nh_count++] = nexthop; {
/* For labeled-unicast, each nexthop is followed by label. */
if (CHECK_FLAG (message, ZAPI_MESSAGE_LABEL))
{
label = (mpls_label_t)stream_getl (s);
labels[nh_count] = label;
}
nexthops[nh_count] = nhop_addr;
nh_count++;
} }
break; break;
case NEXTHOP_TYPE_IFINDEX: case NEXTHOP_TYPE_IFINDEX:
@ -1472,20 +1483,20 @@ zread_ipv4_route_ipv6_nexthop_add (struct zserv *client, u_short length, struct
for (i = 0; i < max_nh_if; i++) for (i = 0; i < max_nh_if; i++)
{ {
if ((i < nh_count) && !IN6_IS_ADDR_UNSPECIFIED (&nexthops[i])) { if ((i < nh_count) && !IN6_IS_ADDR_UNSPECIFIED (&nexthops[i])) {
if ((i < if_count) && ifindices[i]) { if ((i < if_count) && ifindices[i])
rib_nexthop_ipv6_ifindex_add (rib, &nexthops[i], ifindices[i]); nexthop = rib_nexthop_ipv6_ifindex_add (rib, &nexthops[i], ifindices[i]);
else
nexthop = rib_nexthop_ipv6_add (rib, &nexthops[i]);
if (CHECK_FLAG (message, ZAPI_MESSAGE_LABEL))
nexthop_add_labels (nexthop, nexthop->nh_label_type, 1, &labels[i]);
} }
else { else {
rib_nexthop_ipv6_add (rib, &nexthops[i]); if ((i < if_count) && ifindices[i])
}
}
else {
if ((i < if_count) && ifindices[i]) {
rib_nexthop_ifindex_add (rib, ifindices[i]); rib_nexthop_ifindex_add (rib, ifindices[i]);
} }
} }
} }
}
/* Distance. */ /* Distance. */
if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE)) if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE))