[ovs-dev] [PATCH 36/62] [netdev-offload-dpdk];add ipv6 hw offload support && suppress non ipv4/ipv6 hw offload
Tao YunXiang
taoyunxiang at cmss.chinamobile.com
Mon Dec 28 09:24:54 UTC 2020
From: Rongyin <rongyin at cmss.chinamobile.com>
Code Source From: Self Code
Description:
Add ipv6 hw offload support && suppress non ipv4/ipv6 hw offload
Jira: #[Optional]
市场项目编号(名称):[Optional]
---
lib/netdev-offload-dpdk.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 11b04b5..13b46a5 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -856,6 +856,44 @@ parse_flow_match(struct flow_patterns *patterns,
return 0;
}
+ /* IP v6 */
+ if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) {
+ struct rte_flow_item_ipv6 *spec, *mask;
+
+ spec = xzalloc(sizeof *spec);
+ mask = xzalloc(sizeof *mask);
+
+ spec->hdr.proto = match->flow.nw_proto;
+ spec->hdr.hop_limits = match->flow.nw_ttl;
+ spec->hdr.vtc_flow = htonl((uint32_t)match->flow.nw_tos <<
+ RTE_IPV6_HDR_TC_SHIFT);
+ memcpy(spec->hdr.src_addr, &match->flow.ipv6_src,
+ sizeof spec->hdr.src_addr);
+ memcpy(spec->hdr.dst_addr, &match->flow.ipv6_dst,
+ sizeof spec->hdr.dst_addr);
+
+ mask->hdr.proto = match->wc.masks.nw_proto;
+ mask->hdr.hop_limits = match->wc.masks.nw_ttl;
+ mask->hdr.vtc_flow = htonl((uint32_t)match->wc.masks.nw_tos <<
+ RTE_IPV6_HDR_TC_SHIFT);
+ memcpy(mask->hdr.src_addr, &match->wc.masks.ipv6_src,
+ sizeof mask->hdr.src_addr);
+ memcpy(mask->hdr.dst_addr, &match->wc.masks.ipv6_dst,
+ sizeof mask->hdr.dst_addr);
+
+ consumed_masks->nw_proto = 0;
+ consumed_masks->nw_ttl = 0;
+ consumed_masks->nw_tos = 0;
+ memset(&consumed_masks->ipv6_src, 0, sizeof consumed_masks->ipv6_src);
+ memset(&consumed_masks->ipv6_dst, 0, sizeof consumed_masks->ipv6_dst);
+
+ add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV6, spec, mask);
+
+ /* Save proto for L4 protocol setup */
+ proto = spec->hdr.proto & mask->hdr.proto;
+ next_proto_mask = &mask->hdr.proto;
+ }
+
if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP &&
proto != IPPROTO_SCTP && proto != IPPROTO_TCP ){
VLOG_DBG("L4 Protocol (%u) not supported", proto);
@@ -1649,6 +1687,14 @@ netdev_offload_dpdk_validate_flow(const struct match *match)
}
*/
+ /* only offload ipv4/ipv6 */
+ if ((match->flow.dl_type != htons(ETH_TYPE_IP)) &&
+ (match->flow.dl_type != htons(ETH_TYPE_IPV6))) {
+ VLOG_DBG("RY DBG: dl_type=0x%04x no need to be offloaded",
+ ntohs(match->flow.dl_type));
+ return -1;
+ }
+
if (masks->ct_state || masks->ct_nw_proto ||
masks->ct_zone || masks->ct_mark ||
!ovs_u128_is_zero(masks->ct_label)) {
--
1.8.3.1
More information about the dev
mailing list