utils.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <linux/kernel.h>
  2. #include <linux/netfilter.h>
  3. #include <linux/netfilter_ipv4.h>
  4. #include <linux/netfilter_ipv6.h>
  5. #include <net/netfilter/nf_queue.h>
  6. __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
  7. unsigned int dataoff, u_int8_t protocol,
  8. unsigned short family)
  9. {
  10. const struct nf_ipv6_ops *v6ops;
  11. __sum16 csum = 0;
  12. switch (family) {
  13. case AF_INET:
  14. csum = nf_ip_checksum(skb, hook, dataoff, protocol);
  15. break;
  16. case AF_INET6:
  17. v6ops = rcu_dereference(nf_ipv6_ops);
  18. if (v6ops)
  19. csum = v6ops->checksum(skb, hook, dataoff, protocol);
  20. break;
  21. }
  22. return csum;
  23. }
  24. EXPORT_SYMBOL_GPL(nf_checksum);
  25. __sum16 nf_checksum_partial(struct sk_buff *skb, unsigned int hook,
  26. unsigned int dataoff, unsigned int len,
  27. u_int8_t protocol, unsigned short family)
  28. {
  29. const struct nf_ipv6_ops *v6ops;
  30. __sum16 csum = 0;
  31. switch (family) {
  32. case AF_INET:
  33. csum = nf_ip_checksum_partial(skb, hook, dataoff, len,
  34. protocol);
  35. break;
  36. case AF_INET6:
  37. v6ops = rcu_dereference(nf_ipv6_ops);
  38. if (v6ops)
  39. csum = v6ops->checksum_partial(skb, hook, dataoff, len,
  40. protocol);
  41. break;
  42. }
  43. return csum;
  44. }
  45. EXPORT_SYMBOL_GPL(nf_checksum_partial);
  46. int nf_route(struct net *net, struct dst_entry **dst, struct flowi *fl,
  47. bool strict, unsigned short family)
  48. {
  49. const struct nf_ipv6_ops *v6ops;
  50. int ret = 0;
  51. switch (family) {
  52. case AF_INET:
  53. ret = nf_ip_route(net, dst, fl, strict);
  54. break;
  55. case AF_INET6:
  56. v6ops = rcu_dereference(nf_ipv6_ops);
  57. if (v6ops)
  58. ret = v6ops->route(net, dst, fl, strict);
  59. break;
  60. }
  61. return ret;
  62. }
  63. EXPORT_SYMBOL_GPL(nf_route);
  64. int nf_reroute(struct sk_buff *skb, struct nf_queue_entry *entry)
  65. {
  66. const struct nf_ipv6_ops *v6ops;
  67. int ret = 0;
  68. switch (entry->state.pf) {
  69. case AF_INET:
  70. ret = nf_ip_reroute(skb, entry);
  71. break;
  72. case AF_INET6:
  73. v6ops = rcu_dereference(nf_ipv6_ops);
  74. if (v6ops)
  75. ret = v6ops->reroute(skb, entry);
  76. break;
  77. }
  78. return ret;
  79. }