nfp: flower: implement ip fragmentation match offload
authorPieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Mon, 26 Mar 2018 08:16:38 +0000 (10:16 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Mar 2018 17:01:09 +0000 (13:01 -0400)
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 <pieter.jansenvanvuuren@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/flower/cmsg.h
drivers/net/ethernet/netronome/nfp/flower/match.c
drivers/net/ethernet/netronome/nfp/flower/offload.c

index db32f129aded64ec0f8b2297f9533a237700780b..3f46d836d1b8fd6d74cef17dfaadf41d581b216a 100644 (file)
@@ -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)
index 26110670ba13d30b2e65fb2ee2dcc3ee4f9dfb40..91935405f5861678077c188328d365ed5cb2ba7f 100644 (file)
@@ -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
index f3586c5198050ccbbb0e039d81a508901b16c2c3..114d2ab02a389d11645ad2cee3b27f6a0d5597a3 100644 (file)
        (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;