rfg_new = bgp_rfapi_cfg_match_byname(bgp, argv[5]->arg,
RFAPI_GROUP_CFG_NVE);
- if (rfg_new == NULL)
+ if (rfg_new == NULL) {
rfg_new = bgp_rfapi_cfg_match_byname(bgp, argv[5]->arg,
RFAPI_GROUP_CFG_VRF);
+ vnc_add_vrf_opener(bgp, rfg_new);
+ }
if (rfg_new == NULL) {
vty_out(vty, "Can't group named \"%s\".\n", argv[5]->arg);
*/
for (ALL_LIST_ELEMENTS_RO(bgp->rfapi_cfg->rfg_export_direct_bgp_l, node,
rfgn)) {
- if (rfg_name == NULL || (type == RFAPI_GROUP_CFG_NVE
- && !strcmp(rfgn->name, rfg_name))) {
+ if (rfgn->rfg == rfg) {
rfgn->rfg = NULL;
/* remove exported routes from this group */
vnc_direct_bgp_del_group(bgp, rfg);
*/
for (ALL_LIST_ELEMENTS_RO(bgp->rfapi_cfg->rfg_export_zebra_l, node,
rfgn)) {
-
- if (rfg_name == NULL || (type == RFAPI_GROUP_CFG_NVE
- && !strcmp(rfgn->name, rfg_name))) {
+ if (rfgn->rfg == rfg) {
rfgn->rfg = NULL;
/* remove exported routes from this group */
vnc_zebra_del_group(bgp, rfg);
break;
}
}
- if (rfg)
+ if (rfg) {
+ if (rfg->rfd)
+ clear_vnc_vrf_closer(rfg);
bgp_rfapi_delete_nve_group(vty, bgp, rfg);
+ }
else /* must be delete all */
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);
+ }
return CMD_SUCCESS;
}
* add [vrf <vrf-name>] prefix <prefix>
* [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 */
static int vnc_add_vrf_prefix(struct vty *vty, const char *arg_vrf,
}
}
rpfx.cost = 255 - (pref & 255);
- 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);
- }
+ vnc_add_vrf_opener(bgp, rfg);
if (!rfapi_register(rfg->rfd, &rpfx, RFAPI_INFINITE_LIFETIME, NULL,
(cur_opt ? optary : NULL), RFAPI_REGISTER_ADD)) {
start_count = rfapi_cfg_group_it_count(rfg);
clear_vnc_prefix(&cda);
- clear_vnc_vrf_closer(rfg);
vty_out(vty, "Cleared %u out of %d prefixes.\n", cda.pfx_count,
start_count);
return CMD_SUCCESS;