app/flow-perf: add runtime option to use unique data
authorWisam Jaddo <wisamm@nvidia.com>
Sun, 14 Mar 2021 09:54:22 +0000 (11:54 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 12 Apr 2021 13:51:04 +0000 (15:51 +0200)
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>
app/test-flow-perf/actions_gen.c
app/test-flow-perf/actions_gen.h
app/test-flow-perf/config.h
app/test-flow-perf/flow_gen.c
app/test-flow-perf/flow_gen.h
app/test-flow-perf/main.c
doc/guides/tools/flow-perf.rst

index 1f5c64f..82cddfc 100644 (file)
@@ -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(&gtp_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) {
index 77353cf..6f2f833 100644 (file)
@@ -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 */
index 3d4696d..a14d4e0 100644 (file)
@@ -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
 #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
index df4af16..8f87fac 100644 (file)
@@ -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);
 
index f1d0999..dc887fc 100644 (file)
@@ -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 */
index 029ce4f..faab179 100644 (file)
@@ -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())
index 017e200..280bf7e 100644 (file)
@@ -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``