全部博文(140)
分类: LINUX
2014-03-02 15:26:00
我们知道NetFilter框架中有五个HOOK点,分别是PREROUTING、POSTROUTING、INPUT、FORWARD、OUTPUT。通过调用nf_register_hooks函数可在HOOK点上注册自己的回调函数,回调函数的格式如下:
static unsigned int sample( unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
参数解析:hooknum 表示该回调函数是在哪个HOOK点上被触发的;skb 在内核态就代表了一个数据包; in表示该数据包是从哪个网络设备进来的;out表示该数据包是从哪个网络设备出去的; okfn 暂时不确定,一般也不必关心。
返回值: #define NF_DROP 0
直接丢弃该数据包; #define NF_ACCEPT 1
该数据包继续被下一个回调函数(同一个HOOK点)进行分析检查; #define NF_STOLEN 2
回调函数拿走了这个数据包;#define NF_QUEUE 3
表示返回给用户态的应用程序进行处理;#define NF_REPEAT 4
该回调函数重新执行;#define NF_STOP 5
与NF_ACCEPT类似,只是后面的回调函数不再被调用;
总结:struct skb_buff 和 struct net_device 结构是内核协议栈中最重要的两个结构。另外,内核又是如何将数据包交付给应用程序呢?这就是我们要分析的nf_queue机制。