Merge pull request #4240 from FRRouting/revert-4236-zebra_diet

Revert "Zebra diet"
This commit is contained in:
Pascal Mathis 2019-05-02 13:07:02 +02:00 committed by GitHub
commit a599986949
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 74 additions and 84 deletions

View File

@ -119,8 +119,6 @@ The common setup pattern will look like this:
.. code-block:: c .. code-block:: c
#include <typesafe.h>
PREDECL_XXX(Z) PREDECL_XXX(Z)
struct item { struct item {
int otherdata; int otherdata;
@ -161,26 +159,26 @@ Common iteration macros
The following iteration macros work across all data structures: The following iteration macros work across all data structures:
.. c:function:: for_each(Z, &head, item) .. c:function:: for_each(Z, head, item)
Equivalent to: Equivalent to:
.. code-block:: c .. code-block:: c
for (item = Z_first(&head); item; item = Z_next(&head, item)) for (item = Z_first(head); item; item = Z_next(head, item))
Note that this will fail if the list is modified while being iterated Note that this will fail if the list is modified while being iterated
over. over.
.. c:function:: for_each_safe(Z, &head, item) .. c:function:: for_each_safe(Z, head, item)
Same as the previous, but the next element is pre-loaded into a "hidden" Same as the previous, but the next element is pre-loaded into a "hidden"
variable (named ``Z_safe``.) Equivalent to: variable (named ``Z_safe``.) Equivalent to:
.. code-block:: c .. code-block:: c
for (item = Z_first(&head); item; item = next) { for (item = Z_first(head); item; item = next) {
next = Z_next_safe(&head, item); next = Z_next_safe(head, item);
... ...
} }
@ -191,7 +189,7 @@ The following iteration macros work across all data structures:
tables is resized while iterating. This will cause items to be tables is resized while iterating. This will cause items to be
skipped or iterated over twice. skipped or iterated over twice.
.. c:function:: for_each_from(Z, &head, item, from) .. c:function:: for_each_from(Z, head, item, from)
Iterates over the list, starting at item ``from``. This variant is "safe" Iterates over the list, starting at item ``from``. This variant is "safe"
as in the previous macro. Equivalent to: as in the previous macro. Equivalent to:
@ -199,7 +197,7 @@ The following iteration macros work across all data structures:
.. code-block:: c .. code-block:: c
for (item = from; item; item = from) { for (item = from; item; item = from) {
from = Z_next_safe(&head, item); from = Z_next_safe(head, item);
... ...
} }

View File

@ -1543,7 +1543,7 @@ char *prefix_mac2str(const struct ethaddr *mac, char *buf, int size)
return ptr; return ptr;
} }
unsigned prefix_hash_key(const void *pp) unsigned prefix_hash_key(void *pp)
{ {
struct prefix copy; struct prefix copy;

View File

@ -466,7 +466,7 @@ extern int is_zero_mac(struct ethaddr *mac);
extern int prefix_str2mac(const char *str, struct ethaddr *mac); extern int prefix_str2mac(const char *str, struct ethaddr *mac);
extern char *prefix_mac2str(const struct ethaddr *mac, char *buf, int size); extern char *prefix_mac2str(const struct ethaddr *mac, char *buf, int size);
extern unsigned prefix_hash_key(const void *pp); extern unsigned prefix_hash_key(void *pp);
extern int str_to_esi(const char *str, esi_t *esi); extern int str_to_esi(const char *str, esi_t *esi);
extern char *esi_to_str(const esi_t *esi, char *buf, int size); extern char *esi_to_str(const esi_t *esi, char *buf, int size);

View File

@ -33,14 +33,12 @@ DEFINE_MTYPE(LIB, ROUTE_NODE, "Route node")
static void route_table_free(struct route_table *); static void route_table_free(struct route_table *);
static int route_table_hash_cmp(const void *a, const void *b) static bool route_table_hash_cmp(const void *a, const void *b)
{ {
const struct prefix *pa = a, *pb = b; const struct prefix *pa = a, *pb = b;
return prefix_cmp(pa, pb); return prefix_cmp(pa, pb) == 0;
} }
DECLARE_HASH(rn_hash_node, struct route_node, nodehash, route_table_hash_cmp,
prefix_hash_key)
/* /*
* route_table_init_with_delegate * route_table_init_with_delegate
*/ */
@ -51,7 +49,8 @@ route_table_init_with_delegate(route_table_delegate_t *delegate)
rt = XCALLOC(MTYPE_ROUTE_TABLE, sizeof(struct route_table)); rt = XCALLOC(MTYPE_ROUTE_TABLE, sizeof(struct route_table));
rt->delegate = delegate; rt->delegate = delegate;
rn_hash_node_init(&rt->hash); rt->hash = hash_create(prefix_hash_key, route_table_hash_cmp,
"route table hash");
return rt; return rt;
} }
@ -70,14 +69,15 @@ static struct route_node *route_node_new(struct route_table *table)
static struct route_node *route_node_set(struct route_table *table, static struct route_node *route_node_set(struct route_table *table,
const struct prefix *prefix) const struct prefix *prefix)
{ {
struct route_node *node; struct route_node *node, *inserted;
node = route_node_new(table); node = route_node_new(table);
prefix_copy(&node->p, prefix); prefix_copy(&node->p, prefix);
node->table = table; node->table = table;
rn_hash_node_add(&node->table->hash, node); inserted = hash_get(node->table->hash, node, hash_alloc_intern);
assert(inserted == node);
return node; return node;
} }
@ -99,6 +99,9 @@ static void route_table_free(struct route_table *rt)
if (rt == NULL) if (rt == NULL)
return; return;
hash_clean(rt->hash, NULL);
hash_free(rt->hash);
node = rt->top; node = rt->top;
/* Bulk deletion of nodes remaining in this table. This function is not /* Bulk deletion of nodes remaining in this table. This function is not
@ -120,7 +123,6 @@ static void route_table_free(struct route_table *rt)
tmp_node->table->count--; tmp_node->table->count--;
tmp_node->lock = 0; /* to cause assert if unlocked after this */ tmp_node->lock = 0; /* to cause assert if unlocked after this */
rn_hash_node_del(&rt->hash, tmp_node);
route_node_free(rt, tmp_node); route_node_free(rt, tmp_node);
if (node != NULL) { if (node != NULL) {
@ -135,7 +137,6 @@ static void route_table_free(struct route_table *rt)
assert(rt->count == 0); assert(rt->count == 0);
rn_hash_node_fini(&rt->hash);
XFREE(MTYPE_ROUTE_TABLE, rt); XFREE(MTYPE_ROUTE_TABLE, rt);
return; return;
} }
@ -256,7 +257,7 @@ struct route_node *route_node_lookup(const struct route_table *table,
prefix_copy(&p, pu.p); prefix_copy(&p, pu.p);
apply_mask(&p); apply_mask(&p);
node = rn_hash_node_find(&table->hash, (void *)&p); node = hash_get(table->hash, (void *)&p, NULL);
return (node && node->info) ? route_lock_node(node) : NULL; return (node && node->info) ? route_lock_node(node) : NULL;
} }
@ -269,7 +270,7 @@ struct route_node *route_node_lookup_maynull(const struct route_table *table,
prefix_copy(&p, pu.p); prefix_copy(&p, pu.p);
apply_mask(&p); apply_mask(&p);
node = rn_hash_node_find(&table->hash, (void *)&p); node = hash_get(table->hash, (void *)&p, NULL);
return node ? route_lock_node(node) : NULL; return node ? route_lock_node(node) : NULL;
} }
@ -281,11 +282,12 @@ struct route_node *route_node_get(struct route_table *const table,
struct route_node *new; struct route_node *new;
struct route_node *node; struct route_node *node;
struct route_node *match; struct route_node *match;
struct route_node *inserted;
uint16_t prefixlen = p->prefixlen; uint16_t prefixlen = p->prefixlen;
const uint8_t *prefix = &p->u.prefix; const uint8_t *prefix = &p->u.prefix;
apply_mask((struct prefix *)p); apply_mask((struct prefix *)p);
node = rn_hash_node_find(&table->hash, (void *)p); node = hash_get(table->hash, (void *)p, NULL);
if (node && node->info) if (node && node->info)
return route_lock_node(node); return route_lock_node(node);
@ -312,7 +314,8 @@ struct route_node *route_node_get(struct route_table *const table,
new->p.family = p->family; new->p.family = p->family;
new->table = table; new->table = table;
set_link(new, node); set_link(new, node);
rn_hash_node_add(&table->hash, new); inserted = hash_get(node->table->hash, new, hash_alloc_intern);
assert(inserted == new);
if (match) if (match)
set_link(match, new); set_link(match, new);
@ -364,7 +367,7 @@ void route_node_delete(struct route_node *node)
node->table->count--; node->table->count--;
rn_hash_node_del(&node->table->hash, node); hash_release(node->table->hash, node);
/* WARNING: FRAGILE CODE! /* WARNING: FRAGILE CODE!
* route_node_free may have the side effect of free'ing the entire * route_node_free may have the side effect of free'ing the entire

View File

@ -25,7 +25,6 @@
#include "memory.h" #include "memory.h"
#include "hash.h" #include "hash.h"
#include "prefix.h" #include "prefix.h"
#include "typesafe.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -60,12 +59,10 @@ struct route_table_delegate_t_ {
route_table_destroy_node_func_t destroy_node; route_table_destroy_node_func_t destroy_node;
}; };
PREDECL_HASH(rn_hash_node)
/* Routing table top structure. */ /* Routing table top structure. */
struct route_table { struct route_table {
struct route_node *top; struct route_node *top;
struct rn_hash_node_head hash; struct hash *hash;
/* /*
* Delegate that performs certain functions for this table. * Delegate that performs certain functions for this table.
@ -132,7 +129,6 @@ struct route_table {
/* Lock of this radix */ \ /* Lock of this radix */ \
unsigned int table_rdonly(lock); \ unsigned int table_rdonly(lock); \
\ \
struct rn_hash_node_item nodehash; \
/* Each node of route. */ \ /* Each node of route. */ \
void *info; \ void *info; \

View File

@ -275,7 +275,7 @@ macro_pure size_t prefix ## _count(struct prefix##_head *h) \
#define DECLARE_SORTLIST_UNIQ(prefix, type, field, cmpfn) \ #define DECLARE_SORTLIST_UNIQ(prefix, type, field, cmpfn) \
_DECLARE_SORTLIST(prefix, type, field, cmpfn, cmpfn) \ _DECLARE_SORTLIST(prefix, type, field, cmpfn, cmpfn) \
\ \
macro_inline type *prefix ## _find(const struct prefix##_head *h, const type *item) \ macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item) \
{ \ { \
struct ssort_item *sitem = h->sh.first; \ struct ssort_item *sitem = h->sh.first; \
int cmpval = 0; \ int cmpval = 0; \
@ -383,7 +383,7 @@ macro_inline type *prefix ## _add(struct prefix##_head *h, type *item) \
*np = &item->field.hi; \ *np = &item->field.hi; \
return NULL; \ return NULL; \
} \ } \
macro_inline type *prefix ## _find(const struct prefix##_head *h, const type *item) \ macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item) \
{ \ { \
if (!h->hh.tabshift) \ if (!h->hh.tabshift) \
return NULL; \ return NULL; \
@ -576,7 +576,7 @@ macro_inline int prefix ## __cmp(const struct sskip_item *a, \
return cmpfn(container_of(a, type, field.si), \ return cmpfn(container_of(a, type, field.si), \
container_of(b, type, field.si)); \ container_of(b, type, field.si)); \
} \ } \
macro_inline type *prefix ## _find(const struct prefix##_head *h, const type *item) \ macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item) \
{ \ { \
struct sskip_item *sitem = typesafe_skiplist_find(&h->sh, \ struct sskip_item *sitem = typesafe_skiplist_find(&h->sh, \
&item->field.si, &prefix ## __cmp); \ &item->field.si, &prefix ## __cmp); \

View File

@ -10,8 +10,7 @@ luCommand('r3','vtysh -c "debug rfapi-dev close vn 10.0.0.2 un 2.2.2.2"','status
luCommand('r4','vtysh -c "debug rfapi-dev unregister vn 10.0.0.3 un 3.3.3.3 prefix 33.33.33.0/24"','', 'none', 'Prefix removed') luCommand('r4','vtysh -c "debug rfapi-dev unregister vn 10.0.0.3 un 3.3.3.3 prefix 33.33.33.0/24"','', 'none', 'Prefix removed')
luCommand('r4','vtysh -c "debug rfapi-dev unregister vn 10.0.0.3 un 3.3.3.3 prefix 11.11.11.0/24"','', 'none', 'MP prefix removed') luCommand('r4','vtysh -c "debug rfapi-dev unregister vn 10.0.0.3 un 3.3.3.3 prefix 11.11.11.0/24"','', 'none', 'MP prefix removed')
luCommand('r4','vtysh -c "show vnc registrations"','Locally: *Active: 0 ','wait','Local registration removed') luCommand('r4','vtysh -c "show vnc registrations"','Locally: *Active: 0 ','wait','Local registration removed')
#luCommand('r4','vtysh -c "debug rfapi-dev close vn 10.0.0.3 un 3.3.3.3"','status 0', 'pass', 'Closed RFAPI') luCommand('r4','vtysh -c "debug rfapi-dev close vn 10.0.0.3 un 3.3.3.3"','status 0', 'pass', 'Closed RFAPI')
luCommand('r4','vtysh -c "clear vnc nve *"','.', 'pass', 'Cleared NVEs')
luCommand('r1','vtysh -c "show vnc registrations"','Locally: *Active: 0 .* Remotely: *Active: 0','wait','All registrations cleared') luCommand('r1','vtysh -c "show vnc registrations"','Locally: *Active: 0 .* Remotely: *Active: 0','wait','All registrations cleared')
luCommand('r3','vtysh -c "show vnc registrations"','Locally: *Active: 0 .* Remotely: *Active: 0','wait','All registrations cleared') luCommand('r3','vtysh -c "show vnc registrations"','Locally: *Active: 0 .* Remotely: *Active: 0','wait','All registrations cleared')

View File

@ -24,7 +24,6 @@
#include "zebra.h" #include "zebra.h"
#include "hook.h" #include "hook.h"
#include "typesafe.h"
#include "linklist.h" #include "linklist.h"
#include "prefix.h" #include "prefix.h"
#include "table.h" #include "table.h"
@ -40,44 +39,6 @@
extern "C" { extern "C" {
#endif #endif
typedef enum { RNH_NEXTHOP_TYPE, RNH_IMPORT_CHECK_TYPE } rnh_type_t;
PREDECL_LIST(rnh_list)
/* Nexthop structure. */
struct rnh {
uint8_t flags;
#define ZEBRA_NHT_CONNECTED 0x1
#define ZEBRA_NHT_DELETED 0x2
#define ZEBRA_NHT_EXACT_MATCH 0x4
/* VRF identifier. */
vrf_id_t vrf_id;
afi_t afi;
rnh_type_t type;
uint32_t seqno;
struct route_entry *state;
struct prefix resolved_route;
struct list *client_list;
/* pseudowires dependent on this nh */
struct list *zebra_pseudowire_list;
struct route_node *node;
/*
* if this has been filtered for the client
*/
int filtered[ZEBRA_ROUTE_MAX];
struct rnh_list_item rnh_list_item;
};
#define DISTANCE_INFINITY 255 #define DISTANCE_INFINITY 255
#define ZEBRA_KERNEL_TABLE_MAX 252 /* support for no more than this rt tables */ #define ZEBRA_KERNEL_TABLE_MAX 252 /* support for no more than this rt tables */
@ -190,7 +151,7 @@ typedef struct rib_dest_t_ {
* the data plane we will run evaluate_rnh * the data plane we will run evaluate_rnh
* on these prefixes. * on these prefixes.
*/ */
struct rnh_list_head nht; struct list *nht;
/* /*
* Linkage to put dest on the FPM processing queue. * Linkage to put dest on the FPM processing queue.
@ -199,8 +160,6 @@ typedef struct rib_dest_t_ {
} rib_dest_t; } rib_dest_t;
DECLARE_LIST(rnh_list, struct rnh, rnh_list_item);
#define RIB_ROUTE_QUEUED(x) (1 << (x)) #define RIB_ROUTE_QUEUED(x) (1 << (x))
// If MQ_SIZE is modified this value needs to be updated. // If MQ_SIZE is modified this value needs to be updated.
#define RIB_ROUTE_ANY_QUEUED 0x1F #define RIB_ROUTE_ANY_QUEUED 0x1F

View File

@ -1204,6 +1204,7 @@ static int rib_can_delete_dest(rib_dest_t *dest)
void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq) void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq)
{ {
rib_dest_t *dest = rib_dest_from_rnode(rn); rib_dest_t *dest = rib_dest_from_rnode(rn);
struct listnode *node, *nnode;
struct rnh *rnh; struct rnh *rnh;
/* /*
@ -1235,7 +1236,7 @@ void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq)
* nht resolution and as such we need to call the * nht resolution and as such we need to call the
* nexthop tracking evaluation code * nexthop tracking evaluation code
*/ */
for_each (rnh_list, &dest->nht, rnh) { for (ALL_LIST_ELEMENTS(dest->nht, node, nnode, rnh)) {
struct zebra_vrf *zvrf = struct zebra_vrf *zvrf =
zebra_vrf_lookup_by_id(rnh->vrf_id); zebra_vrf_lookup_by_id(rnh->vrf_id);
struct prefix *p = &rnh->node->p; struct prefix *p = &rnh->node->p;
@ -1311,7 +1312,7 @@ int rib_gc_dest(struct route_node *rn)
zebra_rib_evaluate_rn_nexthops(rn, zebra_router_get_next_sequence()); zebra_rib_evaluate_rn_nexthops(rn, zebra_router_get_next_sequence());
dest->rnode = NULL; dest->rnode = NULL;
rnh_list_fini(&dest->nht); list_delete(&dest->nht);
XFREE(MTYPE_RIB_DEST, dest); XFREE(MTYPE_RIB_DEST, dest);
rn->info = NULL; rn->info = NULL;
@ -2356,7 +2357,7 @@ rib_dest_t *zebra_rib_create_dest(struct route_node *rn)
rib_dest_t *dest; rib_dest_t *dest;
dest = XCALLOC(MTYPE_RIB_DEST, sizeof(rib_dest_t)); dest = XCALLOC(MTYPE_RIB_DEST, sizeof(rib_dest_t));
rnh_list_init(&dest->nht); dest->nht = list_new();
route_lock_node(rn); /* rn route table reference */ route_lock_node(rn); /* rn route table reference */
rn->info = dest; rn->info = dest;
dest->rnode = rn; dest->rnode = rn;

View File

@ -119,7 +119,7 @@ static void zebra_rnh_remove_from_routing_table(struct rnh *rnh)
} }
dest = rib_dest_from_rnode(rn); dest = rib_dest_from_rnode(rn);
rnh_list_del(&dest->nht, rnh); listnode_delete(dest->nht, rnh);
route_unlock_node(rn); route_unlock_node(rn);
} }
@ -145,7 +145,7 @@ static void zebra_rnh_store_in_routing_table(struct rnh *rnh)
} }
dest = rib_dest_from_rnode(rn); dest = rib_dest_from_rnode(rn);
rnh_list_add_tail(&dest->nht, rnh); listnode_add(dest->nht, rnh);
route_unlock_node(rn); route_unlock_node(rn);
} }
@ -251,7 +251,7 @@ void zebra_free_rnh(struct rnh *rnh)
route_unlock_node(rern); route_unlock_node(rern);
dest = rib_dest_from_rnode(rern); dest = rib_dest_from_rnode(rern);
rnh_list_del(&dest->nht, rnh); listnode_delete(dest->nht, rnh);
} }
} }
free_state(rnh->vrf_id, rnh->state, rnh->node); free_state(rnh->vrf_id, rnh->state, rnh->node);

View File

@ -29,6 +29,40 @@
extern "C" { extern "C" {
#endif #endif
typedef enum { RNH_NEXTHOP_TYPE, RNH_IMPORT_CHECK_TYPE } rnh_type_t;
/* Nexthop structure. */
struct rnh {
uint8_t flags;
#define ZEBRA_NHT_CONNECTED 0x1
#define ZEBRA_NHT_DELETED 0x2
#define ZEBRA_NHT_EXACT_MATCH 0x4
/* VRF identifier. */
vrf_id_t vrf_id;
afi_t afi;
rnh_type_t type;
uint32_t seqno;
struct route_entry *state;
struct prefix resolved_route;
struct list *client_list;
/* pseudowires dependent on this nh */
struct list *zebra_pseudowire_list;
struct route_node *node;
/*
* if this has been filtered for the client
*/
int filtered[ZEBRA_ROUTE_MAX];
};
extern int zebra_rnh_ip_default_route; extern int zebra_rnh_ip_default_route;
extern int zebra_rnh_ipv6_default_route; extern int zebra_rnh_ipv6_default_route;

View File

@ -357,7 +357,7 @@ void zebra_rtable_node_cleanup(struct route_table *table,
if (node->info) { if (node->info) {
rib_dest_t *dest = node->info; rib_dest_t *dest = node->info;
rnh_list_fini(&dest->nht); list_delete(&dest->nht);
XFREE(MTYPE_RIB_DEST, node->info); XFREE(MTYPE_RIB_DEST, node->info);
} }
} }