pipeline: get table action params
Add API to specify action related parameters such as action handler, table entry data size, etc. for the pipeline table. Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
This commit is contained in:
parent
654dd41112
commit
406a2bc0c6
@ -56,5 +56,6 @@ EXPERIMENTAL {
|
||||
rte_table_action_profile_create;
|
||||
rte_table_action_profile_free;
|
||||
rte_table_action_profile_freeze;
|
||||
rte_table_action_table_params_get;
|
||||
|
||||
} DPDK_16.04;
|
||||
|
@ -267,6 +267,136 @@ rte_table_action_apply(struct rte_table_action *action,
|
||||
}
|
||||
}
|
||||
|
||||
static __rte_always_inline uint64_t
|
||||
pkt_work(struct rte_mbuf *mbuf __rte_unused,
|
||||
struct rte_pipeline_table_entry *table_entry __rte_unused,
|
||||
uint64_t time __rte_unused,
|
||||
struct rte_table_action *action __rte_unused,
|
||||
struct ap_config *cfg __rte_unused)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __rte_always_inline uint64_t
|
||||
pkt4_work(struct rte_mbuf **mbufs __rte_unused,
|
||||
struct rte_pipeline_table_entry **table_entries __rte_unused,
|
||||
uint64_t time __rte_unused,
|
||||
struct rte_table_action *action __rte_unused,
|
||||
struct ap_config *cfg __rte_unused)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __rte_always_inline int
|
||||
ah(struct rte_pipeline *p,
|
||||
struct rte_mbuf **pkts,
|
||||
uint64_t pkts_mask,
|
||||
struct rte_pipeline_table_entry **entries,
|
||||
struct rte_table_action *action,
|
||||
struct ap_config *cfg)
|
||||
{
|
||||
uint64_t pkts_drop_mask = 0;
|
||||
uint64_t time = 0;
|
||||
|
||||
if ((pkts_mask & (pkts_mask + 1)) == 0) {
|
||||
uint64_t n_pkts = __builtin_popcountll(pkts_mask);
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < (n_pkts & (~0x3LLU)); i += 4) {
|
||||
uint64_t drop_mask;
|
||||
|
||||
drop_mask = pkt4_work(&pkts[i],
|
||||
&entries[i],
|
||||
time,
|
||||
action,
|
||||
cfg);
|
||||
|
||||
pkts_drop_mask |= drop_mask << i;
|
||||
}
|
||||
|
||||
for ( ; i < n_pkts; i++) {
|
||||
uint64_t drop_mask;
|
||||
|
||||
drop_mask = pkt_work(pkts[i],
|
||||
entries[i],
|
||||
time,
|
||||
action,
|
||||
cfg);
|
||||
|
||||
pkts_drop_mask |= drop_mask << i;
|
||||
}
|
||||
} else
|
||||
for ( ; pkts_mask; ) {
|
||||
uint32_t pos = __builtin_ctzll(pkts_mask);
|
||||
uint64_t pkt_mask = 1LLU << pos;
|
||||
uint64_t drop_mask;
|
||||
|
||||
drop_mask = pkt_work(pkts[pos],
|
||||
entries[pos],
|
||||
time,
|
||||
action,
|
||||
cfg);
|
||||
|
||||
pkts_mask &= ~pkt_mask;
|
||||
pkts_drop_mask |= drop_mask << pos;
|
||||
}
|
||||
|
||||
rte_pipeline_ah_packet_drop(p, pkts_drop_mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
ah_default(struct rte_pipeline *p,
|
||||
struct rte_mbuf **pkts,
|
||||
uint64_t pkts_mask,
|
||||
struct rte_pipeline_table_entry **entries,
|
||||
void *arg)
|
||||
{
|
||||
struct rte_table_action *action = arg;
|
||||
|
||||
return ah(p,
|
||||
pkts,
|
||||
pkts_mask,
|
||||
entries,
|
||||
action,
|
||||
&action->cfg);
|
||||
}
|
||||
|
||||
static rte_pipeline_table_action_handler_hit
|
||||
ah_selector(struct rte_table_action *action)
|
||||
{
|
||||
if (action->cfg.action_mask == (1LLU << RTE_TABLE_ACTION_FWD))
|
||||
return NULL;
|
||||
|
||||
return ah_default;
|
||||
}
|
||||
|
||||
int
|
||||
rte_table_action_table_params_get(struct rte_table_action *action,
|
||||
struct rte_pipeline_table_params *params)
|
||||
{
|
||||
rte_pipeline_table_action_handler_hit f_action_hit;
|
||||
uint32_t total_size;
|
||||
|
||||
/* Check input arguments */
|
||||
if ((action == NULL) ||
|
||||
(params == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
f_action_hit = ah_selector(action);
|
||||
total_size = rte_align32pow2(action->data.total_size);
|
||||
|
||||
/* Fill in params */
|
||||
params->f_action_hit = f_action_hit;
|
||||
params->f_action_miss = NULL;
|
||||
params->arg_ah = (f_action_hit) ? action : NULL;
|
||||
params->action_data_size = total_size -
|
||||
sizeof(struct rte_pipeline_table_entry);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rte_table_action_free(struct rte_table_action *action)
|
||||
{
|
||||
|
@ -193,6 +193,20 @@ rte_table_action_create(struct rte_table_action_profile *profile,
|
||||
int __rte_experimental
|
||||
rte_table_action_free(struct rte_table_action *action);
|
||||
|
||||
/**
|
||||
* Table action table params get.
|
||||
*
|
||||
* @param[in] action
|
||||
* Handle to table action object (needs to be valid).
|
||||
* @param[inout] params
|
||||
* Pipeline table parameters (needs to be pre-allocated).
|
||||
* @return
|
||||
* Zero on success, non-zero error code otherwise.
|
||||
*/
|
||||
int __rte_experimental
|
||||
rte_table_action_table_params_get(struct rte_table_action *action,
|
||||
struct rte_pipeline_table_params *params);
|
||||
|
||||
/**
|
||||
* Table action apply.
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user