Skip to content

Commit

Permalink
Merge pull request #4236 from donaldsharp/zebra_diet
Browse files Browse the repository at this point in the history
Zebra diet
  • Loading branch information
louberger authored May 2, 2019
2 parents 5390986 + be6f84a commit eefbfd1
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 74 deletions.
16 changes: 9 additions & 7 deletions doc/developer/lists.rst
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ The common setup pattern will look like this:

.. code-block:: c
#include <typesafe.h>
PREDECL_XXX(Z)
struct item {
int otherdata;
Expand Down Expand Up @@ -159,26 +161,26 @@ Common iteration macros

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:

.. 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
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"
variable (named ``Z_safe``.) Equivalent to:

.. code-block:: c
for (item = Z_first(head); item; item = next) {
next = Z_next_safe(head, item);
for (item = Z_first(&head); item; item = next) {
next = Z_next_safe(&head, item);
...
}
Expand All @@ -189,15 +191,15 @@ The following iteration macros work across all data structures:
tables is resized while iterating. This will cause items to be
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"
as in the previous macro. Equivalent to:

.. code-block:: c
for (item = from; item; item = from) {
from = Z_next_safe(head, item);
from = Z_next_safe(&head, item);
...
}
Expand Down
2 changes: 1 addition & 1 deletion lib/prefix.c
Original file line number Diff line number Diff line change
Expand Up @@ -1543,7 +1543,7 @@ char *prefix_mac2str(const struct ethaddr *mac, char *buf, int size)
return ptr;
}

unsigned prefix_hash_key(void *pp)
unsigned prefix_hash_key(const void *pp)
{
struct prefix copy;

Expand Down
2 changes: 1 addition & 1 deletion lib/prefix.h
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ extern int is_zero_mac(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 unsigned prefix_hash_key(void *pp);
extern unsigned prefix_hash_key(const void *pp);

extern int str_to_esi(const char *str, esi_t *esi);
extern char *esi_to_str(const esi_t *esi, char *buf, int size);
Expand Down
31 changes: 14 additions & 17 deletions lib/table.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@ DEFINE_MTYPE(LIB, ROUTE_NODE, "Route node")

static void route_table_free(struct route_table *);

static bool route_table_hash_cmp(const void *a, const void *b)
static int route_table_hash_cmp(const void *a, const void *b)
{
const struct prefix *pa = a, *pb = b;
return prefix_cmp(pa, pb) == 0;
return prefix_cmp(pa, pb);
}

DECLARE_HASH(rn_hash_node, struct route_node, nodehash, route_table_hash_cmp,
prefix_hash_key)
/*
* route_table_init_with_delegate
*/
Expand All @@ -49,8 +51,7 @@ route_table_init_with_delegate(route_table_delegate_t *delegate)

rt = XCALLOC(MTYPE_ROUTE_TABLE, sizeof(struct route_table));
rt->delegate = delegate;
rt->hash = hash_create(prefix_hash_key, route_table_hash_cmp,
"route table hash");
rn_hash_node_init(&rt->hash);
return rt;
}

Expand All @@ -69,15 +70,14 @@ static struct route_node *route_node_new(struct route_table *table)
static struct route_node *route_node_set(struct route_table *table,
const struct prefix *prefix)
{
struct route_node *node, *inserted;
struct route_node *node;

node = route_node_new(table);

prefix_copy(&node->p, prefix);
node->table = table;

inserted = hash_get(node->table->hash, node, hash_alloc_intern);
assert(inserted == node);
rn_hash_node_add(&node->table->hash, node);

return node;
}
Expand All @@ -99,9 +99,6 @@ static void route_table_free(struct route_table *rt)
if (rt == NULL)
return;

hash_clean(rt->hash, NULL);
hash_free(rt->hash);

node = rt->top;

/* Bulk deletion of nodes remaining in this table. This function is not
Expand All @@ -123,6 +120,7 @@ static void route_table_free(struct route_table *rt)

tmp_node->table->count--;
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);

if (node != NULL) {
Expand All @@ -137,6 +135,7 @@ static void route_table_free(struct route_table *rt)

assert(rt->count == 0);

rn_hash_node_fini(&rt->hash);
XFREE(MTYPE_ROUTE_TABLE, rt);
return;
}
Expand Down Expand Up @@ -257,7 +256,7 @@ struct route_node *route_node_lookup(const struct route_table *table,
prefix_copy(&p, pu.p);
apply_mask(&p);

node = hash_get(table->hash, (void *)&p, NULL);
node = rn_hash_node_find(&table->hash, (void *)&p);
return (node && node->info) ? route_lock_node(node) : NULL;
}

Expand All @@ -270,7 +269,7 @@ struct route_node *route_node_lookup_maynull(const struct route_table *table,
prefix_copy(&p, pu.p);
apply_mask(&p);

node = hash_get(table->hash, (void *)&p, NULL);
node = rn_hash_node_find(&table->hash, (void *)&p);
return node ? route_lock_node(node) : NULL;
}

Expand All @@ -282,12 +281,11 @@ struct route_node *route_node_get(struct route_table *const table,
struct route_node *new;
struct route_node *node;
struct route_node *match;
struct route_node *inserted;
uint16_t prefixlen = p->prefixlen;
const uint8_t *prefix = &p->u.prefix;

apply_mask((struct prefix *)p);
node = hash_get(table->hash, (void *)p, NULL);
node = rn_hash_node_find(&table->hash, (void *)p);
if (node && node->info)
return route_lock_node(node);

Expand All @@ -314,8 +312,7 @@ struct route_node *route_node_get(struct route_table *const table,
new->p.family = p->family;
new->table = table;
set_link(new, node);
inserted = hash_get(node->table->hash, new, hash_alloc_intern);
assert(inserted == new);
rn_hash_node_add(&table->hash, new);

if (match)
set_link(match, new);
Expand Down Expand Up @@ -367,7 +364,7 @@ void route_node_delete(struct route_node *node)

node->table->count--;

hash_release(node->table->hash, node);
rn_hash_node_del(&node->table->hash, node);

/* WARNING: FRAGILE CODE!
* route_node_free may have the side effect of free'ing the entire
Expand Down
6 changes: 5 additions & 1 deletion lib/table.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "memory.h"
#include "hash.h"
#include "prefix.h"
#include "typesafe.h"

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -59,10 +60,12 @@ struct route_table_delegate_t_ {
route_table_destroy_node_func_t destroy_node;
};

PREDECL_HASH(rn_hash_node)

/* Routing table top structure. */
struct route_table {
struct route_node *top;
struct hash *hash;
struct rn_hash_node_head hash;

/*
* Delegate that performs certain functions for this table.
Expand Down Expand Up @@ -129,6 +132,7 @@ struct route_table {
/* Lock of this radix */ \
unsigned int table_rdonly(lock); \
\
struct rn_hash_node_item nodehash; \
/* Each node of route. */ \
void *info; \

Expand Down
6 changes: 3 additions & 3 deletions lib/typesafe.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ macro_pure size_t prefix ## _count(struct prefix##_head *h) \
#define DECLARE_SORTLIST_UNIQ(prefix, type, field, cmpfn) \
_DECLARE_SORTLIST(prefix, type, field, cmpfn, cmpfn) \
\
macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item) \
macro_inline type *prefix ## _find(const struct prefix##_head *h, const type *item) \
{ \
struct ssort_item *sitem = h->sh.first; \
int cmpval = 0; \
Expand Down Expand Up @@ -383,7 +383,7 @@ macro_inline type *prefix ## _add(struct prefix##_head *h, type *item) \
*np = &item->field.hi; \
return NULL; \
} \
macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item) \
macro_inline type *prefix ## _find(const struct prefix##_head *h, const type *item) \
{ \
if (!h->hh.tabshift) \
return NULL; \
Expand Down Expand Up @@ -576,7 +576,7 @@ macro_inline int prefix ## __cmp(const struct sskip_item *a, \
return cmpfn(container_of(a, type, field.si), \
container_of(b, type, field.si)); \
} \
macro_inline type *prefix ## _find(struct prefix##_head *h, const type *item) \
macro_inline type *prefix ## _find(const struct prefix##_head *h, const type *item) \
{ \
struct sskip_item *sitem = typesafe_skiplist_find(&h->sh, \
&item->field.si, &prefix ## __cmp); \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
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 "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('r3','vtysh -c "show vnc registrations"','Locally: *Active: 0 .* Remotely: *Active: 0','wait','All registrations cleared')
Expand Down
43 changes: 42 additions & 1 deletion zebra/rib.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

#include "zebra.h"
#include "hook.h"
#include "typesafe.h"
#include "linklist.h"
#include "prefix.h"
#include "table.h"
Expand All @@ -39,6 +40,44 @@
extern "C" {
#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 ZEBRA_KERNEL_TABLE_MAX 252 /* support for no more than this rt tables */

Expand Down Expand Up @@ -151,7 +190,7 @@ typedef struct rib_dest_t_ {
* the data plane we will run evaluate_rnh
* on these prefixes.
*/
struct list *nht;
struct rnh_list_head nht;

/*
* Linkage to put dest on the FPM processing queue.
Expand All @@ -160,6 +199,8 @@ typedef struct rib_dest_t_ {

} rib_dest_t;

DECLARE_LIST(rnh_list, struct rnh, rnh_list_item);

#define RIB_ROUTE_QUEUED(x) (1 << (x))
// If MQ_SIZE is modified this value needs to be updated.
#define RIB_ROUTE_ANY_QUEUED 0x1F
Expand Down
7 changes: 3 additions & 4 deletions zebra/zebra_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1204,7 +1204,6 @@ static int rib_can_delete_dest(rib_dest_t *dest)
void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq)
{
rib_dest_t *dest = rib_dest_from_rnode(rn);
struct listnode *node, *nnode;
struct rnh *rnh;

/*
Expand Down Expand Up @@ -1236,7 +1235,7 @@ void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq)
* nht resolution and as such we need to call the
* nexthop tracking evaluation code
*/
for (ALL_LIST_ELEMENTS(dest->nht, node, nnode, rnh)) {
for_each (rnh_list, &dest->nht, rnh) {
struct zebra_vrf *zvrf =
zebra_vrf_lookup_by_id(rnh->vrf_id);
struct prefix *p = &rnh->node->p;
Expand Down Expand Up @@ -1312,7 +1311,7 @@ int rib_gc_dest(struct route_node *rn)
zebra_rib_evaluate_rn_nexthops(rn, zebra_router_get_next_sequence());

dest->rnode = NULL;
list_delete(&dest->nht);
rnh_list_fini(&dest->nht);
XFREE(MTYPE_RIB_DEST, dest);
rn->info = NULL;

Expand Down Expand Up @@ -2357,7 +2356,7 @@ rib_dest_t *zebra_rib_create_dest(struct route_node *rn)
rib_dest_t *dest;

dest = XCALLOC(MTYPE_RIB_DEST, sizeof(rib_dest_t));
dest->nht = list_new();
rnh_list_init(&dest->nht);
route_lock_node(rn); /* rn route table reference */
rn->info = dest;
dest->rnode = rn;
Expand Down
6 changes: 3 additions & 3 deletions zebra/zebra_rnh.c
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ static void zebra_rnh_remove_from_routing_table(struct rnh *rnh)
}

dest = rib_dest_from_rnode(rn);
listnode_delete(dest->nht, rnh);
rnh_list_del(&dest->nht, rnh);
route_unlock_node(rn);
}

Expand All @@ -145,7 +145,7 @@ static void zebra_rnh_store_in_routing_table(struct rnh *rnh)
}

dest = rib_dest_from_rnode(rn);
listnode_add(dest->nht, rnh);
rnh_list_add_tail(&dest->nht, rnh);
route_unlock_node(rn);
}

Expand Down Expand Up @@ -251,7 +251,7 @@ void zebra_free_rnh(struct rnh *rnh)
route_unlock_node(rern);

dest = rib_dest_from_rnode(rern);
listnode_delete(dest->nht, rnh);
rnh_list_del(&dest->nht, rnh);
}
}
free_state(rnh->vrf_id, rnh->state, rnh->node);
Expand Down
Loading

0 comments on commit eefbfd1

Please sign in to comment.