ip6table_security.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * "security" table for IPv6
  3. *
  4. * This is for use by Mandatory Access Control (MAC) security models,
  5. * which need to be able to manage security policy in separate context
  6. * to DAC.
  7. *
  8. * Based on iptable_mangle.c
  9. *
  10. * Copyright (C) 1999 Paul `Rusty' Russell & Michael J. Neuling
  11. * Copyright (C) 2000-2004 Netfilter Core Team <coreteam <at> netfilter.org>
  12. * Copyright (C) 2008 Red Hat, Inc., James Morris <jmorris <at> redhat.com>
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License version 2 as
  16. * published by the Free Software Foundation.
  17. */
  18. #include <linux/module.h>
  19. #include <linux/netfilter_ipv6/ip6_tables.h>
  20. #include <linux/slab.h>
  21. MODULE_LICENSE("GPL");
  22. MODULE_AUTHOR("James Morris <jmorris <at> redhat.com>");
  23. MODULE_DESCRIPTION("ip6tables security table, for MAC rules");
  24. #define SECURITY_VALID_HOOKS (1 << NF_INET_LOCAL_IN) | \
  25. (1 << NF_INET_FORWARD) | \
  26. (1 << NF_INET_LOCAL_OUT)
  27. static const struct xt_table security_table = {
  28. .name = "security",
  29. .valid_hooks = SECURITY_VALID_HOOKS,
  30. .me = THIS_MODULE,
  31. .af = NFPROTO_IPV6,
  32. .priority = NF_IP6_PRI_SECURITY,
  33. };
  34. static unsigned int
  35. ip6table_security_hook(void *priv, struct sk_buff *skb,
  36. const struct nf_hook_state *state)
  37. {
  38. return ip6t_do_table(skb, state, state->net->ipv6.ip6table_security);
  39. }
  40. static struct nf_hook_ops *sectbl_ops __read_mostly;
  41. static int __net_init ip6table_security_net_init(struct net *net)
  42. {
  43. struct ip6t_replace *repl;
  44. repl = ip6t_alloc_initial_table(&security_table);
  45. if (repl == NULL)
  46. return -ENOMEM;
  47. net->ipv6.ip6table_security =
  48. ip6t_register_table(net, &security_table, repl);
  49. kfree(repl);
  50. return PTR_ERR_OR_ZERO(net->ipv6.ip6table_security);
  51. }
  52. static void __net_exit ip6table_security_net_exit(struct net *net)
  53. {
  54. ip6t_unregister_table(net, net->ipv6.ip6table_security);
  55. }
  56. static struct pernet_operations ip6table_security_net_ops = {
  57. .init = ip6table_security_net_init,
  58. .exit = ip6table_security_net_exit,
  59. };
  60. static int __init ip6table_security_init(void)
  61. {
  62. int ret;
  63. ret = register_pernet_subsys(&ip6table_security_net_ops);
  64. if (ret < 0)
  65. return ret;
  66. sectbl_ops = xt_hook_link(&security_table, ip6table_security_hook);
  67. if (IS_ERR(sectbl_ops)) {
  68. ret = PTR_ERR(sectbl_ops);
  69. goto cleanup_table;
  70. }
  71. return ret;
  72. cleanup_table:
  73. unregister_pernet_subsys(&ip6table_security_net_ops);
  74. return ret;
  75. }
  76. static void __exit ip6table_security_fini(void)
  77. {
  78. xt_hook_unlink(&security_table, sectbl_ops);
  79. unregister_pernet_subsys(&ip6table_security_net_ops);
  80. }
  81. module_init(ip6table_security_init);
  82. module_exit(ip6table_security_fini);