From: Pieter Jansen van Vuuren <[email protected]>

Implement ip fragmentation match offloading for both IPv4 and IPv6. Allows
offloading frag, nofrag, first and nofirstfrag classification.

Signed-off-by: Pieter Jansen van Vuuren <[email protected]>
Reviewed-by: Jakub Kicinski <[email protected]>
Signed-off-by: Simon Horman <[email protected]>
---
 drivers/net/ethernet/netronome/nfp/flower/cmsg.h    |  3 +++
 drivers/net/ethernet/netronome/nfp/flower/match.c   | 12 ++++++++++++
 drivers/net/ethernet/netronome/nfp/flower/offload.c | 15 +++++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h 
b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h
index db32f129aded..3f46d836d1b8 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/cmsg.h
+++ b/drivers/net/ethernet/netronome/nfp/flower/cmsg.h
@@ -61,6 +61,9 @@
 #define NFP_FLOWER_MASK_MPLS_BOS       BIT(8)
 #define NFP_FLOWER_MASK_MPLS_Q         BIT(0)
 
+#define NFP_FL_IP_FRAG_FIRST           BIT(7)
+#define NFP_FL_IP_FRAGMENTED           BIT(6)
+
 /* Compressed HW representation of TCP Flags */
 #define NFP_FL_TCP_FLAG_URG            BIT(4)
 #define NFP_FL_TCP_FLAG_PSH            BIT(3)
diff --git a/drivers/net/ethernet/netronome/nfp/flower/match.c 
b/drivers/net/ethernet/netronome/nfp/flower/match.c
index 26110670ba13..91935405f586 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/match.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/match.c
@@ -190,6 +190,18 @@ nfp_flower_compile_ip_ext(struct nfp_flower_ip_ext *frame,
                if (tcp_flags & TCPHDR_URG)
                        frame->flags |= NFP_FL_TCP_FLAG_URG;
        }
+
+       if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_CONTROL)) {
+               struct flow_dissector_key_control *key;
+
+               key = skb_flow_dissector_target(flow->dissector,
+                                               FLOW_DISSECTOR_KEY_CONTROL,
+                                               target);
+               if (key->flags & FLOW_DIS_IS_FRAGMENT)
+                       frame->flags |= NFP_FL_IP_FRAGMENTED;
+               if (key->flags & FLOW_DIS_FIRST_FRAG)
+                       frame->flags |= NFP_FL_IP_FRAG_FIRST;
+       }
 }
 
 static void
diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c 
b/drivers/net/ethernet/netronome/nfp/flower/offload.c
index f3586c519805..114d2ab02a38 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/offload.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c
@@ -48,6 +48,10 @@
        (TCPHDR_FIN | TCPHDR_SYN | TCPHDR_RST | \
         TCPHDR_PSH | TCPHDR_URG)
 
+#define NFP_FLOWER_SUPPORTED_CTLFLAGS \
+       (FLOW_DIS_IS_FRAGMENT | \
+        FLOW_DIS_FIRST_FRAG)
+
 #define NFP_FLOWER_WHITELIST_DISSECTOR \
        (BIT(FLOW_DISSECTOR_KEY_CONTROL) | \
         BIT(FLOW_DISSECTOR_KEY_BASIC) | \
@@ -322,6 +326,17 @@ nfp_flower_calculate_key_layers(struct nfp_app *app,
                }
        }
 
+       if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_CONTROL)) {
+               struct flow_dissector_key_control *key_ctl;
+
+               key_ctl = skb_flow_dissector_target(flow->dissector,
+                                                   FLOW_DISSECTOR_KEY_CONTROL,
+                                                   flow->key);
+
+               if (key_ctl->flags & ~NFP_FLOWER_SUPPORTED_CTLFLAGS)
+                       return -EOPNOTSUPP;
+       }
+
        ret_key_ls->key_layer = key_layer;
        ret_key_ls->key_layer_two = key_layer_two;
        ret_key_ls->key_size = key_size;
-- 
2.11.0

Reply via email to