diff options
| author | G. Paul Ziemba <paulz@labn.net> | 2023-07-17 09:31:06 -0700 |
|---|---|---|
| committer | G. Paul Ziemba <paulz@labn.net> | 2023-07-20 08:10:45 -0700 |
| commit | 580a98b798fe14ce7a9013df2d242afcb66f93a1 (patch) | |
| tree | 8b58fbe5113809a0fcb91303760aac9676ee8a5f /zebra/zapi_msg.c | |
| parent | 46b47720a23d3615bebda73d92867d4075fa1be4 (diff) | |
lib: zapi PBR common encode/decode
bgpd, pbrd: use common pbr encoder
zebra: use common pbr decoder
tests: pbr_topo1: check more filter fields
Purpose:
1. Reduce likelihood of zapi format mismatches when adding
PBR fields due to multiple parallel encoder implementations
2. Encourage common PBR structure usage among various daemons
3. Reduce coding errors via explicit per-field enable flags
Signed-off-by: G. Paul Ziemba <paulz@labn.net>
Diffstat (limited to 'zebra/zapi_msg.c')
| -rw-r--r-- | zebra/zapi_msg.c | 64 |
1 files changed, 3 insertions, 61 deletions
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index 928cb3f9b7..a136fcf8ae 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -3184,7 +3184,6 @@ static inline void zread_rule(ZAPI_HANDLER_ARGS) struct zebra_pbr_rule zpr; struct stream *s; uint32_t total, i; - char ifname[INTERFACE_NAMSIZ + 1] = {}; s = msg; STREAM_GETL(s, total); @@ -3194,68 +3193,11 @@ static inline void zread_rule(ZAPI_HANDLER_ARGS) zpr.sock = client->sock; zpr.rule.vrf_id = hdr->vrf_id; - STREAM_GETL(s, zpr.rule.seq); - STREAM_GETL(s, zpr.rule.priority); - STREAM_GETL(s, zpr.rule.unique); - STREAM_GETL(s, zpr.rule.filter.filter_bm); - - STREAM_GETC(s, zpr.rule.filter.ip_proto); - STREAM_GETC(s, zpr.rule.filter.src_ip.family); - STREAM_GETC(s, zpr.rule.filter.src_ip.prefixlen); - STREAM_GET(&zpr.rule.filter.src_ip.u.prefix, s, - prefix_blen(&zpr.rule.filter.src_ip)); - STREAM_GETW(s, zpr.rule.filter.src_port); - STREAM_GETC(s, zpr.rule.filter.dst_ip.family); - STREAM_GETC(s, zpr.rule.filter.dst_ip.prefixlen); - STREAM_GET(&zpr.rule.filter.dst_ip.u.prefix, s, - prefix_blen(&zpr.rule.filter.dst_ip)); - STREAM_GETW(s, zpr.rule.filter.dst_port); - STREAM_GETC(s, zpr.rule.filter.dsfield); - STREAM_GETL(s, zpr.rule.filter.fwmark); - - STREAM_GETC(s, zpr.rule.filter.pcp); - STREAM_GETW(s, zpr.rule.action.pcp); - STREAM_GETW(s, zpr.rule.filter.vlan_id); - STREAM_GETW(s, zpr.rule.filter.vlan_flags); - STREAM_GETW(s, zpr.rule.action.vlan_id); - STREAM_GETW(s, zpr.rule.action.vlan_flags); - STREAM_GETL(s, zpr.rule.action.queue_id); - - STREAM_GETL(s, zpr.rule.action.table); - STREAM_GET(ifname, s, INTERFACE_NAMSIZ); - - strlcpy(zpr.ifname, ifname, sizeof(zpr.ifname)); - strlcpy(zpr.rule.ifname, ifname, sizeof(zpr.rule.ifname)); - - if (!is_default_prefix(&zpr.rule.filter.src_ip)) - zpr.rule.filter.filter_bm |= PBR_FILTER_SRC_IP; - - if (!is_default_prefix(&zpr.rule.filter.dst_ip)) - zpr.rule.filter.filter_bm |= PBR_FILTER_DST_IP; - - if (zpr.rule.filter.src_port) - zpr.rule.filter.filter_bm |= PBR_FILTER_SRC_PORT; - - if (zpr.rule.filter.dst_port) - zpr.rule.filter.filter_bm |= PBR_FILTER_DST_PORT; - - if (zpr.rule.filter.dsfield) - zpr.rule.filter.filter_bm |= PBR_FILTER_DSFIELD; - - if (zpr.rule.filter.ip_proto) - zpr.rule.filter.filter_bm |= PBR_FILTER_IP_PROTOCOL; - - if (zpr.rule.filter.fwmark) - zpr.rule.filter.filter_bm |= PBR_FILTER_FWMARK; - - /* NB PBR_FILTER_PCP should already be set by sender */ - - if (zpr.rule.filter.vlan_flags) - zpr.rule.filter.filter_bm |= PBR_FILTER_VLAN_FLAGS; + if (!zapi_pbr_rule_decode(s, &zpr.rule)) + goto stream_failure; - if (zpr.rule.filter.vlan_id) - zpr.rule.filter.filter_bm |= PBR_FILTER_VLAN_ID; + strlcpy(zpr.ifname, zpr.rule.ifname, sizeof(zpr.ifname)); if (!(zpr.rule.filter.src_ip.family == AF_INET || zpr.rule.filter.src_ip.family == AF_INET6)) { |
