Chinaunix首页 | 论坛 | 博客
  • 博客访问: 541721
  • 博文数量: 140
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-11 19:00
文章存档

2015年(5)

2014年(135)

分类: LINUX

2014-03-02 15:26:00

我们知道NetFilter框架中有五个HOOK点,分别是PREROUTINGPOSTROUTINGINPUTFORWARDOUTPUT。通过调用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机制。

阅读(6007) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~