afi_t afi)
{
int debug = BGP_DEBUG(vpn, VPN_LEAK_FROM_VRF);
- struct srv6_locator_chunk *tovpn_sid_locator;
+ struct srv6_locator *tovpn_sid_locator;
struct in6_addr *tovpn_sid;
uint32_t tovpn_sid_index = 0, tovpn_sid_transpose_label;
bool tovpn_sid_auto = false;
/*
* skip when bgp vpn instance ins't allocated
- * or srv6 locator chunk isn't allocated
+ * or srv6 locator isn't allocated
*/
- if (!bgp_vpn || !bgp_vpn->srv6_locator_chunks)
+ if (!bgp_vpn || !bgp_vpn->srv6_locator)
return;
tovpn_sid_index = bgp_vrf->vpn_policy[afi].tovpn_sid_index;
return;
}
- tovpn_sid_locator = srv6_locator_chunk_alloc();
+ tovpn_sid_locator = srv6_locator_alloc(bgp_vpn->srv6_locator_name);
+ srv6_locator_copy(tovpn_sid_locator, bgp_vpn->srv6_locator);
+
tovpn_sid = XCALLOC(MTYPE_BGP_SRV6_SID, sizeof(struct in6_addr));
tovpn_sid_transpose_label = alloc_new_sid(bgp_vpn, tovpn_sid_index,
zlog_debug(
"%s: not allocated new sid for vrf %s: afi %s",
__func__, bgp_vrf->name_pretty, afi2str(afi));
- srv6_locator_chunk_free(&tovpn_sid_locator);
+ srv6_locator_free(tovpn_sid_locator);
XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid);
return;
}
void ensure_vrf_tovpn_sid_per_vrf(struct bgp *bgp_vpn, struct bgp *bgp_vrf)
{
int debug = BGP_DEBUG(vpn, VPN_LEAK_FROM_VRF);
- struct srv6_locator_chunk *tovpn_sid_locator;
+ struct srv6_locator *tovpn_sid_locator;
struct in6_addr *tovpn_sid;
uint32_t tovpn_sid_index = 0, tovpn_sid_transpose_label;
bool tovpn_sid_auto = false;
/*
* skip when bgp vpn instance ins't allocated
- * or srv6 locator chunk isn't allocated
+ * or srv6 locator isn't allocated
*/
- if (!bgp_vpn || !bgp_vpn->srv6_locator_chunks)
+ if (!bgp_vpn || !bgp_vpn->srv6_locator)
return;
tovpn_sid_index = bgp_vrf->tovpn_sid_index;
return;
}
- tovpn_sid_locator = srv6_locator_chunk_alloc();
+ tovpn_sid_locator = srv6_locator_alloc(bgp_vpn->srv6_locator_name);
+ srv6_locator_copy(tovpn_sid_locator, bgp_vpn->srv6_locator);
+
tovpn_sid = XCALLOC(MTYPE_BGP_SRV6_SID, sizeof(struct in6_addr));
tovpn_sid_transpose_label = alloc_new_sid(bgp_vpn, tovpn_sid_index,
if (debug)
zlog_debug("%s: not allocated new sid for vrf %s",
__func__, bgp_vrf->name_pretty);
- srv6_locator_chunk_free(&tovpn_sid_locator);
+ srv6_locator_free(tovpn_sid_locator);
XFREE(MTYPE_BGP_SRV6_SID, tovpn_sid);
return;
}
if (tovpn_sid_index != 0 || tovpn_sid_auto)
return;
- srv6_locator_chunk_free(&bgp_vrf->vpn_policy[afi].tovpn_sid_locator);
+ srv6_locator_free(bgp_vrf->vpn_policy[afi].tovpn_sid_locator);
+ bgp_vrf->vpn_policy[afi].tovpn_sid_locator = NULL;
if (bgp_vrf->vpn_policy[afi].tovpn_sid) {
sid_unregister(bgp_vpn, bgp_vrf->vpn_policy[afi].tovpn_sid);
if (tovpn_sid_index != 0 || tovpn_sid_auto)
return;
- srv6_locator_chunk_free(&bgp_vrf->tovpn_sid_locator);
+ srv6_locator_free(bgp_vrf->tovpn_sid_locator);
+ bgp_vrf->tovpn_sid_locator = NULL;
if (bgp_vrf->tovpn_sid) {
sid_unregister(bgp_vpn, bgp_vrf->tovpn_sid);
/* Set SID for SRv6 VPN */
if (from_bgp->vpn_policy[afi].tovpn_sid_locator) {
- struct srv6_locator_chunk *locator =
+ struct srv6_locator *locator =
from_bgp->vpn_policy[afi].tovpn_sid_locator;
+
encode_label(
from_bgp->vpn_policy[afi].tovpn_sid_transpose_label,
&label);
.tovpn_sid_locator->prefix.prefix,
sizeof(struct in6_addr));
} else if (from_bgp->tovpn_sid_locator) {
- struct srv6_locator_chunk *locator =
- from_bgp->tovpn_sid_locator;
+ struct srv6_locator *locator = from_bgp->tovpn_sid_locator;
+
encode_label(from_bgp->tovpn_sid_transpose_label, &label);
static_attr.srv6_l3vpn =
XCALLOC(MTYPE_BGP_SRV6_L3VPN,
/* unset srv6 locator */
static int bgp_srv6_locator_unset(struct bgp *bgp)
{
- int ret;
struct listnode *node, *nnode;
struct srv6_locator_chunk *chunk;
struct bgp_srv6_function *func;
struct bgp *bgp_vrf;
- /* release chunk notification via ZAPI */
- ret = bgp_zebra_srv6_manager_release_locator_chunk(
- bgp->srv6_locator_name);
- if (ret < 0)
- return -1;
-
/* refresh chunks */
for (ALL_LIST_ELEMENTS(bgp->srv6_locator_chunks, node, nnode, chunk)) {
listnode_delete(bgp->srv6_locator_chunks, chunk);
continue;
/* refresh vpnv4 tovpn_sid_locator */
- srv6_locator_chunk_free(
- &bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator);
+ srv6_locator_free(bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator);
+ bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator = NULL;
/* refresh vpnv6 tovpn_sid_locator */
- srv6_locator_chunk_free(
- &bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator);
+ srv6_locator_free(
+ bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator);
+ bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator = NULL;
/* refresh per-vrf tovpn_sid_locator */
- srv6_locator_chunk_free(&bgp_vrf->tovpn_sid_locator);
+ srv6_locator_free(bgp_vrf->tovpn_sid_locator);
+ bgp_vrf->tovpn_sid_locator = NULL;
}
/* clear locator name */
memset(bgp->srv6_locator_name, 0, sizeof(bgp->srv6_locator_name));
+ /* clear SRv6 locator */
+ if (bgp->srv6_locator) {
+ srv6_locator_free(bgp->srv6_locator);
+ bgp->srv6_locator = NULL;
+ }
+
return 0;
}
snprintf(bgp->srv6_locator_name,
sizeof(bgp->srv6_locator_name), "%s", name);
- ret = bgp_zebra_srv6_manager_get_locator_chunk(name);
+ ret = bgp_zebra_srv6_manager_get_locator(name);
if (ret < 0)
return CMD_WARNING_CONFIG_FAILED;
return CMD_SUCCESS;
vty_out(vty, "locator_name: %s\n", bgp->srv6_locator_name);
+ if (bgp->srv6_locator) {
+ vty_out(vty, " prefix: %pFX\n", &bgp->srv6_locator->prefix);
+ vty_out(vty, " block-length: %d\n",
+ bgp->srv6_locator->block_bits_length);
+ vty_out(vty, " node-length: %d\n",
+ bgp->srv6_locator->node_bits_length);
+ vty_out(vty, " func-length: %d\n",
+ bgp->srv6_locator->function_bits_length);
+ vty_out(vty, " arg-length: %d\n",
+ bgp->srv6_locator->argument_bits_length);
+ }
vty_out(vty, "locator_chunks:\n");
for (ALL_LIST_ELEMENTS_RO(bgp->srv6_locator_chunks, node, chunk)) {
vty_out(vty, "- %pFX\n", &chunk->prefix);
struct srv6_locator loc = {};
struct bgp *bgp = bgp_get_default();
struct listnode *node, *nnode;
- struct srv6_locator_chunk *chunk, *tovpn_sid_locator;
+ struct srv6_locator_chunk *chunk;
+ struct srv6_locator *tovpn_sid_locator;
struct bgp_srv6_function *func;
struct bgp *bgp_vrf;
struct in6_addr *tovpn_sid;
if (zapi_srv6_locator_decode(zclient->ibuf, &loc) < 0)
return -1;
+ // clear SRv6 locator
+ if (bgp->srv6_locator) {
+ srv6_locator_free(bgp->srv6_locator);
+ bgp->srv6_locator = NULL;
+ }
+
// refresh chunks
for (ALL_LIST_ELEMENTS(bgp->srv6_locator_chunks, node, nnode, chunk))
if (prefix_match((struct prefix *)&loc.prefix,
tmp_prefi.prefixlen = IPV6_MAX_BITLEN;
tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix;
if (prefix_match((struct prefix *)&loc.prefix,
- (struct prefix *)&tmp_prefi))
- srv6_locator_chunk_free(
- &bgp_vrf->vpn_policy[AFI_IP]
- .tovpn_sid_locator);
+ (struct prefix *)&tmp_prefi)) {
+ srv6_locator_free(bgp_vrf->vpn_policy[AFI_IP]
+ .tovpn_sid_locator);
+ bgp_vrf->vpn_policy[AFI_IP].tovpn_sid_locator =
+ NULL;
+ }
}
/* refresh vpnv6 tovpn_sid_locator */
tmp_prefi.prefixlen = IPV6_MAX_BITLEN;
tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix;
if (prefix_match((struct prefix *)&loc.prefix,
- (struct prefix *)&tmp_prefi))
- srv6_locator_chunk_free(
- &bgp_vrf->vpn_policy[AFI_IP6]
- .tovpn_sid_locator);
+ (struct prefix *)&tmp_prefi)) {
+ srv6_locator_free(bgp_vrf->vpn_policy[AFI_IP6]
+ .tovpn_sid_locator);
+ bgp_vrf->vpn_policy[AFI_IP6].tovpn_sid_locator =
+ NULL;
+ }
}
/* refresh per-vrf tovpn_sid_locator */
tmp_prefi.prefixlen = IPV6_MAX_BITLEN;
tmp_prefi.prefix = tovpn_sid_locator->prefix.prefix;
if (prefix_match((struct prefix *)&loc.prefix,
- (struct prefix *)&tmp_prefi))
- srv6_locator_chunk_free(
- &bgp_vrf->tovpn_sid_locator);
+ (struct prefix *)&tmp_prefi)) {
+ srv6_locator_free(bgp_vrf->tovpn_sid_locator);
+ bgp_vrf->tovpn_sid_locator = NULL;
+ }
}
}
static void bgp_srv6_cleanup(struct bgp *bgp)
{
for (afi_t afi = AFI_IP; afi < AFI_MAX; afi++) {
- if (bgp->vpn_policy[afi].tovpn_sid_locator != NULL)
- srv6_locator_chunk_free(
- &bgp->vpn_policy[afi].tovpn_sid_locator);
+ if (bgp->vpn_policy[afi].tovpn_sid_locator != NULL) {
+ srv6_locator_free(
+ bgp->vpn_policy[afi].tovpn_sid_locator);
+ bgp->vpn_policy[afi].tovpn_sid_locator = NULL;
+ }
if (bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent != NULL)
XFREE(MTYPE_BGP_SRV6_SID,
bgp->vpn_policy[afi].tovpn_zebra_vrf_sid_last_sent);
}
}
- if (bgp->tovpn_sid_locator != NULL)
- srv6_locator_chunk_free(&bgp->tovpn_sid_locator);
+ if (bgp->tovpn_sid_locator != NULL) {
+ srv6_locator_free(bgp->tovpn_sid_locator);
+ bgp->tovpn_sid_locator = NULL;
+ }
if (bgp->tovpn_zebra_vrf_sid_last_sent != NULL)
XFREE(MTYPE_BGP_SRV6_SID, bgp->tovpn_zebra_vrf_sid_last_sent);
if (bgp->tovpn_sid != NULL) {
list_delete(&bgp->srv6_locator_chunks);
if (bgp->srv6_functions)
list_delete(&bgp->srv6_functions);
+
+ srv6_locator_free(bgp->srv6_locator);
+ bgp->srv6_locator = NULL;
}
/* Allocate new peer object, implicitely locked. */
*/
uint32_t tovpn_sid_index; /* unset => set to 0 */
struct in6_addr *tovpn_sid;
- struct srv6_locator_chunk *tovpn_sid_locator;
+ struct srv6_locator *tovpn_sid_locator;
uint32_t tovpn_sid_transpose_label;
struct in6_addr *tovpn_zebra_vrf_sid_last_sent;
};
/* BGP VPN SRv6 backend */
bool srv6_enabled;
char srv6_locator_name[SRV6_LOCNAME_SIZE];
+ struct srv6_locator *srv6_locator;
struct list *srv6_locator_chunks;
struct list *srv6_functions;
uint32_t tovpn_sid_index; /* unset => set to 0 */
struct in6_addr *tovpn_sid;
- struct srv6_locator_chunk *tovpn_sid_locator;
+ struct srv6_locator *tovpn_sid_locator;
uint32_t tovpn_sid_transpose_label;
struct in6_addr *tovpn_zebra_vrf_sid_last_sent;