nft_fib_inet.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>
  4. #include <linux/module.h>
  5. #include <linux/netlink.h>
  6. #include <linux/netfilter.h>
  7. #include <linux/netfilter/nf_tables.h>
  8. #include <net/netfilter/nf_tables_core.h>
  9. #include <net/netfilter/nf_tables.h>
  10. #include <net/netfilter/nft_fib.h>
  11. static void nft_fib_inet_eval(const struct nft_expr *expr,
  12. struct nft_regs *regs,
  13. const struct nft_pktinfo *pkt)
  14. {
  15. const struct nft_fib *priv = nft_expr_priv(expr);
  16. switch (nft_pf(pkt)) {
  17. case NFPROTO_IPV4:
  18. switch (priv->result) {
  19. case NFT_FIB_RESULT_OIF:
  20. case NFT_FIB_RESULT_OIFNAME:
  21. return nft_fib4_eval(expr, regs, pkt);
  22. case NFT_FIB_RESULT_ADDRTYPE:
  23. return nft_fib4_eval_type(expr, regs, pkt);
  24. }
  25. break;
  26. case NFPROTO_IPV6:
  27. switch (priv->result) {
  28. case NFT_FIB_RESULT_OIF:
  29. case NFT_FIB_RESULT_OIFNAME:
  30. return nft_fib6_eval(expr, regs, pkt);
  31. case NFT_FIB_RESULT_ADDRTYPE:
  32. return nft_fib6_eval_type(expr, regs, pkt);
  33. }
  34. break;
  35. }
  36. regs->verdict.code = NF_DROP;
  37. }
  38. static struct nft_expr_type nft_fib_inet_type;
  39. static const struct nft_expr_ops nft_fib_inet_ops = {
  40. .type = &nft_fib_inet_type,
  41. .size = NFT_EXPR_SIZE(sizeof(struct nft_fib)),
  42. .eval = nft_fib_inet_eval,
  43. .init = nft_fib_init,
  44. .dump = nft_fib_dump,
  45. .validate = nft_fib_validate,
  46. };
  47. static struct nft_expr_type nft_fib_inet_type __read_mostly = {
  48. .family = NFPROTO_INET,
  49. .name = "fib",
  50. .ops = &nft_fib_inet_ops,
  51. .policy = nft_fib_policy,
  52. .maxattr = NFTA_FIB_MAX,
  53. .owner = THIS_MODULE,
  54. };
  55. static int __init nft_fib_inet_module_init(void)
  56. {
  57. return nft_register_expr(&nft_fib_inet_type);
  58. }
  59. static void __exit nft_fib_inet_module_exit(void)
  60. {
  61. nft_unregister_expr(&nft_fib_inet_type);
  62. }
  63. module_init(nft_fib_inet_module_init);
  64. module_exit(nft_fib_inet_module_exit);
  65. MODULE_LICENSE("GPL");
  66. MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
  67. MODULE_ALIAS_NFT_AF_EXPR(1, "fib");
  68. MODULE_DESCRIPTION("nftables fib inet support");