mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Minor rte/rta interface changes:
o rte can now contain a pointer to both cached and uncached rta. Protocols which don't need their own attribute caching can now just fill-in a rta, link it to rte without any calls to attribute cache and call rte_update() which will replace rte->attrs by a cached copy. o In order to support this, one of previously pad bytes in struct rta now holds new attribute flags (RTAF_CACHED). If you call rte_update() with uncached rta, you _must_ clear these flags. In other cases rta_lookup() sets it appropriately. o Added rte_free() which is useful when you construct a rte and then the circumstances change and you decide not to use it for an update. (Needed for temporary rte's in kernel syncer...)
This commit is contained in:
@@ -136,8 +136,16 @@ rt_feed_baby(struct proto *p)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
void
|
||||
rte_free(rte *e)
|
||||
{
|
||||
if (e->attrs->aflags & RTAF_CACHED)
|
||||
rta_free(e->attrs);
|
||||
sl_free(rte_slab, e);
|
||||
}
|
||||
|
||||
static inline void
|
||||
rte_free_quick(rte *e)
|
||||
{
|
||||
rta_free(e->attrs);
|
||||
sl_free(rte_slab, e);
|
||||
@@ -150,6 +158,9 @@ rte_update(net *net, struct proto *p, rte *new)
|
||||
rte *old = NULL;
|
||||
rte **k, *r, *s;
|
||||
|
||||
if (new && !(new->attrs->aflags & RTAF_CACHED)) /* Need to copy attributes */
|
||||
new->attrs = rta_lookup(new->attrs);
|
||||
|
||||
k = &net->routes; /* Find and remove original route from the same protocol */
|
||||
while (old = *k)
|
||||
{
|
||||
@@ -202,7 +213,7 @@ rte_update(net *net, struct proto *p, rte *new)
|
||||
{
|
||||
if (p->rte_remove)
|
||||
p->rte_remove(net, old);
|
||||
rte_free(old);
|
||||
rte_free_quick(old);
|
||||
}
|
||||
if (new)
|
||||
{
|
||||
|
Reference in New Issue
Block a user