These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / net / netfilter / nf_conntrack_zones.h
1 #ifndef _NF_CONNTRACK_ZONES_H
2 #define _NF_CONNTRACK_ZONES_H
3
4 #include <linux/netfilter/nf_conntrack_zones_common.h>
5
6 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
7 #include <net/netfilter/nf_conntrack_extend.h>
8
9 static inline const struct nf_conntrack_zone *
10 nf_ct_zone(const struct nf_conn *ct)
11 {
12         const struct nf_conntrack_zone *nf_ct_zone = NULL;
13
14 #ifdef CONFIG_NF_CONNTRACK_ZONES
15         nf_ct_zone = nf_ct_ext_find(ct, NF_CT_EXT_ZONE);
16 #endif
17         return nf_ct_zone ? nf_ct_zone : &nf_ct_zone_dflt;
18 }
19
20 static inline const struct nf_conntrack_zone *
21 nf_ct_zone_init(struct nf_conntrack_zone *zone, u16 id, u8 dir, u8 flags)
22 {
23         zone->id = id;
24         zone->flags = flags;
25         zone->dir = dir;
26
27         return zone;
28 }
29
30 static inline const struct nf_conntrack_zone *
31 nf_ct_zone_tmpl(const struct nf_conn *tmpl, const struct sk_buff *skb,
32                 struct nf_conntrack_zone *tmp)
33 {
34         const struct nf_conntrack_zone *zone;
35
36         if (!tmpl)
37                 return &nf_ct_zone_dflt;
38
39         zone = nf_ct_zone(tmpl);
40         if (zone->flags & NF_CT_FLAG_MARK)
41                 zone = nf_ct_zone_init(tmp, skb->mark, zone->dir, 0);
42
43         return zone;
44 }
45
46 static inline int nf_ct_zone_add(struct nf_conn *ct, gfp_t flags,
47                                  const struct nf_conntrack_zone *info)
48 {
49 #ifdef CONFIG_NF_CONNTRACK_ZONES
50         struct nf_conntrack_zone *nf_ct_zone;
51
52         nf_ct_zone = nf_ct_ext_add(ct, NF_CT_EXT_ZONE, flags);
53         if (!nf_ct_zone)
54                 return -ENOMEM;
55
56         nf_ct_zone_init(nf_ct_zone, info->id, info->dir,
57                         info->flags);
58 #endif
59         return 0;
60 }
61
62 static inline bool nf_ct_zone_matches_dir(const struct nf_conntrack_zone *zone,
63                                           enum ip_conntrack_dir dir)
64 {
65         return zone->dir & (1 << dir);
66 }
67
68 static inline u16 nf_ct_zone_id(const struct nf_conntrack_zone *zone,
69                                 enum ip_conntrack_dir dir)
70 {
71         return nf_ct_zone_matches_dir(zone, dir) ?
72                zone->id : NF_CT_DEFAULT_ZONE_ID;
73 }
74
75 static inline bool nf_ct_zone_equal(const struct nf_conn *a,
76                                     const struct nf_conntrack_zone *b,
77                                     enum ip_conntrack_dir dir)
78 {
79         return nf_ct_zone_id(nf_ct_zone(a), dir) ==
80                nf_ct_zone_id(b, dir);
81 }
82
83 static inline bool nf_ct_zone_equal_any(const struct nf_conn *a,
84                                         const struct nf_conntrack_zone *b)
85 {
86         return nf_ct_zone(a)->id == b->id;
87 }
88 #endif /* IS_ENABLED(CONFIG_NF_CONNTRACK) */
89 #endif /* _NF_CONNTRACK_ZONES_H */