From 3ad00234f734ec477c80799fd67f5b7b1b87c650 Mon Sep 17 00:00:00 2001 From: Lou Berger Date: Sat, 2 Jun 2018 15:01:36 -0400 Subject: [PATCH] bgpd: open per vrf listen socket for linux type vrfs Signed-off-by: Lou Berger --- bgpd/bgp_network.c | 4 +++- bgpd/bgpd.c | 58 +++++++++------------------------------------- 2 files changed, 14 insertions(+), 48 deletions(-) diff --git a/bgpd/bgp_network.c b/bgpd/bgp_network.c index 37d06c1e53..84a959d0e8 100644 --- a/bgpd/bgp_network.c +++ b/bgpd/bgp_network.c @@ -723,7 +723,9 @@ int bgp_socket(struct bgp *bgp, unsigned short port, const char *address) if (bgpd_privs.change(ZPRIVS_RAISE)) zlog_err("Can't raise privileges"); sock = vrf_socket(ainfo->ai_family, ainfo->ai_socktype, - ainfo->ai_protocol, bgp->vrf_id, NULL); + ainfo->ai_protocol, bgp->vrf_id, + (bgp->inst_type == BGP_INSTANCE_TYPE_VRF ? + bgp->name : NULL)); if (bgpd_privs.change(ZPRIVS_LOWER)) zlog_err("Can't lower privileges"); if (sock < 0) { diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 69297cd3e4..3f4e4eeacb 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -109,12 +109,7 @@ extern struct zclient *zclient; static int bgp_check_main_socket(bool create, struct bgp *bgp) { static int bgp_server_main_created; - struct listnode *bgpnode, *nbgpnode; - struct bgp *bgp_temp; - if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF && - vrf_is_mapped_on_netns(bgp->vrf_id)) - return 0; if (create == true) { if (bgp_server_main_created) return 0; @@ -125,18 +120,6 @@ static int bgp_check_main_socket(bool create, struct bgp *bgp) } if (!bgp_server_main_created) return 0; - /* only delete socket on some cases */ - for (ALL_LIST_ELEMENTS(bm->bgp, bgpnode, nbgpnode, bgp_temp)) { - /* do not count with current bgp */ - if (bgp_temp == bgp) - continue; - /* if other instance non VRF, do not delete socket */ - if (bgp_temp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) - return 0; - /* vrf lite, do not delete socket */ - if (!vrf_is_mapped_on_netns(bgp_temp->vrf_id)) - return 0; - } bgp_close(); bgp_server_main_created = 0; return 0; @@ -3079,17 +3062,16 @@ int bgp_handle_socket(struct bgp *bgp, struct vrf *vrf, vrf_id_t old_vrf_id, /* Create BGP server socket, if listen mode not disabled */ if (!bgp || bgp_option_check(BGP_OPT_NO_LISTEN)) return 0; - if (bgp->name && bgp->inst_type == BGP_INSTANCE_TYPE_VRF && vrf) { + if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF) { /* * suppress vrf socket */ if (create == FALSE) { - if (vrf_is_mapped_on_netns(vrf->vrf_id)) - bgp_close_vrf_socket(bgp); - else - ret = bgp_check_main_socket(create, bgp); - return ret; + bgp_close_vrf_socket(bgp); + return 0; } + if (vrf == NULL) + return BGP_ERR_INVALID_VALUE; /* do nothing * if vrf_id did not change */ @@ -3104,21 +3086,12 @@ int bgp_handle_socket(struct bgp *bgp, struct vrf *vrf, vrf_id_t old_vrf_id, */ if (vrf->vrf_id == VRF_UNKNOWN) return 0; - /* if BGP VRF instance requested - * if backend is NETNS, create BGP server socket in the NETNS - */ - if (vrf_is_mapped_on_netns(bgp->vrf_id)) { - ret = bgp_socket(bgp, bm->port, bm->address); - if (ret < 0) - return BGP_ERR_INVALID_VALUE; - return 0; - } - } - /* if BGP VRF instance requested or VRF lite backend - * if BGP non VRF instance, create it - * if not already done - */ - return bgp_check_main_socket(create, bgp); + ret = bgp_socket(bgp, bm->port, bm->address); + if (ret < 0) + return BGP_ERR_INVALID_VALUE; + return 0; + } else + return bgp_check_main_socket(create, bgp); } /* Called from VTY commands. */ @@ -3495,16 +3468,7 @@ struct peer *peer_lookup(struct bgp *bgp, union sockunion *su) struct listnode *bgpnode, *nbgpnode; for (ALL_LIST_ELEMENTS(bm->bgp, bgpnode, nbgpnode, bgp)) { - /* Skip VRFs Lite only, this function will not be - * invoked without an instance - * when examining VRFs. - */ - if ((bgp->inst_type == BGP_INSTANCE_TYPE_VRF) - && !vrf_is_mapped_on_netns(bgp->vrf_id)) - continue; - peer = hash_lookup(bgp->peerhash, &tmp_peer); - if (peer) break; } -- 2.39.5