[ovs-dev] [PATCH] netdev-offload-dpdk : add ipv6 rte flow item support
From: Liu Chang Nowadays some Nics support hw offloading via dpdk rte_flow lib. Many layer2-layer4 fields can be offloaded to nics, including smac/dmac ipv4 sip/dip etc. Also some nics(including intel X710) supports ipv6 header offloading, but when we execute netdev_offload_dpdk_add_flow, there is no IPV6 rte_flow pattern. This patch adds support for IPV6 header hw-offload rte_flow pattern, including ipv6_label, nw_ttl, nw_proto, ipv6 sip and dip, also the corresponding mask filed is added. Signed-off-by: Liu Chang --- lib/netdev-offload-dpdk.c | 32 1 file changed, 32 insertions(+) diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index f8c46bbaa..f8d3a044a 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -635,6 +635,38 @@ parse_flow_match(struct flow_patterns *patterns, next_proto_mask = >hdr.next_proto_id; } +/* IP v6 */ +if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { +int i =0; +struct rte_flow_item_ipv6 *spec, *mask; + +spec = xzalloc(sizeof *spec); +mask = xzalloc(sizeof *mask); + +spec->hdr.vtc_flow= match->flow.ipv6_label; +spec->hdr.proto = match->flow.nw_proto; +spec->hdr.hop_limits = match->flow.nw_ttl; + +mask->hdr.vtc_flow= match->wc.masks.ipv6_label; +mask->hdr.proto = match->wc.masks.nw_proto; +mask->hdr.hop_limits = match->wc.masks.nw_ttl; + +for (i = 0; i < 16; i++) { + +spec->hdr.src_addr[i] = match->flow.ipv6_src.s6_addr[i]; +spec->hdr.dst_addr[i] = match->flow.ipv6_dst.s6_addr[i]; + +mask->hdr.src_addr[i] = match->wc.masks.ipv6_src.s6_addr[i]; +mask->hdr.dst_addr[i] = match->wc.masks.ipv6_dst.s6_addr[i]; +} + +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 = >hdr.proto; +} + if (proto != IPPROTO_ICMP && proto != IPPROTO_UDP && proto != IPPROTO_SCTP && proto != IPPROTO_TCP && (match->wc.masks.tp_src || -- 2.13.3 ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev
Re: [ovs-dev] [PATCH] netdev-offload-dpdk : add ipv6 rte flow item support
Hi Timo, Please try to format your patch in raw text. Thanks, Yifeng On Wed, Sep 11, 2019 at 7:55 PM Timo_Liu wrote: > > > > Nowadays some Nics support hw offloading via dpdk rte_flow lib. Many > layer2-layer4 fields can be offloaded to nics, including smac/dmac ipv4 > sip/dip etc. Also some nics(including intel X710) supports ipv6 header > offloading, but when we execute netdev_offload_dpdk_add_flow, there is no > IPV6 rte_flow pattern. > > > > > > This patch adds support for IPV6 header hw-offload rte_flow pattern, > including ipv6_label, nw_ttl, nw_proto, ipv6 sip and dip, also the > corresponding mask filed is added. > > > > > Signed-off-by: Liu Chang > > > > > > > diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c > > index 01e9004..ab3f82b 100644 > > --- a/lib/netdev-offload-dpdk.c > > +++ b/lib/netdev-offload-dpdk.c > > @@ -433,7 +433,10 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, > > struct flow_items { > > struct rte_flow_item_eth eth; > > struct rte_flow_item_vlan vlan; > > -struct rte_flow_item_ipv4 ipv4; > > +union { > > +struct rte_flow_item_ipv4 ipv4; > > +struct rte_flow_item_ipv6 ipv6; > > +}; > > union { > > struct rte_flow_item_tcp tcp; > > struct rte_flow_item_udp udp; > > @@ -503,6 +506,31 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, > > mask.ipv4.hdr.next_proto_id; > > } > > > > > +/* IP v6 */ > > +if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { > > +int i =0; > > + > > +spec.ipv6.hdr.vtc_flow = match->flow.ipv6_label; > > +spec.ipv6.hdr.proto = match->flow.nw_proto; > > +spec.ipv6.hdr.hop_limits = match->flow.nw_ttl; > > + > > +mask.ipv6.hdr.vtc_flow = match->wc.masks.ipv6_label; > > +mask.ipv6.hdr.proto = match->wc.masks.nw_proto; > > +mask.ipv6.hdr.hop_limits = match->wc.masks.nw_ttl; > > + > > > > +for (i = 0; i < 16; i++) { > > +spec.ipv6.hdr.src_addr[i] = match->flow.ipv6_src.s6_addr[i]; > > +spec.ipv6.hdr.dst_addr[i] = match->flow.ipv6_dst.s6_addr[i]; > > + > > +mask.ipv6.hdr.src_addr[i] = match->wc.masks.ipv6_src.s6_addr[i]; > > +mask.ipv6.hdr.dst_addr[i] = match->wc.masks.ipv6_dst.s6_addr[i]; > > +} > > + > > +add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV6, > > + spec.ipv6, mask.ipv6); > > + > > +} > > + > > if (proto != IPPROTO_ICMP proto != IPPROTO_UDP > > proto != IPPROTO_SCTP proto != IPPROTO_TCP > > (match->wc.masks.tp_src || > > > > > > > > > Best Regards > > Timo_liu > ___ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev
[ovs-dev] [PATCH] netdev-offload-dpdk : add ipv6 rte flow item support
Nowadays some Nics support hw offloading via dpdk rte_flow lib. Many layer2-layer4 fields can be offloaded to nics, including smac/dmac ipv4 sip/dip etc. Also some nics(including intel X710) supports ipv6 header offloading, but when we execute netdev_offload_dpdk_add_flow, there is no IPV6 rte_flow pattern. This patch adds support for IPV6 header hw-offload rte_flow pattern, including ipv6_label, nw_ttl, nw_proto, ipv6 sip and dip, also the corresponding mask filed is added. Signed-off-by: Liu Chang diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 01e9004..ab3f82b 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -433,7 +433,10 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, struct flow_items { struct rte_flow_item_eth eth; struct rte_flow_item_vlan vlan; -struct rte_flow_item_ipv4 ipv4; +union { +struct rte_flow_item_ipv4 ipv4; +struct rte_flow_item_ipv6 ipv6; +}; union { struct rte_flow_item_tcp tcp; struct rte_flow_item_udp udp; @@ -503,6 +506,31 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev, mask.ipv4.hdr.next_proto_id; } +/* IP v6 */ +if (match->flow.dl_type == htons(ETH_TYPE_IPV6)) { +int i =0; + +spec.ipv6.hdr.vtc_flow = match->flow.ipv6_label; +spec.ipv6.hdr.proto = match->flow.nw_proto; +spec.ipv6.hdr.hop_limits = match->flow.nw_ttl; + +mask.ipv6.hdr.vtc_flow = match->wc.masks.ipv6_label; +mask.ipv6.hdr.proto = match->wc.masks.nw_proto; +mask.ipv6.hdr.hop_limits = match->wc.masks.nw_ttl; + +for (i = 0; i < 16; i++) { +spec.ipv6.hdr.src_addr[i] = match->flow.ipv6_src.s6_addr[i]; +spec.ipv6.hdr.dst_addr[i] = match->flow.ipv6_dst.s6_addr[i]; + +mask.ipv6.hdr.src_addr[i] = match->wc.masks.ipv6_src.s6_addr[i]; +mask.ipv6.hdr.dst_addr[i] = match->wc.masks.ipv6_dst.s6_addr[i]; +} + +add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV6, + spec.ipv6, mask.ipv6); + +} + if (proto != IPPROTO_ICMP proto != IPPROTO_UDP proto != IPPROTO_SCTP proto != IPPROTO_TCP (match->wc.masks.tp_src || Best Regards Timo_liu ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev