pipeline: add table action for packet tag
authorCristian Dumitrescu <cristian.dumitrescu@intel.com>
Tue, 9 Oct 2018 13:00:36 +0000 (14:00 +0100)
committerCristian Dumitrescu <cristian.dumitrescu@intel.com>
Fri, 12 Oct 2018 17:33:26 +0000 (19:33 +0200)
This patch introduces the packet tag table action which attaches
a 32-bit value (the tag) to the current input packet. The tag is
read from the current table entry. The tag is written into the
mbuf->hash.fdir.hi and the flags PKT_RX_FDIR and PKT_RX_FDIR_ID
are set into mbuf->ol_flags.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
lib/librte_pipeline/rte_table_action.c
lib/librte_pipeline/rte_table_action.h

index edb3340..fb7eaf9 100644 (file)
@@ -2011,6 +2011,50 @@ 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;
+}
+
 /**
  * Action profile
  */
@@ -2028,6 +2072,7 @@ 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:
                return 1;
        default:
                return 0;
@@ -2162,6 +2207,9 @@ 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);
+
        default:
                return 0;
        }
@@ -2419,6 +2467,10 @@ 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);
+
        default:
                return -EINVAL;
        }
@@ -2803,6 +2855,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;
 }
 
@@ -3111,6 +3171,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) |
index e8a7b66..5dbb147 100644 (file)
@@ -96,6 +96,9 @@ enum rte_table_action_type {
 
        /** Crypto. */
        RTE_TABLE_ACTION_SYM_CRYPTO,
+
+       /** Tag. */
+       RTE_TABLE_ACTION_TAG,
 };
 
 /** Common action configuration (per table action profile). */
@@ -770,6 +773,15 @@ struct rte_table_action_sym_crypto_params {
        };
 };
 
+/**
+ * RTE_TABLE_ACTION_TAG
+ */
+/** Tag action parameters (per table rule). */
+struct rte_table_action_tag_params {
+       /** Tag to be attached to the input packet. */
+       uint32_t tag;
+};
+
 /**
  * Table action profile.
  */