nf_conntrack_ecache.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * connection tracking event cache.
  3. */
  4. #ifndef _NF_CONNTRACK_ECACHE_H
  5. #define _NF_CONNTRACK_ECACHE_H
  6. #include <net/netfilter/nf_conntrack.h>
  7. #include <linux/notifier.h>
  8. #include <linux/interrupt.h>
  9. #include <net/netfilter/nf_conntrack_expect.h>
  10. #ifdef CONFIG_NF_CONNTRACK_EVENTS
  11. struct nf_conntrack_ecache {
  12. struct nf_conn *ct;
  13. unsigned int events;
  14. };
  15. DECLARE_PER_CPU(struct nf_conntrack_ecache, nf_conntrack_ecache);
  16. #define CONNTRACK_ECACHE(x) (__get_cpu_var(nf_conntrack_ecache).x)
  17. extern struct atomic_notifier_head nf_conntrack_chain;
  18. extern struct atomic_notifier_head nf_conntrack_expect_chain;
  19. static inline int nf_conntrack_register_notifier(struct notifier_block *nb)
  20. {
  21. return atomic_notifier_chain_register(&nf_conntrack_chain, nb);
  22. }
  23. static inline int nf_conntrack_unregister_notifier(struct notifier_block *nb)
  24. {
  25. return atomic_notifier_chain_unregister(&nf_conntrack_chain, nb);
  26. }
  27. static inline int
  28. nf_conntrack_expect_register_notifier(struct notifier_block *nb)
  29. {
  30. return atomic_notifier_chain_register(&nf_conntrack_expect_chain, nb);
  31. }
  32. static inline int
  33. nf_conntrack_expect_unregister_notifier(struct notifier_block *nb)
  34. {
  35. return atomic_notifier_chain_unregister(&nf_conntrack_expect_chain,
  36. nb);
  37. }
  38. extern void nf_ct_deliver_cached_events(const struct nf_conn *ct);
  39. extern void __nf_ct_event_cache_init(struct nf_conn *ct);
  40. extern void nf_ct_event_cache_flush(void);
  41. static inline void
  42. nf_conntrack_event_cache(enum ip_conntrack_events event,
  43. const struct sk_buff *skb)
  44. {
  45. struct nf_conn *ct = (struct nf_conn *)skb->nfct;
  46. struct nf_conntrack_ecache *ecache;
  47. local_bh_disable();
  48. ecache = &__get_cpu_var(nf_conntrack_ecache);
  49. if (ct != ecache->ct)
  50. __nf_ct_event_cache_init(ct);
  51. ecache->events |= event;
  52. local_bh_enable();
  53. }
  54. static inline void nf_conntrack_event(enum ip_conntrack_events event,
  55. struct nf_conn *ct)
  56. {
  57. if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct))
  58. atomic_notifier_call_chain(&nf_conntrack_chain, event, ct);
  59. }
  60. static inline void
  61. nf_conntrack_expect_event(enum ip_conntrack_expect_events event,
  62. struct nf_conntrack_expect *exp)
  63. {
  64. atomic_notifier_call_chain(&nf_conntrack_expect_chain, event, exp);
  65. }
  66. #else /* CONFIG_NF_CONNTRACK_EVENTS */
  67. static inline void nf_conntrack_event_cache(enum ip_conntrack_events event,
  68. const struct sk_buff *skb) {}
  69. static inline void nf_conntrack_event(enum ip_conntrack_events event,
  70. struct nf_conn *ct) {}
  71. static inline void nf_ct_deliver_cached_events(const struct nf_conn *ct) {}
  72. static inline void
  73. nf_conntrack_expect_event(enum ip_conntrack_expect_events event,
  74. struct nf_conntrack_expect *exp) {}
  75. static inline void nf_ct_event_cache_flush(void) {}
  76. #endif /* CONFIG_NF_CONNTRACK_EVENTS */
  77. #endif /*_NF_CONNTRACK_ECACHE_H*/