utils.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include <linux/kernel.h>
  2. #include <linux/netfilter.h>
  3. #include <linux/netfilter_ipv4.h>
  4. #include <linux/netfilter_ipv6.h>
  5. __sum16 nf_checksum(struct sk_buff *skb, unsigned int hook,
  6. unsigned int dataoff, u_int8_t protocol,
  7. unsigned short family)
  8. {
  9. const struct nf_ipv6_ops *v6ops;
  10. __sum16 csum = 0;
  11. switch (family) {
  12. case AF_INET:
  13. csum = nf_ip_checksum(skb, hook, dataoff, protocol);
  14. break;
  15. case AF_INET6:
  16. v6ops = rcu_dereference(nf_ipv6_ops);
  17. if (v6ops)
  18. csum = v6ops->checksum(skb, hook, dataoff, protocol);
  19. break;
  20. }
  21. return csum;
  22. }
  23. EXPORT_SYMBOL_GPL(nf_checksum);
  24. __sum16 nf_checksum_partial(struct sk_buff *skb, unsigned int hook,
  25. unsigned int dataoff, unsigned int len,
  26. u_int8_t protocol, unsigned short family)
  27. {
  28. const struct nf_ipv6_ops *v6ops;
  29. __sum16 csum = 0;
  30. switch (family) {
  31. case AF_INET:
  32. csum = nf_ip_checksum_partial(skb, hook, dataoff, len,
  33. protocol);
  34. break;
  35. case AF_INET6:
  36. v6ops = rcu_dereference(nf_ipv6_ops);
  37. if (v6ops)
  38. csum = v6ops->checksum_partial(skb, hook, dataoff, len,
  39. protocol);
  40. break;
  41. }
  42. return csum;
  43. }
  44. EXPORT_SYMBOL_GPL(nf_checksum_partial);