blob: 1723a67c0b0a887d689c58481189f77f723aa400 [file] [log] [blame]
Florian Westphalc539f012013-01-11 06:30:44 +00001#include <linux/types.h>
2#include <net/net_namespace.h>
3#include <linux/netfilter/nf_conntrack_common.h>
4#include <linux/netfilter/nf_conntrack_tuple_common.h>
5#include <net/netfilter/nf_conntrack.h>
6#include <net/netfilter/nf_conntrack_extend.h>
7
8#include <uapi/linux/netfilter/xt_connlabel.h>
9
Florian Westphald2bf2f32014-02-18 15:25:32 +010010#define NF_CT_LABELS_MAX_SIZE ((XT_CONNLABEL_MAXBIT + 1) / BITS_PER_BYTE)
11
Florian Westphalc539f012013-01-11 06:30:44 +000012struct nf_conn_labels {
Florian Westphal23014012016-07-21 12:51:16 +020013 unsigned long bits[NF_CT_LABELS_MAX_SIZE / sizeof(long)];
Florian Westphalc539f012013-01-11 06:30:44 +000014};
15
16static inline struct nf_conn_labels *nf_ct_labels_find(const struct nf_conn *ct)
17{
18#ifdef CONFIG_NF_CONNTRACK_LABELS
19 return nf_ct_ext_find(ct, NF_CT_EXT_LABELS);
20#else
21 return NULL;
22#endif
23}
24
25static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct)
26{
27#ifdef CONFIG_NF_CONNTRACK_LABELS
Florian Westphalc539f012013-01-11 06:30:44 +000028 struct net *net = nf_ct_net(ct);
Florian Westphalc539f012013-01-11 06:30:44 +000029
Florian Westphal23014012016-07-21 12:51:16 +020030 if (net->ct.labels_used == 0)
Florian Westphalc539f012013-01-11 06:30:44 +000031 return NULL;
32
Florian Westphalcdb436d2016-10-26 23:46:17 +020033 return nf_ct_ext_add(ct, NF_CT_EXT_LABELS, GFP_ATOMIC);
Florian Westphalc539f012013-01-11 06:30:44 +000034#else
35 return NULL;
36#endif
37}
38
Florian Westphal9b21f6a2013-01-11 06:30:46 +000039int nf_connlabels_replace(struct nf_conn *ct,
40 const u32 *data, const u32 *mask, unsigned int words);
41
Florian Westphalc539f012013-01-11 06:30:44 +000042#ifdef CONFIG_NF_CONNTRACK_LABELS
Gao feng5f69b8f2013-01-21 22:10:31 +000043int nf_conntrack_labels_init(void);
44void nf_conntrack_labels_fini(void);
Florian Westphaladff6c62016-04-12 18:14:25 +020045int nf_connlabels_get(struct net *net, unsigned int bit);
Joe Stringer86ca02e2015-08-26 11:31:51 -070046void nf_connlabels_put(struct net *net);
Florian Westphalc539f012013-01-11 06:30:44 +000047#else
Gao feng5f69b8f2013-01-21 22:10:31 +000048static inline int nf_conntrack_labels_init(void) { return 0; }
49static inline void nf_conntrack_labels_fini(void) {}
Florian Westphaladff6c62016-04-12 18:14:25 +020050static inline int nf_connlabels_get(struct net *net, unsigned int bit) { return 0; }
Joe Stringer86ca02e2015-08-26 11:31:51 -070051static inline void nf_connlabels_put(struct net *net) {}
Florian Westphalc539f012013-01-11 06:30:44 +000052#endif