pipeline: add table action for packet tag

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>
This commit is contained in:
Cristian Dumitrescu 2018-10-09 14:00:36 +01:00
parent b53258c14c
commit a63e06d706
2 changed files with 90 additions and 0 deletions

View 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) |

View 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.
*/