nfp: flower: refactor shared ip header in match offload
authorPieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com>
Mon, 26 Mar 2018 08:16:37 +0000 (10:16 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 26 Mar 2018 17:01:09 +0000 (13:01 -0400)
Refactored shared ip header code for IPv4 and IPv6 in match offload.

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

index 28c1cd5..db32f12 100644 (file)
@@ -260,6 +260,13 @@ struct nfp_flower_tp_ports {
        __be16 port_dst;
 };
 
+struct nfp_flower_ip_ext {
+       u8 tos;
+       u8 proto;
+       u8 ttl;
+       u8 flags;
+};
+
 /* L3 IPv4 details (3W/12B)
  *    3                   2                   1
  *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
@@ -272,10 +279,7 @@ struct nfp_flower_tp_ports {
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
 struct nfp_flower_ipv4 {
-       u8 tos;
-       u8 proto;
-       u8 ttl;
-       u8 flags;
+       struct nfp_flower_ip_ext ip_ext;
        __be32 ipv4_src;
        __be32 ipv4_dst;
 };
@@ -284,7 +288,7 @@ struct nfp_flower_ipv4 {
  *    3                   2                   1
  *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |    DSCP   |ECN|   protocol    |          reserved             |
+ * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * |   ipv6_exthdr   | res |            ipv6_flow_label            |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -306,10 +310,7 @@ struct nfp_flower_ipv4 {
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  */
 struct nfp_flower_ipv6 {
-       u8 tos;
-       u8 proto;
-       u8 ttl;
-       u8 reserved;
+       struct nfp_flower_ip_ext ip_ext;
        __be32 ipv6_flow_label_exthdr;
        struct in6_addr ipv6_src;
        struct in6_addr ipv6_dst;
index b3bc827..2611067 100644 (file)
@@ -146,26 +146,15 @@ nfp_flower_compile_tport(struct nfp_flower_tp_ports *frame,
 }
 
 static void
-nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
-                       struct tc_cls_flower_offload *flow,
-                       bool mask_version)
+nfp_flower_compile_ip_ext(struct nfp_flower_ip_ext *frame,
+                         struct tc_cls_flower_offload *flow,
+                         bool mask_version)
 {
        struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
-       struct flow_dissector_key_ipv4_addrs *addr;
-       struct flow_dissector_key_basic *basic;
-
-       memset(frame, 0, sizeof(struct nfp_flower_ipv4));
-
-       if (dissector_uses_key(flow->dissector,
-                              FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
-               addr = skb_flow_dissector_target(flow->dissector,
-                                                FLOW_DISSECTOR_KEY_IPV4_ADDRS,
-                                                target);
-               frame->ipv4_src = addr->src;
-               frame->ipv4_dst = addr->dst;
-       }
 
        if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
+               struct flow_dissector_key_basic *basic;
+
                basic = skb_flow_dissector_target(flow->dissector,
                                                  FLOW_DISSECTOR_KEY_BASIC,
                                                  target);
@@ -203,6 +192,28 @@ nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
        }
 }
 
+static void
+nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame,
+                       struct tc_cls_flower_offload *flow,
+                       bool mask_version)
+{
+       struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
+       struct flow_dissector_key_ipv4_addrs *addr;
+
+       memset(frame, 0, sizeof(struct nfp_flower_ipv4));
+
+       if (dissector_uses_key(flow->dissector,
+                              FLOW_DISSECTOR_KEY_IPV4_ADDRS)) {
+               addr = skb_flow_dissector_target(flow->dissector,
+                                                FLOW_DISSECTOR_KEY_IPV4_ADDRS,
+                                                target);
+               frame->ipv4_src = addr->src;
+               frame->ipv4_dst = addr->dst;
+       }
+
+       nfp_flower_compile_ip_ext(&frame->ip_ext, flow, mask_version);
+}
+
 static void
 nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
                        struct tc_cls_flower_offload *flow,
@@ -210,7 +221,6 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
 {
        struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
        struct flow_dissector_key_ipv6_addrs *addr;
-       struct flow_dissector_key_basic *basic;
 
        memset(frame, 0, sizeof(struct nfp_flower_ipv6));
 
@@ -223,22 +233,7 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame,
                frame->ipv6_dst = addr->dst;
        }
 
-       if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) {
-               basic = skb_flow_dissector_target(flow->dissector,
-                                                 FLOW_DISSECTOR_KEY_BASIC,
-                                                 target);
-               frame->proto = basic->ip_proto;
-       }
-
-       if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_IP)) {
-               struct flow_dissector_key_ip *flow_ip;
-
-               flow_ip = skb_flow_dissector_target(flow->dissector,
-                                                   FLOW_DISSECTOR_KEY_IP,
-                                                   target);
-               frame->tos = flow_ip->tos;
-               frame->ttl = flow_ip->ttl;
-       }
+       nfp_flower_compile_ip_ext(&frame->ip_ext, flow, mask_version);
 }
 
 static void