Add virtchnl protocol header and field definitions for advanced RSS
configuration including GTPC, GTPU, L2TPv2, ECPRI, PPP, GRE, and IP
fragment headers.

- Define new virtchnl protocol header types
- Add RSS field selectors for tunnel protocols
- Extend static mapping arrays for protocol field matching
- Add L2TPv2 session ID and length+session ID field support

This provides the foundational definitions needed for VF RSS
configuration of tunnel protocols.

Co-developed-by: Dan Nowlin <[email protected]>
Signed-off-by: Dan Nowlin <[email protected]>
Co-developed-by: Jie Wang <[email protected]>
Signed-off-by: Jie Wang <[email protected]>
Co-developed-by: Junfeng Guo <[email protected]>
Signed-off-by: Junfeng Guo <[email protected]>
Co-developed-by: Qi Zhang <[email protected]>
Signed-off-by: Qi Zhang <[email protected]>
Co-developed-by: Ting Xu <[email protected]>
Signed-off-by: Ting Xu <[email protected]>
Signed-off-by: Przemek Kitszel <[email protected]>
Signed-off-by: Aleksandr Loktionov <[email protected]>
---
 drivers/net/ethernet/intel/ice/virt/rss.c | 91 +++++++++++++++++++++++
 include/linux/avf/virtchnl.h              | 48 ++++++++++++
 2 files changed, 139 insertions(+)

diff --git a/drivers/net/ethernet/intel/ice/virt/rss.c 
b/drivers/net/ethernet/intel/ice/virt/rss.c
index cbdbb32..71d7db6 100644
--- a/drivers/net/ethernet/intel/ice/virt/rss.c
+++ b/drivers/net/ethernet/intel/ice/virt/rss.c
@@ -36,6 +36,13 @@ static const struct ice_vc_hdr_match_type ice_vc_hdr_list[] 
= {
        {VIRTCHNL_PROTO_HDR_ESP,        ICE_FLOW_SEG_HDR_ESP},
        {VIRTCHNL_PROTO_HDR_AH,         ICE_FLOW_SEG_HDR_AH},
        {VIRTCHNL_PROTO_HDR_PFCP,       ICE_FLOW_SEG_HDR_PFCP_SESSION},
+       {VIRTCHNL_PROTO_HDR_GTPC,       ICE_FLOW_SEG_HDR_GTPC},
+       {VIRTCHNL_PROTO_HDR_L2TPV2,     ICE_FLOW_SEG_HDR_L2TPV2},
+       {VIRTCHNL_PROTO_HDR_PPP,        ICE_FLOW_SEG_HDR_PPP},
+       {VIRTCHNL_PROTO_HDR_ECPRI,      ICE_FLOW_SEG_HDR_ECPRI_TP0},
+       {VIRTCHNL_PROTO_HDR_IPV4_FRAG,  ICE_FLOW_SEG_HDR_IPV_FRAG},
+       {VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,       ICE_FLOW_SEG_HDR_IPV_FRAG},
+       {VIRTCHNL_PROTO_HDR_GRE,        ICE_FLOW_SEG_HDR_GRE},
 };
 
 struct ice_vc_hash_field_match_type {
@@ -149,6 +156,90 @@ ice_vc_hash_field_match_type ice_vc_hash_field_list[] = {
        {VIRTCHNL_PROTO_HDR_L2TPV3,
                FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV3_SESS_ID),
                BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID)},
+       {VIRTCHNL_PROTO_HDR_L2TPV2,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV2_SESS_ID)},
+       {VIRTCHNL_PROTO_HDR_L2TPV2,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV2_LEN_SESS_ID)},
+       {VIRTCHNL_PROTO_HDR_PPP,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_PPP_PROTO_ID),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_PPP_PROTO_ID)},
+       {VIRTCHNL_PROTO_HDR_GTPC,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GTPC_TEID),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_GTPC_TEID)},
+       {VIRTCHNL_PROTO_HDR_IPV4,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_CHKSUM),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_CHKSUM)},
+       {VIRTCHNL_PROTO_HDR_IPV4,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV4_ID),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_ID)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_TC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_TC)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_HOP_LIMIT),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_HLIM)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX32_SRC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX32_DST),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX40_SRC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE40_SA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX40_DST),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE40_DA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX48_SRC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX48_DST),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX56_SRC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE56_SA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX56_DST),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE56_DA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_SRC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE96_SA)},
+       {VIRTCHNL_PROTO_HDR_IPV6,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE96_DA)},
+       {VIRTCHNL_PROTO_HDR_TCP,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_TCP_CHKSUM),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_CHKSUM)},
+       {VIRTCHNL_PROTO_HDR_UDP,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_UDP_CHKSUM),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_CHKSUM)},
+       {VIRTCHNL_PROTO_HDR_GRE,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_GRE_PROTO),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_GRE_PROTO)},
+       {VIRTCHNL_PROTO_HDR_ECPRI,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_MSG_TYPE),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_ECPRI_TP0_MSG_TYPE)},
+       {VIRTCHNL_PROTO_HDR_ECPRI,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_ECPRI_TP0_PC_ID)},
+       {VIRTCHNL_PROTO_HDR_ECPRI,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_REV),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_ECPRI_TP0_REV)},
+       {VIRTCHNL_PROTO_HDR_ECPRI,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_CONCAT),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_ECPRI_TP0_CONCAT)},
+       {VIRTCHNL_PROTO_HDR_ECPRI,
+               FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ECPRI_MSG_LEN),
+               BIT_ULL(ICE_FLOW_FIELD_IDX_ECPRI_TP0_MSG_LEN)},
        {VIRTCHNL_PROTO_HDR_ESP, FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_ESP_SPI),
                BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)},
        {VIRTCHNL_PROTO_HDR_AH, FIELD_SELECTOR(VIRTCHNL_PROTO_HDR_AH_SPI),
diff --git a/include/linux/avf/virtchnl.h b/include/linux/avf/virtchnl.h
index 5be1881..b0d5164 100644
--- a/include/linux/avf/virtchnl.h
+++ b/include/linux/avf/virtchnl.h
@@ -1253,6 +1253,17 @@ enum virtchnl_proto_hdr_type {
        VIRTCHNL_PROTO_HDR_ESP,
        VIRTCHNL_PROTO_HDR_AH,
        VIRTCHNL_PROTO_HDR_PFCP,
+       VIRTCHNL_PROTO_HDR_GTPC,
+       VIRTCHNL_PROTO_HDR_ECPRI,
+       VIRTCHNL_PROTO_HDR_L2TPV2,
+       VIRTCHNL_PROTO_HDR_PPP,
+       /* IPv4 and IPv6 Fragment header types are only associated to
+        * VIRTCHNL_PROTO_HDR_IPV4 and VIRTCHNL_PROTO_HDR_IPV6 respectively,
+        * cannot be used independently.
+        */
+       VIRTCHNL_PROTO_HDR_IPV4_FRAG,
+       VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
+       VIRTCHNL_PROTO_HDR_GRE,
 };
 
 /* Protocol header field within a protocol header. */
@@ -1275,6 +1286,8 @@ enum virtchnl_proto_hdr_field {
        VIRTCHNL_PROTO_HDR_IPV4_DSCP,
        VIRTCHNL_PROTO_HDR_IPV4_TTL,
        VIRTCHNL_PROTO_HDR_IPV4_PROT,
+       VIRTCHNL_PROTO_HDR_IPV4_CHKSUM,
+       VIRTCHNL_PROTO_HDR_IPV4_ID,
        /* IPV6 */
        VIRTCHNL_PROTO_HDR_IPV6_SRC =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1282,14 +1295,29 @@ enum virtchnl_proto_hdr_field {
        VIRTCHNL_PROTO_HDR_IPV6_TC,
        VIRTCHNL_PROTO_HDR_IPV6_HOP_LIMIT,
        VIRTCHNL_PROTO_HDR_IPV6_PROT,
+       /* IPV6 Prefix */
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX32_SRC,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX32_DST,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX40_SRC,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX40_DST,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX48_SRC,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX48_DST,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX56_SRC,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX56_DST,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_SRC,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
+       VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
        /* TCP */
        VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
        VIRTCHNL_PROTO_HDR_TCP_DST_PORT,
+       VIRTCHNL_PROTO_HDR_TCP_CHKSUM,
        /* UDP */
        VIRTCHNL_PROTO_HDR_UDP_SRC_PORT =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_UDP),
        VIRTCHNL_PROTO_HDR_UDP_DST_PORT,
+       VIRTCHNL_PROTO_HDR_UDP_CHKSUM,
        /* SCTP */
        VIRTCHNL_PROTO_HDR_SCTP_SRC_PORT =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_SCTP),
@@ -1317,6 +1345,26 @@ enum virtchnl_proto_hdr_field {
        VIRTCHNL_PROTO_HDR_PFCP_S_FIELD =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PFCP),
        VIRTCHNL_PROTO_HDR_PFCP_SEID,
+       /* GTPC */
+       VIRTCHNL_PROTO_HDR_GTPC_TEID =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GTPC),
+       /* L2TPV2 */
+       VIRTCHNL_PROTO_HDR_L2TPV2_SESS_ID =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_L2TPV2),
+       VIRTCHNL_PROTO_HDR_L2TPV2_LEN_SESS_ID,
+       /* PPP */
+       VIRTCHNL_PROTO_HDR_PPP_PROTO_ID =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_PPP),
+       /* GRE */
+       VIRTCHNL_PROTO_HDR_GRE_PROTO =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_GRE),
+       /* ECPRI */
+       VIRTCHNL_PROTO_HDR_ECPRI_MSG_TYPE =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ECPRI),
+       VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID,
+       VIRTCHNL_PROTO_HDR_ECPRI_REV,
+       VIRTCHNL_PROTO_HDR_ECPRI_CONCAT,
+       VIRTCHNL_PROTO_HDR_ECPRI_MSG_LEN,
 };
 
 struct virtchnl_proto_hdr {
-- 
2.49.0

Reply via email to