@@ -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)) {
From: Rongyin <rongyin@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(+)