mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 11:18:43 +00:00
zebra: evpn l3vni map to vrf nb changes
The set of northbound changes for l3vni configuration command under vrf. vrf x vni 1000 prefix-routes-only { "frr-vrf:lib": { "vrf": [ { "name": "vrf1", "frr-zebra:zebra": { "l3vni-id": 4001 } }, { "name": "vrf2", "frr-zebra:zebra": { "l3vni-id": 4002, "prefix-only": true } } ] } } Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
This commit is contained in:
parent
ee4b89c784
commit
e2bcfa3946
@ -91,27 +91,6 @@ const struct frr_yang_module_info frr_zebra_info = {
|
|||||||
.modify = zebra_dplane_queue_limit_modify,
|
.modify = zebra_dplane_queue_limit_modify,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.xpath = "/frr-zebra:zebra/vrf-vni-mapping",
|
|
||||||
.cbs = {
|
|
||||||
.create = zebra_vrf_vni_mapping_create,
|
|
||||||
.destroy = zebra_vrf_vni_mapping_destroy,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.xpath = "/frr-zebra:zebra/vrf-vni-mapping/vni-id",
|
|
||||||
.cbs = {
|
|
||||||
.modify = zebra_vrf_vni_mapping_vni_id_modify,
|
|
||||||
.destroy = zebra_vrf_vni_mapping_vni_id_destroy,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.xpath = "/frr-zebra:zebra/vrf-vni-mapping/prefix-only",
|
|
||||||
.cbs = {
|
|
||||||
.create = zebra_vrf_vni_mapping_prefix_only_create,
|
|
||||||
.destroy = zebra_vrf_vni_mapping_prefix_only_destroy,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.xpath = "/frr-zebra:zebra/debugs/debug-events",
|
.xpath = "/frr-zebra:zebra/debugs/debug-events",
|
||||||
.cbs = {
|
.cbs = {
|
||||||
@ -635,6 +614,19 @@ const struct frr_yang_module_info frr_zebra_info = {
|
|||||||
.get_elem = lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem,
|
.get_elem = lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id",
|
||||||
|
.cbs = {
|
||||||
|
.modify = lib_vrf_zebra_l3vni_id_modify,
|
||||||
|
.destroy = lib_vrf_zebra_l3vni_id_destroy,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/prefix-only",
|
||||||
|
.cbs = {
|
||||||
|
.modify = lib_vrf_zebra_prefix_only_modify,
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.xpath = "/frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv4-prefix-length",
|
.xpath = "/frr-route-map:lib/route-map/entry/match-condition/frr-zebra:ipv4-prefix-length",
|
||||||
.cbs = {
|
.cbs = {
|
||||||
|
@ -57,12 +57,6 @@ int zebra_import_kernel_table_route_map_destroy(
|
|||||||
int zebra_allow_external_route_update_create(struct nb_cb_create_args *args);
|
int zebra_allow_external_route_update_create(struct nb_cb_create_args *args);
|
||||||
int zebra_allow_external_route_update_destroy(struct nb_cb_destroy_args *args);
|
int zebra_allow_external_route_update_destroy(struct nb_cb_destroy_args *args);
|
||||||
int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args *args);
|
int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args *args);
|
||||||
int zebra_vrf_vni_mapping_create(struct nb_cb_create_args *args);
|
|
||||||
int zebra_vrf_vni_mapping_destroy(struct nb_cb_destroy_args *args);
|
|
||||||
int zebra_vrf_vni_mapping_vni_id_modify(struct nb_cb_modify_args *args);
|
|
||||||
int zebra_vrf_vni_mapping_vni_id_destroy(struct nb_cb_destroy_args *args);
|
|
||||||
int zebra_vrf_vni_mapping_prefix_only_create(struct nb_cb_create_args *args);
|
|
||||||
int zebra_vrf_vni_mapping_prefix_only_destroy(struct nb_cb_destroy_args *args);
|
|
||||||
int zebra_debugs_debug_events_modify(struct nb_cb_modify_args *args);
|
int zebra_debugs_debug_events_modify(struct nb_cb_modify_args *args);
|
||||||
int zebra_debugs_debug_events_destroy(struct nb_cb_destroy_args *args);
|
int zebra_debugs_debug_events_destroy(struct nb_cb_destroy_args *args);
|
||||||
int zebra_debugs_debug_zapi_send_modify(struct nb_cb_modify_args *args);
|
int zebra_debugs_debug_zapi_send_modify(struct nb_cb_modify_args *args);
|
||||||
@ -316,6 +310,9 @@ lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_fib_get_elem(
|
|||||||
struct yang_data *
|
struct yang_data *
|
||||||
lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem(
|
lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem(
|
||||||
struct nb_cb_get_elem_args *args);
|
struct nb_cb_get_elem_args *args);
|
||||||
|
int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args *args);
|
||||||
|
int lib_vrf_zebra_l3vni_id_destroy(struct nb_cb_destroy_args *args);
|
||||||
|
int lib_vrf_zebra_prefix_only_modify(struct nb_cb_modify_args *args);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
#include "zebra/connected.h"
|
#include "zebra/connected.h"
|
||||||
#include "zebra/zebra_router.h"
|
#include "zebra/zebra_router.h"
|
||||||
#include "zebra/debug.h"
|
#include "zebra/debug.h"
|
||||||
|
#include "zebra/zebra_vxlan_private.h"
|
||||||
|
#include "zebra/zebra_vxlan.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-zebra:zebra/mcast-rpf-lookup
|
* XPath: /frr-zebra:zebra/mcast-rpf-lookup
|
||||||
@ -272,99 +274,6 @@ int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args *args)
|
|||||||
return NB_OK;
|
return NB_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* XPath: /frr-zebra:zebra/vrf-vni-mapping
|
|
||||||
*/
|
|
||||||
int zebra_vrf_vni_mapping_create(struct nb_cb_create_args *args)
|
|
||||||
{
|
|
||||||
switch (args->event) {
|
|
||||||
case NB_EV_VALIDATE:
|
|
||||||
case NB_EV_PREPARE:
|
|
||||||
case NB_EV_ABORT:
|
|
||||||
case NB_EV_APPLY:
|
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NB_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int zebra_vrf_vni_mapping_destroy(struct nb_cb_destroy_args *args)
|
|
||||||
{
|
|
||||||
switch (args->event) {
|
|
||||||
case NB_EV_VALIDATE:
|
|
||||||
case NB_EV_PREPARE:
|
|
||||||
case NB_EV_ABORT:
|
|
||||||
case NB_EV_APPLY:
|
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NB_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XPath: /frr-zebra:zebra/vrf-vni-mapping/vni-id
|
|
||||||
*/
|
|
||||||
int zebra_vrf_vni_mapping_vni_id_modify(struct nb_cb_modify_args *args)
|
|
||||||
{
|
|
||||||
switch (args->event) {
|
|
||||||
case NB_EV_VALIDATE:
|
|
||||||
case NB_EV_PREPARE:
|
|
||||||
case NB_EV_ABORT:
|
|
||||||
case NB_EV_APPLY:
|
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NB_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int zebra_vrf_vni_mapping_vni_id_destroy(struct nb_cb_destroy_args *args)
|
|
||||||
{
|
|
||||||
switch (args->event) {
|
|
||||||
case NB_EV_VALIDATE:
|
|
||||||
case NB_EV_PREPARE:
|
|
||||||
case NB_EV_ABORT:
|
|
||||||
case NB_EV_APPLY:
|
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NB_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XPath: /frr-zebra:zebra/vrf-vni-mapping/prefix-only
|
|
||||||
*/
|
|
||||||
int zebra_vrf_vni_mapping_prefix_only_create(struct nb_cb_create_args *args)
|
|
||||||
{
|
|
||||||
switch (args->event) {
|
|
||||||
case NB_EV_VALIDATE:
|
|
||||||
case NB_EV_PREPARE:
|
|
||||||
case NB_EV_ABORT:
|
|
||||||
case NB_EV_APPLY:
|
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NB_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int zebra_vrf_vni_mapping_prefix_only_destroy(struct nb_cb_destroy_args *args)
|
|
||||||
{
|
|
||||||
switch (args->event) {
|
|
||||||
case NB_EV_VALIDATE:
|
|
||||||
case NB_EV_PREPARE:
|
|
||||||
case NB_EV_ABORT:
|
|
||||||
case NB_EV_APPLY:
|
|
||||||
/* TODO: implement me. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NB_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath: /frr-zebra:zebra/debugs/debug-events
|
* XPath: /frr-zebra:zebra/debugs/debug-events
|
||||||
*/
|
*/
|
||||||
@ -1277,6 +1186,150 @@ int lib_vrf_zebra_ribs_rib_destroy(struct nb_cb_destroy_args *args)
|
|||||||
return NB_OK;
|
return NB_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id
|
||||||
|
*/
|
||||||
|
int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args *args)
|
||||||
|
{
|
||||||
|
struct vrf *vrf;
|
||||||
|
struct zebra_vrf *zvrf;
|
||||||
|
vni_t vni = 0;
|
||||||
|
zebra_l3vni_t *zl3vni = NULL;
|
||||||
|
struct zebra_vrf *zvrf_evpn = NULL;
|
||||||
|
char err[ERR_STR_SZ];
|
||||||
|
bool pfx_only = false;
|
||||||
|
const struct lyd_node *pn_dnode;
|
||||||
|
const char *vrfname;
|
||||||
|
|
||||||
|
switch (args->event) {
|
||||||
|
case NB_EV_PREPARE:
|
||||||
|
case NB_EV_ABORT:
|
||||||
|
break;
|
||||||
|
case NB_EV_VALIDATE:
|
||||||
|
zvrf_evpn = zebra_vrf_get_evpn();
|
||||||
|
if (!zvrf_evpn)
|
||||||
|
return NB_ERR_VALIDATION;
|
||||||
|
|
||||||
|
vni = yang_dnode_get_uint32(args->dnode, NULL);
|
||||||
|
/* Get vrf info from parent node, reject configuration
|
||||||
|
* if zebra vrf already mapped to different vni id.
|
||||||
|
*/
|
||||||
|
pn_dnode = yang_dnode_get_parent(args->dnode, "vrf");
|
||||||
|
if (pn_dnode) {
|
||||||
|
vrfname = yang_dnode_get_string(pn_dnode, "./name");
|
||||||
|
vrf = vrf_lookup_by_name(vrfname);
|
||||||
|
zvrf = zebra_vrf_lookup_by_id(vrf->vrf_id);
|
||||||
|
if (zvrf->l3vni && zvrf->l3vni != vni) {
|
||||||
|
zlog_debug(
|
||||||
|
"vni %u cannot be configured as vni %u is already configured under the vrf",
|
||||||
|
vni, zvrf->l3vni);
|
||||||
|
return NB_ERR_VALIDATION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if this VNI is already present in the system */
|
||||||
|
zl3vni = zl3vni_lookup(vni);
|
||||||
|
if (zl3vni) {
|
||||||
|
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||||
|
zlog_debug(
|
||||||
|
"VNI %u is already configured as L3-VNI",
|
||||||
|
vni);
|
||||||
|
return NB_ERR_VALIDATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NB_EV_APPLY:
|
||||||
|
|
||||||
|
vrf = nb_running_get_entry(args->dnode, NULL, true);
|
||||||
|
zvrf = zebra_vrf_lookup_by_id(vrf->vrf_id);
|
||||||
|
vni = yang_dnode_get_uint32(args->dnode, NULL);
|
||||||
|
/* Note: This covers lib_vrf_zebra_prefix_only_modify() config
|
||||||
|
* along with l3vni config
|
||||||
|
*/
|
||||||
|
pfx_only = yang_dnode_get_bool(args->dnode, "../prefix-only");
|
||||||
|
|
||||||
|
if (zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ,
|
||||||
|
pfx_only ? 1 : 0, 1)
|
||||||
|
!= 0) {
|
||||||
|
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||||
|
zlog_debug(
|
||||||
|
"vrf vni %u mapping failed with error: %s",
|
||||||
|
vni, err);
|
||||||
|
return NB_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mark as having FRR configuration */
|
||||||
|
vrf_set_user_cfged(vrf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lib_vrf_zebra_l3vni_id_destroy(struct nb_cb_destroy_args *args)
|
||||||
|
{
|
||||||
|
struct vrf *vrf;
|
||||||
|
struct zebra_vrf *zvrf;
|
||||||
|
vni_t vni = 0;
|
||||||
|
char err[ERR_STR_SZ];
|
||||||
|
uint8_t filter = 0;
|
||||||
|
|
||||||
|
switch (args->event) {
|
||||||
|
case NB_EV_PREPARE:
|
||||||
|
case NB_EV_ABORT:
|
||||||
|
case NB_EV_VALIDATE:
|
||||||
|
break;
|
||||||
|
case NB_EV_APPLY:
|
||||||
|
vrf = nb_running_get_entry(args->dnode, NULL, true);
|
||||||
|
zvrf = zebra_vrf_lookup_by_id(vrf->vrf_id);
|
||||||
|
vni = yang_dnode_get_uint32(args->dnode, NULL);
|
||||||
|
|
||||||
|
if (!zl3vni_lookup(vni))
|
||||||
|
return NB_OK;
|
||||||
|
|
||||||
|
if (zvrf->l3vni != vni)
|
||||||
|
return NB_ERR;
|
||||||
|
|
||||||
|
if (is_l3vni_for_prefix_routes_only(zvrf->l3vni))
|
||||||
|
filter = 1;
|
||||||
|
|
||||||
|
if (zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ,
|
||||||
|
filter, 0)
|
||||||
|
!= 0) {
|
||||||
|
if (IS_ZEBRA_DEBUG_VXLAN)
|
||||||
|
zlog_debug(
|
||||||
|
"vrf vni %u unmapping failed with error: %s",
|
||||||
|
vni, err);
|
||||||
|
return NB_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If no other FRR config for this VRF, mark accordingly. */
|
||||||
|
if (!zebra_vrf_has_config(zvrf))
|
||||||
|
vrf_reset_user_cfged(vrf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XPath: /frr-vrf:lib/vrf/frr-zebra:zebra/prefix-only
|
||||||
|
*/
|
||||||
|
int lib_vrf_zebra_prefix_only_modify(struct nb_cb_modify_args *args)
|
||||||
|
{
|
||||||
|
switch (args->event) {
|
||||||
|
case NB_EV_VALIDATE:
|
||||||
|
case NB_EV_PREPARE:
|
||||||
|
case NB_EV_ABORT:
|
||||||
|
case NB_EV_APPLY:
|
||||||
|
/* TODO: implement me. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NB_OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XPath:
|
* XPath:
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#include "zebra/zebra_nhg.h"
|
#include "zebra/zebra_nhg.h"
|
||||||
#include "zebra/interface.h"
|
#include "zebra/interface.h"
|
||||||
#include "northbound_cli.h"
|
#include "northbound_cli.h"
|
||||||
|
#include "zebra/zebra_nb.h"
|
||||||
|
|
||||||
extern int allow_delete;
|
extern int allow_delete;
|
||||||
|
|
||||||
@ -2304,12 +2305,9 @@ DEFUN (vrf_vni_mapping,
|
|||||||
"VNI-ID\n"
|
"VNI-ID\n"
|
||||||
"prefix-routes-only\n")
|
"prefix-routes-only\n")
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
int filter = 0;
|
int filter = 0;
|
||||||
|
|
||||||
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf);
|
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf);
|
||||||
vni_t vni = strtoul(argv[1]->arg, NULL, 10);
|
|
||||||
char err[ERR_STR_SZ];
|
|
||||||
|
|
||||||
assert(vrf);
|
assert(vrf);
|
||||||
assert(zvrf);
|
assert(zvrf);
|
||||||
@ -2317,14 +2315,15 @@ DEFUN (vrf_vni_mapping,
|
|||||||
if (argc == 3)
|
if (argc == 3)
|
||||||
filter = 1;
|
filter = 1;
|
||||||
|
|
||||||
/* Mark as having FRR configuration */
|
nb_cli_enqueue_change(vty, "./frr-zebra:zebra", NB_OP_CREATE, NULL);
|
||||||
vrf_set_user_cfged(vrf);
|
nb_cli_enqueue_change(vty, "./frr-zebra:zebra/l3vni-id", NB_OP_MODIFY,
|
||||||
ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err, ERR_STR_SZ,
|
argv[1]->arg);
|
||||||
filter, 1);
|
|
||||||
if (ret != 0) {
|
if (filter)
|
||||||
vty_out(vty, "%s\n", err);
|
nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only",
|
||||||
return CMD_WARNING;
|
NB_OP_MODIFY, "true");
|
||||||
}
|
|
||||||
|
nb_cli_apply_changes(vty, NULL);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2337,12 +2336,10 @@ DEFUN (no_vrf_vni_mapping,
|
|||||||
"VNI-ID\n"
|
"VNI-ID\n"
|
||||||
"prefix-routes-only\n")
|
"prefix-routes-only\n")
|
||||||
{
|
{
|
||||||
int ret = 0;
|
|
||||||
int filter = 0;
|
int filter = 0;
|
||||||
char err[ERR_STR_SZ];
|
|
||||||
vni_t vni = strtoul(argv[2]->arg, NULL, 10);
|
|
||||||
|
|
||||||
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf);
|
ZEBRA_DECLVAR_CONTEXT(vrf, zvrf);
|
||||||
|
vni_t vni = strtoul(argv[1]->arg, NULL, 10);
|
||||||
|
|
||||||
assert(vrf);
|
assert(vrf);
|
||||||
assert(zvrf);
|
assert(zvrf);
|
||||||
@ -2350,16 +2347,22 @@ DEFUN (no_vrf_vni_mapping,
|
|||||||
if (argc == 4)
|
if (argc == 4)
|
||||||
filter = 1;
|
filter = 1;
|
||||||
|
|
||||||
ret = zebra_vxlan_process_vrf_vni_cmd(zvrf, vni, err,
|
if (zvrf->l3vni != vni) {
|
||||||
ERR_STR_SZ, filter, 0);
|
vty_out(vty, "VNI %d doesn't exist in VRF: %s \n", vni,
|
||||||
if (ret != 0) {
|
zvrf->vrf->name);
|
||||||
vty_out(vty, "%s\n", err);
|
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no other FRR config for this VRF, mark accordingly. */
|
nb_cli_enqueue_change(vty, "./frr-zebra:zebra/l3vni-id", NB_OP_DESTROY,
|
||||||
if (!zebra_vrf_has_config(zvrf))
|
argv[2]->arg);
|
||||||
vrf_reset_user_cfged(vrf);
|
|
||||||
|
if (filter)
|
||||||
|
nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only",
|
||||||
|
NB_OP_DESTROY, "true");
|
||||||
|
|
||||||
|
nb_cli_enqueue_change(vty, "./frr-zebra:zebra", NB_OP_DESTROY, NULL);
|
||||||
|
|
||||||
|
nb_cli_apply_changes(vty, NULL);
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,6 @@ static int zl3vni_rmac_install(zebra_l3vni_t *zl3vni, zebra_mac_t *zrmac);
|
|||||||
static int zl3vni_rmac_uninstall(zebra_l3vni_t *zl3vni, zebra_mac_t *zrmac);
|
static int zl3vni_rmac_uninstall(zebra_l3vni_t *zl3vni, zebra_mac_t *zrmac);
|
||||||
|
|
||||||
/* l3-vni related APIs*/
|
/* l3-vni related APIs*/
|
||||||
static zebra_l3vni_t *zl3vni_lookup(vni_t vni);
|
|
||||||
static void *zl3vni_alloc(void *p);
|
static void *zl3vni_alloc(void *p);
|
||||||
static zebra_l3vni_t *zl3vni_add(vni_t vni, vrf_id_t vrf_id);
|
static zebra_l3vni_t *zl3vni_add(vni_t vni, vrf_id_t vrf_id);
|
||||||
static int zl3vni_del(zebra_l3vni_t *zl3vni);
|
static int zl3vni_del(zebra_l3vni_t *zl3vni);
|
||||||
@ -5110,7 +5109,7 @@ static void *zl3vni_alloc(void *p)
|
|||||||
/*
|
/*
|
||||||
* Look up L3 VNI hash entry.
|
* Look up L3 VNI hash entry.
|
||||||
*/
|
*/
|
||||||
static zebra_l3vni_t *zl3vni_lookup(vni_t vni)
|
zebra_l3vni_t *zl3vni_lookup(vni_t vni)
|
||||||
{
|
{
|
||||||
zebra_l3vni_t tmp_l3vni;
|
zebra_l3vni_t tmp_l3vni;
|
||||||
zebra_l3vni_t *zl3vni = NULL;
|
zebra_l3vni_t *zl3vni = NULL;
|
||||||
|
@ -476,6 +476,7 @@ extern zebra_l3vni_t *zl3vni_from_vrf(vrf_id_t vrf_id);
|
|||||||
extern struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni);
|
extern struct interface *zl3vni_map_to_vxlan_if(zebra_l3vni_t *zl3vni);
|
||||||
extern struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni);
|
extern struct interface *zl3vni_map_to_svi_if(zebra_l3vni_t *zl3vni);
|
||||||
extern struct interface *zl3vni_map_to_mac_vlan_if(zebra_l3vni_t *zl3vni);
|
extern struct interface *zl3vni_map_to_mac_vlan_if(zebra_l3vni_t *zl3vni);
|
||||||
|
extern zebra_l3vni_t *zl3vni_lookup(vni_t vni);
|
||||||
|
|
||||||
DECLARE_HOOK(zebra_rmac_update, (zebra_mac_t *rmac, zebra_l3vni_t *zl3vni,
|
DECLARE_HOOK(zebra_rmac_update, (zebra_mac_t *rmac, zebra_l3vni_t *zl3vni,
|
||||||
bool delete, const char *reason), (rmac, zl3vni, delete, reason))
|
bool delete, const char *reason), (rmac, zl3vni, delete, reason))
|
||||||
|
Loading…
Reference in New Issue
Block a user