From ddaf2a7e9b1a352706234f57037a1b98ccef8d0a Mon Sep 17 00:00:00 2001 From: Carmine Scarpitta Date: Sun, 15 Sep 2024 17:23:34 +0200 Subject: [PATCH 1/5] lib: Include SID structure in seg6local nexthop Include SID structure information in seg6local nexthop data structure. Signed-off-by: Carmine Scarpitta --- lib/srv6.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/srv6.h b/lib/srv6.h index 433c5c14fd..b5ae3890aa 100644 --- a/lib/srv6.h +++ b/lib/srv6.h @@ -104,6 +104,10 @@ struct seg6local_context { struct in6_addr nh6; uint32_t table; struct seg6local_flavors_info flv; + uint8_t block_len; + uint8_t node_len; + uint8_t function_len; + uint8_t argument_len; }; struct srv6_locator { From 7669e2784d977b908261c97f1b43812172d7b10e Mon Sep 17 00:00:00 2001 From: Carmine Scarpitta Date: Sun, 15 Sep 2024 18:53:35 +0200 Subject: [PATCH 2/5] bgpd: Include structure when installing End.DT4/6 SID Include SID structure information when installing an SRv6 End.DT6 or End.DT4 SID in the forwarding plane. Signed-off-by: Carmine Scarpitta --- bgpd/bgp_mplsvpn.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index e8951bafb6..b428e8b076 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -381,6 +381,12 @@ void vpn_leak_zebra_vrf_sid_update_per_af(struct bgp *bgp, afi_t afi) if (!vrf) return; + if (bgp->vpn_policy[afi].tovpn_sid_locator) { + ctx.block_len = bgp->vpn_policy[afi].tovpn_sid_locator->block_bits_length; + ctx.node_len = bgp->vpn_policy[afi].tovpn_sid_locator->node_bits_length; + ctx.function_len = bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length; + ctx.argument_len = bgp->vpn_policy[afi].tovpn_sid_locator->argument_bits_length; + } ctx.table = vrf->data.l.table_id; act = afi == AFI_IP ? ZEBRA_SEG6_LOCAL_ACTION_END_DT4 : ZEBRA_SEG6_LOCAL_ACTION_END_DT6; From f1c9c38d58d48d36b005f60ff4d7a51c44f151e6 Mon Sep 17 00:00:00 2001 From: Carmine Scarpitta Date: Sun, 15 Sep 2024 18:54:55 +0200 Subject: [PATCH 3/5] bgpd: Include structure when installing End.DT46 SID Include SID structure information when installing an SRv6 End.DT46 SID in the forwarding plane. Signed-off-by: Carmine Scarpitta --- bgpd/bgp_mplsvpn.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index b428e8b076..92d1d135f6 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -438,6 +438,12 @@ void vpn_leak_zebra_vrf_sid_update_per_vrf(struct bgp *bgp) if (!vrf) return; + if (bgp->tovpn_sid_locator) { + ctx.block_len = bgp->tovpn_sid_locator->block_bits_length; + ctx.node_len = bgp->tovpn_sid_locator->node_bits_length; + ctx.function_len = bgp->tovpn_sid_locator->function_bits_length; + ctx.argument_len = bgp->tovpn_sid_locator->argument_bits_length; + } ctx.table = vrf->data.l.table_id; act = ZEBRA_SEG6_LOCAL_ACTION_END_DT46; zclient_send_localsid(zclient, tovpn_sid, bgp->vrf_id, act, &ctx); From 29caedcda681bf8a897057a4a63acb01ae1799a7 Mon Sep 17 00:00:00 2001 From: Carmine Scarpitta Date: Sun, 15 Sep 2024 18:56:21 +0200 Subject: [PATCH 4/5] bgpd: Include structure when removing End.DT4/6 SID Include SID structure information when removing an SRv6 End.DT4 or End.DT6 SID from the forwarding plane. Signed-off-by: Carmine Scarpitta --- bgpd/bgp_mplsvpn.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 92d1d135f6..7b6811a1a1 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -482,6 +482,7 @@ void vpn_leak_zebra_vrf_sid_update(struct bgp *bgp, afi_t afi) void vpn_leak_zebra_vrf_sid_withdraw_per_af(struct bgp *bgp, afi_t afi) { int debug = BGP_DEBUG(vpn, VPN_LEAK_LABEL); + struct seg6local_context seg6localctx = {}; if (bgp->vrf_id == VRF_UNKNOWN) { if (debug) @@ -494,9 +495,16 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_af(struct bgp *bgp, afi_t afi) zlog_debug("%s: deleting sid for vrf %s afi (id=%d)", __func__, bgp->name_pretty, bgp->vrf_id); - zclient_send_localsid(zclient, - bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent, - bgp->vrf_id, ZEBRA_SEG6_LOCAL_ACTION_UNSPEC, NULL); + if (bgp->vpn_policy[afi].tovpn_sid_locator) { + seg6localctx.block_len = bgp->vpn_policy[afi].tovpn_sid_locator->block_bits_length; + seg6localctx.node_len = bgp->vpn_policy[afi].tovpn_sid_locator->node_bits_length; + seg6localctx.function_len = + bgp->vpn_policy[afi].tovpn_sid_locator->function_bits_length; + seg6localctx.argument_len = + bgp->vpn_policy[afi].tovpn_sid_locator->argument_bits_length; + } + zclient_send_localsid(zclient, bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent, + bgp->vrf_id, ZEBRA_SEG6_LOCAL_ACTION_UNSPEC, &seg6localctx); XFREE(MTYPE_BGP_SRV6_SID, bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent); bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent = NULL; From 88320c88e5a6bd60b998767b9bd7f83b51fce0fa Mon Sep 17 00:00:00 2001 From: Carmine Scarpitta Date: Sun, 15 Sep 2024 18:56:48 +0200 Subject: [PATCH 5/5] bgpd: Include structure when removing End.DT46 SID Include SID structure information when removing an SRv6 End.DT46 SID from the forwarding plane. Signed-off-by: Carmine Scarpitta --- bgpd/bgp_mplsvpn.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/bgpd/bgp_mplsvpn.c b/bgpd/bgp_mplsvpn.c index 7b6811a1a1..bd95e16901 100644 --- a/bgpd/bgp_mplsvpn.c +++ b/bgpd/bgp_mplsvpn.c @@ -517,6 +517,7 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_af(struct bgp *bgp, afi_t afi) void vpn_leak_zebra_vrf_sid_withdraw_per_vrf(struct bgp *bgp) { int debug = BGP_DEBUG(vpn, VPN_LEAK_LABEL); + struct seg6local_context seg6localctx = {}; if (bgp->vrf_id == VRF_UNKNOWN) { if (debug) @@ -530,9 +531,14 @@ void vpn_leak_zebra_vrf_sid_withdraw_per_vrf(struct bgp *bgp) zlog_debug("%s: deleting sid for vrf %s (id=%d)", __func__, bgp->name_pretty, bgp->vrf_id); - zclient_send_localsid(zclient, bgp->tovpn_zebra_vrf_sid_last_sent, - bgp->vrf_id, ZEBRA_SEG6_LOCAL_ACTION_UNSPEC, - NULL); + if (bgp->tovpn_sid_locator) { + seg6localctx.block_len = bgp->tovpn_sid_locator->block_bits_length; + seg6localctx.node_len = bgp->tovpn_sid_locator->node_bits_length; + seg6localctx.function_len = bgp->tovpn_sid_locator->function_bits_length; + seg6localctx.argument_len = bgp->tovpn_sid_locator->argument_bits_length; + } + zclient_send_localsid(zclient, bgp->tovpn_zebra_vrf_sid_last_sent, bgp->vrf_id, + ZEBRA_SEG6_LOCAL_ACTION_UNSPEC, &seg6localctx); XFREE(MTYPE_BGP_SRV6_SID, bgp->tovpn_zebra_vrf_sid_last_sent); bgp->tovpn_zebra_vrf_sid_last_sent = NULL; }