mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-03 08:56:13 +00:00
nhrpd: convert notifier list to DLIST
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
e1111c5faf
commit
865bf787fa
@ -315,7 +315,7 @@ static void nhrp_cache_peer_notifier(struct notifier_block *n,
|
||||
static void nhrp_cache_reset_new(struct nhrp_cache *c)
|
||||
{
|
||||
THREAD_OFF(c->t_auth);
|
||||
if (list_hashed(&c->newpeer_notifier.notifier_entry))
|
||||
if (notifier_list_anywhere(&c->newpeer_notifier))
|
||||
nhrp_peer_notify_del(c->new.peer, &c->newpeer_notifier);
|
||||
nhrp_peer_unref(c->new.peer);
|
||||
memset(&c->new, 0, sizeof(c->new));
|
||||
@ -574,5 +574,5 @@ void nhrp_cache_notify_add(struct nhrp_cache *c, struct notifier_block *n,
|
||||
|
||||
void nhrp_cache_notify_del(struct nhrp_cache *c, struct notifier_block *n)
|
||||
{
|
||||
notifier_del(n);
|
||||
notifier_del(n, &c->notifier_list);
|
||||
}
|
||||
|
@ -224,8 +224,12 @@ void nhrp_interface_update_nbma(struct interface *ifp,
|
||||
nbmanifp = nbmaifp->info;
|
||||
|
||||
if (nbmaifp != nifp->nbmaifp) {
|
||||
if (nifp->nbmaifp)
|
||||
notifier_del(&nifp->nbmanifp_notifier);
|
||||
if (nifp->nbmaifp) {
|
||||
struct nhrp_interface *prev_nifp = nifp->nbmaifp->info;
|
||||
|
||||
notifier_del(&nifp->nbmanifp_notifier,
|
||||
&prev_nifp->notifier_list);
|
||||
}
|
||||
nifp->nbmaifp = nbmaifp;
|
||||
if (nbmaifp) {
|
||||
notifier_add(&nifp->nbmanifp_notifier,
|
||||
@ -509,12 +513,15 @@ void nhrp_interface_notify_add(struct interface *ifp, struct notifier_block *n,
|
||||
notifier_fn_t fn)
|
||||
{
|
||||
struct nhrp_interface *nifp = ifp->info;
|
||||
|
||||
notifier_add(n, &nifp->notifier_list, fn);
|
||||
}
|
||||
|
||||
void nhrp_interface_notify_del(struct interface *ifp, struct notifier_block *n)
|
||||
{
|
||||
notifier_del(n);
|
||||
struct nhrp_interface *nifp = ifp->info;
|
||||
|
||||
notifier_del(n, &nifp->notifier_list);
|
||||
}
|
||||
|
||||
void nhrp_interface_set_protection(struct interface *ifp, const char *profile,
|
||||
|
@ -359,7 +359,7 @@ void nhrp_peer_notify_add(struct nhrp_peer *p, struct notifier_block *n,
|
||||
|
||||
void nhrp_peer_notify_del(struct nhrp_peer *p, struct notifier_block *n)
|
||||
{
|
||||
notifier_del(n);
|
||||
notifier_del(n, &p->notifier_list);
|
||||
nhrp_peer_check_delete(p);
|
||||
}
|
||||
|
||||
|
@ -170,7 +170,7 @@ void nhrp_vc_notify_add(struct nhrp_vc *vc, struct notifier_block *n,
|
||||
|
||||
void nhrp_vc_notify_del(struct nhrp_vc *vc, struct notifier_block *n)
|
||||
{
|
||||
notifier_del(n);
|
||||
notifier_del(n, &vc->notifier_list);
|
||||
nhrp_vc_check_delete(vc);
|
||||
}
|
||||
|
||||
|
@ -42,48 +42,53 @@ struct notifier_block;
|
||||
|
||||
typedef void (*notifier_fn_t)(struct notifier_block *, unsigned long);
|
||||
|
||||
PREDECL_DLIST(notifier_list);
|
||||
|
||||
struct notifier_block {
|
||||
struct list_head notifier_entry;
|
||||
struct notifier_list_item notifier_entry;
|
||||
notifier_fn_t action;
|
||||
};
|
||||
|
||||
DECLARE_DLIST(notifier_list, struct notifier_block, notifier_entry);
|
||||
|
||||
struct notifier_list {
|
||||
struct list_head notifier_head;
|
||||
struct notifier_list_head head;
|
||||
};
|
||||
|
||||
#define NOTIFIER_LIST_INITIALIZER(l) \
|
||||
{ \
|
||||
.notifier_head = LIST_INITIALIZER((l)->notifier_head) \
|
||||
.head = INIT_DLIST((l)->head) \
|
||||
}
|
||||
|
||||
static inline void notifier_init(struct notifier_list *l)
|
||||
{
|
||||
list_init(&l->notifier_head);
|
||||
notifier_list_init(&l->head);
|
||||
}
|
||||
|
||||
static inline void notifier_add(struct notifier_block *n,
|
||||
struct notifier_list *l, notifier_fn_t action)
|
||||
{
|
||||
n->action = action;
|
||||
list_add_tail(&n->notifier_entry, &l->notifier_head);
|
||||
notifier_list_add_tail(&l->head, n);
|
||||
}
|
||||
|
||||
static inline void notifier_del(struct notifier_block *n)
|
||||
static inline void notifier_del(struct notifier_block *n,
|
||||
struct notifier_list *l)
|
||||
{
|
||||
list_del(&n->notifier_entry);
|
||||
notifier_list_del(&l->head, n);
|
||||
}
|
||||
|
||||
static inline void notifier_call(struct notifier_list *l, int cmd)
|
||||
{
|
||||
struct notifier_block *n, *nn;
|
||||
list_for_each_entry_safe(n, nn, &l->notifier_head, notifier_entry) {
|
||||
struct notifier_block *n;
|
||||
|
||||
frr_each_safe (notifier_list, &l->head, n)
|
||||
n->action(n, cmd);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int notifier_active(struct notifier_list *l)
|
||||
{
|
||||
return !list_empty(&l->notifier_head);
|
||||
return notifier_list_count(&l->head) > 0;
|
||||
}
|
||||
|
||||
extern struct hash *nhrp_gre_list;
|
||||
|
Loading…
Reference in New Issue
Block a user