root/net/ipv4/fib_notifier.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. call_fib4_notifier
  2. call_fib4_notifiers
  3. fib4_seq_read
  4. fib4_dump
  5. fib4_notifier_init
  6. fib4_notifier_exit

   1 // SPDX-License-Identifier: GPL-2.0
   2 #include <linux/rtnetlink.h>
   3 #include <linux/notifier.h>
   4 #include <linux/socket.h>
   5 #include <linux/kernel.h>
   6 #include <linux/export.h>
   7 #include <net/net_namespace.h>
   8 #include <net/fib_notifier.h>
   9 #include <net/netns/ipv4.h>
  10 #include <net/ip_fib.h>
  11 
  12 int call_fib4_notifier(struct notifier_block *nb, struct net *net,
  13                        enum fib_event_type event_type,
  14                        struct fib_notifier_info *info)
  15 {
  16         info->family = AF_INET;
  17         return call_fib_notifier(nb, net, event_type, info);
  18 }
  19 
  20 int call_fib4_notifiers(struct net *net, enum fib_event_type event_type,
  21                         struct fib_notifier_info *info)
  22 {
  23         ASSERT_RTNL();
  24 
  25         info->family = AF_INET;
  26         net->ipv4.fib_seq++;
  27         return call_fib_notifiers(net, event_type, info);
  28 }
  29 
  30 static unsigned int fib4_seq_read(struct net *net)
  31 {
  32         ASSERT_RTNL();
  33 
  34         return net->ipv4.fib_seq + fib4_rules_seq_read(net);
  35 }
  36 
  37 static int fib4_dump(struct net *net, struct notifier_block *nb)
  38 {
  39         int err;
  40 
  41         err = fib4_rules_dump(net, nb);
  42         if (err)
  43                 return err;
  44 
  45         fib_notify(net, nb);
  46 
  47         return 0;
  48 }
  49 
  50 static const struct fib_notifier_ops fib4_notifier_ops_template = {
  51         .family         = AF_INET,
  52         .fib_seq_read   = fib4_seq_read,
  53         .fib_dump       = fib4_dump,
  54         .owner          = THIS_MODULE,
  55 };
  56 
  57 int __net_init fib4_notifier_init(struct net *net)
  58 {
  59         struct fib_notifier_ops *ops;
  60 
  61         net->ipv4.fib_seq = 0;
  62 
  63         ops = fib_notifier_ops_register(&fib4_notifier_ops_template, net);
  64         if (IS_ERR(ops))
  65                 return PTR_ERR(ops);
  66         net->ipv4.notifier_ops = ops;
  67 
  68         return 0;
  69 }
  70 
  71 void __net_exit fib4_notifier_exit(struct net *net)
  72 {
  73         fib_notifier_ops_unregister(net->ipv4.notifier_ops);
  74 }

/* [<][>][^][v][top][bottom][index][help] */