summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-06-13 10:23:46 -0400
committerGitHub <noreply@github.com>2023-06-13 10:23:46 -0400
commite35f0668e504baef9caef2f7025052c77782ea01 (patch)
tree038d29b37d6c59df7f65e58a4648a08ef62de49a
parent609491fe0dd09140250e7921ca8a3a916f5ba24a (diff)
parent4112baec9f7ec235c66e2c5992ba2288ca1557e7 (diff)
Merge pull request #13589 from mjstapp/fix_pbr_zebra
pbrd, zebra: fix zapi and netlink rule encoding
-rw-r--r--pbrd/pbr_zebra.c21
-rw-r--r--zebra/rule_netlink.c4
2 files changed, 17 insertions, 8 deletions
diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c
index 097c9f2964..53a02e14a5 100644
--- a/pbrd/pbr_zebra.c
+++ b/pbrd/pbr_zebra.c
@@ -516,7 +516,7 @@ pbr_encode_pbr_map_sequence_vrf(struct stream *s,
stream_putl(s, pbr_vrf->vrf->data.l.table_id);
}
-static void pbr_encode_pbr_map_sequence(struct stream *s,
+static bool pbr_encode_pbr_map_sequence(struct stream *s,
struct pbr_map_sequence *pbrms,
struct interface *ifp)
{
@@ -549,7 +549,14 @@ static void pbr_encode_pbr_map_sequence(struct stream *s,
stream_putl(s, pbr_nht_get_table(pbrms->nhgrp_name));
else if (pbrms->nhg)
stream_putl(s, pbr_nht_get_table(pbrms->internal_nhg_name));
+ else {
+ /* Not valid for install without table */
+ return false;
+ }
+
stream_put(s, ifp->name, INTERFACE_NAMSIZ);
+
+ return true;
}
bool pbr_send_pbr_map(struct pbr_map_sequence *pbrms,
@@ -593,11 +600,13 @@ bool pbr_send_pbr_map(struct pbr_map_sequence *pbrms,
install ? "Installing" : "Deleting", pbrm->name, pbrms->seqno,
install, pmi->ifp->name, pmi->delete);
- pbr_encode_pbr_map_sequence(s, pbrms, pmi->ifp);
-
- stream_putw_at(s, 0, stream_get_endp(s));
-
- zclient_send_message(zclient);
+ if (pbr_encode_pbr_map_sequence(s, pbrms, pmi->ifp)) {
+ stream_putw_at(s, 0, stream_get_endp(s));
+ zclient_send_message(zclient);
+ } else {
+ DEBUGD(&pbr_dbg_zebra, "%s: %s seq %u encode failed, skipped",
+ __func__, pbrm->name, pbrms->seqno);
+ }
return true;
}
diff --git a/zebra/rule_netlink.c b/zebra/rule_netlink.c
index c7832992ea..518c948c99 100644
--- a/zebra/rule_netlink.c
+++ b/zebra/rule_netlink.c
@@ -116,9 +116,9 @@ static ssize_t netlink_rule_msg_encode(
return 0;
}
- /* dsfield, if specified */
+ /* dsfield, if specified; mask off the ECN bits */
if (filter_bm & PBR_FILTER_DSFIELD)
- req->frh.tos = dsfield;
+ req->frh.tos = dsfield & 0xfc;
/* protocol to match on */
if (filter_bm & PBR_FILTER_IP_PROTOCOL)