summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_pbr.c70
-rw-r--r--bgpd/bgp_zebra.c18
-rw-r--r--tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py4
3 files changed, 38 insertions, 54 deletions
diff --git a/bgpd/bgp_pbr.c b/bgpd/bgp_pbr.c
index 01443c778f..27d868afa1 100644
--- a/bgpd/bgp_pbr.c
+++ b/bgpd/bgp_pbr.c
@@ -1072,22 +1072,31 @@ static void *bgp_pbr_rule_alloc_intern(void *arg)
return new;
}
+static void bgp_pbr_bpa_remove(struct bgp_pbr_action *bpa)
+{
+ if ((bpa->refcnt == 0) && bpa->installed && bpa->table_id != 0) {
+ bgp_send_pbr_rule_action(bpa, NULL, false);
+ bgp_zebra_announce_default(bpa->bgp, &bpa->nh, bpa->afi,
+ bpa->table_id, false);
+ bpa->installed = false;
+ }
+}
+
+static void bgp_pbr_bpa_add(struct bgp_pbr_action *bpa)
+{
+ if (!bpa->installed && !bpa->install_in_progress) {
+ bgp_send_pbr_rule_action(bpa, NULL, true);
+ bgp_zebra_announce_default(bpa->bgp, &bpa->nh, bpa->afi,
+ bpa->table_id, true);
+ }
+}
+
static void bgp_pbr_action_free(void *arg)
{
- struct bgp_pbr_action *bpa;
+ struct bgp_pbr_action *bpa = arg;
- bpa = (struct bgp_pbr_action *)arg;
+ bgp_pbr_bpa_remove(bpa);
- if (bpa->refcnt == 0) {
- if (bpa->installed && bpa->table_id != 0) {
- bgp_send_pbr_rule_action(bpa, NULL, false);
- bgp_zebra_announce_default(bpa->bgp, &(bpa->nh),
- AFI_IP,
- bpa->table_id,
- false);
- bpa->installed = false;
- }
- }
XFREE(MTYPE_PBR_ACTION, bpa);
}
@@ -1691,16 +1700,7 @@ static void bgp_pbr_flush_iprule(struct bgp *bgp, struct bgp_pbr_action *bpa,
}
}
hash_release(bgp->pbr_rule_hash, bpr);
- if (bpa->refcnt == 0) {
- if (bpa->installed && bpa->table_id != 0) {
- bgp_send_pbr_rule_action(bpa, NULL, false);
- bgp_zebra_announce_default(bpa->bgp, &(bpa->nh),
- AFI_IP,
- bpa->table_id,
- false);
- bpa->installed = false;
- }
- }
+ bgp_pbr_bpa_remove(bpa);
}
static void bgp_pbr_flush_entry(struct bgp *bgp, struct bgp_pbr_action *bpa,
@@ -1748,16 +1748,7 @@ static void bgp_pbr_flush_entry(struct bgp *bgp, struct bgp_pbr_action *bpa,
* note that drop does not need to call send_pbr_action
*/
}
- if (bpa->refcnt == 0) {
- if (bpa->installed && bpa->table_id != 0) {
- bgp_send_pbr_rule_action(bpa, NULL, false);
- bgp_zebra_announce_default(bpa->bgp, &(bpa->nh),
- bpa->afi,
- bpa->table_id,
- false);
- bpa->installed = false;
- }
- }
+ bgp_pbr_bpa_remove(bpa);
}
struct bgp_pbr_match_entry_remain {
@@ -2374,12 +2365,9 @@ static void bgp_pbr_policyroute_add_to_zebra_unit(struct bgp *bgp,
return;
}
}
- if (!bpa->installed && !bpa->install_in_progress) {
- bgp_send_pbr_rule_action(bpa, NULL, true);
- bgp_zebra_announce_default(bgp, nh,
- bpa->afi,
- bpa->table_id, true);
- }
+
+ bgp_pbr_bpa_add(bpa);
+
/* ip rule add */
if (bpr && !bpr->installed)
bgp_send_pbr_rule_action(bpa, bpr, true);
@@ -2547,11 +2535,7 @@ static void bgp_pbr_policyroute_add_to_zebra_unit(struct bgp *bgp,
* it will be suppressed subsequently
*/
/* ip rule add */
- if (!bpa->installed && !bpa->install_in_progress) {
- bgp_send_pbr_rule_action(bpa, NULL, true);
- bgp_zebra_announce_default(bgp, nh,
- bpa->afi, bpa->table_id, true);
- }
+ bgp_pbr_bpa_add(bpa);
/* ipset create */
if (!bpm->installed)
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 05d00a4851..63214c5676 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -1180,7 +1180,6 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
route_tag_t tag;
mpls_label_t label;
int nh_othervrf = 0;
- char buf_prefix[PREFIX_STRLEN]; /* filled in if we are debugging */
bool is_evpn;
bool nh_updated = false;
bool do_wt_ecmp;
@@ -1197,9 +1196,6 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
if (bgp->main_zebra_update_hold)
return;
- if (bgp_debug_zebra(p))
- prefix2str(p, buf_prefix, sizeof(buf_prefix));
-
if (safi == SAFI_FLOWSPEC) {
bgp_pbr_update_entry(bgp, bgp_dest_get_prefix(dest), info, afi,
safi, true);
@@ -1312,13 +1308,14 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
if (bgp_debug_zebra(&api.prefix)) {
if (mpinfo->extra) {
- zlog_debug("%s: p=%s, bgp_is_valid_label: %d",
- __func__, buf_prefix,
+ zlog_debug("%s: p=%pFX, bgp_is_valid_label: %d",
+ __func__, p,
bgp_is_valid_label(
&mpinfo->extra->label[0]));
} else {
- zlog_debug("%s: p=%s, extra is NULL, no label",
- __func__, buf_prefix);
+ zlog_debug(
+ "%s: p=%pFX, extra is NULL, no label",
+ __func__, p);
}
}
@@ -1500,9 +1497,8 @@ void bgp_zebra_announce(struct bgp_dest *dest, const struct prefix *p,
if (CHECK_FLAG(api.flags, ZEBRA_FLAG_ALLOW_RECURSION))
recursion_flag = 1;
- zlog_debug("%s: %s: announcing to zebra (recursion %sset)",
- __func__, buf_prefix,
- (recursion_flag ? "" : "NOT "));
+ zlog_debug("%s: %pFX: announcing to zebra (recursion %sset)",
+ __func__, p, (recursion_flag ? "" : "NOT "));
}
zclient_route_send(is_add ? ZEBRA_ROUTE_ADD : ZEBRA_ROUTE_DELETE,
zclient, &api);
diff --git a/tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py b/tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py
index a772a2aab1..fdd84fcd40 100644
--- a/tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py
+++ b/tests/topotests/bgp_flowspec/test_bgp_flowspec_topo.py
@@ -71,6 +71,10 @@ from lib.lutil import luCommand
# Required to instantiate the topology builder class.
from mininet.topo import Topo
+
+pytestmark = [pytest.mark.bgpd]
+
+
#####################################################
##
## Network Topology Definition