linux/include/net/netfilter/nf_conntrack_extend.h
<<
>>
Prefs
   1#ifndef _NF_CONNTRACK_EXTEND_H
   2#define _NF_CONNTRACK_EXTEND_H
   3
   4#include <linux/slab.h>
   5
   6#include <net/netfilter/nf_conntrack.h>
   7
   8enum nf_ct_ext_id {
   9        NF_CT_EXT_HELPER,
  10#if defined(CONFIG_NF_NAT) || defined(CONFIG_NF_NAT_MODULE)
  11        NF_CT_EXT_NAT,
  12#endif
  13        NF_CT_EXT_ACCT,
  14#ifdef CONFIG_NF_CONNTRACK_EVENTS
  15        NF_CT_EXT_ECACHE,
  16#endif
  17#ifdef CONFIG_NF_CONNTRACK_ZONES
  18        NF_CT_EXT_ZONE,
  19#endif
  20#ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
  21        NF_CT_EXT_TSTAMP,
  22#endif
  23        NF_CT_EXT_NUM,
  24};
  25
  26#define NF_CT_EXT_HELPER_TYPE struct nf_conn_help
  27#define NF_CT_EXT_NAT_TYPE struct nf_conn_nat
  28#define NF_CT_EXT_ACCT_TYPE struct nf_conn_counter
  29#define NF_CT_EXT_ECACHE_TYPE struct nf_conntrack_ecache
  30#define NF_CT_EXT_ZONE_TYPE struct nf_conntrack_zone
  31#define NF_CT_EXT_TSTAMP_TYPE struct nf_conn_tstamp
  32
  33/* Extensions: optional stuff which isn't permanently in struct. */
  34struct nf_ct_ext {
  35        struct rcu_head rcu;
  36        u8 offset[NF_CT_EXT_NUM];
  37        u8 len;
  38        char data[0];
  39};
  40
  41static inline bool __nf_ct_ext_exist(const struct nf_ct_ext *ext, u8 id)
  42{
  43        return !!ext->offset[id];
  44}
  45
  46static inline bool nf_ct_ext_exist(const struct nf_conn *ct, u8 id)
  47{
  48        return (ct->ext && __nf_ct_ext_exist(ct->ext, id));
  49}
  50
  51static inline void *__nf_ct_ext_find(const struct nf_conn *ct, u8 id)
  52{
  53        if (!nf_ct_ext_exist(ct, id))
  54                return NULL;
  55
  56        return (void *)ct->ext + ct->ext->offset[id];
  57}
  58#define nf_ct_ext_find(ext, id) \
  59        ((id##_TYPE *)__nf_ct_ext_find((ext), (id)))
  60
  61/* Destroy all relationships */
  62extern void __nf_ct_ext_destroy(struct nf_conn *ct);
  63static inline void nf_ct_ext_destroy(struct nf_conn *ct)
  64{
  65        if (ct->ext)
  66                __nf_ct_ext_destroy(ct);
  67}
  68
  69/* Free operation. If you want to free a object referred from private area,
  70 * please implement __nf_ct_ext_free() and call it.
  71 */
  72static inline void nf_ct_ext_free(struct nf_conn *ct)
  73{
  74        if (ct->ext)
  75                kfree(ct->ext);
  76}
  77
  78/* Add this type, returns pointer to data or NULL. */
  79void *
  80__nf_ct_ext_add(struct nf_conn *ct, enum nf_ct_ext_id id, gfp_t gfp);
  81#define nf_ct_ext_add(ct, id, gfp) \
  82        ((id##_TYPE *)__nf_ct_ext_add((ct), (id), (gfp)))
  83
  84#define NF_CT_EXT_F_PREALLOC    0x0001
  85
  86struct nf_ct_ext_type {
  87        /* Destroys relationships (can be NULL). */
  88        void (*destroy)(struct nf_conn *ct);
  89        /* Called when realloacted (can be NULL).
  90           Contents has already been moved. */
  91        void (*move)(void *new, void *old);
  92
  93        enum nf_ct_ext_id id;
  94
  95        unsigned int flags;
  96
  97        /* Length and min alignment. */
  98        u8 len;
  99        u8 align;
 100        /* initial size of nf_ct_ext. */
 101        u8 alloc_size;
 102};
 103
 104int nf_ct_extend_register(struct nf_ct_ext_type *type);
 105void nf_ct_extend_unregister(struct nf_ct_ext_type *type);
 106#endif /* _NF_CONNTRACK_EXTEND_H */
 107