net/mlx4: fix default flow rule create
[dpdk.git] / lib / librte_pipeline / rte_table_action.c
index edb3340..8a2bb13 100644 (file)
@@ -107,14 +107,6 @@ mtr_cfg_check(struct rte_table_action_mtr_config *mtr)
        return 0;
 }
 
-#define MBUF_SCHED_QUEUE_TC_COLOR(queue, tc, color)        \
-       ((uint16_t)((((uint64_t)(queue)) & 0x3) |          \
-       ((((uint64_t)(tc)) & 0x3) << 2) |                  \
-       ((((uint64_t)(color)) & 0x3) << 4)))
-
-#define MBUF_SCHED_COLOR(sched, color)                     \
-       (((sched) & (~0x30LLU)) | ((color) << 4))
-
 struct mtr_trtcm_data {
        struct rte_meter_trtcm trtcm;
        uint64_t stats[e_RTE_METER_COLORS];
@@ -176,7 +168,7 @@ mtr_data_size(struct rte_table_action_mtr_config *mtr)
 struct dscp_table_entry_data {
        enum rte_meter_color color;
        uint16_t tc;
-       uint16_t queue_tc_color;
+       uint16_t tc_queue;
 };
 
 struct dscp_table_data {
@@ -319,8 +311,7 @@ pkt_work_mtr(struct rte_mbuf *mbuf,
        uint32_t dscp,
        uint16_t total_length)
 {
-       uint64_t drop_mask, sched;
-       uint64_t *sched_ptr = (uint64_t *) &mbuf->hash.sched;
+       uint64_t drop_mask;
        struct dscp_table_entry_data *dscp_entry = &dscp_table->entry[dscp];
        enum rte_meter_color color_in, color_meter, color_policer;
        uint32_t tc, mp_id;
@@ -329,7 +320,6 @@ pkt_work_mtr(struct rte_mbuf *mbuf,
        color_in = dscp_entry->color;
        data += tc;
        mp_id = MTR_TRTCM_DATA_METER_PROFILE_ID_GET(data);
-       sched = *sched_ptr;
 
        /* Meter */
        color_meter = rte_meter_trtcm_color_aware_check(
@@ -346,7 +336,7 @@ pkt_work_mtr(struct rte_mbuf *mbuf,
        drop_mask = MTR_TRTCM_DATA_POLICER_ACTION_DROP_GET(data, color_meter);
        color_policer =
                MTR_TRTCM_DATA_POLICER_ACTION_COLOR_GET(data, color_meter);
-       *sched_ptr = MBUF_SCHED_COLOR(sched, color_policer);
+       rte_mbuf_sched_color_set(mbuf, (uint8_t)color_policer);
 
        return drop_mask;
 }
@@ -368,9 +358,8 @@ tm_cfg_check(struct rte_table_action_tm_config *tm)
 }
 
 struct tm_data {
-       uint16_t queue_tc_color;
-       uint16_t subport;
-       uint32_t pipe;
+       uint32_t queue_id;
+       uint32_t reserved;
 } __attribute__((__packed__));
 
 static int
@@ -397,9 +386,9 @@ tm_apply(struct tm_data *data,
                return status;
 
        /* Apply */
-       data->queue_tc_color = 0;
-       data->subport = (uint16_t) p->subport_id;
-       data->pipe = p->pipe_id;
+       data->queue_id = p->subport_id <<
+                               (__builtin_ctz(cfg->n_pipes_per_subport) + 4) |
+                               p->pipe_id << 4;
 
        return 0;
 }
@@ -411,12 +400,11 @@ pkt_work_tm(struct rte_mbuf *mbuf,
        uint32_t dscp)
 {
        struct dscp_table_entry_data *dscp_entry = &dscp_table->entry[dscp];
-       struct tm_data *sched_ptr = (struct tm_data *) &mbuf->hash.sched;
-       struct tm_data sched;
-
-       sched = *data;
-       sched.queue_tc_color = dscp_entry->queue_tc_color;
-       *sched_ptr = sched;
+       uint32_t queue_id = data->queue_id |
+                               (dscp_entry->tc << 2) |
+                               dscp_entry->tc_queue;
+       rte_mbuf_sched_set(mbuf, queue_id, dscp_entry->tc,
+                               (uint8_t)dscp_entry->color);
 }
 
 /**
@@ -1694,10 +1682,9 @@ get_block_size(const struct rte_crypto_sym_xform *xform, uint8_t cdev_id)
 
        rte_cryptodev_info_get(cdev_id, &dev_info);
 
-       for (i = 0;; i++) {
+       for (i = 0; dev_info.capabilities[i].op != RTE_CRYPTO_OP_TYPE_UNDEFINED;
+                       i++) {
                cap = &dev_info.capabilities[i];
-               if (!cap)
-                       break;
 
                if (cap->sym.xform_type != xform->type)
                        continue;
@@ -2011,6 +1998,127 @@ pkt_work_sym_crypto(struct rte_mbuf *mbuf, struct sym_crypto_data *data,
        return 0;
 }
 
+/**
+ * RTE_TABLE_ACTION_TAG
+ */
+struct tag_data {
+       uint32_t tag;
+} __attribute__((__packed__));
+
+static int
+tag_apply(struct tag_data *data,
+       struct rte_table_action_tag_params *p)
+{
+       data->tag = p->tag;
+       return 0;
+}
+
+static __rte_always_inline void
+pkt_work_tag(struct rte_mbuf *mbuf,
+       struct tag_data *data)
+{
+       mbuf->hash.fdir.hi = data->tag;
+       mbuf->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+}
+
+static __rte_always_inline void
+pkt4_work_tag(struct rte_mbuf *mbuf0,
+       struct rte_mbuf *mbuf1,
+       struct rte_mbuf *mbuf2,
+       struct rte_mbuf *mbuf3,
+       struct tag_data *data0,
+       struct tag_data *data1,
+       struct tag_data *data2,
+       struct tag_data *data3)
+{
+       mbuf0->hash.fdir.hi = data0->tag;
+       mbuf1->hash.fdir.hi = data1->tag;
+       mbuf2->hash.fdir.hi = data2->tag;
+       mbuf3->hash.fdir.hi = data3->tag;
+
+       mbuf0->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+       mbuf1->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+       mbuf2->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+       mbuf3->ol_flags |= PKT_RX_FDIR | PKT_RX_FDIR_ID;
+}
+
+/**
+ * RTE_TABLE_ACTION_DECAP
+ */
+struct decap_data {
+       uint16_t n;
+} __attribute__((__packed__));
+
+static int
+decap_apply(struct decap_data *data,
+       struct rte_table_action_decap_params *p)
+{
+       data->n = p->n;
+       return 0;
+}
+
+static __rte_always_inline void
+pkt_work_decap(struct rte_mbuf *mbuf,
+       struct decap_data *data)
+{
+       uint16_t data_off = mbuf->data_off;
+       uint16_t data_len = mbuf->data_len;
+       uint32_t pkt_len = mbuf->pkt_len;
+       uint16_t n = data->n;
+
+       mbuf->data_off = data_off + n;
+       mbuf->data_len = data_len - n;
+       mbuf->pkt_len = pkt_len - n;
+}
+
+static __rte_always_inline void
+pkt4_work_decap(struct rte_mbuf *mbuf0,
+       struct rte_mbuf *mbuf1,
+       struct rte_mbuf *mbuf2,
+       struct rte_mbuf *mbuf3,
+       struct decap_data *data0,
+       struct decap_data *data1,
+       struct decap_data *data2,
+       struct decap_data *data3)
+{
+       uint16_t data_off0 = mbuf0->data_off;
+       uint16_t data_len0 = mbuf0->data_len;
+       uint32_t pkt_len0 = mbuf0->pkt_len;
+
+       uint16_t data_off1 = mbuf1->data_off;
+       uint16_t data_len1 = mbuf1->data_len;
+       uint32_t pkt_len1 = mbuf1->pkt_len;
+
+       uint16_t data_off2 = mbuf2->data_off;
+       uint16_t data_len2 = mbuf2->data_len;
+       uint32_t pkt_len2 = mbuf2->pkt_len;
+
+       uint16_t data_off3 = mbuf3->data_off;
+       uint16_t data_len3 = mbuf3->data_len;
+       uint32_t pkt_len3 = mbuf3->pkt_len;
+
+       uint16_t n0 = data0->n;
+       uint16_t n1 = data1->n;
+       uint16_t n2 = data2->n;
+       uint16_t n3 = data3->n;
+
+       mbuf0->data_off = data_off0 + n0;
+       mbuf0->data_len = data_len0 - n0;
+       mbuf0->pkt_len = pkt_len0 - n0;
+
+       mbuf1->data_off = data_off1 + n1;
+       mbuf1->data_len = data_len1 - n1;
+       mbuf1->pkt_len = pkt_len1 - n1;
+
+       mbuf2->data_off = data_off2 + n2;
+       mbuf2->data_len = data_len2 - n2;
+       mbuf2->pkt_len = pkt_len2 - n2;
+
+       mbuf3->data_off = data_off3 + n3;
+       mbuf3->data_len = data_len3 - n3;
+       mbuf3->pkt_len = pkt_len3 - n3;
+}
+
 /**
  * Action profile
  */
@@ -2028,6 +2136,8 @@ action_valid(enum rte_table_action_type action)
        case RTE_TABLE_ACTION_STATS:
        case RTE_TABLE_ACTION_TIME:
        case RTE_TABLE_ACTION_SYM_CRYPTO:
+       case RTE_TABLE_ACTION_TAG:
+       case RTE_TABLE_ACTION_DECAP:
                return 1;
        default:
                return 0;
@@ -2162,6 +2272,12 @@ action_data_size(enum rte_table_action_type action,
        case RTE_TABLE_ACTION_SYM_CRYPTO:
                return (sizeof(struct sym_crypto_data));
 
+       case RTE_TABLE_ACTION_TAG:
+               return sizeof(struct tag_data);
+
+       case RTE_TABLE_ACTION_DECAP:
+               return sizeof(struct decap_data);
+
        default:
                return 0;
        }
@@ -2419,6 +2535,14 @@ rte_table_action_apply(struct rte_table_action *action,
                                &action->cfg.sym_crypto,
                                action_params);
 
+       case RTE_TABLE_ACTION_TAG:
+               return tag_apply(action_data,
+                       action_params);
+
+       case RTE_TABLE_ACTION_DECAP:
+               return decap_apply(action_data,
+                       action_params);
+
        default:
                return -EINVAL;
        }
@@ -2444,17 +2568,13 @@ rte_table_action_dscp_table_update(struct rte_table_action *action,
                        &action->dscp_table.entry[i];
                struct rte_table_action_dscp_table_entry *entry =
                        &table->entry[i];
-               uint16_t queue_tc_color =
-                       MBUF_SCHED_QUEUE_TC_COLOR(entry->tc_queue_id,
-                               entry->tc_id,
-                               entry->color);
 
                if ((dscp_mask & (1LLU << i)) == 0)
                        continue;
 
                data->color = entry->color;
                data->tc = entry->tc_id;
-               data->queue_tc_color = queue_tc_color;
+               data->tc_queue = entry->tc_queue_id;
        }
 
        return 0;
@@ -2749,6 +2869,14 @@ pkt_work(struct rte_mbuf *mbuf,
                        dscp);
        }
 
+       if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) {
+               void *data = action_data_get(table_entry,
+                       action,
+                       RTE_TABLE_ACTION_DECAP);
+
+               pkt_work_decap(mbuf, data);
+       }
+
        if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
                void *data =
                        action_data_get(table_entry, action, RTE_TABLE_ACTION_ENCAP);
@@ -2803,6 +2931,14 @@ pkt_work(struct rte_mbuf *mbuf,
                                ip_offset);
        }
 
+       if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_TAG)) {
+               void *data = action_data_get(table_entry,
+                       action,
+                       RTE_TABLE_ACTION_TAG);
+
+               pkt_work_tag(mbuf, data);
+       }
+
        return drop_mask;
 }
 
@@ -2974,6 +3110,24 @@ pkt4_work(struct rte_mbuf **mbufs,
                        dscp3);
        }
 
+       if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_DECAP)) {
+               void *data0 = action_data_get(table_entry0,
+                       action,
+                       RTE_TABLE_ACTION_DECAP);
+               void *data1 = action_data_get(table_entry1,
+                       action,
+                       RTE_TABLE_ACTION_DECAP);
+               void *data2 = action_data_get(table_entry2,
+                       action,
+                       RTE_TABLE_ACTION_DECAP);
+               void *data3 = action_data_get(table_entry3,
+                       action,
+                       RTE_TABLE_ACTION_DECAP);
+
+               pkt4_work_decap(mbuf0, mbuf1, mbuf2, mbuf3,
+                       data0, data1, data2, data3);
+       }
+
        if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_ENCAP)) {
                void *data0 =
                        action_data_get(table_entry0, action, RTE_TABLE_ACTION_ENCAP);
@@ -3111,6 +3265,24 @@ pkt4_work(struct rte_mbuf **mbufs,
                                ip_offset);
        }
 
+       if (cfg->action_mask & (1LLU << RTE_TABLE_ACTION_TAG)) {
+               void *data0 = action_data_get(table_entry0,
+                       action,
+                       RTE_TABLE_ACTION_TAG);
+               void *data1 = action_data_get(table_entry1,
+                       action,
+                       RTE_TABLE_ACTION_TAG);
+               void *data2 = action_data_get(table_entry2,
+                       action,
+                       RTE_TABLE_ACTION_TAG);
+               void *data3 = action_data_get(table_entry3,
+                       action,
+                       RTE_TABLE_ACTION_TAG);
+
+               pkt4_work_tag(mbuf0, mbuf1, mbuf2, mbuf3,
+                       data0, data1, data2, data3);
+       }
+
        return drop_mask0 |
                (drop_mask1 << 1) |
                (drop_mask2 << 2) |