Skip to content

Commit

Permalink
Merge pull request #17652 from pguibert6WIND/topotest_bgp_evpn_rt5
Browse files Browse the repository at this point in the history
bgpd, tests: bgp_evpn_rt5, add test with match evpn vni command
  • Loading branch information
ton31337 authored Jan 23, 2025
2 parents 4a2612c + 25b6751 commit f19b843
Show file tree
Hide file tree
Showing 14 changed files with 199 additions and 116 deletions.
28 changes: 17 additions & 11 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -4923,6 +4923,7 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
bool force_evpn_import = false;
safi_t orig_safi = safi;
struct bgp_labels bgp_labels = {};
struct bgp_route_evpn *p_evpn = evpn;
uint8_t i;

if (frrtrace_enabled(frr_bgp, process_update)) {
Expand Down Expand Up @@ -4964,11 +4965,9 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
* will not be interned. In which case, it is ok to update the
* attr->evpn_overlay, so that, this can be stored in adj_in.
*/
if (evpn) {
if (afi == AFI_L2VPN)
bgp_attr_set_evpn_overlay(attr, evpn);
else
evpn_overlay_free(evpn);
if (evpn && afi == AFI_L2VPN) {
bgp_attr_set_evpn_overlay(attr, evpn);
p_evpn = NULL;
}
bgp_adj_in_set(dest, peer, attr, addpath_id, &bgp_labels);
}
Expand Down Expand Up @@ -5141,11 +5140,9 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
* attr->evpn_overlay with evpn directly. Instead memcpy
* evpn to new_atr.evpn_overlay before it is interned.
*/
if (soft_reconfig && evpn) {
if (afi == AFI_L2VPN)
bgp_attr_set_evpn_overlay(&new_attr, evpn);
else
evpn_overlay_free(evpn);
if (soft_reconfig && evpn && afi == AFI_L2VPN) {
bgp_attr_set_evpn_overlay(&new_attr, evpn);
p_evpn = NULL;
}

/* Apply incoming route-map.
Expand Down Expand Up @@ -5314,7 +5311,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,

bgp_dest_unlock_node(dest);
bgp_attr_unintern(&attr_new);

if (p_evpn)
evpn_overlay_free(p_evpn);
return;
}

Expand Down Expand Up @@ -5479,6 +5477,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
ret = bgp_damp_update(pi, dest, afi, safi);
if (ret == BGP_DAMP_SUPPRESSED) {
bgp_dest_unlock_node(dest);
if (p_evpn)
evpn_overlay_free(p_evpn);
return;
}
}
Expand Down Expand Up @@ -5565,6 +5565,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
type, sub_type, NULL);
}
#endif
if (p_evpn)
evpn_overlay_free(p_evpn);
return;
} // End of implicit withdraw

Expand Down Expand Up @@ -5659,6 +5661,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
}
#endif

if (p_evpn)
evpn_overlay_free(p_evpn);
return;

/* This BGP update is filtered. Log the reason then update BGP
Expand Down Expand Up @@ -5722,6 +5726,8 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id,
}
#endif

if (p_evpn)
evpn_overlay_free(p_evpn);
return;
}

Expand Down
34 changes: 19 additions & 15 deletions bgpd/bgp_vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -1499,13 +1499,12 @@ DEFUN_NOSH (router_bgp,
int idx_asn = 2;
int idx_view_vrf = 3;
int idx_vrf = 4;
int is_new_bgp = 0;
int idx_asnotation = 3;
int idx_asnotation_kind = 4;
enum asnotation_mode asnotation = ASNOTATION_UNDEFINED;
int ret;
as_t as;
struct bgp *bgp;
struct bgp *bgp = NULL;
const char *name = NULL;
enum bgp_instance_type inst_type;

Expand Down Expand Up @@ -1567,35 +1566,40 @@ DEFUN_NOSH (router_bgp,
asnotation = ASNOTATION_PLAIN;
}

if (inst_type == BGP_INSTANCE_TYPE_DEFAULT)
is_new_bgp = (bgp_lookup(as, name) == NULL);

ret = bgp_get_vty(&bgp, &as, name, inst_type,
argv[idx_asn]->arg, asnotation);
ret = bgp_lookup_by_as_name_type(&bgp, &as, argv[idx_asn]->arg, asnotation, name,
inst_type, true);
if (bgp && ret == BGP_INSTANCE_EXISTS)
ret = CMD_SUCCESS;
else if (bgp == NULL && ret == CMD_SUCCESS)
/* SUCCESS and bgp is NULL */
ret = bgp_get_vty(&bgp, &as, name, inst_type, argv[idx_asn]->arg,
asnotation);
switch (ret) {
case BGP_ERR_AS_MISMATCH:
vty_out(vty, "BGP is already running; AS is %s\n",
bgp->as_pretty);
bgp ? bgp->as_pretty : "unknown");
return CMD_WARNING_CONFIG_FAILED;
case BGP_ERR_INSTANCE_MISMATCH:
vty_out(vty,
"BGP instance name and AS number mismatch\n");
vty_out(vty,
"BGP instance is already running; AS is %s\n",
bgp->as_pretty);
vty_out(vty, "BGP instance is already running; AS is %s\n",
bgp ? bgp->as_pretty : "unknown");
return CMD_WARNING_CONFIG_FAILED;
}

if (!bgp) {
vty_out(vty, "BGP instance not found\n");
return CMD_WARNING_CONFIG_FAILED;
}
/*
* If we just instantiated the default instance, complete
* any pending VRF-VPN leaking that was configured via
* earlier "router bgp X vrf FOO" blocks.
*/
if (is_new_bgp && inst_type == BGP_INSTANCE_TYPE_DEFAULT)
if (inst_type == BGP_INSTANCE_TYPE_DEFAULT)
vpn_leak_postchange_all();

if (inst_type == BGP_INSTANCE_TYPE_VRF ||
IS_BGP_INSTANCE_HIDDEN(bgp)) {
if (inst_type == BGP_INSTANCE_TYPE_VRF || IS_BGP_INSTANCE_HIDDEN(bgp)) {
bgp_vpn_leak_export(bgp);
UNSET_FLAG(bgp->flags, BGP_FLAG_INSTANCE_HIDDEN);
UNSET_FLAG(bgp->flags, BGP_FLAG_DELETE_IN_PROGRESS);
Expand Down Expand Up @@ -10559,7 +10563,7 @@ DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
SET_FLAG(bgp_default->flags, BGP_FLAG_INSTANCE_HIDDEN);
}

vrf_bgp = bgp_lookup_by_name(import_name);
vrf_bgp = bgp_lookup_by_name_filter(import_name, false);
if (!vrf_bgp) {
if (strcmp(import_name, VRF_DEFAULT_NAME) == 0) {
vrf_bgp = bgp_default;
Expand Down
24 changes: 14 additions & 10 deletions bgpd/bgpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -3634,13 +3634,13 @@ struct bgp *bgp_lookup(as_t as, const char *name)
}

/* Lookup BGP structure by view name. */
struct bgp *bgp_lookup_by_name(const char *name)
struct bgp *bgp_lookup_by_name_filter(const char *name, bool filter_auto)
{
struct bgp *bgp;
struct listnode *node, *nnode;

for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
if (filter_auto && CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
continue;
if ((bgp->name == NULL && name == NULL)
|| (bgp->name && name && strcmp(bgp->name, name) == 0))
Expand All @@ -3649,6 +3649,11 @@ struct bgp *bgp_lookup_by_name(const char *name)
return NULL;
}

struct bgp *bgp_lookup_by_name(const char *name)
{
return bgp_lookup_by_name_filter(name, true);
}

/* Lookup BGP instance based on VRF id. */
/* Note: Only to be used for incoming messages from Zebra. */
struct bgp *bgp_lookup_by_vrf_id(vrf_id_t vrf_id)
Expand Down Expand Up @@ -3734,10 +3739,9 @@ int bgp_handle_socket(struct bgp *bgp, struct vrf *vrf, vrf_id_t old_vrf_id,
return bgp_check_main_socket(create, bgp);
}

int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as,
const char *as_pretty,
int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as, const char *as_pretty,
enum asnotation_mode asnotation, const char *name,
enum bgp_instance_type inst_type)
enum bgp_instance_type inst_type, bool force_config)
{
struct bgp *bgp;
struct peer *peer = NULL;
Expand All @@ -3746,7 +3750,7 @@ int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as,

/* Multiple instance check. */
if (name)
bgp = bgp_lookup_by_name(name);
bgp = bgp_lookup_by_name_filter(name, !force_config);
else
bgp = bgp_get_default();

Expand All @@ -3756,15 +3760,16 @@ int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as,
/* Handle AS number change */
if (bgp->as != *as) {
if (hidden || CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO)) {
if (hidden) {
if (force_config == false && hidden) {
bgp_create(as, name, inst_type,
as_pretty, asnotation, bgp,
hidden);
UNSET_FLAG(bgp->flags,
BGP_FLAG_INSTANCE_HIDDEN);
} else {
bgp->as = *as;
UNSET_FLAG(bgp->vrf_flags, BGP_VRF_AUTO);
if (force_config == false)
UNSET_FLAG(bgp->vrf_flags, BGP_VRF_AUTO);
}

/* Set all peer's local AS with this ASN */
Expand Down Expand Up @@ -3801,8 +3806,7 @@ int bgp_get(struct bgp **bgp_val, as_t *as, const char *name,
struct vrf *vrf = NULL;
int ret = 0;

ret = bgp_lookup_by_as_name_type(bgp_val, as, as_pretty, asnotation,
name, inst_type);
ret = bgp_lookup_by_as_name_type(bgp_val, as, as_pretty, asnotation, name, inst_type, false);
if (ret || *bgp_val)
return ret;

Expand Down
9 changes: 4 additions & 5 deletions bgpd/bgpd.h
Original file line number Diff line number Diff line change
Expand Up @@ -2285,6 +2285,7 @@ extern void bgp_zclient_reset(void);
extern struct bgp *bgp_get_default(void);
extern struct bgp *bgp_lookup(as_t, const char *);
extern struct bgp *bgp_lookup_by_name(const char *);
extern struct bgp *bgp_lookup_by_name_filter(const char *name, bool filter_auto);
extern struct bgp *bgp_lookup_by_vrf_id(vrf_id_t);
extern struct bgp *bgp_get_evpn(void);
extern void bgp_set_evpn(struct bgp *bgp);
Expand Down Expand Up @@ -2859,11 +2860,9 @@ extern struct peer *peer_new(struct bgp *bgp);

extern struct peer *peer_lookup_in_view(struct vty *vty, struct bgp *bgp,
const char *ip_str, bool use_json);
extern int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as,
const char *as_pretty,
enum asnotation_mode asnotation,
const char *name,
enum bgp_instance_type inst_type);
extern int bgp_lookup_by_as_name_type(struct bgp **bgp_val, as_t *as, const char *as_pretty,
enum asnotation_mode asnotation, const char *name,
enum bgp_instance_type inst_type, bool force_config);

/* Hooks */
DECLARE_HOOK(bgp_vrf_status_changed, (struct bgp *bgp, struct interface *ifp),
Expand Down
2 changes: 1 addition & 1 deletion tests/topotests/bgp_bmp/test_bgp_bmp_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def setup_module(mod):
"tcpdump -nni r1-eth0 -s 0 -w {} &".format(pcap_file), stdout=None
)

for rname, router in tgen.routers().items():
for _, (rname, router) in enumerate(tgen.routers().items(), 1):
logger.info("Loading router %s" % rname)
router.load_frr_config(
os.path.join(CWD, "{}/frr.conf".format(rname)),
Expand Down
8 changes: 4 additions & 4 deletions tests/topotests/bgp_evpn_rt5/r1/bgp_l2vpn_evpn_routes.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"bgpLocalRouterId":"192.168.100.21",
"defaultLocPrf":100,
"localAS":65000,
"192.168.101.41:2":{
"rd":"192.168.101.41:2",
"65000:201":{
"rd":"65000:201",
"[5]:[0]:[32]:[192.168.101.41]":{
"prefix":"[5]:[0]:[32]:[192.168.101.41]",
"prefixLen":352,
Expand Down Expand Up @@ -65,8 +65,8 @@
]
}
},
"192.168.102.21:2":{
"rd":"192.168.102.21:2",
"65000:101":{
"rd":"65000:101",
"[5]:[0]:[32]:[192.168.102.21]":{
"prefix":"[5]:[0]:[32]:[192.168.102.21]",
"prefixLen":352,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"bgpLocalRouterId":"192.168.100.21",
"defaultLocPrf":100,
"localAS":65000,
"192.168.101.41:2":{
"rd":"192.168.101.41:2",
"65000:201":{
"rd":"65000:201",
"[5]:[0]:[32]:[192.168.101.41]":{
"prefix":"[5]:[0]:[32]:[192.168.101.41]",
"prefixLen":352,
Expand Down Expand Up @@ -125,8 +125,8 @@
]
}
},
"192.168.102.21:2":{
"rd":"192.168.102.21:2",
"65000:101":{
"rd":"65000:101",
"[5]:[0]:[32]:[192.168.102.21]":{
"prefix":"[5]:[0]:[32]:[192.168.102.21]",
"prefixLen":352,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,36 @@
! debug zebra vxlan
! debug zebra kernel
! debug zebra dplane
! debug zebra rib
! debug bgp neighbor-events
! debug bgp updates
! debug bgp zebra
vrf r1-vrf-101
vni 101
exit-vrf
!
interface r1-eth0
ip address 192.168.100.21/24
!
interface loop101 vrf r1-vrf-101
ip address 192.168.102.21/32
ipv6 address fd00::1/128
!
router bgp 65000
bgp router-id 192.168.100.21
bgp log-neighbor-changes
no bgp default ipv4-unicast
no bgp ebgp-requires-policy
neighbor 192.168.100.41 remote-as 65000
neighbor 192.168.100.41 capability extended-nexthop
neighbor 192.168.100.61 remote-as 65500
neighbor 192.168.100.61 capability extended-nexthop
!
address-family l2vpn evpn
neighbor 192.168.100.41 activate
neighbor 192.168.100.41 route-map rmap_r1 in
neighbor 192.168.100.61 activate
neighbor 192.168.100.61 route-map rmap_r3 in
advertise-all-vni
exit-address-family
!
Expand All @@ -24,7 +45,17 @@ router bgp 65000 vrf r1-vrf-101
network fd00::1/128
exit-address-family
address-family l2vpn evpn
rd 65000:101
route-target both 65:101
advertise ipv4 unicast
advertise ipv6 unicast
exit-address-family
!
route-map rmap_r3 deny 1
match evpn vni 102
exit
route-map rmap_r1 permit 1
match evpn vni 101
exit


23 changes: 0 additions & 23 deletions tests/topotests/bgp_evpn_rt5/r1/zebra.conf

This file was deleted.

Loading

0 comments on commit f19b843

Please sign in to comment.