doc: add Meson coding style to contributors guide
[dpdk.git] / lib / librte_fib / rte_fib6.c
index 9f00a80..44cc0c9 100644 (file)
@@ -17,6 +17,8 @@
 #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",
@@ -92,12 +94,22 @@ static int
 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;
        }
@@ -148,7 +160,7 @@ rte_fib6_create(const char *name, int socket_id, struct rte_fib6_conf *conf)
 
        /* 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;
        }
@@ -260,6 +272,8 @@ free_dataplane(struct rte_fib6 *fib)
        switch (fib->type) {
        case RTE_FIB6_DUMMY:
                return;
+       case RTE_FIB6_TRIE:
+               trie_free(fib->dp);
        default:
                return;
        }
@@ -306,3 +320,20 @@ rte_fib6_get_rib(struct rte_fib6 *fib)
        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;
+       }
+}