studying network stack under kernel 2.6 (03)

4. 根据概率丢弃送往特定ip的packets

涉及到的api:

void kfree_skb (struct sk_buff * skb);

Drop a reference to the buffer and free it if the usage count has hit zero.

与前面的处理方式不太一样的地方在于,kfree_skb()的工作放在了内核源代码的原来的地方,而不是放在kernel module里面。如果在module里面将skb给释放掉,然后返回到kernel原来的程序处继续执行的话,可能会出现下面的代码继续存取该skb包的情况,因此引起严重的错误。

所以这次在kernel module中只是判断丢包的条件成立与否,真正的丢包工作就放在了原来的内核代码处。

涉及到的内核代码片段:dev_queue_xmit(skb);

int dev_queue_xmit(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
struct Qdisc *q;
int rc = -ENOMEM;

//...
}

在原先第一个实例的地方,可以添加一个HOOK:

if(ee_drop_func && (*ee_drop_func)(skb))Ã  {

kfree_skb(skb);

return 0;

}

内核模块的内容:

在内核模块中,主要完成的工作是,实现这样一个函数:

int drop_packet_func(struct sk_buff *skb);

判断skb包的目的地址是否是需要丢包的地址,如果是的话,判断符合不符合丢包的条件,来设置返回值为1否,为1则表示需要丢弃。

代码略。

Advertisements
studying network stack under kernel 2.6 (03)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s