ethdev: use extension header for GTP PSC item
authorRaslan Darawsheh <rasland@nvidia.com>
Mon, 23 Aug 2021 10:55:39 +0000 (13:55 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 28 Sep 2021 10:34:58 +0000 (12:34 +0200)
This updates the gtp_psc flow item to use the net header
definition of the gtp_psc to be based on RFC 38415-g30

Signed-off-by: Raslan Darawsheh <rasland@nvidia.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
app/test-pmd/cmdline_flow.c
doc/guides/testpmd_app_ug/testpmd_funcs.rst
drivers/net/iavf/iavf_fdir.c
drivers/net/iavf/iavf_hash.c
drivers/net/ice/ice_fdir_filter.c
drivers/net/ice/ice_hash.c
drivers/net/ice/ice_switch_filter.c
drivers/net/mlx5/mlx5_flow.h
drivers/net/mlx5/mlx5_flow_dv.c
lib/ethdev/rte_flow.h

index 6cd99bf..bb22294 100644 (file)
@@ -3315,16 +3315,16 @@ static const struct token token_list[] = {
                .help = "QoS flow identifier",
                .next = NEXT(item_gtp_psc, NEXT_ENTRY(COMMON_UNSIGNED),
                             item_param),
-               .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gtp_psc,
-                                       qfi)),
+               .args = ARGS(ARGS_ENTRY_BF(struct rte_flow_item_gtp_psc,
+                                       hdr.qfi, 6)),
        },
        [ITEM_GTP_PSC_PDU_T] = {
                .name = "pdu_t",
                .help = "PDU type",
                .next = NEXT(item_gtp_psc, NEXT_ENTRY(COMMON_UNSIGNED),
                             item_param),
-               .args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_gtp_psc,
-                                       pdu_type)),
+               .args = ARGS(ARGS_ENTRY_BF(struct rte_flow_item_gtp_psc,
+                                       hdr.type, 4)),
        },
        [ITEM_PPPOES] = {
                .name = "pppoes",
@@ -8600,20 +8600,13 @@ cmd_set_raw_parsed(const struct buffer *in)
                                        *opt = item->spec;
                                struct {
                                        uint8_t len;
-                                       uint8_t pdu_type;
-                                       uint8_t qfi;
+                                       uint8_t pdu_type:4;
+                                       uint8_t qfi:6;
                                        uint8_t next;
                                } psc;
-
-                               if (opt->pdu_type & 0x0F) {
-                                       /* Support the minimal option only. */
-                                       fprintf(stderr,
-                                               "Error - GTP PSC option with extra fields not supported\n");
-                                       goto error;
-                               }
                                psc.len = sizeof(psc);
-                               psc.pdu_type = opt->pdu_type;
-                               psc.qfi = opt->qfi;
+                               psc.pdu_type = opt->hdr.type;
+                               psc.qfi = opt->hdr.qfi;
                                psc.next = 0;
                                *total_size += sizeof(psc);
                                rte_memcpy(data_tail - (*total_size),
index 4f8751b..bbef706 100644 (file)
@@ -3788,7 +3788,7 @@ This section lists supported pattern items and their attributes, if any.
 
   - ``pdu_type {unsigned}``: PDU type.
 
-  - ``qfi {unsigned}``: PPP, RQI and QoS flow identifier.
+  - ``qfi {unsigned}``: QoS flow identifier.
 
 - ``pppoes``, ``pppoed``: match PPPoE header.
 
index 560589a..ea2b692 100644 (file)
@@ -1161,21 +1161,22 @@ iavf_fdir_parse_pattern(__rte_unused struct iavf_adapter *ad,
 
                        if (!gtp_psc_spec)
                                VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH);
-                       else if ((gtp_psc_mask->qfi) && !(gtp_psc_mask->pdu_type))
+                       else if ((gtp_psc_mask->hdr.qfi) &&
+                               !(gtp_psc_mask->hdr.type))
                                VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH);
-                       else if (gtp_psc_spec->pdu_type == IAVF_GTPU_EH_UPLINK)
+                       else if (gtp_psc_spec->hdr.type == IAVF_GTPU_EH_UPLINK)
                                VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH_PDU_UP);
-                       else if (gtp_psc_spec->pdu_type == IAVF_GTPU_EH_DWLINK)
+                       else if (gtp_psc_spec->hdr.type == IAVF_GTPU_EH_DWLINK)
                                VIRTCHNL_SET_PROTO_HDR_TYPE(hdr, GTPU_EH_PDU_DWN);
 
                        if (gtp_psc_spec && gtp_psc_mask) {
-                               if (gtp_psc_mask->qfi == UINT8_MAX) {
+                               if (gtp_psc_mask->hdr.qfi == 0x3F) {
                                        input_set |= IAVF_INSET_GTPU_QFI;
-                                       if (gtp_psc_spec->pdu_type ==
+                                       if (gtp_psc_spec->hdr.type ==
                                                                IAVF_GTPU_EH_UPLINK)
                                                VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
                                                                                 GTPU_UP, QFI);
-                                       else if (gtp_psc_spec->pdu_type ==
+                                       else if (gtp_psc_spec->hdr.type ==
                                                                IAVF_GTPU_EH_DWLINK)
                                                VIRTCHNL_ADD_PROTO_HDR_FIELD_BIT(hdr,
                                                                                 GTPU_DWN, QFI);
index 03dae5d..589d7f6 100644 (file)
@@ -699,9 +699,9 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
                        psc = item->spec;
                        if (!psc)
                                break;
-                       else if (psc->pdu_type == IAVF_GTPU_EH_UPLINK)
+                       else if (psc->hdr.type == IAVF_GTPU_EH_UPLINK)
                                *phint |= IAVF_PHINT_GTPU_EH_UP;
-                       else if (psc->pdu_type == IAVF_GTPU_EH_DWNLINK)
+                       else if (psc->hdr.type == IAVF_GTPU_EH_DWNLINK)
                                *phint |= IAVF_PHINT_GTPU_EH_DWN;
                        break;
                case RTE_FLOW_ITEM_TYPE_ECPRI:
index af9669f..e0cca7c 100644 (file)
@@ -2106,11 +2106,11 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,
                        if (!(gtp_psc_spec && gtp_psc_mask))
                                break;
 
-                       if (gtp_psc_mask->qfi == UINT8_MAX)
+                       if (gtp_psc_mask->hdr.qfi == 0x3F)
                                input_set_o |= ICE_INSET_GTPU_QFI;
 
                        filter->input.gtpu_data.qfi =
-                               gtp_psc_spec->qfi;
+                               gtp_psc_spec->hdr.qfi;
                        break;
                case RTE_FLOW_ITEM_TYPE_ESP:
                        if (l3 == RTE_FLOW_ITEM_TYPE_IPV4 &&
index 175780c..545bf1b 100644 (file)
@@ -619,9 +619,9 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
                        psc = item->spec;
                        if (!psc)
                                break;
-                       else if (psc->pdu_type == ICE_GTPU_EH_UPLINK)
+                       else if (psc->hdr.type == ICE_GTPU_EH_UPLINK)
                                *phint |= ICE_PHINT_GTPU_EH_UP;
-                       else if (psc->pdu_type == ICE_GTPU_EH_DWNLINK)
+                       else if (psc->hdr.type == ICE_GTPU_EH_DWNLINK)
                                *phint |= ICE_PHINT_GTPU_EH_DWN;
                        break;
                default:
index f4f6cf2..6b0c1bf 100644 (file)
@@ -1371,7 +1371,7 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[],
                                return false;
                        }
                        if (gtp_psc_spec && gtp_psc_mask) {
-                               if (gtp_psc_mask->pdu_type) {
+                               if (gtp_psc_mask->hdr.type) {
                                        rte_flow_error_set(error, EINVAL,
                                                RTE_FLOW_ERROR_TYPE_ITEM,
                                                item,
@@ -1379,13 +1379,13 @@ ice_switch_parse_pattern(const struct rte_flow_item pattern[],
                                        return false;
                                }
                                input = &outer_input_set;
-                               if (gtp_psc_mask->qfi)
+                               if (gtp_psc_mask->hdr.qfi)
                                        *input |= ICE_INSET_GTPU_QFI;
                                list[t].type = ICE_GTP;
                                list[t].h_u.gtp_hdr.qfi =
-                                       gtp_psc_spec->qfi;
+                                       gtp_psc_spec->hdr.qfi;
                                list[t].m_u.gtp_hdr.qfi =
-                                       gtp_psc_mask->qfi;
+                                       gtp_psc_mask->hdr.qfi;
                                input_set_byte += 1;
                                t++;
                        }
index 76ad53f..5c68d4f 100644 (file)
@@ -397,9 +397,6 @@ enum mlx5_feature_name {
 /* GTP extension header flag. */
 #define MLX5_GTP_EXT_HEADER_FLAG 4
 
-/* GTP extension header max PDU type value. */
-#define MLX5_GTP_EXT_MAX_PDU_TYPE 15
-
 /* GTP extension header PDU type shift. */
 #define MLX5_GTP_PDU_TYPE_SHIFT(a) ((a) << 4)
 
index 15ca5cd..b610ad3 100644 (file)
@@ -2412,11 +2412,10 @@ flow_dv_validate_item_gtp_psc(const struct rte_flow_item *item,
 {
        const struct rte_flow_item_gtp *gtp_spec;
        const struct rte_flow_item_gtp *gtp_mask;
-       const struct rte_flow_item_gtp_psc *spec;
        const struct rte_flow_item_gtp_psc *mask;
        const struct rte_flow_item_gtp_psc nic_mask = {
-               .pdu_type = 0xFF,
-               .qfi = 0xFF,
+               .hdr.type = 0xF,
+               .hdr.qfi = 0x3F,
        };
 
        if (!gtp_item || !(last_item & MLX5_FLOW_LAYER_GTP))
@@ -2440,12 +2439,7 @@ flow_dv_validate_item_gtp_psc(const struct rte_flow_item *item,
        /* GTP spec is here and E flag is requested to match zero. */
        if (!item->spec)
                return 0;
-       spec = item->spec;
        mask = item->mask ? item->mask : &rte_flow_item_gtp_psc_mask;
-       if (spec->pdu_type > MLX5_GTP_EXT_MAX_PDU_TYPE)
-               return rte_flow_error_set
-                       (error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM, item,
-                        "PDU type should be smaller than 16");
        return mlx5_flow_item_acceptable(item, (const uint8_t *)mask,
                                         (const uint8_t *)&nic_mask,
                                         sizeof(struct rte_flow_item_gtp_psc),
@@ -9953,14 +9947,14 @@ flow_dv_translate_item_gtp_psc(void *matcher, void *key,
                if (!gtp_psc_m)
                        gtp_psc_m = &rte_flow_item_gtp_psc_mask;
                dw_0.w32 = 0;
-               dw_0.type_flags = MLX5_GTP_PDU_TYPE_SHIFT(gtp_psc_m->pdu_type);
-               dw_0.qfi = gtp_psc_m->qfi;
+               dw_0.type_flags = MLX5_GTP_PDU_TYPE_SHIFT(gtp_psc_m->hdr.type);
+               dw_0.qfi = gtp_psc_m->hdr.qfi;
                MLX5_SET(fte_match_set_misc3, misc3_m, gtpu_first_ext_dw_0,
                         rte_cpu_to_be_32(dw_0.w32));
                dw_0.w32 = 0;
-               dw_0.type_flags = MLX5_GTP_PDU_TYPE_SHIFT(gtp_psc_v->pdu_type &
-                                                       gtp_psc_m->pdu_type);
-               dw_0.qfi = gtp_psc_v->qfi & gtp_psc_m->qfi;
+               dw_0.type_flags = MLX5_GTP_PDU_TYPE_SHIFT(gtp_psc_v->hdr.type &
+                                                       gtp_psc_m->hdr.type);
+               dw_0.qfi = gtp_psc_v->hdr.qfi & gtp_psc_m->hdr.qfi;
                MLX5_SET(fte_match_set_misc3, misc3_v, gtpu_first_ext_dw_0,
                         rte_cpu_to_be_32(dw_0.w32));
        }
index 70f455d..7b1ed7f 100644 (file)
@@ -34,6 +34,7 @@
 #include <rte_mbuf.h>
 #include <rte_mbuf_dyn.h>
 #include <rte_meter.h>
+#include <rte_gtp.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -1444,15 +1445,14 @@ static const struct rte_flow_item_meta rte_flow_item_meta_mask = {
  * Matches a GTP PDU extension header with type 0x85.
  */
 struct rte_flow_item_gtp_psc {
-       uint8_t pdu_type; /**< PDU type. */
-       uint8_t qfi; /**< PPP, RQI, QoS flow identifier. */
+       struct rte_gtp_psc_generic_hdr hdr; /**< gtp psc generic hdr. */
 };
 
 /** Default mask for RTE_FLOW_ITEM_TYPE_GTP_PSC. */
 #ifndef __cplusplus
 static const struct rte_flow_item_gtp_psc
 rte_flow_item_gtp_psc_mask = {
-       .qfi = 0xff,
+       .hdr.qfi = 0x3f,
 };
 #endif