108 lines
2.5 KiB
C
108 lines
2.5 KiB
C
|
|
|||
|
#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
|
|||
|
|