[dpdk-dev,v2,4/5] test: change lpm test to use routes as resource
Commit Message
Change the lpm autotest to use the routes data from the resource data
stored in the binary rather than including it directly into the C file
as a C header. This speeds up compile and link time, without changing
the test results.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
app/test/test_lpm_perf.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 74 insertions(+), 1 deletion(-)
@@ -34,17 +34,25 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
#include <rte_cycles.h>
#include <rte_random.h>
+#include <rte_malloc.h>
#include <rte_branch_prediction.h>
#include <rte_lpm.h>
#include "test.h"
#include "resource.h"
-#include "test_lpm_routes.h"
#include "test_xmmt_ops.h"
+struct route_rule {
+ uint32_t ip;
+ uint8_t depth;
+};
+static struct route_rule *large_route_table;
+static unsigned int NUM_ROUTE_ENTRIES;
+
REGISTER_LINKED_RESOURCE(test_lpm_data)
#define TEST_LPM_ASSERT(cond) do { \
@@ -83,6 +91,68 @@ print_route_distribution(const struct route_rule *table, uint32_t n)
}
static int
+load_large_route_table(void)
+{
+ const struct resource *r;
+ const char *lpm_data;
+
+ r = resource_find("test_lpm_data");
+ TEST_ASSERT_NOT_NULL(r, "No large lpm table data found");
+
+ /* the routing table size is going to be less than the size of the
+ * resource, since text extries are more verbose. Allocate this as
+ * the max size, and shrink the allocation later
+ */
+ large_route_table = rte_malloc(NULL, resource_size(r), 0);
+ if (large_route_table == NULL)
+ return -1;
+
+ /* parse the lpm table. All entries are of format:
+ * {IP-as-decimal-unsigned, depth}
+ * For example:
+ * {1234567U, 24},
+ * We use the "U" and "}" characters as format check characters,
+ * after parsing each number.
+ */
+ for (lpm_data = r->begin; lpm_data < r->end; lpm_data++) {
+ if (*lpm_data == '{') {
+ char *endptr;
+
+ lpm_data++;
+ large_route_table[NUM_ROUTE_ENTRIES].ip = \
+ strtoul(lpm_data, &endptr, 0);
+ if (*endptr != 'U') {
+ if (NUM_ROUTE_ENTRIES > 0) {
+ char *value = strndup(lpm_data, 12);
+ printf("Failed parse of %s\n", value);
+ free(value);
+ }
+ continue;
+ }
+
+ lpm_data = endptr + 2; /* skip U and , */
+ large_route_table[NUM_ROUTE_ENTRIES].depth = \
+ strtoul(lpm_data, &endptr, 0);
+ if (*endptr != '}') {
+ if (NUM_ROUTE_ENTRIES > 0) {
+ char *value = strndup(lpm_data, 5);
+ printf("Failed parse of %s\n", value);
+ free(value);
+ }
+ continue;
+ }
+
+ NUM_ROUTE_ENTRIES++;
+ }
+ }
+
+ large_route_table = rte_realloc(large_route_table,
+ sizeof(large_route_table[0]) * NUM_ROUTE_ENTRIES, 0);
+ printf("Read %u route entries\n", NUM_ROUTE_ENTRIES);
+ return 0;
+}
+
+static int
test_lpm_perf(void)
{
struct rte_lpm *lpm = NULL;
@@ -98,6 +168,9 @@ test_lpm_perf(void)
uint64_t cache_line_counter = 0;
int64_t count = 0;
+ TEST_ASSERT_SUCCESS(load_large_route_table(),
+ "Error loading lpm table");
+
rte_srand(rte_rdtsc());
printf("No. routes = %u\n", (unsigned) NUM_ROUTE_ENTRIES);