* Copyright(c) 2019 Intel Corporation
*/
-#include <rte_string_fns.h>
#include <getopt.h>
#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
#include <arpa/inet.h>
+#include <sys/socket.h>
#include <rte_cycles.h>
#include <rte_errno.h>
uint8_t ent_sz;
uint8_t rnd_lookup_ips_ratio;
uint8_t print_fract;
+ uint8_t lookup_fn;
} config = {
.routes_file = NULL,
.lookup_ips_file = NULL,
.tbl8 = DEFAULT_LPM_TBL8,
.ent_sz = 4,
.rnd_lookup_ips_ratio = 0,
- .print_fract = 10
+ .print_fract = 10,
+ .lookup_fn = 0
};
struct rt_rule_4 {
}
}
+static int
+_inet_net_pton(int af, char *prefix, void *addr)
+{
+ const char *dlm = "/";
+ char *s, *sp;
+ int ret, depth;
+ unsigned int max_depth;
+
+ if ((prefix == NULL) || (addr == NULL))
+ return -EINVAL;
+
+ s = strtok_r(prefix, dlm, &sp);
+ if (s == NULL)
+ return -EINVAL;
+
+ ret = inet_pton(af, s, addr);
+ if (ret != 1)
+ return -errno;
+
+ s = strtok_r(NULL, dlm, &sp);
+ max_depth = (af == AF_INET) ? 32 : 128;
+ GET_CB_FIELD(s, depth, 0, max_depth, 0);
+
+ return depth;
+}
+
static int
parse_rt_4(FILE *f)
{
s = NULL;
}
- ret = inet_net_pton(AF_INET, in[RT_PREFIX], &rt[j].addr,
- sizeof(rt[j].addr));
+ ret = _inet_net_pton(AF_INET, in[RT_PREFIX], &rt[j].addr);
if (ret == -1)
return -errno;
return 0;
}
-static int
-__inet_net_pton6(char *prefix, uint8_t *addr)
-{
- const char *dlm = "/";
- char *s, *sp;
- int ret, depth;
-
- if ((prefix == NULL) || (addr == NULL))
- return -EINVAL;
-
- s = strtok_r(prefix, dlm, &sp);
- if (s == NULL)
- return -EINVAL;
-
- ret = inet_pton(AF_INET6, s, addr);
- if (ret != 1)
- return -errno;
-
- s = strtok_r(NULL, dlm, &sp);
- GET_CB_FIELD(s, depth, 0, 128, 0);
-
- return depth;
-}
-
static int
parse_rt_6(FILE *f)
{
s = NULL;
}
- ret = __inet_net_pton6(in[RT_PREFIX], rt[j].addr);
+ ret = _inet_net_pton(AF_INET6, in[RT_PREFIX], rt[j].addr);
if (ret < 0)
return ret;
while (fgets(line, sizeof(line), f) != NULL) {
s = strtok(line, " \t\n");
+ if (s == NULL)
+ return -EINVAL;
ret = inet_pton(af, s, &tbl[i]);
if (ret != 1)
return -EINVAL;
"[-s <shuffle randomly generated routes>]\n"
"[-a <check nexthops for all ipv4 address space"
"(only valid with -c)>]\n"
- "[-b <fib algorithm>]\n\tavailible options for ipv4\n"
+ "[-b <fib algorithm>]\n\tavailable options for ipv4\n"
"\t\trib - RIB based FIB\n"
"\t\tdir - DIR24_8 based FIB\n"
- "\tavailible options for ipv6:\n"
+ "\tavailable options for ipv6:\n"
"\t\trib - RIB based FIB\n"
"\t\ttrie - TRIE based FIB\n"
"defaults are: dir for ipv4 and trie for ipv6\n"
"1/2/4/8 (default 4)>]\n"
"[-g <number of tbl8's for dir24_8 or trie FIBs>]\n"
"[-w <path to the file to dump routing table>]\n"
- "[-u <path to the file to dump ip's for lookup>]\n",
+ "[-u <path to the file to dump ip's for lookup>]\n"
+ "[-v <type of loookup function:"
+ "\ts1, s2, s3 (3 types of scalar), v (vector) -"
+ " for DIR24_8 based FIB\n"
+ "\ts, v - for TRIE based ipv6 FIB>]\n",
config.prgname);
}
int opt;
char *endptr;
- while ((opt = getopt(argc, argv, "f:t:n:d:l:r:c6ab:e:g:w:u:s")) !=
+ while ((opt = getopt(argc, argv, "f:t:n:d:l:r:c6ab:e:g:w:u:sv:")) !=
-1) {
switch (opt) {
case 'f':
rte_exit(-EINVAL, "Invalid option -g\n");
}
break;
+ case 'v':
+ if ((strcmp(optarg, "s1") == 0) ||
+ (strcmp(optarg, "s") == 0)) {
+ config.lookup_fn = 1;
+ break;
+ } else if (strcmp(optarg, "v") == 0) {
+ config.lookup_fn = 2;
+ break;
+ } else if (strcmp(optarg, "s2") == 0) {
+ config.lookup_fn = 3;
+ break;
+ } else if (strcmp(optarg, "s3") == 0) {
+ config.lookup_fn = 4;
+ break;
+ }
+ print_usage();
+ rte_exit(-EINVAL, "Invalid option -v %s\n", optarg);
default:
print_usage();
rte_exit(-EINVAL, "Invalid options\n");
return -rte_errno;
}
+ if (config.lookup_fn != 0) {
+ if (config.lookup_fn == 1)
+ ret = rte_fib_select_lookup(fib,
+ RTE_FIB_LOOKUP_DIR24_8_SCALAR_MACRO);
+ else if (config.lookup_fn == 2)
+ ret = rte_fib_select_lookup(fib,
+ RTE_FIB_LOOKUP_DIR24_8_VECTOR_AVX512);
+ else if (config.lookup_fn == 3)
+ ret = rte_fib_select_lookup(fib,
+ RTE_FIB_LOOKUP_DIR24_8_SCALAR_INLINE);
+ else if (config.lookup_fn == 4)
+ ret = rte_fib_select_lookup(fib,
+ RTE_FIB_LOOKUP_DIR24_8_SCALAR_UNI);
+ else
+ ret = -EINVAL;
+ if (ret != 0) {
+ printf("Can not init lookup function\n");
+ return ret;
+ }
+ }
+
for (k = config.print_fract, i = 0; k > 0; k--) {
start = rte_rdtsc_precise();
for (j = 0; j < (config.nb_routes - i) / k; j++) {
return -rte_errno;
}
+ if (config.lookup_fn != 0) {
+ if (config.lookup_fn == 1)
+ ret = rte_fib6_select_lookup(fib,
+ RTE_FIB6_LOOKUP_TRIE_SCALAR);
+ else if (config.lookup_fn == 2)
+ ret = rte_fib6_select_lookup(fib,
+ RTE_FIB6_LOOKUP_TRIE_VECTOR_AVX512);
+ else
+ ret = -EINVAL;
+ if (ret != 0) {
+ printf("Can not init lookup function\n");
+ return ret;
+ }
+ }
+
for (k = config.print_fract, i = 0; k > 0; k--) {
start = rte_rdtsc_precise();
for (j = 0; j < (config.nb_routes - i) / k; j++) {