]> git.droids-corp.org - dpdk.git/commitdiff
net/ice/base: add non-word aligned IPv4 field support
authorQi Zhang <qi.z.zhang@intel.com>
Mon, 23 Sep 2019 07:44:21 +0000 (15:44 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 7 Oct 2019 13:00:55 +0000 (15:00 +0200)
Add non-word aligned field support for ipv4 with ttl, tos and proto.
All these fields are one byte within one word. In order to match
bytes within the IPv4 header for flow director we need to use a mask.

Signed-off-by: Junfeng Guo <junfeng.guo@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
drivers/net/ice/base/ice_fdir.c
drivers/net/ice/base/ice_fdir.h

index b92603e102dc6ec0fe05203e8827c2eb14e0e834..db5bbc6ade3c6a69d796ddde1dee5de46510d435 100644 (file)
@@ -484,6 +484,17 @@ static void ice_pkt_insert_ipv6_addr(u8 *pkt, int offset, __be32 *addr)
                           sizeof(*addr), ICE_NONDMA_TO_NONDMA);
 }
 
+/**
+ * ice_pkt_insert_u8 - insert a u8 value into a memory buffer.
+ * @pkt: packet buffer
+ * @offset: offset into buffer
+ * @data: 8 bit value to convert and insert into pkt at offset
+ */
+static void ice_pkt_insert_u8(u8 *pkt, int offset, u8 data)
+{
+       ice_memcpy(pkt + offset, &data, sizeof(data), ICE_NONDMA_TO_NONDMA);
+}
+
 /**
  * ice_pkt_insert_u16 - insert a be16 value into a memory buffer.
  * @pkt: packet buffer
@@ -534,11 +545,9 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                case ICE_IP_PROTO_SCTP:
                        flow = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;
                        break;
-               case ICE_IP_PROTO_IP:
+               default:
                        flow = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;
                        break;
-               default:
-                       return ICE_ERR_PARAM;
                }
        } else if (input->flow_type == ICE_FLTR_PTYPE_NONF_IPV6_OTHER) {
                switch (input->ip.v6.proto) {
@@ -551,11 +560,9 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                case ICE_IP_PROTO_SCTP:
                        flow = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;
                        break;
-               case ICE_IP_PROTO_IP:
+               default:
                        flow = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;
                        break;
-               default:
-                       return ICE_ERR_PARAM;
                }
        } else {
                flow = input->flow_type;
@@ -592,6 +599,8 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                                   input->ip.v4.src_ip);
                ice_pkt_insert_u16(loc, ICE_IPV4_TCP_SRC_PORT_OFFSET,
                                   input->ip.v4.src_port);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
                if (frag)
                        loc[20] = ICE_FDIR_IPV4_PKT_FLAG_DF;
                break;
@@ -604,6 +613,8 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                                   input->ip.v4.src_ip);
                ice_pkt_insert_u16(loc, ICE_IPV4_UDP_SRC_PORT_OFFSET,
                                   input->ip.v4.src_port);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
                break;
        case ICE_FLTR_PTYPE_NONF_IPV4_SCTP:
                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
@@ -614,13 +625,18 @@ ice_fdir_get_gen_prgm_pkt(struct ice_hw *hw, struct ice_fdir_fltr *input,
                                   input->ip.v4.src_ip);
                ice_pkt_insert_u16(loc, ICE_IPV4_SCTP_SRC_PORT_OFFSET,
                                   input->ip.v4.src_port);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
                break;
        case ICE_FLTR_PTYPE_NONF_IPV4_OTHER:
                ice_pkt_insert_u32(loc, ICE_IPV4_DST_ADDR_OFFSET,
                                   input->ip.v4.dst_ip);
                ice_pkt_insert_u32(loc, ICE_IPV4_SRC_ADDR_OFFSET,
                                   input->ip.v4.src_ip);
-               ice_pkt_insert_u16(loc, ICE_IPV4_PROTO_OFFSET, 0);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TOS_OFFSET, input->ip.v4.tos);
+               ice_pkt_insert_u8(loc, ICE_IPV4_TTL_OFFSET, input->ip.v4.ttl);
+               ice_pkt_insert_u8(loc, ICE_IPV4_PROTO_OFFSET,
+                                 input->ip.v4.proto);
                break;
        case ICE_FLTR_PTYPE_NONF_IPV6_TCP:
                ice_pkt_insert_ipv6_addr(loc, ICE_IPV6_DST_ADDR_OFFSET,
index 9e7e220332edcbdedfe84ed42cdf5adcbff50ae2..e817057c81498b4ee45b5dfa9bb1bae74e683cfe 100644 (file)
@@ -82,6 +82,9 @@ enum ice_status ice_clear_pf_fd_table(struct ice_hw *hw);
 #define ICE_IPV6_SCTP_SRC_PORT_OFFSET  54
 #define ICE_IPV6_SCTP_DST_PORT_OFFSET  56
 
+#define ICE_IPV4_TOS_OFFSET            15
+#define ICE_IPV4_TTL_OFFSET            22
+
 #define ICE_FDIR_MAX_FLTRS             16384
 
 /* IP v4 has 2 flag bits that enable fragment processing: DF and MF. DF
@@ -123,6 +126,7 @@ struct ice_fdir_v4 {
        u8 tos;
        u8 ip_ver;
        u8 proto;
+       u8 ttl;
 };
 
 #define ICE_IPV6_ADDR_LEN_AS_U32               4