#ifndef _NET_NF_TABLES_H
#define _NET_NF_TABLES_H
#include <linux/unaligned.h>
#include <linux/list.h>
#include <linux/netfilter.h>
#include <linux/netfilter/nfnetlink.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter/nf_tables.h>
#include <linux/u64_stats_sync.h>
#include <linux/rhashtable.h>
#include <net/netfilter/nf_flow_table.h>
#include <net/netlink.h>
#include <net/flow_offload.h>
#include <net/netns/generic.h>
#define NFT_MAX_HOOKS …
struct module;
#define NFT_JUMP_STACK_SIZE …
enum { … };
struct nft_pktinfo { … };
static inline struct sock *nft_sk(const struct nft_pktinfo *pkt)
{ … }
static inline unsigned int nft_thoff(const struct nft_pktinfo *pkt)
{ … }
static inline struct net *nft_net(const struct nft_pktinfo *pkt)
{ … }
static inline unsigned int nft_hook(const struct nft_pktinfo *pkt)
{ … }
static inline u8 nft_pf(const struct nft_pktinfo *pkt)
{ … }
static inline const struct net_device *nft_in(const struct nft_pktinfo *pkt)
{ … }
static inline const struct net_device *nft_out(const struct nft_pktinfo *pkt)
{ … }
static inline void nft_set_pktinfo(struct nft_pktinfo *pkt,
struct sk_buff *skb,
const struct nf_hook_state *state)
{ … }
static inline void nft_set_pktinfo_unspec(struct nft_pktinfo *pkt)
{ … }
struct nft_verdict { … };
struct nft_data { … } __attribute__((aligned …));
#define NFT_REG32_NUM …
struct nft_regs { … };
struct nft_regs_track { … };
static inline void nft_reg_store8(u32 *dreg, u8 val)
{ … }
static inline u8 nft_reg_load8(const u32 *sreg)
{ … }
static inline void nft_reg_store16(u32 *dreg, u16 val)
{ … }
static inline void nft_reg_store_be16(u32 *dreg, __be16 val)
{ … }
static inline u16 nft_reg_load16(const u32 *sreg)
{ … }
static inline __be16 nft_reg_load_be16(const u32 *sreg)
{ … }
static inline __be32 nft_reg_load_be32(const u32 *sreg)
{ … }
static inline void nft_reg_store64(u64 *dreg, u64 val)
{ … }
static inline u64 nft_reg_load64(const u32 *sreg)
{ … }
static inline void nft_data_copy(u32 *dst, const struct nft_data *src,
unsigned int len)
{ … }
struct nft_ctx { … };
enum nft_data_desc_flags { … };
struct nft_data_desc { … };
int nft_data_init(const struct nft_ctx *ctx, struct nft_data *data,
struct nft_data_desc *desc, const struct nlattr *nla);
void nft_data_hold(const struct nft_data *data, enum nft_data_types type);
void nft_data_release(const struct nft_data *data, enum nft_data_types type);
int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data,
enum nft_data_types type, unsigned int len);
static inline enum nft_data_types nft_dreg_to_type(enum nft_registers reg)
{ … }
static inline enum nft_registers nft_type_to_reg(enum nft_data_types type)
{ … }
int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest);
int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg);
int nft_parse_register_load(const struct nft_ctx *ctx,
const struct nlattr *attr, u8 *sreg, u32 len);
int nft_parse_register_store(const struct nft_ctx *ctx,
const struct nlattr *attr, u8 *dreg,
const struct nft_data *data,
enum nft_data_types type, unsigned int len);
struct nft_userdata { … };
struct nft_elem_priv { … };
struct nft_set_elem { … };
static inline void *nft_elem_priv_cast(const struct nft_elem_priv *priv)
{ … }
enum nft_iter_type { … };
struct nft_set;
struct nft_set_iter { … };
struct nft_set_desc { … };
enum nft_set_class { … };
struct nft_set_estimate { … };
#define NFT_EXPR_MAXATTR …
#define NFT_EXPR_SIZE(size) …
struct nft_expr { … };
static inline void *nft_expr_priv(const struct nft_expr *expr)
{ … }
struct nft_expr_info;
int nft_expr_inner_parse(const struct nft_ctx *ctx, const struct nlattr *nla,
struct nft_expr_info *info);
int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src, gfp_t gfp);
void nft_expr_destroy(const struct nft_ctx *ctx, struct nft_expr *expr);
int nft_expr_dump(struct sk_buff *skb, unsigned int attr,
const struct nft_expr *expr, bool reset);
bool nft_expr_reduce_bitwise(struct nft_regs_track *track,
const struct nft_expr *expr);
struct nft_set_ext;
struct nft_set_ops { … };
struct nft_set_type { … };
#define to_set_type(o) …
struct nft_set_elem_expr { … };
#define nft_setelem_expr_at(__elem_expr, __offset) …
#define nft_setelem_expr_foreach(__expr, __elem_expr, __size) …
#define NFT_SET_EXPR_MAX …
struct nft_set { … };
static inline bool nft_set_is_anonymous(const struct nft_set *set)
{ … }
static inline void *nft_set_priv(const struct nft_set *set)
{ … }
static inline enum nft_data_types nft_set_datatype(const struct nft_set *set)
{ … }
static inline bool nft_set_gc_is_pending(const struct nft_set *s)
{ … }
static inline struct nft_set *nft_set_container_of(const void *priv)
{ … }
struct nft_set *nft_set_lookup_global(const struct net *net,
const struct nft_table *table,
const struct nlattr *nla_set_name,
const struct nlattr *nla_set_id,
u8 genmask);
struct nft_set_ext *nft_set_catchall_lookup(const struct net *net,
const struct nft_set *set);
static inline unsigned long nft_set_gc_interval(const struct nft_set *set)
{ … }
struct nft_set_binding { … };
enum nft_trans_phase;
void nf_tables_activate_set(const struct nft_ctx *ctx, struct nft_set *set);
void nf_tables_deactivate_set(const struct nft_ctx *ctx, struct nft_set *set,
struct nft_set_binding *binding,
enum nft_trans_phase phase);
int nf_tables_bind_set(const struct nft_ctx *ctx, struct nft_set *set,
struct nft_set_binding *binding);
void nf_tables_destroy_set(const struct nft_ctx *ctx, struct nft_set *set);
enum nft_set_extensions { … };
struct nft_set_ext_type { … };
extern const struct nft_set_ext_type nft_set_ext_types[];
struct nft_set_ext_tmpl { … };
struct nft_set_ext { … };
static inline void nft_set_ext_prepare(struct nft_set_ext_tmpl *tmpl)
{ … }
static inline int nft_set_ext_add_length(struct nft_set_ext_tmpl *tmpl, u8 id,
unsigned int len)
{ … }
static inline int nft_set_ext_add(struct nft_set_ext_tmpl *tmpl, u8 id)
{ … }
static inline void nft_set_ext_init(struct nft_set_ext *ext,
const struct nft_set_ext_tmpl *tmpl)
{ … }
static inline bool __nft_set_ext_exists(const struct nft_set_ext *ext, u8 id)
{ … }
static inline bool nft_set_ext_exists(const struct nft_set_ext *ext, u8 id)
{ … }
static inline void *nft_set_ext(const struct nft_set_ext *ext, u8 id)
{ … }
static inline struct nft_data *nft_set_ext_key(const struct nft_set_ext *ext)
{ … }
static inline struct nft_data *nft_set_ext_key_end(const struct nft_set_ext *ext)
{ … }
static inline struct nft_data *nft_set_ext_data(const struct nft_set_ext *ext)
{ … }
static inline u8 *nft_set_ext_flags(const struct nft_set_ext *ext)
{ … }
struct nft_timeout { … };
static inline struct nft_timeout *nft_set_ext_timeout(const struct nft_set_ext *ext)
{ … }
static inline struct nft_userdata *nft_set_ext_userdata(const struct nft_set_ext *ext)
{ … }
static inline struct nft_set_elem_expr *nft_set_ext_expr(const struct nft_set_ext *ext)
{ … }
static inline bool __nft_set_elem_expired(const struct nft_set_ext *ext,
u64 tstamp)
{ … }
static inline bool nft_set_elem_expired(const struct nft_set_ext *ext)
{ … }
static inline struct nft_set_ext *nft_set_elem_ext(const struct nft_set *set,
const struct nft_elem_priv *elem_priv)
{ … }
static inline struct nft_object **nft_set_ext_obj(const struct nft_set_ext *ext)
{ … }
struct nft_expr *nft_set_elem_expr_alloc(const struct nft_ctx *ctx,
const struct nft_set *set,
const struct nlattr *attr);
struct nft_elem_priv *nft_set_elem_init(const struct nft_set *set,
const struct nft_set_ext_tmpl *tmpl,
const u32 *key, const u32 *key_end,
const u32 *data,
u64 timeout, u64 expiration, gfp_t gfp);
int nft_set_elem_expr_clone(const struct nft_ctx *ctx, struct nft_set *set,
struct nft_expr *expr_array[]);
void nft_set_elem_destroy(const struct nft_set *set,
const struct nft_elem_priv *elem_priv,
bool destroy_expr);
void nf_tables_set_elem_destroy(const struct nft_ctx *ctx,
const struct nft_set *set,
const struct nft_elem_priv *elem_priv);
struct nft_expr_ops;
struct nft_expr_type { … };
#define NFT_EXPR_STATEFUL …
#define NFT_EXPR_GC …
enum nft_trans_phase { … };
struct nft_flow_rule;
struct nft_offload_ctx;
struct nft_expr_ops { … };
struct nft_rule { … };
static inline struct nft_expr *nft_expr_first(const struct nft_rule *rule)
{ … }
static inline struct nft_expr *nft_expr_next(const struct nft_expr *expr)
{ … }
static inline struct nft_expr *nft_expr_last(const struct nft_rule *rule)
{ … }
static inline bool nft_expr_more(const struct nft_rule *rule,
const struct nft_expr *expr)
{ … }
static inline struct nft_userdata *nft_userdata(const struct nft_rule *rule)
{ … }
void nft_rule_expr_activate(const struct nft_ctx *ctx, struct nft_rule *rule);
void nft_rule_expr_deactivate(const struct nft_ctx *ctx, struct nft_rule *rule,
enum nft_trans_phase phase);
void nf_tables_rule_destroy(const struct nft_ctx *ctx, struct nft_rule *rule);
static inline void nft_set_elem_update_expr(const struct nft_set_ext *ext,
struct nft_regs *regs,
const struct nft_pktinfo *pkt)
{ … }
#define nft_rule_for_each_expr(expr, last, rule) …
#define NFT_CHAIN_POLICY_UNSET …
struct nft_rule_dp { … };
struct nft_rule_dp_last { … };
static inline const struct nft_rule_dp *nft_rule_next(const struct nft_rule_dp *rule)
{ … }
struct nft_rule_blob { … };
struct nft_chain { … };
int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain);
int nft_setelem_validate(const struct nft_ctx *ctx, struct nft_set *set,
const struct nft_set_iter *iter,
struct nft_elem_priv *elem_priv);
int nft_set_catchall_validate(const struct nft_ctx *ctx, struct nft_set *set);
int nf_tables_bind_chain(const struct nft_ctx *ctx, struct nft_chain *chain);
void nf_tables_unbind_chain(const struct nft_ctx *ctx, struct nft_chain *chain);
enum nft_chain_types { … };
struct nft_chain_type { … };
int nft_chain_validate_dependency(const struct nft_chain *chain,
enum nft_chain_types type);
int nft_chain_validate_hooks(const struct nft_chain *chain,
unsigned int hook_flags);
static inline bool nft_chain_binding(const struct nft_chain *chain)
{ … }
static inline bool nft_chain_is_bound(struct nft_chain *chain)
{ … }
int nft_chain_add(struct nft_table *table, struct nft_chain *chain);
void nft_chain_del(struct nft_chain *chain);
void nf_tables_chain_destroy(struct nft_chain *chain);
struct nft_stats { … };
struct nft_hook { … };
struct nft_base_chain { … };
static inline struct nft_base_chain *nft_base_chain(const struct nft_chain *chain)
{ … }
static inline bool nft_is_base_chain(const struct nft_chain *chain)
{ … }
int __nft_release_basechain(struct nft_ctx *ctx);
unsigned int nft_do_chain(struct nft_pktinfo *pkt, void *priv);
static inline bool nft_use_inc(u32 *use)
{ … }
static inline void nft_use_dec(u32 *use)
{ … }
static inline void nft_use_inc_restore(u32 *use)
{ … }
#define nft_use_dec_restore …
struct nft_table { … };
static inline bool nft_table_has_owner(const struct nft_table *table)
{ … }
static inline bool nft_table_is_orphan(const struct nft_table *table)
{ … }
static inline bool nft_base_chain_netdev(int family, u32 hooknum)
{ … }
void nft_register_chain_type(const struct nft_chain_type *);
void nft_unregister_chain_type(const struct nft_chain_type *);
int nft_register_expr(struct nft_expr_type *);
void nft_unregister_expr(struct nft_expr_type *);
int nft_verdict_dump(struct sk_buff *skb, int type,
const struct nft_verdict *v);
struct nft_object_hash_key { … };
struct nft_object { … };
static inline void *nft_obj_data(const struct nft_object *obj)
{ … }
#define nft_expr_obj(expr) …
struct nft_object *nft_obj_lookup(const struct net *net,
const struct nft_table *table,
const struct nlattr *nla, u32 objtype,
u8 genmask);
void nft_obj_notify(struct net *net, const struct nft_table *table,
struct nft_object *obj, u32 portid, u32 seq,
int event, u16 flags, int family, int report, gfp_t gfp);
struct nft_object_type { … };
struct nft_object_ops { … };
int nft_register_obj(struct nft_object_type *obj_type);
void nft_unregister_obj(struct nft_object_type *obj_type);
#define NFT_NETDEVICE_MAX …
struct nft_flowtable { … };
struct nft_flowtable *nft_flowtable_lookup(const struct nft_table *table,
const struct nlattr *nla,
u8 genmask);
void nf_tables_deactivate_flowtable(const struct nft_ctx *ctx,
struct nft_flowtable *flowtable,
enum nft_trans_phase phase);
void nft_register_flowtable_type(struct nf_flowtable_type *type);
void nft_unregister_flowtable_type(struct nf_flowtable_type *type);
struct nft_traceinfo { … };
void nft_trace_init(struct nft_traceinfo *info, const struct nft_pktinfo *pkt,
const struct nft_chain *basechain);
void nft_trace_notify(const struct nft_pktinfo *pkt,
const struct nft_verdict *verdict,
const struct nft_rule_dp *rule,
struct nft_traceinfo *info);
#define MODULE_ALIAS_NFT_CHAIN(family, name) …
#define MODULE_ALIAS_NFT_AF_EXPR(family, name) …
#define MODULE_ALIAS_NFT_EXPR(name) …
#define MODULE_ALIAS_NFT_OBJ(type) …
#if IS_ENABLED(CONFIG_NF_TABLES)
static inline unsigned int nft_gencursor_next(const struct net *net)
{ … }
static inline u8 nft_genmask_next(const struct net *net)
{ … }
static inline u8 nft_genmask_cur(const struct net *net)
{ … }
#define NFT_GENMASK_ANY …
#define nft_is_active(__net, __obj) …
#define nft_is_active_next(__net, __obj) …
#define nft_activate_next(__net, __obj) …
#define nft_deactivate_next(__net, __obj) …
#define nft_clear(__net, __obj) …
#define nft_active_genmask(__obj, __genmask) …
static inline bool nft_set_elem_active(const struct nft_set_ext *ext,
u8 genmask)
{ … }
static inline void nft_set_elem_change_active(const struct net *net,
const struct nft_set *set,
struct nft_set_ext *ext)
{ … }
#endif
#define NFT_SET_ELEM_DEAD_MASK …
#if defined(__LITTLE_ENDIAN_BITFIELD)
#define NFT_SET_ELEM_DEAD_BIT …
#elif defined(__BIG_ENDIAN_BITFIELD)
#define NFT_SET_ELEM_DEAD_BIT …
#else
#error
#endif
static inline void nft_set_elem_dead(struct nft_set_ext *ext)
{ … }
static inline int nft_set_elem_is_dead(const struct nft_set_ext *ext)
{ … }
struct nft_trans { … };
struct nft_trans_binding { … };
struct nft_trans_rule { … };
#define nft_trans_container_rule(trans) …
#define nft_trans_rule(trans) …
#define nft_trans_flow_rule(trans) …
#define nft_trans_rule_id(trans) …
#define nft_trans_rule_bound(trans) …
#define nft_trans_rule_chain(trans) …
struct nft_trans_set { … };
#define nft_trans_container_set(t) …
#define nft_trans_set(trans) …
#define nft_trans_set_id(trans) …
#define nft_trans_set_bound(trans) …
#define nft_trans_set_update(trans) …
#define nft_trans_set_timeout(trans) …
#define nft_trans_set_gc_int(trans) …
#define nft_trans_set_size(trans) …
struct nft_trans_chain { … };
#define nft_trans_container_chain(t) …
#define nft_trans_chain(trans) …
#define nft_trans_chain_update(trans) …
#define nft_trans_chain_name(trans) …
#define nft_trans_chain_stats(trans) …
#define nft_trans_chain_policy(trans) …
#define nft_trans_chain_bound(trans) …
#define nft_trans_chain_id(trans) …
#define nft_trans_basechain(trans) …
#define nft_trans_chain_hooks(trans) …
struct nft_trans_table { … };
#define nft_trans_container_table(trans) …
#define nft_trans_table_update(trans) …
enum nft_trans_elem_flags { … };
struct nft_trans_elem { … };
#define nft_trans_container_elem(t) …
#define nft_trans_elem_set(trans) …
#define nft_trans_elem_priv(trans) …
#define nft_trans_elem_update_flags(trans) …
#define nft_trans_elem_timeout(trans) …
#define nft_trans_elem_expiration(trans) …
#define nft_trans_elem_set_bound(trans) …
struct nft_trans_obj { … };
#define nft_trans_container_obj(t) …
#define nft_trans_obj(trans) …
#define nft_trans_obj_newobj(trans) …
#define nft_trans_obj_update(trans) …
struct nft_trans_flowtable { … };
#define nft_trans_container_flowtable(t) …
#define nft_trans_flowtable(trans) …
#define nft_trans_flowtable_update(trans) …
#define nft_trans_flowtable_hooks(trans) …
#define nft_trans_flowtable_flags(trans) …
#define NFT_TRANS_GC_BATCHCOUNT …
struct nft_trans_gc { … };
static inline void nft_ctx_update(struct nft_ctx *ctx,
const struct nft_trans *trans)
{ … }
struct nft_trans_gc *nft_trans_gc_alloc(struct nft_set *set,
unsigned int gc_seq, gfp_t gfp);
void nft_trans_gc_destroy(struct nft_trans_gc *trans);
struct nft_trans_gc *nft_trans_gc_queue_async(struct nft_trans_gc *gc,
unsigned int gc_seq, gfp_t gfp);
void nft_trans_gc_queue_async_done(struct nft_trans_gc *gc);
struct nft_trans_gc *nft_trans_gc_queue_sync(struct nft_trans_gc *gc, gfp_t gfp);
void nft_trans_gc_queue_sync_done(struct nft_trans_gc *trans);
void nft_trans_gc_elem_add(struct nft_trans_gc *gc, void *priv);
struct nft_trans_gc *nft_trans_gc_catchall_async(struct nft_trans_gc *gc,
unsigned int gc_seq);
struct nft_trans_gc *nft_trans_gc_catchall_sync(struct nft_trans_gc *gc);
void nft_setelem_data_deactivate(const struct net *net,
const struct nft_set *set,
struct nft_elem_priv *elem_priv);
int __init nft_chain_filter_init(void);
void nft_chain_filter_fini(void);
void __init nft_chain_route_init(void);
void nft_chain_route_fini(void);
void nf_tables_trans_destroy_flush_work(void);
int nf_msecs_to_jiffies64(const struct nlattr *nla, u64 *result);
__be64 nf_jiffies64_to_msecs(u64 input);
#ifdef CONFIG_MODULES
__printf(2, 3) int nft_request_module(struct net *net, const char *fmt, ...);
#else
static inline int nft_request_module(struct net *net, const char *fmt, ...) { return -ENOENT; }
#endif
struct nftables_pernet { … };
extern unsigned int nf_tables_net_id;
static inline struct nftables_pernet *nft_pernet(const struct net *net)
{ … }
static inline u64 nft_net_tstamp(const struct net *net)
{ … }
#define __NFT_REDUCE_READONLY …
#define NFT_REDUCE_READONLY …
static inline bool nft_reduce_is_readonly(const struct nft_expr *expr)
{ … }
void nft_reg_track_update(struct nft_regs_track *track,
const struct nft_expr *expr, u8 dreg, u8 len);
void nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg, u8 len);
void __nft_reg_track_cancel(struct nft_regs_track *track, u8 dreg);
static inline bool nft_reg_track_cmp(struct nft_regs_track *track,
const struct nft_expr *expr, u8 dreg)
{ … }
#endif