linux/net/ipv4/fib_notifier.c
<<
>>
Prefs
   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
  12int call_fib4_notifier(struct notifier_block *nb,
  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, event_type, info);
  18}
  19
  20int 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
  30static 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
  37static int fib4_dump(struct net *net, struct notifier_block *nb,
  38                     struct netlink_ext_ack *extack)
  39{
  40        int err;
  41
  42        err = fib4_rules_dump(net, nb, extack);
  43        if (err)
  44                return err;
  45
  46        return fib_notify(net, nb, extack);
  47}
  48
  49static const struct fib_notifier_ops fib4_notifier_ops_template = {
  50        .family         = AF_INET,
  51        .fib_seq_read   = fib4_seq_read,
  52        .fib_dump       = fib4_dump,
  53        .owner          = THIS_MODULE,
  54};
  55
  56int __net_init fib4_notifier_init(struct net *net)
  57{
  58        struct fib_notifier_ops *ops;
  59
  60        net->ipv4.fib_seq = 0;
  61
  62        ops = fib_notifier_ops_register(&fib4_notifier_ops_template, net);
  63        if (IS_ERR(ops))
  64                return PTR_ERR(ops);
  65        net->ipv4.notifier_ops = ops;
  66
  67        return 0;
  68}
  69
  70void __net_exit fib4_notifier_exit(struct net *net)
  71{
  72        fib_notifier_ops_unregister(net->ipv4.notifier_ops);
  73}
  74