summaryrefslogtreecommitdiff
path: root/pbrd
diff options
context:
space:
mode:
Diffstat (limited to 'pbrd')
-rw-r--r--pbrd/pbr_map.c8
-rw-r--r--pbrd/pbr_nht.c79
-rw-r--r--pbrd/pbr_vty.c10
-rw-r--r--pbrd/pbr_zebra.c8
4 files changed, 71 insertions, 34 deletions
diff --git a/pbrd/pbr_map.c b/pbrd/pbr_map.c
index 01caff5b52..5b851988f6 100644
--- a/pbrd/pbr_map.c
+++ b/pbrd/pbr_map.c
@@ -304,7 +304,7 @@ static void pbrms_vrf_update(struct pbr_map_sequence *pbrms,
if (pbrms->vrf_lookup
&& (strncmp(vrf_name, pbrms->vrf_name, sizeof(pbrms->vrf_name))
== 0)) {
- DEBUGD(&pbr_dbg_map, "\tSeq %u uses vrf %s (%u), updating map",
+ DEBUGD(&pbr_dbg_map, " Seq %u uses vrf %s (%u), updating map",
pbrms->seqno, vrf_name, pbr_vrf_id(pbr_vrf));
pbr_map_check(pbrms, false);
@@ -666,7 +666,7 @@ void pbr_map_schedule_policy_from_nhg(const char *nh_group, bool installed)
RB_FOREACH (pbrm, pbr_map_entry_head, &pbr_maps) {
DEBUGD(&pbr_dbg_map, "%s: Looking at %s", __func__, pbrm->name);
for (ALL_LIST_ELEMENTS_RO(pbrm->seqnumbers, node, pbrms)) {
- DEBUGD(&pbr_dbg_map, "\tNH Grp name: %s",
+ DEBUGD(&pbr_dbg_map, " NH Grp name: %s",
pbrms->nhgrp_name ?
pbrms->nhgrp_name : pbrms->internal_nhg_name);
@@ -707,7 +707,7 @@ void pbr_map_policy_install(const char *name)
if (pbrm->valid && pbrms->nhs_installed
&& pbrm->incoming->count) {
- DEBUGD(&pbr_dbg_map, "\tInstalling %s %u", pbrm->name,
+ DEBUGD(&pbr_dbg_map, " Installing %s %u", pbrm->name,
pbrms->seqno);
for (ALL_LIST_ELEMENTS_RO(pbrm->incoming, inode, pmi))
if (pbr_map_interface_is_valid(pmi))
@@ -861,7 +861,7 @@ void pbr_map_check(struct pbr_map_sequence *pbrms, bool changed)
DEBUGD(&pbr_dbg_map, "%s: Installing %s(%u) reason: %" PRIu64,
__func__, pbrm->name, pbrms->seqno, pbrms->reason);
DEBUGD(&pbr_dbg_map,
- "\tSending PBR_MAP_POLICY_INSTALL event");
+ " Sending PBR_MAP_POLICY_INSTALL event");
} else {
install = false;
DEBUGD(&pbr_dbg_map, "%s: Removing %s(%u) reason: %" PRIu64,
diff --git a/pbrd/pbr_nht.c b/pbrd/pbr_nht.c
index ce7780ed49..ba9ad97ab8 100644
--- a/pbrd/pbr_nht.c
+++ b/pbrd/pbr_nht.c
@@ -213,7 +213,7 @@ void pbr_nhgroup_add_cb(const char *name)
nhgc = nhgc_find(name);
if (!nhgc) {
- DEBUGD(&pbr_dbg_nht, "%s: Could not find nhgc with name: %s\n",
+ DEBUGD(&pbr_dbg_nht, "%s: Could not find nhgc with name: %s",
__func__, name);
return;
}
@@ -320,13 +320,6 @@ void pbr_nhgroup_delete_cb(const char *name)
pbr_map_check_nh_group_change(name);
}
-#if 0
-static struct pbr_nexthop_cache *pbr_nht_lookup_nexthop(struct nexthop *nexthop)
-{
- return NULL;
-}
-#endif
-
static void
pbr_nht_find_nhg_from_table_update(struct pbr_nexthop_group_cache *pnhgc,
uint32_t table_id, bool installed)
@@ -627,7 +620,7 @@ struct pbr_nexthop_group_cache *pbr_nht_add_group(const char *name)
nhgc = nhgc_find(name);
if (!nhgc) {
- DEBUGD(&pbr_dbg_nht, "%s: Could not find nhgc with name: %s\n",
+ DEBUGD(&pbr_dbg_nht, "%s: Could not find nhgc with name: %s",
__func__, name);
return NULL;
}
@@ -693,7 +686,7 @@ bool pbr_nht_nexthop_group_valid(const char *name)
pnhgc = hash_get(pbr_nhg_hash, &lookup, NULL);
if (!pnhgc)
return false;
- DEBUGD(&pbr_dbg_nht, "%s: \t%d %d", __func__, pnhgc->valid,
+ DEBUGD(&pbr_dbg_nht, "%s: %d %d", __func__, pnhgc->valid,
pnhgc->installed);
if (pnhgc->valid && pnhgc->installed)
return true;
@@ -719,21 +712,46 @@ pbr_nht_individual_nexthop_gw_update(struct pbr_nexthop_cache *pnhc,
{
bool is_valid = pnhc->valid;
- if (!pnhi->nhr) /* It doesn't care about non-nexthop updates */
+ /*
+ * If we have an interface down event, let's note that
+ * it is happening and find all the nexthops that depend
+ * on that interface. As that if we have an interface
+ * flapping fast enough it means that zebra might turn
+ * those nexthop tracking events into a no-update
+ * So let's search and do the right thing on the
+ * interface event.
+ */
+ if (!pnhi->nhr && pnhi->ifp) {
+ switch (pnhc->nexthop.type) {
+ case NEXTHOP_TYPE_BLACKHOLE:
+ case NEXTHOP_TYPE_IPV4:
+ case NEXTHOP_TYPE_IPV6:
+ goto done;
+ case NEXTHOP_TYPE_IFINDEX:
+ case NEXTHOP_TYPE_IPV4_IFINDEX:
+ case NEXTHOP_TYPE_IPV6_IFINDEX:
+ if (pnhc->nexthop.ifindex == pnhi->ifp->ifindex)
+ is_valid = if_is_up(pnhi->ifp);
+ goto done;
+ }
+
goto done;
+ }
- switch (pnhi->nhr->prefix.family) {
- case AF_INET:
- if (pnhc->nexthop.gate.ipv4.s_addr
- != pnhi->nhr->prefix.u.prefix4.s_addr)
- goto done; /* Unrelated change */
- break;
- case AF_INET6:
- if (memcmp(&pnhc->nexthop.gate.ipv6,
- &pnhi->nhr->prefix.u.prefix6, 16)
- != 0)
- goto done; /* Unrelated change */
- break;
+ if (pnhi->nhr) {
+ switch (pnhi->nhr->prefix.family) {
+ case AF_INET:
+ if (pnhc->nexthop.gate.ipv4.s_addr
+ != pnhi->nhr->prefix.u.prefix4.s_addr)
+ goto done; /* Unrelated change */
+ break;
+ case AF_INET6:
+ if (memcmp(&pnhc->nexthop.gate.ipv6,
+ &pnhi->nhr->prefix.u.prefix6, 16)
+ != 0)
+ goto done; /* Unrelated change */
+ break;
+ }
}
pnhi->nhr_matched = true;
@@ -833,7 +851,7 @@ static void pbr_nht_individual_nexthop_update_lookup(struct hash_bucket *b,
pbr_nht_individual_nexthop_update(pnhc, pnhi);
- DEBUGD(&pbr_dbg_nht, "\tFound %pFX: old: %d new: %d",
+ DEBUGD(&pbr_dbg_nht, " Found %pFX: old: %d new: %d",
&pnhi->nhr->prefix, old_valid, pnhc->valid);
if (pnhc->valid)
@@ -983,7 +1001,6 @@ static void pbr_nht_nexthop_vrf_handle(struct hash_bucket *b, void *data)
struct pbr_vrf *pbr_vrf = data;
struct pbr_nht_individual pnhi = {};
- zlog_debug("pnhgc iterating");
hash_iterate(pnhgc->nhh, pbr_nht_clear_looked_at, NULL);
memset(&pnhi, 0, sizeof(pnhi));
pnhi.pbr_vrf = pbr_vrf;
@@ -1085,7 +1102,7 @@ pbr_nht_individual_nexthop_interface_update_lookup(struct hash_bucket *b,
pbr_nht_individual_nexthop_update(pnhc, pnhi);
- DEBUGD(&pbr_dbg_nht, "\tFound %s: old: %d new: %d", pnhi->ifp->name,
+ DEBUGD(&pbr_dbg_nht, " Found %s: old: %d new: %d", pnhi->ifp->name,
old_valid, pnhc->valid);
if (pnhc->valid)
@@ -1097,6 +1114,7 @@ static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b,
{
struct pbr_nexthop_group_cache *pnhgc = b->data;
struct pbr_nht_individual pnhi = {};
+ struct nexthop_group nhg = {};
bool old_valid;
old_valid = pnhgc->valid;
@@ -1111,6 +1129,15 @@ static void pbr_nht_nexthop_interface_update_lookup(struct hash_bucket *b,
*/
pnhgc->valid = pnhi.valid;
+ pbr_nexthop_group_cache_to_nexthop_group(&nhg, pnhgc);
+
+ if (pnhgc->valid)
+ pbr_nht_install_nexthop_group(pnhgc, nhg);
+ else
+ pbr_nht_uninstall_nexthop_group(pnhgc, nhg, 0);
+
+ nexthops_free(nhg.nexthop);
+
if (old_valid != pnhgc->valid)
pbr_map_check_nh_group_change(pnhgc->name);
}
diff --git a/pbrd/pbr_vty.c b/pbrd/pbr_vty.c
index 26163dcc56..216834fe0c 100644
--- a/pbrd/pbr_vty.c
+++ b/pbrd/pbr_vty.c
@@ -137,6 +137,11 @@ DEFPY(pbr_map_match_src, pbr_map_match_src_cmd,
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
+ if (pbrms->dst && pbrms->family && prefix->family != pbrms->family) {
+ vty_out(vty, "Cannot mismatch families within match src/dst\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
pbrms->family = prefix->family;
if (!no) {
@@ -165,6 +170,11 @@ DEFPY(pbr_map_match_dst, pbr_map_match_dst_cmd,
{
struct pbr_map_sequence *pbrms = VTY_GET_CONTEXT(pbr_map_sequence);
+ if (pbrms->src && pbrms->family && prefix->family != pbrms->family) {
+ vty_out(vty, "Cannot mismatch families within match src/dst\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
pbrms->family = prefix->family;
if (!no) {
diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c
index 222a10e751..467bbc8f72 100644
--- a/pbrd/pbr_zebra.c
+++ b/pbrd/pbr_zebra.c
@@ -266,7 +266,7 @@ static void route_add_helper(struct zapi_route *api, struct nexthop_group nhg,
api->prefix.family = install_afi;
- DEBUGD(&pbr_dbg_zebra, "\tEncoding %pFX", &api->prefix);
+ DEBUGD(&pbr_dbg_zebra, " Encoding %pFX", &api->prefix);
i = 0;
for (ALL_NEXTHOPS(nhg, nhop)) {
@@ -409,12 +409,12 @@ static int pbr_zebra_nexthop_update(ZAPI_CALLBACK_ARGS)
DEBUGD(&pbr_dbg_zebra, "%s: Received Nexthop update: %pFX",
__func__, &nhr.prefix);
- DEBUGD(&pbr_dbg_zebra, "%s: (\tNexthops(%u)", __func__,
+ DEBUGD(&pbr_dbg_zebra, "%s: (Nexthops(%u)", __func__,
nhr.nexthop_num);
for (i = 0; i < nhr.nexthop_num; i++) {
DEBUGD(&pbr_dbg_zebra,
- "%s: \tType: %d: vrf: %d, ifindex: %d gate: %pI4",
+ "%s: Type: %d: vrf: %d, ifindex: %d gate: %pI4",
__func__, nhr.nexthops[i].type,
nhr.nexthops[i].vrf_id, nhr.nexthops[i].ifindex,
&nhr.nexthops[i].gate.ipv4);
@@ -585,7 +585,7 @@ bool pbr_send_pbr_map(struct pbr_map_sequence *pbrms,
*/
stream_putl(s, 1);
- DEBUGD(&pbr_dbg_zebra, "%s: \t%s %s seq %u %d %s %u", __func__,
+ DEBUGD(&pbr_dbg_zebra, "%s: %s %s seq %u %d %s %u", __func__,
install ? "Installing" : "Deleting", pbrm->name, pbrms->seqno,
install, pmi->ifp->name, pmi->delete);