Re: [ovs-dev] [PATCH V2 2/4] netdev-offload-dpdk: Support IPv4 fragmentation types

2021-08-27 Thread Maxime Coquelin



On 8/16/21 3:53 PM, Eli Britstein via dev wrote:
> Support IPv4 fragmentation matching.
> 
> Signed-off-by: Eli Britstein 
> ---
>  lib/netdev-offload-dpdk.c | 47 +--
>  1 file changed, 45 insertions(+), 2 deletions(-)
> 

Looks good to me:

Reviewed-by: Maxime Coquelin 

Thanks,
Maxime

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH V2 2/4] netdev-offload-dpdk: Support IPv4 fragmentation types

2021-08-16 Thread 0-day Robot
Bleep bloop.  Greetings Eli Britstein, I am a robot and I have tried out your 
patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
WARNING: Line is 80 characters long (recommended limit is 79)
#77 FILE: lib/netdev-offload-dpdk.c:1181:
mask->hdr.fragment_offset = htons(RTE_IPV4_HDR_OFFSET_MASK |

WARNING: Line is 82 characters long (recommended limit is 79)
#82 FILE: lib/netdev-offload-dpdk.c:1186:
spec->hdr.fragment_offset = htons(1 << 
RTE_IPV4_HDR_FO_SHIFT);

WARNING: Line is 80 characters long (recommended limit is 79)
#83 FILE: lib/netdev-offload-dpdk.c:1187:
mask->hdr.fragment_offset = htons(RTE_IPV4_HDR_OFFSET_MASK);

WARNING: Line is 80 characters long (recommended limit is 79)
#84 FILE: lib/netdev-offload-dpdk.c:1188:
last->hdr.fragment_offset = htons(RTE_IPV4_HDR_OFFSET_MASK);

Lines checked: 100, Warnings: 4, Errors: 0


Please check this out.  If you feel there has been an error, please email 
acon...@redhat.com

Thanks,
0-day Robot
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH V2 2/4] netdev-offload-dpdk: Support IPv4 fragmentation types

2021-08-16 Thread Eli Britstein via dev
Support IPv4 fragmentation matching.

Signed-off-by: Eli Britstein 
---
 lib/netdev-offload-dpdk.c | 47 +--
 1 file changed, 45 insertions(+), 2 deletions(-)

diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 769dc48d2..ee8e56fe0 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -250,12 +250,18 @@ dump_flow_pattern(struct ds *s,
 } else if (item->type == RTE_FLOW_ITEM_TYPE_IPV4) {
 const struct rte_flow_item_ipv4 *ipv4_spec = item->spec;
 const struct rte_flow_item_ipv4 *ipv4_mask = item->mask;
+const struct rte_flow_item_ipv4 *ipv4_last = item->last;
 
 ds_put_cstr(s, "ipv4 ");
 if (ipv4_spec) {
+ovs_be16 fragment_offset_mask;
+
 if (!ipv4_mask) {
 ipv4_mask = _flow_item_ipv4_mask;
 }
+if (!ipv4_last) {
+ipv4_last = _flow_item_ipv4_mask;
+}
 DUMP_PATTERN_ITEM(ipv4_mask->hdr.src_addr, false, "src", IP_FMT,
   IP_ARGS(ipv4_spec->hdr.src_addr),
   IP_ARGS(ipv4_mask->hdr.src_addr), IP_ARGS(0));
@@ -271,6 +277,16 @@ dump_flow_pattern(struct ds *s,
 DUMP_PATTERN_ITEM(ipv4_mask->hdr.time_to_live, false, "ttl",
   "0x%"PRIx8, ipv4_spec->hdr.time_to_live,
   ipv4_mask->hdr.time_to_live, 0);
+fragment_offset_mask = ipv4_mask->hdr.fragment_offset ==
+   htons(RTE_IPV4_HDR_OFFSET_MASK |
+ RTE_IPV4_HDR_MF_FLAG)
+   ? OVS_BE16_MAX
+   : ipv4_mask->hdr.fragment_offset;
+DUMP_PATTERN_ITEM(fragment_offset_mask, item->last,
+  "fragment_offset", "0x%"PRIx16,
+  ntohs(ipv4_spec->hdr.fragment_offset),
+  ntohs(ipv4_mask->hdr.fragment_offset),
+  ntohs(ipv4_last->hdr.fragment_offset));
 }
 ds_put_cstr(s, "/ ");
 } else if (item->type == RTE_FLOW_ITEM_TYPE_UDP) {
@@ -1129,7 +1145,7 @@ parse_flow_match(struct netdev *netdev,
 
 /* IP v4 */
 if (match->flow.dl_type == htons(ETH_TYPE_IP)) {
-struct rte_flow_item_ipv4 *spec, *mask;
+struct rte_flow_item_ipv4 *spec, *mask, *last = NULL;
 
 spec = xzalloc(sizeof *spec);
 mask = xzalloc(sizeof *mask);
@@ -1152,7 +1168,34 @@ parse_flow_match(struct netdev *netdev,
 consumed_masks->nw_src = 0;
 consumed_masks->nw_dst = 0;
 
-add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV4, spec, mask, NULL);
+if (match->wc.masks.nw_frag & FLOW_NW_FRAG_ANY) {
+if (!(match->flow.nw_frag & FLOW_NW_FRAG_ANY)) {
+/* frag=no. */
+spec->hdr.fragment_offset = 0;
+mask->hdr.fragment_offset = htons(RTE_IPV4_HDR_OFFSET_MASK |
+  RTE_IPV4_HDR_MF_FLAG);
+} else if (match->wc.masks.nw_frag & FLOW_NW_FRAG_LATER) {
+if (!(match->flow.nw_frag & FLOW_NW_FRAG_LATER)) {
+/* frag=first. */
+spec->hdr.fragment_offset = htons(RTE_IPV4_HDR_MF_FLAG);
+mask->hdr.fragment_offset = htons(RTE_IPV4_HDR_OFFSET_MASK 
|
+  RTE_IPV4_HDR_MF_FLAG);
+} else {
+/* frag=later. */
+last = xzalloc(sizeof *last);
+spec->hdr.fragment_offset = htons(1 << 
RTE_IPV4_HDR_FO_SHIFT);
+mask->hdr.fragment_offset = 
htons(RTE_IPV4_HDR_OFFSET_MASK);
+last->hdr.fragment_offset = 
htons(RTE_IPV4_HDR_OFFSET_MASK);
+}
+} else {
+VLOG_WARN_RL(, "Unknown IPv4 frag (0x%x/0x%x)",
+ match->flow.nw_frag, match->wc.masks.nw_frag);
+return -1;
+}
+consumed_masks->nw_frag = 0;
+}
+
+add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_IPV4, spec, mask, last);
 
 /* Save proto for L4 protocol setup. */
 proto = spec->hdr.next_proto_id &
-- 
2.28.0.2311.g225365fb51

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev