bgpd: rfapi - open rfd for vrf groups on export config,

keep open until group deleted

Signed-off-by: Lou Berger <lberger@labn.net>
This commit is contained in:
Lou Berger 2017-10-29 22:43:19 -04:00
parent 02a82b47b3
commit 9d6a46aa1e
4 changed files with 44 additions and 38 deletions

View File

@ -1459,9 +1459,11 @@ DEFUN (vnc_export_nvegroup,
rfg_new = bgp_rfapi_cfg_match_byname(bgp, argv[5]->arg, rfg_new = bgp_rfapi_cfg_match_byname(bgp, argv[5]->arg,
RFAPI_GROUP_CFG_NVE); RFAPI_GROUP_CFG_NVE);
if (rfg_new == NULL) if (rfg_new == NULL) {
rfg_new = bgp_rfapi_cfg_match_byname(bgp, argv[5]->arg, rfg_new = bgp_rfapi_cfg_match_byname(bgp, argv[5]->arg,
RFAPI_GROUP_CFG_VRF); RFAPI_GROUP_CFG_VRF);
vnc_add_vrf_opener(bgp, rfg_new);
}
if (rfg_new == NULL) { if (rfg_new == NULL) {
vty_out(vty, "Can't group named \"%s\".\n", argv[5]->arg); vty_out(vty, "Can't group named \"%s\".\n", argv[5]->arg);
@ -2432,8 +2434,7 @@ bgp_rfapi_delete_named_nve_group(struct vty *vty, /* NULL = no output */
*/ */
for (ALL_LIST_ELEMENTS_RO(bgp->rfapi_cfg->rfg_export_direct_bgp_l, node, for (ALL_LIST_ELEMENTS_RO(bgp->rfapi_cfg->rfg_export_direct_bgp_l, node,
rfgn)) { rfgn)) {
if (rfg_name == NULL || (type == RFAPI_GROUP_CFG_NVE if (rfgn->rfg == rfg) {
&& !strcmp(rfgn->name, rfg_name))) {
rfgn->rfg = NULL; rfgn->rfg = NULL;
/* remove exported routes from this group */ /* remove exported routes from this group */
vnc_direct_bgp_del_group(bgp, rfg); vnc_direct_bgp_del_group(bgp, rfg);
@ -2446,21 +2447,25 @@ bgp_rfapi_delete_named_nve_group(struct vty *vty, /* NULL = no output */
*/ */
for (ALL_LIST_ELEMENTS_RO(bgp->rfapi_cfg->rfg_export_zebra_l, node, for (ALL_LIST_ELEMENTS_RO(bgp->rfapi_cfg->rfg_export_zebra_l, node,
rfgn)) { rfgn)) {
if (rfgn->rfg == rfg) {
if (rfg_name == NULL || (type == RFAPI_GROUP_CFG_NVE
&& !strcmp(rfgn->name, rfg_name))) {
rfgn->rfg = NULL; rfgn->rfg = NULL;
/* remove exported routes from this group */ /* remove exported routes from this group */
vnc_zebra_del_group(bgp, rfg); vnc_zebra_del_group(bgp, rfg);
break; break;
} }
} }
if (rfg) if (rfg) {
if (rfg->rfd)
clear_vnc_vrf_closer(rfg);
bgp_rfapi_delete_nve_group(vty, bgp, rfg); bgp_rfapi_delete_nve_group(vty, bgp, rfg);
}
else /* must be delete all */ else /* must be delete all */
for (ALL_LIST_ELEMENTS(bgp->rfapi_cfg->nve_groups_sequential, for (ALL_LIST_ELEMENTS(bgp->rfapi_cfg->nve_groups_sequential,
node, nnode, rfg)) node, nnode, rfg)) {
if (rfg->rfd)
clear_vnc_vrf_closer(rfg);
bgp_rfapi_delete_nve_group(vty, bgp, rfg); bgp_rfapi_delete_nve_group(vty, bgp, rfg);
}
return CMD_SUCCESS; return CMD_SUCCESS;
} }

View File

@ -345,6 +345,7 @@ extern void rfapi_un_options_free(struct rfapi_un_option *goner);
extern void rfapi_vn_options_free(struct rfapi_vn_option *goner); extern void rfapi_vn_options_free(struct rfapi_vn_option *goner);
extern void vnc_add_vrf_opener(struct bgp *bgp, struct rfapi_nve_group_cfg *rfg);
extern void clear_vnc_vrf_closer(struct rfapi_nve_group_cfg *rfg); extern void clear_vnc_vrf_closer(struct rfapi_nve_group_cfg *rfg);
/*------------------------------------------ /*------------------------------------------
* rfapi_extract_l2o * rfapi_extract_l2o

View File

@ -4632,6 +4632,35 @@ notcfg:
* add [vrf <vrf-name>] prefix <prefix> * add [vrf <vrf-name>] prefix <prefix>
* [rd <value>] [label <value>] [local-preference <0-4294967295>] * [rd <value>] [label <value>] [local-preference <0-4294967295>]
************************************************************************/ ************************************************************************/
void vnc_add_vrf_opener(struct bgp *bgp, struct rfapi_nve_group_cfg *rfg)
{
if (rfg->rfd == NULL) /* need new rfapi_handle */
{
/* based on rfapi_open */
struct rfapi_descriptor *rfd;
rfd = XCALLOC(MTYPE_RFAPI_DESC,
sizeof(struct rfapi_descriptor));
rfd->bgp = bgp;
rfg->rfd = rfd;
/* leave most fields empty as will get from (dynamic) config
* when needed */
rfd->default_tunneltype_option.type = BGP_ENCAP_TYPE_MPLS;
rfd->cookie = rfg;
if (rfg->vn_prefix.family
&& !CHECK_FLAG(rfg->flags, RFAPI_RFG_VPN_NH_SELF)) {
rfapiQprefix2Raddr(&rfg->vn_prefix, &rfd->vn_addr);
} else {
memset(&rfd->vn_addr, 0, sizeof(struct rfapi_ip_addr));
rfd->vn_addr.addr_family = AF_INET;
rfd->vn_addr.addr.v4 = bgp->router_id;
}
rfd->un_addr = rfd->vn_addr; /* sigh, need something in UN for
lookups */
vnc_zlog_debug_verbose("%s: Opening RFD for VRF %s", __func__,
rfg->name);
rfapi_init_and_open(bgp, rfd, rfg);
}
}
/* NOTE: this functions parallels vnc_direct_add_rn_group_rd */ /* NOTE: this functions parallels vnc_direct_add_rn_group_rd */
static int vnc_add_vrf_prefix(struct vty *vty, const char *arg_vrf, static int vnc_add_vrf_prefix(struct vty *vty, const char *arg_vrf,
@ -4725,32 +4754,7 @@ static int vnc_add_vrf_prefix(struct vty *vty, const char *arg_vrf,
} }
} }
rpfx.cost = 255 - (pref & 255); rpfx.cost = 255 - (pref & 255);
if (rfg->rfd == NULL) /* need new rfapi_handle */ vnc_add_vrf_opener(bgp, rfg);
{
/* based on rfapi_open */
struct rfapi_descriptor *rfd;
rfd = XCALLOC(MTYPE_RFAPI_DESC,
sizeof(struct rfapi_descriptor));
rfd->bgp = bgp;
rfg->rfd = rfd;
/* leave most fields empty as will get from (dynamic) config
* when needed */
rfd->default_tunneltype_option.type = BGP_ENCAP_TYPE_MPLS;
rfd->cookie = rfg;
if (rfg->vn_prefix.family
&& !CHECK_FLAG(rfg->flags, RFAPI_RFG_VPN_NH_SELF)) {
rfapiQprefix2Raddr(&rfg->vn_prefix, &rfd->vn_addr);
} else {
memset(&rfd->vn_addr, 0, sizeof(struct rfapi_ip_addr));
rfd->vn_addr.addr_family = AF_INET;
rfd->vn_addr.addr.v4 = bgp->router_id;
}
rfd->un_addr = rfd->vn_addr; /* sigh, need something in UN for
lookups */
vnc_zlog_debug_verbose("%s: Opening RFD for VRF %s", __func__,
rfg->name);
rfapi_init_and_open(bgp, rfd, rfg);
}
if (!rfapi_register(rfg->rfd, &rpfx, RFAPI_INFINITE_LIFETIME, NULL, if (!rfapi_register(rfg->rfd, &rpfx, RFAPI_INFINITE_LIFETIME, NULL,
(cur_opt ? optary : NULL), RFAPI_REGISTER_ADD)) { (cur_opt ? optary : NULL), RFAPI_REGISTER_ADD)) {
@ -4907,7 +4911,6 @@ static int vnc_clear_vrf(struct vty *vty, struct bgp *bgp, const char *arg_vrf,
start_count = rfapi_cfg_group_it_count(rfg); start_count = rfapi_cfg_group_it_count(rfg);
clear_vnc_prefix(&cda); clear_vnc_prefix(&cda);
clear_vnc_vrf_closer(rfg);
vty_out(vty, "Cleared %u out of %d prefixes.\n", cda.pfx_count, vty_out(vty, "Cleared %u out of %d prefixes.\n", cda.pfx_count,
start_count); start_count);
return CMD_SUCCESS; return CMD_SUCCESS;

View File

@ -1367,9 +1367,6 @@ static void vnc_direct_del_rn_group_rd(struct bgp *bgp,
NULL, /* RD not used for unicast */ NULL, /* RD not used for unicast */
NULL, NULL,
NULL); /* tag not used for unicast */ NULL); /* tag not used for unicast */
if (rfg->type == RFAPI_GROUP_CFG_VRF) {
clear_vnc_vrf_closer(rfg);
}
return; return;
} }