#include <rte_rib6.h>
#include <rte_fib6.h>
+#include "trie.h"
+
TAILQ_HEAD(rte_fib6_list, rte_tailq_entry);
static struct rte_tailq_elem rte_fib6_tailq = {
.name = "RTE_FIB6",
init_dataplane(struct rte_fib6 *fib, __rte_unused int socket_id,
struct rte_fib6_conf *conf)
{
+ char dp_name[sizeof(void *)];
+
+ snprintf(dp_name, sizeof(dp_name), "%p", fib);
switch (conf->type) {
case RTE_FIB6_DUMMY:
fib->dp = fib;
fib->lookup = dummy_lookup;
fib->modify = dummy_modify;
return 0;
+ case RTE_FIB6_TRIE:
+ fib->dp = trie_create(dp_name, socket_id, conf);
+ if (fib->dp == NULL)
+ return -rte_errno;
+ fib->lookup = trie_get_lookup_fn(fib->dp, RTE_FIB6_LOOKUP_DEFAULT);
+ fib->modify = trie_modify;
+ return 0;
default:
return -EINVAL;
}
/* Check user arguments. */
if ((name == NULL) || (conf == NULL) || (conf->max_routes < 0) ||
- (conf->type >= RTE_FIB6_TYPE_MAX)) {
+ (conf->type > RTE_FIB6_TRIE)) {
rte_errno = EINVAL;
return NULL;
}
switch (fib->type) {
case RTE_FIB6_DUMMY:
return;
+ case RTE_FIB6_TRIE:
+ trie_free(fib->dp);
default:
return;
}
return (fib == NULL) ? NULL : fib->rib;
}
+int
+rte_fib6_select_lookup(struct rte_fib6 *fib,
+ enum rte_fib6_lookup_type type)
+{
+ rte_fib6_lookup_fn_t fn;
+
+ switch (fib->type) {
+ case RTE_FIB6_TRIE:
+ fn = trie_get_lookup_fn(fib->dp, type);
+ if (fn == NULL)
+ return -EINVAL;
+ fib->lookup = fn;
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}