net/virtio: improve perf via one-way barriers on used flag
[dpdk.git] / drivers / net / softnic / rte_eth_softnic_cli.c
index 410eb54..bc95f16 100644 (file)
@@ -566,8 +566,7 @@ queue_node_id(uint32_t n_spp __rte_unused,
        uint32_t tc_id,
        uint32_t queue_id)
 {
-       return queue_id +
-               tc_id * RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE +
+       return queue_id + tc_id +
                (pipe_id + subport_id * n_pps) * RTE_SCHED_QUEUES_PER_PIPE;
 }
 
@@ -617,10 +616,20 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
                },
        };
 
+       uint32_t *shared_shaper_id =
+               (uint32_t *)calloc(RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE,
+                       sizeof(uint32_t));
+
+       if (shared_shaper_id == NULL)
+               return -1;
+
+       memcpy(shared_shaper_id, params->shared_shaper_id.tc,
+               sizeof(params->shared_shaper_id.tc));
+
        struct rte_tm_node_params tc_node_params[] = {
                [0] = {
                        .shaper_profile_id = params->shaper_profile_id.tc[0],
-                       .shared_shaper_id = &params->shared_shaper_id.tc[0],
+                       .shared_shaper_id = &shared_shaper_id[0],
                        .n_shared_shapers =
                                (&params->shared_shaper_id.tc_valid[0]) ? 1 : 0,
                        .nonleaf = {
@@ -630,7 +639,7 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
 
                [1] = {
                        .shaper_profile_id = params->shaper_profile_id.tc[1],
-                       .shared_shaper_id = &params->shared_shaper_id.tc[1],
+                       .shared_shaper_id = &shared_shaper_id[1],
                        .n_shared_shapers =
                                (&params->shared_shaper_id.tc_valid[1]) ? 1 : 0,
                        .nonleaf = {
@@ -640,7 +649,7 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
 
                [2] = {
                        .shaper_profile_id = params->shaper_profile_id.tc[2],
-                       .shared_shaper_id = &params->shared_shaper_id.tc[2],
+                       .shared_shaper_id = &shared_shaper_id[2],
                        .n_shared_shapers =
                                (&params->shared_shaper_id.tc_valid[2]) ? 1 : 0,
                        .nonleaf = {
@@ -650,13 +659,103 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
 
                [3] = {
                        .shaper_profile_id = params->shaper_profile_id.tc[3],
-                       .shared_shaper_id = &params->shared_shaper_id.tc[3],
+                       .shared_shaper_id = &shared_shaper_id[3],
                        .n_shared_shapers =
                                (&params->shared_shaper_id.tc_valid[3]) ? 1 : 0,
                        .nonleaf = {
                                .n_sp_priorities = 1,
                        },
                },
+
+               [4] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[4],
+                       .shared_shaper_id = &shared_shaper_id[4],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[4]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [5] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[5],
+                       .shared_shaper_id = &shared_shaper_id[5],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[5]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [6] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[6],
+                       .shared_shaper_id = &shared_shaper_id[6],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[6]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [7] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[7],
+                       .shared_shaper_id = &shared_shaper_id[7],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[7]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [8] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[8],
+                       .shared_shaper_id = &shared_shaper_id[8],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[8]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [9] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[9],
+                       .shared_shaper_id = &shared_shaper_id[9],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[9]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [10] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[10],
+                       .shared_shaper_id = &shared_shaper_id[10],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[10]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [11] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[11],
+                       .shared_shaper_id = &shared_shaper_id[11],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[11]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
+
+               [12] = {
+                       .shaper_profile_id = params->shaper_profile_id.tc[12],
+                       .shared_shaper_id = &shared_shaper_id[12],
+                       .n_shared_shapers =
+                               (&params->shared_shaper_id.tc_valid[12]) ? 1 : 0,
+                       .nonleaf = {
+                               .n_sp_priorities = 1,
+                       },
+               },
        };
 
        struct rte_tm_node_params queue_node_params = {
@@ -730,7 +829,9 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
                                        return -1;
 
                                /* Hierarchy level 4: Queue nodes */
-                               for (q = 0; q < RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS; q++) {
+                               if (t < RTE_SCHED_TRAFFIC_CLASS_BE) {
+                                       /* Strict-priority traffic class queues */
+                                       q = 0;
                                        status = rte_tm_node_add(port_id,
                                                queue_node_id(n_spp, n_pps, s, p, t, q),
                                                tc_node_id(n_spp, n_pps, s, p, t),
@@ -741,7 +842,22 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
                                                &error);
                                        if (status)
                                                return -1;
-                               } /* Queue */
+
+                                       continue;
+                               }
+                               /* Best-effort traffic class queues */
+                               for (q = 0; q < RTE_SCHED_BE_QUEUES_PER_PIPE; q++) {
+                                       status = rte_tm_node_add(port_id,
+                                               queue_node_id(n_spp, n_pps, s, p, t, q),
+                                               tc_node_id(n_spp, n_pps, s, p, t),
+                                               0,
+                                               params->weight.queue[q],
+                                               RTE_TM_NODE_LEVEL_ID_ANY,
+                                               &queue_node_params,
+                                               &error);
+                                       if (status)
+                                               return -1;
+                               }
                        } /* TC */
                } /* Pipe */
        } /* Subport */
@@ -762,13 +878,31 @@ tmgr_hierarchy_default(struct pmd_internals *softnic,
  *   tc1 <profile_id>
  *   tc2 <profile_id>
  *   tc3 <profile_id>
+ *   tc4 <profile_id>
+ *   tc5 <profile_id>
+ *   tc6 <profile_id>
+ *   tc7 <profile_id>
+ *   tc8 <profile_id>
+ *   tc9 <profile_id>
+ *   tc10 <profile_id>
+ *   tc11 <profile_id>
+ *   tc12 <profile_id>
  *  shared shaper
  *   tc0 <id | none>
  *   tc1 <id | none>
  *   tc2 <id | none>
  *   tc3 <id | none>
+ *   tc4 <id | none>
+ *   tc5 <id | none>
+ *   tc6 <id | none>
+ *   tc7 <id | none>
+ *   tc8 <id | none>
+ *   tc9 <id | none>
+ *   tc10 <id | none>
+ *   tc11 <id | none>
+ *   tc12 <id | none>
  *  weight
- *   queue  <q0> ... <q15>
+ *   queue  <q12> ... <q15>
  */
 static void
 cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
@@ -778,11 +912,11 @@ cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
        size_t out_size)
 {
        struct tmgr_hierarchy_default_params p;
-       int i, status;
+       int i, j, status;
 
        memset(&p, 0, sizeof(p));
 
-       if (n_tokens != 50) {
+       if (n_tokens != 74) {
                snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
                return;
        }
@@ -894,27 +1028,118 @@ cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
                return;
        }
 
+       if (strcmp(tokens[22], "tc4") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc4");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[4], tokens[23]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc4 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[24], "tc5") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc5");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[5], tokens[25]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc5 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[26], "tc6") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc6");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[6], tokens[27]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc6 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[28], "tc7") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc7");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[7], tokens[29]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc7 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[30], "tc8") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc8");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[8], tokens[31]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc8 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[32], "tc9") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc9");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[9], tokens[33]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc9 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[34], "tc10") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc10");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[10], tokens[35]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc10 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[36], "tc11") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc11");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[11], tokens[37]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc11 profile id");
+               return;
+       }
+
+       if (strcmp(tokens[38], "tc12") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc12");
+               return;
+       }
+
+       if (softnic_parser_read_uint32(&p.shaper_profile_id.tc[12], tokens[39]) != 0) {
+               snprintf(out, out_size, MSG_ARG_INVALID, "tc12 profile id");
+               return;
+       }
+
        /* Shared shaper */
 
-       if (strcmp(tokens[22], "shared") != 0) {
+       if (strcmp(tokens[40], "shared") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "shared");
                return;
        }
 
-       if (strcmp(tokens[23], "shaper") != 0) {
+       if (strcmp(tokens[41], "shaper") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "shaper");
                return;
        }
 
-       if (strcmp(tokens[24], "tc0") != 0) {
+       if (strcmp(tokens[42], "tc0") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc0");
                return;
        }
 
-       if (strcmp(tokens[25], "none") == 0)
+       if (strcmp(tokens[43], "none") == 0)
                p.shared_shaper_id.tc_valid[0] = 0;
        else {
-               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[0], tokens[25]) != 0) {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[0],
+                       tokens[43]) != 0) {
                        snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc0");
                        return;
                }
@@ -922,15 +1147,16 @@ cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
                p.shared_shaper_id.tc_valid[0] = 1;
        }
 
-       if (strcmp(tokens[26], "tc1") != 0) {
+       if (strcmp(tokens[44], "tc1") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc1");
                return;
        }
 
-       if (strcmp(tokens[27], "none") == 0)
+       if (strcmp(tokens[45], "none") == 0)
                p.shared_shaper_id.tc_valid[1] = 0;
        else {
-               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[1], tokens[27]) != 0) {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[1],
+                       tokens[45]) != 0) {
                        snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc1");
                        return;
                }
@@ -938,15 +1164,16 @@ cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
                p.shared_shaper_id.tc_valid[1] = 1;
        }
 
-       if (strcmp(tokens[28], "tc2") != 0) {
+       if (strcmp(tokens[46], "tc2") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc2");
                return;
        }
 
-       if (strcmp(tokens[29], "none") == 0)
+       if (strcmp(tokens[47], "none") == 0)
                p.shared_shaper_id.tc_valid[2] = 0;
        else {
-               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[2], tokens[29]) != 0) {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[2],
+                       tokens[47]) != 0) {
                        snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc2");
                        return;
                }
@@ -954,15 +1181,16 @@ cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
                p.shared_shaper_id.tc_valid[2] = 1;
        }
 
-       if (strcmp(tokens[30], "tc3") != 0) {
+       if (strcmp(tokens[48], "tc3") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc3");
                return;
        }
 
-       if (strcmp(tokens[31], "none") == 0)
+       if (strcmp(tokens[49], "none") == 0)
                p.shared_shaper_id.tc_valid[3] = 0;
        else {
-               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[3], tokens[31]) != 0) {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[3],
+                       tokens[49]) != 0) {
                        snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc3");
                        return;
                }
@@ -970,22 +1198,181 @@ cmd_tmgr_hierarchy_default(struct pmd_internals *softnic,
                p.shared_shaper_id.tc_valid[3] = 1;
        }
 
+       if (strcmp(tokens[50], "tc4") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc4");
+               return;
+       }
+
+       if (strcmp(tokens[51], "none") == 0) {
+               p.shared_shaper_id.tc_valid[4] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[4],
+                       tokens[51]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc4");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[4] = 1;
+       }
+
+       if (strcmp(tokens[52], "tc5") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc5");
+               return;
+       }
+
+       if (strcmp(tokens[53], "none") == 0) {
+               p.shared_shaper_id.tc_valid[5] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[5],
+                       tokens[53]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc5");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[5] = 1;
+       }
+
+       if (strcmp(tokens[54], "tc6") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc6");
+               return;
+       }
+
+       if (strcmp(tokens[55], "none") == 0) {
+               p.shared_shaper_id.tc_valid[6] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[6],
+                       tokens[55]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc6");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[6] = 1;
+       }
+
+       if (strcmp(tokens[56], "tc7") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc7");
+               return;
+       }
+
+       if (strcmp(tokens[57], "none") == 0) {
+               p.shared_shaper_id.tc_valid[7] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[7],
+                       tokens[57]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc7");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[7] = 1;
+       }
+
+       if (strcmp(tokens[58], "tc8") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc8");
+               return;
+       }
+
+       if (strcmp(tokens[59], "none") == 0) {
+               p.shared_shaper_id.tc_valid[8] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[8],
+                       tokens[59]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc8");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[8] = 1;
+       }
+
+       if (strcmp(tokens[60], "tc9") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc9");
+               return;
+       }
+
+       if (strcmp(tokens[61], "none") == 0) {
+               p.shared_shaper_id.tc_valid[9] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[9],
+                       tokens[61]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc9");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[9] = 1;
+       }
+
+       if (strcmp(tokens[62], "tc10") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc10");
+               return;
+       }
+
+       if (strcmp(tokens[63], "none") == 0) {
+               p.shared_shaper_id.tc_valid[10] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[10],
+                       tokens[63]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc10");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[10] = 1;
+       }
+
+       if (strcmp(tokens[64], "tc11") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc11");
+               return;
+       }
+
+       if (strcmp(tokens[65], "none") == 0) {
+               p.shared_shaper_id.tc_valid[11] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[11],
+                       tokens[65]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc11");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[11] = 1;
+       }
+
+       if (strcmp(tokens[66], "tc12") != 0) {
+               snprintf(out, out_size, MSG_ARG_NOT_FOUND, "tc12");
+               return;
+       }
+
+       if (strcmp(tokens[67], "none") == 0) {
+               p.shared_shaper_id.tc_valid[12] = 0;
+       } else {
+               if (softnic_parser_read_uint32(&p.shared_shaper_id.tc[12],
+                       tokens[67]) != 0) {
+                       snprintf(out, out_size, MSG_ARG_INVALID, "shared shaper tc12");
+                       return;
+               }
+
+               p.shared_shaper_id.tc_valid[12] = 1;
+       }
+
        /* Weight */
 
-       if (strcmp(tokens[32], "weight") != 0) {
+       if (strcmp(tokens[68], "weight") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "weight");
                return;
        }
 
-       if (strcmp(tokens[33], "queue") != 0) {
+       if (strcmp(tokens[69], "queue") != 0) {
                snprintf(out, out_size, MSG_ARG_NOT_FOUND, "queue");
                return;
        }
 
-       for (i = 0; i < 16; i++) {
-               if (softnic_parser_read_uint32(&p.weight.queue[i], tokens[34 + i]) != 0) {
-                       snprintf(out, out_size, MSG_ARG_INVALID, "weight queue");
-                       return;
+       for (i = 0, j = 0; i < 16; i++) {
+               if (i < RTE_SCHED_TRAFFIC_CLASS_BE) {
+                       p.weight.queue[i] = 1;
+               } else {
+                       if (softnic_parser_read_uint32(&p.weight.queue[i],
+                               tokens[70 + j]) != 0) {
+                               snprintf(out, out_size, MSG_ARG_INVALID, "weight queue");
+                               return;
+                       }
+                       j++;
                }
        }
 
@@ -3555,11 +3942,11 @@ parse_table_action_meter_tc(char **tokens,
                softnic_parser_read_uint32(&mtr->meter_profile_id, tokens[1]) ||
                strcmp(tokens[2], "policer") ||
                strcmp(tokens[3], "g") ||
-               parse_policer_action(tokens[4], &mtr->policer[e_RTE_METER_GREEN]) ||
+               parse_policer_action(tokens[4], &mtr->policer[RTE_COLOR_GREEN]) ||
                strcmp(tokens[5], "y") ||
-               parse_policer_action(tokens[6], &mtr->policer[e_RTE_METER_YELLOW]) ||
+               parse_policer_action(tokens[6], &mtr->policer[RTE_COLOR_YELLOW]) ||
                strcmp(tokens[7], "r") ||
-               parse_policer_action(tokens[8], &mtr->policer[e_RTE_METER_RED]))
+               parse_policer_action(tokens[8], &mtr->policer[RTE_COLOR_RED]))
                return 0;
 
        return 9;
@@ -4095,24 +4482,18 @@ parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params *p)
 
                switch (xform[i]->type) {
                case RTE_CRYPTO_SYM_XFORM_CIPHER:
-                       if (xform[i]->cipher.key.data)
-                               free(xform[i]->cipher.key.data);
                        if (p->cipher_auth.cipher_iv.val)
                                free(p->cipher_auth.cipher_iv.val);
                        if (p->cipher_auth.cipher_iv_update.val)
                                free(p->cipher_auth.cipher_iv_update.val);
                        break;
                case RTE_CRYPTO_SYM_XFORM_AUTH:
-                       if (xform[i]->auth.key.data)
-                               free(xform[i]->cipher.key.data);
                        if (p->cipher_auth.auth_iv.val)
                                free(p->cipher_auth.cipher_iv.val);
                        if (p->cipher_auth.auth_iv_update.val)
                                free(p->cipher_auth.cipher_iv_update.val);
                        break;
                case RTE_CRYPTO_SYM_XFORM_AEAD:
-                       if (xform[i]->aead.key.data)
-                               free(xform[i]->cipher.key.data);
                        if (p->aead.iv.val)
                                free(p->aead.iv.val);
                        if (p->aead.aad.val)
@@ -4127,8 +4508,8 @@ parse_free_sym_crypto_param_data(struct rte_table_action_sym_crypto_params *p)
 
 static struct rte_crypto_sym_xform *
 parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,
-               char **tokens, uint32_t n_tokens, uint32_t encrypt,
-               uint32_t *used_n_tokens)
+               uint8_t *key, uint32_t max_key_len, char **tokens,
+               uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
 {
        struct rte_crypto_sym_xform *xform_cipher;
        int status;
@@ -4155,16 +4536,16 @@ parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,
 
        /* cipher_key */
        len = strlen(tokens[4]);
-       xform_cipher->cipher.key.data = calloc(1, len / 2 + 1);
-       if (xform_cipher->cipher.key.data == NULL)
+       if (len / 2 > max_key_len) {
+               status = -ENOMEM;
                goto error_exit;
+       }
 
-       status = softnic_parse_hex_string(tokens[4],
-                       xform_cipher->cipher.key.data,
-                       (uint32_t *)&len);
+       status = softnic_parse_hex_string(tokens[4], key, (uint32_t *)&len);
        if (status < 0)
                goto error_exit;
 
+       xform_cipher->cipher.key.data = key;
        xform_cipher->cipher.key.length = (uint16_t)len;
 
        /* cipher_iv */
@@ -4188,9 +4569,6 @@ parse_table_action_cipher(struct rte_table_action_sym_crypto_params *p,
        return xform_cipher;
 
 error_exit:
-       if (xform_cipher->cipher.key.data)
-               free(xform_cipher->cipher.key.data);
-
        if (p->cipher_auth.cipher_iv.val) {
                free(p->cipher_auth.cipher_iv.val);
                p->cipher_auth.cipher_iv.val = NULL;
@@ -4203,8 +4581,8 @@ error_exit:
 
 static struct rte_crypto_sym_xform *
 parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
-               char **tokens, uint32_t n_tokens, uint32_t encrypt,
-               uint32_t *used_n_tokens)
+               uint8_t *key, uint32_t max_key_len, char **tokens,
+               uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
 {
        struct rte_crypto_sym_xform *xform_cipher;
        struct rte_crypto_sym_xform *xform_auth;
@@ -4233,17 +4611,21 @@ parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
 
        /* auth_key */
        len = strlen(tokens[10]);
-       xform_auth->auth.key.data = calloc(1, len / 2 + 1);
-       if (xform_auth->auth.key.data == NULL)
+       if (len / 2 > max_key_len) {
+               status = -ENOMEM;
                goto error_exit;
+       }
 
-       status = softnic_parse_hex_string(tokens[10],
-                       xform_auth->auth.key.data, (uint32_t *)&len);
+       status = softnic_parse_hex_string(tokens[10], key, (uint32_t *)&len);
        if (status < 0)
                goto error_exit;
 
+       xform_auth->auth.key.data = key;
        xform_auth->auth.key.length = (uint16_t)len;
 
+       key += xform_auth->auth.key.length;
+       max_key_len -= xform_auth->auth.key.length;
+
        if (strcmp(tokens[11], "digest_size"))
                goto error_exit;
 
@@ -4252,8 +4634,8 @@ parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
        if (status < 0)
                goto error_exit;
 
-       xform_cipher = parse_table_action_cipher(p, tokens, 7, encrypt,
-                       used_n_tokens);
+       xform_cipher = parse_table_action_cipher(p, key, max_key_len, tokens, 7,
+                       encrypt, used_n_tokens);
        if (xform_cipher == NULL)
                goto error_exit;
 
@@ -4268,8 +4650,6 @@ parse_table_action_cipher_auth(struct rte_table_action_sym_crypto_params *p,
        }
 
 error_exit:
-       if (xform_auth->auth.key.data)
-               free(xform_auth->auth.key.data);
        if (p->cipher_auth.auth_iv.val) {
                free(p->cipher_auth.auth_iv.val);
                p->cipher_auth.auth_iv.val = 0;
@@ -4282,8 +4662,8 @@ error_exit:
 
 static struct rte_crypto_sym_xform *
 parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,
-               char **tokens, uint32_t n_tokens, uint32_t encrypt,
-               uint32_t *used_n_tokens)
+               uint8_t *key, uint32_t max_key_len, char **tokens,
+               uint32_t n_tokens, uint32_t encrypt, uint32_t *used_n_tokens)
 {
        struct rte_crypto_sym_xform *xform_aead;
        int status;
@@ -4312,15 +4692,16 @@ parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,
 
        /* aead_key */
        len = strlen(tokens[4]);
-       xform_aead->aead.key.data = calloc(1, len / 2 + 1);
-       if (xform_aead->aead.key.data == NULL)
+       if (len / 2 > max_key_len) {
+               status = -ENOMEM;
                goto error_exit;
+       }
 
-       status = softnic_parse_hex_string(tokens[4], xform_aead->aead.key.data,
-                       (uint32_t *)&len);
+       status = softnic_parse_hex_string(tokens[4], key, (uint32_t *)&len);
        if (status < 0)
                goto error_exit;
 
+       xform_aead->aead.key.data = key;
        xform_aead->aead.key.length = (uint16_t)len;
 
        /* aead_iv */
@@ -4362,8 +4743,6 @@ parse_table_action_aead(struct rte_table_action_sym_crypto_params *p,
        return xform_aead;
 
 error_exit:
-       if (xform_aead->aead.key.data)
-               free(xform_aead->aead.key.data);
        if (p->aead.iv.val) {
                free(p->aead.iv.val);
                p->aead.iv.val = NULL;
@@ -4386,6 +4765,8 @@ parse_table_action_sym_crypto(char **tokens,
 {
        struct rte_table_action_sym_crypto_params *p = &a->sym_crypto;
        struct rte_crypto_sym_xform *xform = NULL;
+       uint8_t *key = a->sym_crypto_key;
+       uint32_t max_key_len = SYM_CRYPTO_MAX_KEY_SIZE;
        uint32_t used_n_tokens;
        uint32_t encrypt;
        int status;
@@ -4410,20 +4791,20 @@ parse_table_action_sym_crypto(char **tokens,
                tokens += 3;
                n_tokens -= 3;
 
-               xform = parse_table_action_cipher(p, tokens, n_tokens, encrypt,
-                               &used_n_tokens);
+               xform = parse_table_action_cipher(p, key, max_key_len, tokens,
+                               n_tokens, encrypt, &used_n_tokens);
        } else if (strcmp(tokens[3], "cipher_auth") == 0) {
                tokens += 3;
                n_tokens -= 3;
 
-               xform = parse_table_action_cipher_auth(p, tokens, n_tokens,
-                               encrypt, &used_n_tokens);
+               xform = parse_table_action_cipher_auth(p, key, max_key_len,
+                               tokens, n_tokens, encrypt, &used_n_tokens);
        } else if (strcmp(tokens[3], "aead") == 0) {
                tokens += 3;
                n_tokens -= 3;
 
-               xform = parse_table_action_aead(p, tokens, n_tokens, encrypt,
-                               &used_n_tokens);
+               xform = parse_table_action_aead(p, key, max_key_len, tokens,
+                               n_tokens, encrypt, &used_n_tokens);
        }
 
        if (xform == NULL)
@@ -5426,7 +5807,7 @@ load_dscp_table(struct rte_table_action_dscp_table *dscp_table,
        for (dscp = 0, l = 1; ; l++) {
                char line[64];
                char *tokens[3];
-               enum rte_meter_color color;
+               enum rte_color color;
                uint32_t tc_id, tc_queue_id, n_tokens = RTE_DIM(tokens);
 
                if (fgets(line, sizeof(line), f) == NULL)
@@ -5459,17 +5840,17 @@ load_dscp_table(struct rte_table_action_dscp_table *dscp_table,
                switch (tokens[2][0]) {
                case 'g':
                case 'G':
-                       color = e_RTE_METER_GREEN;
+                       color = RTE_COLOR_GREEN;
                        break;
 
                case 'y':
                case 'Y':
-                       color = e_RTE_METER_YELLOW;
+                       color = RTE_COLOR_YELLOW;
                        break;
 
                case 'r':
                case 'R':
-                       color = e_RTE_METER_RED;
+                       color = RTE_COLOR_RED;
                        break;
 
                default: