app/flow-perf: add runtime option to use unique data
Current support for unique data is to compile with config.h var FIXED_VALUES as 0, and this is only supported on compilation time, as a result the user may use only single mode for each compilation. Starting with this commit the user will have the ability to use this feature on the fly by using this new option: --unique-data Example of unique data usage: Insert many rules with different encap data for a flows that have encap action in it. Signed-off-by: Wisam Jaddo <wisamm@nvidia.com> Acked-by: Alexander Kozyrev <akozyrev@nvidia.com>
This commit is contained in:
parent
b611605b05
commit
eb4df25f53
@ -30,6 +30,7 @@ struct additional_para {
|
||||
uint64_t encap_data;
|
||||
uint64_t decap_data;
|
||||
uint8_t core_idx;
|
||||
bool unique_data;
|
||||
};
|
||||
|
||||
/* Storage for struct rte_flow_action_raw_encap including external data. */
|
||||
@ -202,14 +203,14 @@ add_count(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_src_mac(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_mac set_macs[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t mac = para.counter;
|
||||
uint16_t i;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
mac = 1;
|
||||
|
||||
/* Mac address to be set is random each time */
|
||||
@ -225,14 +226,14 @@ add_set_src_mac(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_dst_mac(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_mac set_macs[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t mac = para.counter;
|
||||
uint16_t i;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
mac = 1;
|
||||
|
||||
/* Mac address to be set is random each time */
|
||||
@ -248,13 +249,13 @@ add_set_dst_mac(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_src_ipv4(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_ipv4 set_ipv4[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ip = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ip = 1;
|
||||
|
||||
/* IPv4 value to be set is random each time */
|
||||
@ -267,13 +268,13 @@ add_set_src_ipv4(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_dst_ipv4(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_ipv4 set_ipv4[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ip = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ip = 1;
|
||||
|
||||
/* IPv4 value to be set is random each time */
|
||||
@ -286,14 +287,14 @@ add_set_dst_ipv4(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_src_ipv6(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_ipv6 set_ipv6[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ipv6 = para.counter;
|
||||
uint8_t i;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ipv6 = 1;
|
||||
|
||||
/* IPv6 value to set is random each time */
|
||||
@ -309,14 +310,14 @@ add_set_src_ipv6(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_dst_ipv6(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_ipv6 set_ipv6[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ipv6 = para.counter;
|
||||
uint8_t i;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ipv6 = 1;
|
||||
|
||||
/* IPv6 value to set is random each time */
|
||||
@ -332,13 +333,13 @@ add_set_dst_ipv6(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_src_tp(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_tp set_tp[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t tp = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
tp = 100;
|
||||
|
||||
/* TP src port is random each time */
|
||||
@ -353,13 +354,13 @@ add_set_src_tp(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_dst_tp(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_tp set_tp[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t tp = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
tp = 100;
|
||||
|
||||
/* TP src port is random each time */
|
||||
@ -375,13 +376,13 @@ add_set_dst_tp(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_inc_tcp_ack(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static rte_be32_t value[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ack_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ack_value = 1;
|
||||
|
||||
value[para.core_idx] = RTE_BE32(ack_value);
|
||||
@ -393,13 +394,13 @@ add_inc_tcp_ack(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_dec_tcp_ack(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static rte_be32_t value[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ack_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ack_value = 1;
|
||||
|
||||
value[para.core_idx] = RTE_BE32(ack_value);
|
||||
@ -411,13 +412,13 @@ add_dec_tcp_ack(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_inc_tcp_seq(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static rte_be32_t value[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t seq_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
seq_value = 1;
|
||||
|
||||
value[para.core_idx] = RTE_BE32(seq_value);
|
||||
@ -429,13 +430,13 @@ add_inc_tcp_seq(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_dec_tcp_seq(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static rte_be32_t value[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t seq_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
seq_value = 1;
|
||||
|
||||
value[para.core_idx] = RTE_BE32(seq_value);
|
||||
@ -447,13 +448,13 @@ add_dec_tcp_seq(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_ttl(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_ttl set_ttl[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t ttl_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ttl_value = 1;
|
||||
|
||||
/* Set ttl to random value each time */
|
||||
@ -476,13 +477,13 @@ add_dec_ttl(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_ipv4_dscp(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_dscp set_dscp[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t dscp_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
dscp_value = 1;
|
||||
|
||||
/* Set dscp to random value each time */
|
||||
@ -497,13 +498,13 @@ add_set_ipv4_dscp(struct rte_flow_action *actions,
|
||||
static void
|
||||
add_set_ipv6_dscp(struct rte_flow_action *actions,
|
||||
uint8_t actions_counter,
|
||||
__rte_unused struct additional_para para)
|
||||
struct additional_para para)
|
||||
{
|
||||
static struct rte_flow_action_set_dscp set_dscp[RTE_MAX_LCORE] __rte_cache_aligned;
|
||||
uint32_t dscp_value = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
dscp_value = 1;
|
||||
|
||||
/* Set dscp to random value each time */
|
||||
@ -577,7 +578,7 @@ add_ipv4_header(uint8_t **header, uint64_t data,
|
||||
return;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ip_dst = 1;
|
||||
|
||||
memset(&ipv4_hdr, 0, sizeof(struct rte_ipv4_hdr));
|
||||
@ -643,7 +644,7 @@ add_vxlan_header(uint8_t **header, uint64_t data,
|
||||
return;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
vni_value = 1;
|
||||
|
||||
memset(&vxlan_hdr, 0, sizeof(struct rte_vxlan_hdr));
|
||||
@ -666,7 +667,7 @@ add_vxlan_gpe_header(uint8_t **header, uint64_t data,
|
||||
return;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
vni_value = 1;
|
||||
|
||||
memset(&vxlan_gpe_hdr, 0, sizeof(struct rte_vxlan_gpe_hdr));
|
||||
@ -707,7 +708,7 @@ add_geneve_header(uint8_t **header, uint64_t data,
|
||||
return;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
vni_value = 1;
|
||||
|
||||
memset(&geneve_hdr, 0, sizeof(struct rte_geneve_hdr));
|
||||
@ -730,7 +731,7 @@ add_gtp_header(uint8_t **header, uint64_t data,
|
||||
return;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
teid_value = 1;
|
||||
|
||||
memset(>p_hdr, 0, sizeof(struct rte_flow_item_gtp));
|
||||
@ -849,7 +850,7 @@ add_vxlan_encap(struct rte_flow_action *actions,
|
||||
uint32_t ip_dst = para.counter;
|
||||
|
||||
/* Fixed value */
|
||||
if (FIXED_VALUES)
|
||||
if (!para.unique_data)
|
||||
ip_dst = 1;
|
||||
|
||||
items[0].spec = &item_eth;
|
||||
@ -907,7 +908,8 @@ add_meter(struct rte_flow_action *actions,
|
||||
void
|
||||
fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
|
||||
uint32_t counter, uint16_t next_table, uint16_t hairpinq,
|
||||
uint64_t encap_data, uint64_t decap_data, uint8_t core_idx)
|
||||
uint64_t encap_data, uint64_t decap_data, uint8_t core_idx,
|
||||
bool unique_data)
|
||||
{
|
||||
struct additional_para additional_para_data;
|
||||
uint8_t actions_counter = 0;
|
||||
@ -930,6 +932,7 @@ fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
|
||||
.encap_data = encap_data,
|
||||
.decap_data = decap_data,
|
||||
.core_idx = core_idx,
|
||||
.unique_data = unique_data,
|
||||
};
|
||||
|
||||
if (hairpinq != 0) {
|
||||
|
@ -19,6 +19,7 @@
|
||||
|
||||
void fill_actions(struct rte_flow_action *actions, uint64_t *flow_actions,
|
||||
uint32_t counter, uint16_t next_table, uint16_t hairpinq,
|
||||
uint64_t encap_data, uint64_t decap_data, uint8_t core_idx);
|
||||
uint64_t encap_data, uint64_t decap_data, uint8_t core_idx,
|
||||
bool unique_data);
|
||||
|
||||
#endif /* FLOW_PERF_ACTION_GEN */
|
||||
|
@ -5,7 +5,7 @@
|
||||
#define FLOW_ITEM_MASK(_x) (UINT64_C(1) << _x)
|
||||
#define FLOW_ACTION_MASK(_x) (UINT64_C(1) << _x)
|
||||
#define FLOW_ATTR_MASK(_x) (UINT64_C(1) << _x)
|
||||
#define GET_RSS_HF() (ETH_RSS_IP | ETH_RSS_TCP)
|
||||
#define GET_RSS_HF() (ETH_RSS_IP)
|
||||
|
||||
/* Configuration */
|
||||
#define RXQ_NUM 4
|
||||
@ -19,12 +19,6 @@
|
||||
#define METER_CIR 1250000
|
||||
#define DEFAULT_METER_PROF_ID 100
|
||||
|
||||
/* This is used for encap/decap & header modify actions.
|
||||
* When it's 1: it means all actions have fixed values.
|
||||
* When it's 0: it means all actions will have different values.
|
||||
*/
|
||||
#define FIXED_VALUES 1
|
||||
|
||||
/* Items/Actions parameters */
|
||||
#define JUMP_ACTION_TABLE 2
|
||||
#define VLAN_VALUE 1
|
||||
|
@ -46,6 +46,7 @@ generate_flow(uint16_t port_id,
|
||||
uint64_t encap_data,
|
||||
uint64_t decap_data,
|
||||
uint8_t core_idx,
|
||||
bool unique_data,
|
||||
struct rte_flow_error *error)
|
||||
{
|
||||
struct rte_flow_attr attr;
|
||||
@ -61,7 +62,8 @@ generate_flow(uint16_t port_id,
|
||||
|
||||
fill_actions(actions, flow_actions,
|
||||
outer_ip_src, next_table, hairpinq,
|
||||
encap_data, decap_data, core_idx);
|
||||
encap_data, decap_data, core_idx,
|
||||
unique_data);
|
||||
|
||||
fill_items(items, flow_items, outer_ip_src, core_idx);
|
||||
|
||||
|
@ -35,6 +35,7 @@ generate_flow(uint16_t port_id,
|
||||
uint64_t encap_data,
|
||||
uint64_t decap_data,
|
||||
uint8_t core_idx,
|
||||
bool unique_data,
|
||||
struct rte_flow_error *error);
|
||||
|
||||
#endif /* FLOW_PERF_FLOW_GEN */
|
||||
|
@ -61,6 +61,7 @@ static bool dump_iterations;
|
||||
static bool delete_flag;
|
||||
static bool dump_socket_mem_flag;
|
||||
static bool enable_fwd;
|
||||
static bool unique_data;
|
||||
|
||||
static struct rte_mempool *mbuf_mp;
|
||||
static uint32_t nb_lcores;
|
||||
@ -131,6 +132,8 @@ usage(char *progname)
|
||||
printf(" --enable-fwd: To enable packets forwarding"
|
||||
" after insertion\n");
|
||||
printf(" --portmask=N: hexadecimal bitmask of ports used\n");
|
||||
printf(" --unique-data: flag to set using unique data for all"
|
||||
" actions that support data, such as header modify and encap actions\n");
|
||||
|
||||
printf("To set flow attributes:\n");
|
||||
printf(" --ingress: set ingress attribute in flows\n");
|
||||
@ -567,6 +570,7 @@ args_parse(int argc, char **argv)
|
||||
{ "deletion-rate", 0, 0, 0 },
|
||||
{ "dump-socket-mem", 0, 0, 0 },
|
||||
{ "enable-fwd", 0, 0, 0 },
|
||||
{ "unique-data", 0, 0, 0 },
|
||||
{ "portmask", 1, 0, 0 },
|
||||
{ "cores", 1, 0, 0 },
|
||||
/* Attributes */
|
||||
@ -762,6 +766,9 @@ args_parse(int argc, char **argv)
|
||||
if (strcmp(lgopts[opt_idx].name,
|
||||
"dump-iterations") == 0)
|
||||
dump_iterations = true;
|
||||
if (strcmp(lgopts[opt_idx].name,
|
||||
"unique-data") == 0)
|
||||
unique_data = true;
|
||||
if (strcmp(lgopts[opt_idx].name,
|
||||
"deletion-rate") == 0)
|
||||
delete_flag = true;
|
||||
@ -1173,7 +1180,7 @@ insert_flows(int port_id, uint8_t core_id)
|
||||
*/
|
||||
flow = generate_flow(port_id, 0, flow_attrs,
|
||||
global_items, global_actions,
|
||||
flow_group, 0, 0, 0, 0, core_id, &error);
|
||||
flow_group, 0, 0, 0, 0, core_id, unique_data, &error);
|
||||
|
||||
if (flow == NULL) {
|
||||
print_flow_error(error);
|
||||
@ -1189,7 +1196,7 @@ insert_flows(int port_id, uint8_t core_id)
|
||||
JUMP_ACTION_TABLE, counter,
|
||||
hairpin_queues_num,
|
||||
encap_data, decap_data,
|
||||
core_id, &error);
|
||||
core_id, unique_data, &error);
|
||||
|
||||
if (force_quit)
|
||||
counter = end_counter;
|
||||
@ -1860,6 +1867,7 @@ main(int argc, char **argv)
|
||||
delete_flag = false;
|
||||
dump_socket_mem_flag = false;
|
||||
flow_group = DEFAULT_GROUP;
|
||||
unique_data = false;
|
||||
|
||||
signal(SIGINT, signal_handler);
|
||||
signal(SIGTERM, signal_handler);
|
||||
@ -1875,7 +1883,6 @@ main(int argc, char **argv)
|
||||
if (nb_lcores <= 1)
|
||||
rte_exit(EXIT_FAILURE, "This app needs at least two cores\n");
|
||||
|
||||
|
||||
printf(":: Flows Count per port: %d\n\n", rules_count);
|
||||
|
||||
if (has_meter())
|
||||
|
@ -100,6 +100,11 @@ The command line options are:
|
||||
Set the number of needed cores to insert/delete rte_flow rules.
|
||||
Default cores count is 1.
|
||||
|
||||
* ``--unique-data``
|
||||
Flag to set using unique data for all actions that support data,
|
||||
Such as header modify and encap actions. Default is using fixed
|
||||
data for any action that support data for all flows.
|
||||
|
||||
Attributes:
|
||||
|
||||
* ``--ingress``
|
||||
|
Loading…
x
Reference in New Issue
Block a user