Skip to content

Commit

Permalink
bgpd: use label info from attr in bgp_update
Browse files Browse the repository at this point in the history
Use label info from attr in bgp_update. attr labels will be set in the
next commit.

Signed-off-by: Louis Scalbert <[email protected]>
  • Loading branch information
louis-6wind committed Feb 7, 2024
1 parent c097f02 commit 91ea759
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 109 deletions.
22 changes: 14 additions & 8 deletions bgpd/bgp_evpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -4596,6 +4596,7 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
uint32_t num_labels = 0;
uint32_t eth_tag;
int ret = 0;
uint8_t i;

/* Type-2 route should be either 33, 37 or 49 bytes or an
* additional 3 bytes if there is a second label (VNI):
Expand Down Expand Up @@ -4687,11 +4688,14 @@ static int process_type2_route(struct peer *peer, afi_t afi, safi_t safi,
}

/* Process the route. */
if (attr)
if (attr) {
attr->num_labels = num_labels;
for (i=0; i < num_labels; i++)
attr->label_tbl[i] = label[i];
bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
&label[0], num_labels, 0, &evpn);
else
0, &evpn);
} else
bgp_withdraw(peer, (struct prefix *)&p, addpath_id, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, &label[0],
num_labels, &evpn);
Expand Down Expand Up @@ -4780,8 +4784,8 @@ static int process_type3_route(struct peer *peer, afi_t afi, safi_t safi,
/* Process the route. */
if (attr)
bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL,
0, 0, NULL);
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
0, NULL);
else
bgp_withdraw(peer, (struct prefix *)&p, addpath_id, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0,
Expand Down Expand Up @@ -4912,11 +4916,13 @@ static int process_type5_route(struct peer *peer, afi_t afi, safi_t safi,
}

/* Process the route. */
if (attr && is_valid_update)
if (attr && is_valid_update) {
attr->num_labels = 1;
attr->label_tbl[0] = label;
bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
&label, 1, 0, &evpn);
else {
0, &evpn);
} else {
if (!is_valid_update) {
char attr_str[BUFSIZ] = {0};

Expand Down
8 changes: 4 additions & 4 deletions bgpd/bgp_evpn_mh.c
Original file line number Diff line number Diff line change
Expand Up @@ -757,8 +757,8 @@ int bgp_evpn_type4_route_process(struct peer *peer, afi_t afi, safi_t safi,
/* Process the route. */
if (attr) {
bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL,
0, 0, NULL);
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
0, NULL);
} else {
bgp_withdraw(peer, (struct prefix *)&p, addpath_id, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0,
Expand Down Expand Up @@ -1226,8 +1226,8 @@ int bgp_evpn_type1_route_process(struct peer *peer, afi_t afi, safi_t safi,
/* Process the route. */
if (attr) {
bgp_update(peer, (struct prefix *)&p, addpath_id, attr, afi,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL,
0, 0, NULL);
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd,
0, NULL);
} else {
bgp_withdraw(peer, (struct prefix *)&p, addpath_id, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, &prd, NULL, 0,
Expand Down
2 changes: 1 addition & 1 deletion bgpd/bgp_flowspec.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ int bgp_nlri_parse_flowspec(struct peer *peer, struct attr *attr,
if (!withdraw) {
bgp_update(peer, &p, 0, attr, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
NULL, 0, 0, NULL);
0, NULL);
} else {
bgp_withdraw(peer, &p, 0, afi, safi, ZEBRA_ROUTE_BGP,
BGP_ROUTE_NORMAL, NULL, NULL, 0, NULL);
Expand Down
5 changes: 4 additions & 1 deletion bgpd/bgp_label.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,9 +451,12 @@ int bgp_nlri_parse_label(struct peer *peer, struct attr *attr,
}

if (attr) {
attr->num_labels = 1;
attr->label_tbl[0] = label;
bgp_set_valid_label(&attr->label_tbl[0]);
bgp_update(peer, &p, addpath_id, attr, packet->afi,
safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
NULL, &label, 1, 0, NULL);
NULL, 0, NULL);
} else {
bgp_withdraw(peer, &p, addpath_id, packet->afi,
SAFI_UNICAST, ZEBRA_ROUTE_BGP,
Expand Down
12 changes: 3 additions & 9 deletions bgpd/bgp_mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,6 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer,
const struct prefix *p = bgp_dest_get_prefix(dest);
struct prefix_evpn *pevpn = (struct prefix_evpn *)dest;
struct prefix_rd prd;
uint32_t num_labels = 0;
mpls_label_t *label_pnt = NULL;
struct bgp_route_evpn *evpn;

if (pevpn->family == AF_EVPN
Expand Down Expand Up @@ -169,10 +167,6 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer,
&& !dest_affected)
continue;

num_labels = pi->attr->num_labels;
if (num_labels)
label_pnt = &pi->attr->label_tbl[0];

prd.family = AF_UNSPEC;
prd.prefixlen = 64;
memcpy(&prd.val, pdest_p->u.val, 8);
Expand All @@ -183,7 +177,7 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer,

bgp_debug_rdpfxpath2str(
AFI_L2VPN, SAFI_EVPN, &prd,
p, label_pnt, num_labels,
p, &pi->attr->label_tbl[0], pi->attr->num_labels,
pi->addpath_rx_id ? 1 : 0,
pi->addpath_rx_id, NULL,
pfx_buf, sizeof(pfx_buf));
Expand All @@ -198,8 +192,8 @@ static void bgp_process_mac_rescan_table(struct bgp *bgp, struct peer *peer,
sizeof(evpn));
bgp_update(peer, p, pi->addpath_rx_id, pi->attr,
AFI_L2VPN, SAFI_EVPN, ZEBRA_ROUTE_BGP,
BGP_ROUTE_NORMAL, &prd, label_pnt,
num_labels, 1, evpn);
BGP_ROUTE_NORMAL, &prd,
1, evpn);
}
}
}
Expand Down
5 changes: 4 additions & 1 deletion bgpd/bgp_mplsvpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,12 @@ int bgp_nlri_parse_vpn(struct peer *peer, struct attr *attr,
STREAM_GET(p.u.val, data, psize - VPN_PREFIXLEN_MIN_BYTES);

if (attr) {
attr->num_labels = 1;
attr->label_tbl[0] = label;
bgp_set_valid_label(&attr->label_tbl[0]);
bgp_update(peer, &p, addpath_id, attr, packet->afi,
SAFI_MPLS_VPN, ZEBRA_ROUTE_BGP,
BGP_ROUTE_NORMAL, &prd, &label, 1, 0, NULL);
BGP_ROUTE_NORMAL, &prd, 0, NULL);
} else {
bgp_withdraw(peer, &p, addpath_id, packet->afi,
SAFI_MPLS_VPN, ZEBRA_ROUTE_BGP,
Expand Down
79 changes: 21 additions & 58 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -4171,8 +4171,8 @@ static bool bgp_accept_own(struct peer *peer, afi_t afi, safi_t safi,

void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
struct attr *attr, afi_t afi, safi_t safi, int type,
int sub_type, struct prefix_rd *prd, mpls_label_t *label,
uint32_t num_labels, int soft_reconfig,
int sub_type, struct prefix_rd *prd,
int soft_reconfig,
struct bgp_route_evpn *evpn)
{
int ret;
Expand Down Expand Up @@ -4215,13 +4215,9 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
dest = bgp_afi_node_get(bgp->rib[afi][safi], afi, safi, p, prd);
/* TODO: Check to see if we can get rid of "is_valid_label" */
if (afi == AFI_L2VPN && safi == SAFI_EVPN)
has_valid_label = (num_labels > 0) ? 1 : 0;
has_valid_label = (attr->num_labels > 0) ? 1 : 0;
else
has_valid_label = bgp_is_valid_label(label);

if (has_valid_label)
assert(label != NULL);

has_valid_label = bgp_is_valid_label((const mpls_label_t *) attr->label_tbl);

/* When peer's soft reconfiguration enabled. Record input packet in
Adj-RIBs-In. */
Expand Down Expand Up @@ -4408,8 +4404,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
* commands, so we need bgp_attr_flush in the error paths, until we
* intern
* the attr (which takes over the memory references) */
if (bgp_input_modifier(peer, p, &new_attr, afi, orig_safi, NULL, label,
num_labels, dest)
if (bgp_input_modifier(peer, p, &new_attr, afi, orig_safi, NULL, attr->label_tbl,
attr->num_labels, dest)
== RMAP_DENY) {
peer->stat_pfx_filter++;
reason = "route-map;";
Expand Down Expand Up @@ -4516,16 +4512,16 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
if (!CHECK_FLAG(pi->flags, BGP_PATH_REMOVED) && same_attr &&
(!has_valid_label ||
(bgp_labels_same((const mpls_label_t *)pi->attr->label_tbl,
pi->attr->num_labels, label,
num_labels)))) {
pi->attr->num_labels, attr->label_tbl,
attr->num_labels)))) {
if (CHECK_FLAG(bgp->af_flags[afi][safi],
BGP_CONFIG_DAMPENING)
&& peer->sort == BGP_PEER_EBGP
&& CHECK_FLAG(pi->flags, BGP_PATH_HISTORY)) {
if (bgp_debug_update(peer, p, NULL, 1)) {
bgp_debug_rdpfxpath2str(
afi, safi, prd, p, label,
num_labels, addpath_id ? 1 : 0,
afi, safi, prd, p, attr->label_tbl,
attr->num_labels, addpath_id ? 1 : 0,
addpath_id, evpn, pfx_buf,
sizeof(pfx_buf));
zlog_debug("%pBP rcvd %s", peer,
Expand All @@ -4550,8 +4546,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
}

bgp_debug_rdpfxpath2str(
afi, safi, prd, p, label,
num_labels, addpath_id ? 1 : 0,
afi, safi, prd, p, attr->label_tbl,
attr->num_labels, addpath_id ? 1 : 0,
addpath_id, evpn, pfx_buf,
sizeof(pfx_buf));
zlog_debug(
Expand All @@ -4578,7 +4574,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
if (CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) {
if (bgp_debug_update(peer, p, NULL, 1)) {
bgp_debug_rdpfxpath2str(
afi, safi, prd, p, label, num_labels,
afi, safi, prd, p, attr->label_tbl, attr->num_labels,
addpath_id ? 1 : 0, addpath_id, evpn,
pfx_buf, sizeof(pfx_buf));
zlog_debug(
Expand All @@ -4605,8 +4601,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,

/* Received Logging. */
if (bgp_debug_update(peer, p, NULL, 1)) {
bgp_debug_rdpfxpath2str(afi, safi, prd, p, label,
num_labels, addpath_id ? 1 : 0,
bgp_debug_rdpfxpath2str(afi, safi, prd, p, attr->label_tbl,
attr->num_labels, addpath_id ? 1 : 0,
addpath_id, evpn, pfx_buf,
sizeof(pfx_buf));
zlog_debug("%pBP rcvd %s", peer, pfx_buf);
Expand Down Expand Up @@ -4699,20 +4695,6 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
bgp_attr_unintern(&pi->attr);
pi->attr = attr_new;

/* Update MPLS label */
if (has_valid_label) {
bgp_path_info_extra_get(new);
if (!bgp_labels_same((const mpls_label_t *)attr->label_tbl,
attr->num_labels, label,
num_labels)) {
memcpy(&attr->label_tbl, label,
num_labels * sizeof(mpls_label_t));
attr->num_labels = num_labels;
}
if (!(afi == AFI_L2VPN && safi == SAFI_EVPN))
bgp_set_valid_label(&attr->label_tbl[0]);
}

#ifdef ENABLE_BGP_VNC
if ((afi == AFI_IP || afi == AFI_IP6)
&& (safi == SAFI_UNICAST)) {
Expand Down Expand Up @@ -4870,7 +4852,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,

#ifdef ENABLE_BGP_VNC
if (SAFI_MPLS_VPN == safi) {
mpls_label_t label_decoded = decode_label(label);
mpls_label_t label_decoded = decode_label(attr->label_tbl);

rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi,
type, sub_type, &label_decoded);
Expand All @@ -4891,7 +4873,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
peer->rcvd_attr_printed = 1;
}

bgp_debug_rdpfxpath2str(afi, safi, prd, p, label, num_labels,
bgp_debug_rdpfxpath2str(afi, safi, prd, p, attr->label_tbl, attr->num_labels,
addpath_id ? 1 : 0, addpath_id, evpn,
pfx_buf, sizeof(pfx_buf));
zlog_debug("%pBP rcvd %s", peer, pfx_buf);
Expand All @@ -4900,19 +4882,6 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
/* Make new BGP info. */
new = info_make(type, sub_type, 0, peer, attr_new, dest);

/* Update MPLS label */
if (has_valid_label) {
bgp_path_info_extra_get(new);
if (!bgp_labels_same((const mpls_label_t *)attr->label_tbl,
attr->num_labels, label, num_labels)) {
memcpy(&attr->label_tbl, label,
num_labels * sizeof(mpls_label_t));
attr->num_labels = num_labels;
}
if (!(afi == AFI_L2VPN && safi == SAFI_EVPN))
bgp_set_valid_label(&attr->label_tbl[0]);
}

/* Nexthop reachability check. */
if (((afi == AFI_IP || afi == AFI_IP6) &&
(safi == SAFI_UNICAST || safi == SAFI_LABELED_UNICAST ||
Expand Down Expand Up @@ -5012,7 +4981,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
}
#ifdef ENABLE_BGP_VNC
if (SAFI_MPLS_VPN == safi) {
mpls_label_t label_decoded = decode_label(label);
mpls_label_t label_decoded = decode_label(attr->label_tbl);

rfapiProcessUpdate(peer, NULL, p, prd, attr, afi, safi, type,
sub_type, &label_decoded);
Expand Down Expand Up @@ -5044,7 +5013,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
peer->rcvd_attr_printed = 1;
}

bgp_debug_rdpfxpath2str(afi, safi, prd, p, label, num_labels,
bgp_debug_rdpfxpath2str(afi, safi, prd, p, attr->label_tbl, attr->num_labels,
addpath_id ? 1 : 0, addpath_id, evpn,
pfx_buf, sizeof(pfx_buf));
zlog_debug("%pBP rcvd UPDATE about %s -- DENIED due to: %s",
Expand Down Expand Up @@ -5319,18 +5288,12 @@ static void bgp_soft_reconfig_table_update(struct peer *peer,
safi_t safi, struct prefix_rd *prd)
{
struct bgp_path_info *pi;
uint32_t num_labels = 0;
mpls_label_t *label_pnt = NULL;
struct bgp_route_evpn evpn;

for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
if (pi->peer == peer)
break;

if (pi)
num_labels = pi->attr->num_labels;
if (num_labels)
label_pnt = &pi->attr->label_tbl[0];
if (pi)
memcpy(&evpn, bgp_attr_get_evpn_overlay(pi->attr),
sizeof(evpn));
Expand All @@ -5339,7 +5302,7 @@ static void bgp_soft_reconfig_table_update(struct peer *peer,

bgp_update(peer, bgp_dest_get_prefix(dest), ain->addpath_rx_id,
ain->attr, afi, safi, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd,
label_pnt, num_labels, 1, &evpn);
1, &evpn);
}

static void bgp_soft_reconfig_table(struct peer *peer, afi_t afi, safi_t safi,
Expand Down Expand Up @@ -6250,7 +6213,7 @@ int bgp_nlri_parse_ip(struct peer *peer, struct attr *attr,
if (attr)
bgp_update(peer, &p, addpath_id, attr, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
NULL, 0, 0, NULL);
0, NULL);
else
bgp_withdraw(peer, &p, addpath_id, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
Expand Down
4 changes: 2 additions & 2 deletions bgpd/bgp_route.h
Original file line number Diff line number Diff line change
Expand Up @@ -783,8 +783,8 @@ extern int bgp_static_set(struct vty *vty, bool negate, const char *ip_str,
extern void bgp_update(struct peer *peer, const struct prefix *p,
uint32_t addpath_id, struct attr *attr, afi_t afi,
safi_t safi, int type, int sub_type,
struct prefix_rd *prd, mpls_label_t *label,
uint32_t num_labels, int soft_reconfig,
struct prefix_rd *prd,
int soft_reconfig,
struct bgp_route_evpn *evpn);
extern void bgp_withdraw(struct peer *peer, const struct prefix *p,
uint32_t addpath_id, afi_t afi, safi_t safi, int type,
Expand Down
16 changes: 3 additions & 13 deletions bgpd/bgp_rpki.c
Original file line number Diff line number Diff line change
Expand Up @@ -657,21 +657,11 @@ static void revalidate_bgp_node(struct bgp_dest *bgp_dest, afi_t afi,
{
struct bgp_adj_in *ain;

for (ain = bgp_dest->adj_in; ain; ain = ain->next) {
struct bgp_path_info *path =
bgp_dest_get_bgp_path_info(bgp_dest);
mpls_label_t *label = NULL;
uint32_t num_labels = 0;

if (path) {
label = path->attr->label_tbl;
num_labels = path->attr->num_labels;
}
for (ain = bgp_dest->adj_in; ain; ain = ain->next)
(void)bgp_update(ain->peer, bgp_dest_get_prefix(bgp_dest),
ain->addpath_rx_id, ain->attr, afi, safi,
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, label,
num_labels, 1, NULL);
}
ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL,
1, NULL);
}

/*
Expand Down
Loading

0 comments on commit 91ea759

Please sign in to comment.