2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 01:51:26 +00:00

netdev-offload-dpdk: Support ICMPv6 offload.

Add support for offloading packet match on ICMPv6 header
using rte_flow API.

Signed-off-by: Allen Chen <allen.chen@jaguarmicro.com>
Signed-off-by: Kevin Traynor <ktraynor@redhat.com>
This commit is contained in:
Allen Chen 2024-11-12 19:45:28 +08:00 committed by Kevin Traynor
parent b272282abb
commit 6f075ae4e5
2 changed files with 36 additions and 0 deletions

2
NEWS
View File

@ -25,6 +25,8 @@ Post-v3.4.0
formats.
- DPDK:
* OVS validated with DPDK 23.11.2.
* Add hardware offload support for matching ICMPv6 protocol
(experimental).
- Tunnels:
* LISP and STT tunnel port types are deprecated and will be removed in
the next release.

View File

@ -495,6 +495,23 @@ dump_flow_pattern(struct ds *s,
icmp_mask->hdr.icmp_code, 0);
}
ds_put_cstr(s, "/ ");
} else if (item->type == RTE_FLOW_ITEM_TYPE_ICMP6) {
const struct rte_flow_item_icmp6 *icmp6_spec = item->spec;
const struct rte_flow_item_icmp6 *icmp6_mask = item->mask;
ds_put_cstr(s, "icmpv6 ");
if (icmp6_spec) {
if (!icmp6_mask) {
icmp6_mask = &rte_flow_item_icmp6_mask;
}
DUMP_PATTERN_ITEM(icmp6_mask->type, false, "type",
"%"PRIu8, icmp6_spec->type,
icmp6_mask->type, 0);
DUMP_PATTERN_ITEM(icmp6_mask->code, false, "code",
"%"PRIu8, icmp6_spec->code,
icmp6_mask->code, 0);
}
ds_put_cstr(s, "/ ");
} else if (item->type == RTE_FLOW_ITEM_TYPE_TCP) {
const struct rte_flow_item_tcp *tcp_spec = item->spec;
const struct rte_flow_item_tcp *tcp_mask = item->mask;
@ -1608,6 +1625,7 @@ parse_flow_match(struct netdev *netdev,
if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP &&
proto != IPPROTO_SCTP && proto != IPPROTO_TCP &&
proto != IPPROTO_ICMPV6 &&
(match->wc.masks.tp_src ||
match->wc.masks.tp_dst ||
match->wc.masks.tcp_flags)) {
@ -1684,6 +1702,22 @@ parse_flow_match(struct netdev *netdev,
consumed_masks->tp_dst = 0;
add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ICMP, spec, mask, NULL);
} else if (proto == IPPROTO_ICMPV6) {
struct rte_flow_item_icmp6 *spec, *mask;
spec = xzalloc(sizeof *spec);
mask = xzalloc(sizeof *mask);
spec->type = (uint8_t) ntohs(match->flow.tp_src);
spec->code = (uint8_t) ntohs(match->flow.tp_dst);
mask->type = (uint8_t) ntohs(match->wc.masks.tp_src);
mask->code = (uint8_t) ntohs(match->wc.masks.tp_dst);
consumed_masks->tp_src = 0;
consumed_masks->tp_dst = 0;
add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ICMP6, spec, mask, NULL);
}
add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL, NULL);