#ifndef LKH_HOOK_H #define LKH_HOOK_H static DEFINE_MUTEX(lkh_hook_mutex); #define MAX_HOOK_COUNT 1024 /* 多核信息同步处理 */ #define lkh_entry_dereference(e) rcu_dereference_protected(e, lockdep_is_held(&lkh_hook_mutex)) /* 执行HOOK处理后的返回值 */ #define LKH_DROP 0 #define LKH_ACCEPT 1 #define LKH_STOLEN 2 #define LKH_QUEUE 3 #define LKH_REPEAT 4 #define LKH_STOP 5 /* Deprecated, for userspace nf_queue compatibility. */ /* 钩子函数调用位置 */ enum lkh_inet_hooks { LKH_INET_PRE_FORWARD, LKH_INET_NUMHOOKS }; /* 支持的协议类型 */ enum { LKH_PROTO_UNSPEC = 0, LKH_PROTO_IPV4 = 1, LKH_PROTO_IPV6 = 2, LKH_PROTO_NUMPROTO, }; struct lkh_hook_entries_rcu_head { struct rcu_head head; void *allocation; }; struct lkh_hook_state { unsigned int hook_stage; u_int8_t pf; struct net_device *in; struct net_device *out; struct sock *sk; struct net *net; }; typedef unsigned int lkh_hookfn(void *priv, struct sk_buff *skb, const struct lkh_hook_state *state); struct lkh_hook_ops { /* User fills in from here down. */ lkh_hookfn *hook; /* 钩子函数 */ void *priv; u_int8_t pf; /* 协议类型 IPv4、IPv6、brigde等 */ unsigned int hook_stage; /* 阶段ID,比如PRE_FORWARD等*/ int priority; /* 优先级 */ }; struct lkh_hook_entry { lkh_hookfn *hook; void *priv; }; /* 一种协议类型的hook集合,包括多个处理阶段 */ struct lkh_hook_entries { u_int8_t num_hook_entries; struct lkh_hook_entry hooks[]; }; struct lkh_hook { struct list_head list; void * net_ptr; /* 记录struct net 结构指针,用来查找对应的hook */ struct lkh_hook_entries __rcu *hooks_ipv4[LKH_INET_NUMHOOKS]; struct lkh_hook_entries __rcu *hooks_ipv6[LKH_INET_NUMHOOKS]; }; /* 句柄 */ struct lkh_hook_handle { struct list_head list; unsigned int net_num; /* 网络命名空间数量 */ }; extern struct lkh_hook_handle g_lkh_hook_handle; extern void lkh_hash_struct_show(void); extern int lkh_register_net_hooks(struct net *net, const struct lkh_hook_ops *reg, unsigned int hookcount); extern void lkh_unregister_net_hooks(struct net *net, const struct lkh_hook_ops *reg, unsigned int hookcount); extern int lkh_hook(u_int8_t pf, unsigned int hook_stage, struct net *net, struct sock *sk, struct sk_buff *skb, struct net_device *indev, struct net_device *outdev); #endif