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