fib_notifier.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. int call_fib4_notifier(struct notifier_block *nb,
  12. enum fib_event_type event_type,
  13. struct fib_notifier_info *info)
  14. {
  15. info->family = AF_INET;
  16. return call_fib_notifier(nb, event_type, info);
  17. }
  18. int call_fib4_notifiers(struct net *net, enum fib_event_type event_type,
  19. struct fib_notifier_info *info)
  20. {
  21. ASSERT_RTNL();
  22. info->family = AF_INET;
  23. net->ipv4.fib_seq++;
  24. return call_fib_notifiers(net, event_type, info);
  25. }
  26. static unsigned int fib4_seq_read(struct net *net)
  27. {
  28. ASSERT_RTNL();
  29. return net->ipv4.fib_seq + fib4_rules_seq_read(net);
  30. }
  31. static int fib4_dump(struct net *net, struct notifier_block *nb,
  32. struct netlink_ext_ack *extack)
  33. {
  34. int err;
  35. err = fib4_rules_dump(net, nb, extack);
  36. if (err)
  37. return err;
  38. return fib_notify(net, nb, extack);
  39. }
  40. static const struct fib_notifier_ops fib4_notifier_ops_template = {
  41. .family = AF_INET,
  42. .fib_seq_read = fib4_seq_read,
  43. .fib_dump = fib4_dump,
  44. .owner = THIS_MODULE,
  45. };
  46. int __net_init fib4_notifier_init(struct net *net)
  47. {
  48. struct fib_notifier_ops *ops;
  49. net->ipv4.fib_seq = 0;
  50. ops = fib_notifier_ops_register(&fib4_notifier_ops_template, net);
  51. if (IS_ERR(ops))
  52. return PTR_ERR(ops);
  53. net->ipv4.notifier_ops = ops;
  54. return 0;
  55. }
  56. void __net_exit fib4_notifier_exit(struct net *net)
  57. {
  58. fib_notifier_ops_unregister(net->ipv4.notifier_ops);
  59. }