Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bgpd, tests: bgp_evpn_rt5, add test with match evpn vni command #17652

Merged
merged 7 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 17 additions & 11 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -4910,6 +4910,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 @@ -4951,11 +4952,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 @@ -5128,11 +5127,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 @@ -5301,7 +5298,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 @@ -5466,6 +5464,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 @@ -5552,6 +5552,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 @@ -5646,6 +5648,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 @@ -5709,6 +5713,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
Loading