summaryrefslogtreecommitdiff
path: root/bgpd/bgp_mplsvpn.c
diff options
context:
space:
mode:
authorPhilippe Guibert <philippe.guibert@6wind.com>2023-05-24 17:26:13 +0200
committerPhilippe Guibert <philippe.guibert@6wind.com>2023-06-16 10:54:58 +0200
commit76c803171b067a22aa5695b6019fb2218d497c00 (patch)
tree9c843df847801dff96233e9fb8ab0c07c6380b77 /bgpd/bgp_mplsvpn.c
parent29b49f67eb3c25139bfcd27ec96a2fb9b3746b16 (diff)
bgpd: move the label per nexthop structs of bgp_path to an union
The label per nexthop attributes take 24 bytes per bgp path entry on AMD64 platform, and are only used for unicast paths. The current patch-set introduces a similar attributes, but that will be used only for l3vpn paths. To gain some memory on the bgp_path_info structure in the next commit, do some changes. Create an 'mplsvpn' union structure that will either include the label per nexthop structs for ipv4 paths, or the l3vpn paths structures. The 'label_nexthop_cache' and the 'label_nh_thread' attributes of the 'bgp_path_info' structure are moved into an union under a new structure called 'bgp_mplsvpn_label_nh_blnc'. The flags attribute of 'bgp_path_info' is increased from 16 bits to 32 bits, and the BGP_PATH_MPLSVPN_LABEL_NH flag is added to know the 'mplsvpn' usage. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'bgpd/bgp_mplsvpn.c')
-rw-r--r--bgpd/bgp_mplsvpn.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c
index 0ac76c48b4..4b8aa1ee70 100644
--- a/bgpd/bgp_mplsvpn.c
+++ b/bgpd/bgp_mplsvpn.c
@@ -1341,14 +1341,18 @@ void bgp_mplsvpn_path_nh_label_unlink(struct bgp_path_info *pi)
if (!pi)
return;
- blnc = pi->label_nexthop_cache;
+ if (!CHECK_FLAG(pi->flags, BGP_PATH_MPLSVPN_LABEL_NH))
+ return;
+
+ blnc = pi->mplsvpn.blnc.label_nexthop_cache;
if (!blnc)
return;
- LIST_REMOVE(pi, label_nh_thread);
- pi->label_nexthop_cache->path_count--;
- pi->label_nexthop_cache = NULL;
+ LIST_REMOVE(pi, mplsvpn.blnc.label_nh_thread);
+ pi->mplsvpn.blnc.label_nexthop_cache->path_count--;
+ pi->mplsvpn.blnc.label_nexthop_cache = NULL;
+ UNSET_FLAG(pi->flags, BGP_PATH_MPLSVPN_LABEL_NH);
if (LIST_EMPTY(&(blnc->paths)))
bgp_label_per_nexthop_free(blnc);
@@ -1390,7 +1394,7 @@ static int bgp_mplsvpn_get_label_per_nexthop_cb(mpls_label_t label,
ZEBRA_MPLS_LABELS_ADD, blnc->label, blnc->nh->ifindex,
blnc->nh->vrf_id, ZEBRA_LSP_BGP, &blnc->nexthop);
- LIST_FOREACH (pi, &(blnc->paths), label_nh_thread) {
+ LIST_FOREACH (pi, &(blnc->paths), mplsvpn.blnc.label_nh_thread) {
if (!pi->net)
continue;
table = bgp_dest_table(pi->net);
@@ -1457,7 +1461,7 @@ _vpn_leak_from_vrf_get_per_nexthop_label(struct bgp_path_info *pi,
bgp_mplsvpn_get_label_per_nexthop_cb);
}
- if (pi->label_nexthop_cache == blnc)
+ if (pi->mplsvpn.blnc.label_nexthop_cache == blnc)
/* no change */
return blnc->label;
@@ -1466,9 +1470,10 @@ _vpn_leak_from_vrf_get_per_nexthop_label(struct bgp_path_info *pi,
bgp_mplsvpn_path_nh_label_unlink(pi);
/* updates NHT pi list reference */
- LIST_INSERT_HEAD(&(blnc->paths), pi, label_nh_thread);
- pi->label_nexthop_cache = blnc;
- pi->label_nexthop_cache->path_count++;
+ LIST_INSERT_HEAD(&(blnc->paths), pi, mplsvpn.blnc.label_nh_thread);
+ pi->mplsvpn.blnc.label_nexthop_cache = blnc;
+ pi->mplsvpn.blnc.label_nexthop_cache->path_count++;
+ SET_FLAG(pi->flags, BGP_PATH_MPLSVPN_LABEL_NH);
blnc->last_update = monotime(NULL);
/* then add or update the selected nexthop */