This patch adds default RSS support for IPv4 and IPv6 fragment packet.

Signed-off-by: Wenjun Wu <wenjun1...@intel.com>
---
 drivers/net/iavf/iavf_hash.c | 60 +++++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c
index 03dae5d999..e76d094aae 100644
--- a/drivers/net/iavf/iavf_hash.c
+++ b/drivers/net/iavf/iavf_hash.c
@@ -566,6 +566,29 @@ static struct iavf_flow_parser iavf_hash_parser = {
        .stage = IAVF_FLOW_STAGE_RSS,
 };
 
+static void
+iavf_hash_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer)
+{
+       struct virtchnl_proto_hdr *hdr1;
+       struct virtchnl_proto_hdr *hdr2;
+       int i;
+
+       if (layer < 0 || layer > hdrs->count)
+               return;
+
+       /* shift headers layer */
+       for (i = hdrs->count; i >= layer; i--) {
+               hdr1 = &hdrs->proto_hdr[i];
+               hdr2 = &hdrs->proto_hdr[i - 1];
+               *hdr1 = *hdr2;
+       }
+
+       /* adding dummy fragment header */
+       hdr1 = &hdrs->proto_hdr[layer];
+       VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG);
+       hdrs->count = ++layer;
+}
+
 int
 iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, bool add)
 {
@@ -580,7 +603,9 @@ iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t rss_hf, 
bool add)
        ETH_RSS_NONFRAG_IPV4_TCP | \
        ETH_RSS_NONFRAG_IPV6_TCP | \
        ETH_RSS_NONFRAG_IPV4_SCTP | \
-       ETH_RSS_NONFRAG_IPV6_SCTP)
+       ETH_RSS_NONFRAG_IPV6_SCTP | \
+       ETH_RSS_FRAG_IPV4 | \
+       ETH_RSS_FRAG_IPV6)
 
        rss_cfg.rss_algorithm = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC;
        if (rss_hf & ETH_RSS_IPV4) {
@@ -606,6 +631,10 @@ iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t 
rss_hf, bool add)
        if (rss_hf & ETH_RSS_IPV6) {
                rss_cfg.proto_hdrs = inner_ipv6_tmplt;
                iavf_add_del_rss_cfg(ad, &rss_cfg, add);
+               if (rss_hf & ETH_RSS_FRAG_IPV6) {
+                       rss_cfg.proto_hdrs = outer_ipv6_frag_tmplt;
+                       iavf_add_del_rss_cfg(ad, &rss_cfg, add);
+               }
        }
 
        if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP) {
@@ -623,6 +652,12 @@ iavf_rss_hash_set(struct iavf_adapter *ad, uint64_t 
rss_hf, bool add)
                iavf_add_del_rss_cfg(ad, &rss_cfg, add);
        }
 
+       if (rss_hf & ETH_RSS_FRAG_IPV4) {
+               rss_cfg.proto_hdrs = outer_ipv4_tmplt;
+               iavf_hash_add_fragment_hdr(&rss_cfg.proto_hdrs, 1);
+               iavf_add_del_rss_cfg(ad, &rss_cfg, add);
+       }
+
        vf->rss_hf = rss_hf & IAVF_RSS_HF_ALL;
        return 0;
 }
@@ -737,29 +772,6 @@ do { \
        REFINE_PROTO_FLD(ADD, fld_2);   \
 } while (0)
 
-static void
-iavf_hash_add_fragment_hdr(struct virtchnl_proto_hdrs *hdrs, int layer)
-{
-       struct virtchnl_proto_hdr *hdr1;
-       struct virtchnl_proto_hdr *hdr2;
-       int i;
-
-       if (layer < 0 || layer > hdrs->count)
-               return;
-
-       /* shift headers layer */
-       for (i = hdrs->count; i >= layer; i--) {
-               hdr1 = &hdrs->proto_hdr[i];
-               hdr2 = &hdrs->proto_hdr[i - 1];
-               *hdr1 = *hdr2;
-       }
-
-       /* adding dummy fragment header */
-       hdr1 = &hdrs->proto_hdr[layer];
-       VIRTCHNL_SET_PROTO_HDR_TYPE(hdr1, IPV4_FRAG);
-       hdrs->count = ++layer;
-}
-
 /* refine proto hdrs base on l2, l3, l4 rss type */
 static void
 iavf_refine_proto_hdrs_l234(struct virtchnl_proto_hdrs *proto_hdrs,
-- 
2.25.1

Reply via email to