cregit-Linux how code gets into the kernel

Release 4.12 net/ipv4/fib_notifier.c

Directory: net/ipv4
#include <linux/rtnetlink.h>
#include <linux/notifier.h>
#include <linux/rcupdate.h>
#include <linux/kernel.h>
#include <net/net_namespace.h>
#include <net/netns/ipv4.h>
#include <net/ip_fib.h>

static ATOMIC_NOTIFIER_HEAD(fib_chain);


int call_fib_notifier(struct notifier_block *nb, struct net *net, enum fib_event_type event_type, struct fib_notifier_info *info) { info->net = net; return nb->notifier_call(nb, event_type, info); }

Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel42100.00%1100.00%
Total42100.00%1100.00%


int call_fib_notifiers(struct net *net, enum fib_event_type event_type, struct fib_notifier_info *info) { net->ipv4.fib_seq++; info->net = net; return atomic_notifier_call_chain(&fib_chain, event_type, info); }

Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel43100.00%1100.00%
Total43100.00%1100.00%


static unsigned int fib_seq_sum(void) { unsigned int fib_seq = 0; struct net *net; rtnl_lock(); for_each_net(net) fib_seq += net->ipv4.fib_seq; rtnl_unlock(); return fib_seq; }

Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel41100.00%1100.00%
Total41100.00%1100.00%


static bool fib_dump_is_consistent(struct notifier_block *nb, void (*cb)(struct notifier_block *nb), unsigned int fib_seq) { atomic_notifier_chain_register(&fib_chain, nb); if (fib_seq == fib_seq_sum()) return true; atomic_notifier_chain_unregister(&fib_chain, nb); if (cb) cb(nb); return false; }

Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel65100.00%1100.00%
Total65100.00%1100.00%

#define FIB_DUMP_MAX_RETRIES 5
int register_fib_notifier(struct notifier_block *nb, void (*cb)(struct notifier_block *nb)) { int retries = 0; do { unsigned int fib_seq = fib_seq_sum(); struct net *net; /* Mutex semantics guarantee that every change done to * FIB tries before we read the change sequence counter * is now visible to us. */ rcu_read_lock(); for_each_net_rcu(net) { fib_rules_notify(net, nb); fib_notify(net, nb); } rcu_read_unlock(); if (fib_dump_is_consistent(nb, cb, fib_seq)) return 0; } while (++retries < FIB_DUMP_MAX_RETRIES); return -EBUSY; }

Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel95100.00%1100.00%
Total95100.00%1100.00%

EXPORT_SYMBOL(register_fib_notifier);
int unregister_fib_notifier(struct notifier_block *nb) { return atomic_notifier_chain_unregister(&fib_chain, nb); }

Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel19100.00%1100.00%
Total19100.00%1100.00%

EXPORT_SYMBOL(unregister_fib_notifier);

Overall Contributors

PersonTokensPropCommitsCommitProp
Ido Schimmel346100.00%1100.00%
Total346100.00%1100.00%
Directory: net/ipv4
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.