Skip to content

Commit

Permalink
bgpd: check and set extra num_labels
Browse files Browse the repository at this point in the history
extra->num_labels is the number of utilized labels in extra->label[].
extra->label[0] cannot be trusted if extra->num_labels is 0.

Set num_labels each time values are set in extra->label[] and check
extra->num_labels before getting the label from extra->label[0].

Signed-off-by: Louis Scalbert <[email protected]>
  • Loading branch information
louis-6wind committed Feb 6, 2024
1 parent f28447e commit c86d80b
Show file tree
Hide file tree
Showing 10 changed files with 79 additions and 48 deletions.
2 changes: 2 additions & 0 deletions bgpd/bgp_evpn_mh.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,8 @@ int bgp_evpn_mh_route_update(struct bgp *bgp, struct bgp_evpn_es *es,
else
tmp_pi->extra->label[0] = 0;
}
if (tmp_pi->extra)
tmp_pi->extra->num_labels = 0;

/* add the newly created path to the route-node */
bgp_path_info_add(dest, tmp_pi);
Expand Down
4 changes: 3 additions & 1 deletion bgpd/bgp_label.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ mpls_label_t bgp_adv_label(struct bgp_dest *dest, struct bgp_path_info *pi,
if (!dest || !pi || !to)
return MPLS_INVALID_LABEL;

remote_label = pi->extra ? pi->extra->label[0] : MPLS_INVALID_LABEL;
remote_label = (pi->extra && pi->extra->num_labels)
? pi->extra->label[0]
: MPLS_INVALID_LABEL;
from = pi->peer;
reflect =
((from->sort == BGP_PEER_IBGP) && (to->sort == BGP_PEER_IBGP));
Expand Down
3 changes: 2 additions & 1 deletion bgpd/bgp_mplsvpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -4094,7 +4094,8 @@ bool bgp_mplsvpn_path_uses_valid_mpls_label(struct bgp_path_info *pi)
/* prefix_sid attribute */
return false;

if (!pi->extra || !bgp_is_valid_label(&pi->extra->label[0]))
if (!pi->extra || !pi->extra->num_labels ||
!bgp_is_valid_label(&pi->extra->label[0]))
/* invalid MPLS label */
return false;
return true;
Expand Down
15 changes: 8 additions & 7 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -1283,8 +1283,9 @@ int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
newl = new->extra->num_labels;
if (exist->extra)
existl = exist->extra->num_labels;
if (((new->extra &&bgp_is_valid_label(&new->extra->label[0])) !=
(exist->extra &&
if (((new->extra && newl && bgp_is_valid_label(
&new->extra->label[0])) !=
(exist->extra && existl &&
bgp_is_valid_label(&exist->extra->label[0]))) ||
(newl != existl)) {
if (debug)
Expand All @@ -1293,7 +1294,6 @@ int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
pfx_buf, new_buf, exist_buf);
} else if (CHECK_FLAG(bgp->flags,
BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {

/*
* For the two paths, all comparison steps till IGP
* metric
Expand Down Expand Up @@ -3160,7 +3160,7 @@ static bool bgp_lu_need_null_label(struct bgp *bgp,
|| new_select->sub_type == BGP_ROUTE_AGGREGATE
|| new_select->sub_type == BGP_ROUTE_REDISTRIBUTE)
goto need_null_label;
else if (new_select->extra &&
else if (new_select->extra && new_select->extra->num_labels &&
bgp_is_valid_label(&new_select->extra->label[0]))
return false;
need_null_label:
Expand Down Expand Up @@ -6351,7 +6351,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
route_map_result_t ret;
#ifdef ENABLE_BGP_VNC
int vnc_implicit_withdraw = 0;
mpls_label_t label = 0;
mpls_label_t label = MPLS_INVALID_LABEL;
#endif
uint32_t num_labels = 0;

Expand Down Expand Up @@ -6503,7 +6503,7 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
bgp, p, pi);
}
} else {
if (pi->extra)
if (pi->extra && pi->extra->num_labels)
label = decode_label(
&pi->extra->label[0]);
}
Expand Down Expand Up @@ -9731,7 +9731,8 @@ void route_vty_out_tag(struct vty *vty, const struct prefix *p,
}
}

if (bgp_is_valid_label(&path->extra->label[0])) {
if (path->extra->num_labels &&
bgp_is_valid_label(&path->extra->label[0])) {
label = decode_label(&path->extra->label[0]);
if (json) {
json_object_int_add(json_out, "notag", label);
Expand Down
6 changes: 2 additions & 4 deletions bgpd/bgp_zebra.c
Original file line number Diff line number Diff line change
Expand Up @@ -1296,15 +1296,13 @@ static void bgp_zebra_announce_parse_nexthop(
api_nh->srte_color = bgp_attr_get_color(info->attr);

if (bgp_debug_zebra(&api->prefix)) {
if (mpinfo->extra) {
if (mpinfo->extra && mpinfo->extra->num_labels) {
zlog_debug("%s: p=%pFX, bgp_is_valid_label: %d",
__func__, p,
bgp_is_valid_label(
&mpinfo->extra->label[0]));
} else {
zlog_debug(
"%s: p=%pFX, extra is NULL, no label",
__func__, p);
zlog_debug("%s: p=%pFX, no label", __func__, p);
}
}

Expand Down
5 changes: 4 additions & 1 deletion bgpd/rfapi/rfapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,7 @@ void add_vnc_route(struct rfapi_descriptor *rfd, /* cookie, VPN UN addr, peer */
}
}

if (label)
if (label && *label != MPLS_INVALID_LABEL)
label_val = *label;
else
label_val = MPLS_LABEL_IMPLICIT_NULL;
Expand Down Expand Up @@ -1020,7 +1020,9 @@ void add_vnc_route(struct rfapi_descriptor *rfd, /* cookie, VPN UN addr, peer */
new->extra->vnc = XCALLOC(MTYPE_BGP_ROUTE_EXTRA_VNC,
sizeof(struct bgp_path_info_extra_vnc));
new->extra->vnc->vnc.export.rfapi_handle = (void *)rfd;

encode_label(label_val, &new->extra->label[0]);
new->extra->num_labels = 1;

/* debug */

Expand All @@ -1043,6 +1045,7 @@ void add_vnc_route(struct rfapi_descriptor *rfd, /* cookie, VPN UN addr, peer */
bgp, prd, table, p, new);
bgp_dest_unlock_node(pdest);
encode_label(label_val, &bn->local_label);
new->extra->num_labels = 1;
}

bgp_dest_unlock_node(bn);
Expand Down
14 changes: 10 additions & 4 deletions bgpd/rfapi/rfapi_import.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,8 +454,11 @@ static struct bgp_path_info *rfapiBgpInfoCreate(struct attr *attr,
new->extra->vnc->vnc.import.rd = *prd;
new->extra->vnc->vnc.import.create_time = monotime(NULL);
}
if (label)
if (label && *label != MPLS_INVALID_LABEL) {
encode_label(*label, &new->extra->label[0]);
new->extra->num_labels = 1;
} else
new->extra->num_labels = 0;

peer_lock(peer);

Expand Down Expand Up @@ -1267,7 +1270,10 @@ rfapiRouteInfo2NextHopEntry(struct rfapi_ip_prefix *rprefix,
bpi->extra->vnc->vnc.import.rd.val[1];

/* label comes from MP_REACH_NLRI label */
vo->v.l2addr.label = decode_label(&bpi->extra->label[0]);
vo->v.l2addr.label =
bpi->extra->num_labels
? decode_label(&bpi->extra->label[0])
: MPLS_INVALID_LABEL;

new->vn_options = vo;

Expand Down Expand Up @@ -4154,13 +4160,13 @@ static void rfapiBgpTableFilteredImport(struct bgp *bgp,

for (bpi = bgp_dest_get_bgp_path_info(dest2);
bpi; bpi = bpi->next) {
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

if (CHECK_FLAG(bpi->flags,
BGP_PATH_REMOVED))
continue;

if (bpi->extra)
if (bpi->extra && bpi->extra->num_labels)
label = decode_label(
&bpi->extra->label[0]);
(*rfapiBgpInfoFilteredImportFunction(
Expand Down
5 changes: 4 additions & 1 deletion bgpd/rfapi/rfapi_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,10 @@ static void rfapiRibBi2Ri(struct bgp_path_info *bpi, struct rfapi_info *ri,
bpi->extra->vnc->vnc.import.rd.val[1];

/* label comes from MP_REACH_NLRI label */
vo->v.l2addr.label = decode_label(&bpi->extra->label[0]);
vo->v.l2addr.label =
bpi->extra->num_labels
? decode_label(&bpi->extra->label[0])
: MPLS_INVALID_LABEL;

rfapi_vn_options_free(
ri->vn_options); /* maybe free old version */
Expand Down
7 changes: 4 additions & 3 deletions bgpd/rfapi/rfapi_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ void rfapi_vty_out_vncinfo(struct vty *vty, const struct prefix *p,
XFREE(MTYPE_ECOMMUNITY_STR, s);
}

if (bpi->extra != NULL) {
if (bpi->extra != NULL && bpi->extra->num_labels) {
if (bpi->extra->label[0] == BGP_PREVENT_VRF_2_VRF_LEAK)
vty_out(vty, " label=VRF2VRF");
else
Expand Down Expand Up @@ -1052,7 +1052,7 @@ static int rfapiPrintRemoteRegBi(struct bgp *bgp, void *stream,
snprintf(buf_un, sizeof(buf_un), "%s",
inet_ntop(pfx_vn.family, &pfx_vn.u.prefix, buf_ntop,
sizeof(buf_ntop)));
if (bpi->extra) {
if (bpi->extra && bpi->extra->num_labels) {
uint32_t l = decode_label(&bpi->extra->label[0]);
snprintf(buf_vn, sizeof(buf_vn), "Label: %d", l);
} else /* should never happen */
Expand Down Expand Up @@ -1161,7 +1161,8 @@ static int rfapiPrintRemoteRegBi(struct bgp *bgp, void *stream,
}
}
}
if (tun_type != BGP_ENCAP_TYPE_MPLS && bpi->extra) {
if (tun_type != BGP_ENCAP_TYPE_MPLS && bpi->extra &&
bpi->extra->num_labels) {
uint32_t l = decode_label(&bpi->extra->label[0]);

if (!MPLS_LABEL_IS_NULL(l)) {
Expand Down
66 changes: 40 additions & 26 deletions bgpd/rfapi/vnc_import_bgp.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ static void vnc_import_bgp_add_route_mode_resolve_nve_one_bi(
uint32_t lifetime;
uint32_t *plifetime;
struct bgp_attr_encap_subtlv *encaptlvs;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

struct rfapi_un_option optary[3];
struct rfapi_un_option *opt = NULL;
Expand Down Expand Up @@ -470,16 +470,17 @@ static void vnc_import_bgp_add_route_mode_resolve_nve_one_bi(
if (bgp_attr_get_ecommunity(bpi->attr))
ecommunity_merge(new_ecom, bgp_attr_get_ecommunity(bpi->attr));

if (bpi->extra)
if (bpi->extra && bpi->extra->num_labels)
label = decode_label(&bpi->extra->label[0]);

add_vnc_route(&vncHDResolveNve, bgp, SAFI_MPLS_VPN,
prefix, /* unicast route prefix */
prefix, /* unicast route prefix */
prd, &nexthop_h, /* new nexthop */
local_pref, plifetime,
(struct bgp_tea_options *)encaptlvs, /* RFP options */
opt, NULL, new_ecom, med, /* NULL => don't set med */
(label ? &label : NULL), /* NULL= default */
((label != MPLS_INVALID_LABEL) ? &label
: NULL), /* NULL= default */
ZEBRA_ROUTE_BGP_DIRECT, BGP_ROUTE_REDISTRIBUTE,
RFAPI_AHR_RFPOPT_IS_VNCTLV); /* flags */

Expand Down Expand Up @@ -1678,7 +1679,7 @@ static void vnc_import_bgp_exterior_add_route_it(
bpi_interior = bpi_interior->next) {
struct prefix_rd *prd;
struct attr new_attr;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

if (!is_usable_interior_route(bpi_interior))
continue;
Expand All @@ -1698,8 +1699,10 @@ static void vnc_import_bgp_exterior_add_route_it(
if (bpi_interior->extra) {
prd = &bpi_interior->extra->vnc->vnc
.import.rd;
label = decode_label(
&bpi_interior->extra->label[0]);
if (bpi_interior->extra->num_labels)
label = decode_label(
&bpi_interior->extra
->label[0]);
} else
prd = NULL;

Expand Down Expand Up @@ -1851,7 +1854,7 @@ void vnc_import_bgp_exterior_del_route(
for (bpi_interior = rn->info; bpi_interior;
bpi_interior = bpi_interior->next) {
struct prefix_rd *prd;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

if (!is_usable_interior_route(bpi_interior))
continue;
Expand All @@ -1867,8 +1870,10 @@ void vnc_import_bgp_exterior_del_route(
if (bpi_interior->extra) {
prd = &bpi_interior->extra->vnc->vnc
.import.rd;
label = decode_label(
&bpi_interior->extra->label[0]);
if (bpi_interior->extra->num_labels)
label = decode_label(
&bpi_interior->extra
->label[0]);
} else
prd = NULL;

Expand Down Expand Up @@ -2007,15 +2012,16 @@ void vnc_import_bgp_exterior_add_route_interior(

struct prefix_rd *prd;
struct attr new_attr;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

assert(bpi_exterior);
assert(pfx_exterior);

if (bpi_interior->extra) {
prd = &bpi_interior->extra->vnc->vnc.import.rd;
label = decode_label(
&bpi_interior->extra->label[0]);
if (bpi_interior->extra->num_labels)
label = decode_label(
&bpi_interior->extra->label[0]);
} else
prd = NULL;

Expand Down Expand Up @@ -2097,7 +2103,7 @@ void vnc_import_bgp_exterior_add_route_interior(
struct bgp_path_info *bpi;
struct prefix_rd *prd;
struct attr new_attr;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

/* do pull-down */

Expand Down Expand Up @@ -2128,8 +2134,10 @@ void vnc_import_bgp_exterior_add_route_interior(
if (bpi->extra) {
prd = &bpi->extra->vnc->vnc
.import.rd;
label = decode_label(
&bpi->extra->label[0]);
if (bpi->extra->num_labels)
label = decode_label(
&bpi->extra->label
[0]);
} else
prd = NULL;

Expand All @@ -2150,8 +2158,10 @@ void vnc_import_bgp_exterior_add_route_interior(
if (bpi_interior->extra) {
prd = &bpi_interior->extra->vnc->vnc
.import.rd;
label = decode_label(
&bpi_interior->extra->label[0]);
if (bpi_interior->extra->num_labels)
label = decode_label(
&bpi_interior->extra
->label[0]);
} else
prd = NULL;

Expand Down Expand Up @@ -2237,7 +2247,7 @@ void vnc_import_bgp_exterior_add_route_interior(

struct prefix_rd *prd;
struct attr new_attr;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

/* do pull-down */

Expand Down Expand Up @@ -2268,8 +2278,9 @@ void vnc_import_bgp_exterior_add_route_interior(
*/
if (bpi_interior->extra) {
prd = &bpi_interior->extra->vnc->vnc.import.rd;
label = decode_label(
&bpi_interior->extra->label[0]);
if (bpi_interior->extra->num_labels)
label = decode_label(
&bpi_interior->extra->label[0]);
} else
prd = NULL;

Expand Down Expand Up @@ -2372,11 +2383,13 @@ void vnc_import_bgp_exterior_del_route_interior(
&cursor)) {

struct prefix_rd *prd;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

if (bpi_interior->extra) {
prd = &bpi_interior->extra->vnc->vnc.import.rd;
label = decode_label(&bpi_interior->extra->label[0]);
if (bpi_interior->extra->num_labels)
label = decode_label(
&bpi_interior->extra->label[0]);
} else
prd = NULL;

Expand Down Expand Up @@ -2446,15 +2459,16 @@ void vnc_import_bgp_exterior_del_route_interior(

struct prefix_rd *prd;
struct attr new_attr;
uint32_t label = 0;
uint32_t label = MPLS_INVALID_LABEL;

if (bpi->type == ZEBRA_ROUTE_BGP_DIRECT_EXT)
continue;

if (bpi->extra) {
prd = &bpi->extra->vnc->vnc.import.rd;
label = decode_label(
&bpi->extra->label[0]);
if (bpi->extra->num_labels)
label = decode_label(
&bpi->extra->label[0]);
} else
prd = NULL;

Expand Down

0 comments on commit c86d80b

Please sign in to comment.