如何在内核模块中将网络接口设置为混杂模式?

时间:2012-03-29 15:19:22

标签: linux networking module kernel

我开发了一个内核模块来获取绕过和以太网接口的所有数据包。

现在我想在我的模块中,将该界面设置为混杂模式。我怎么能这样做?

我使用dev_get_by_name(& init_net," eth0")将接口连接到struct net_device * dev。

最好的问候

3 个答案:

答案 0 :(得分:2)

您可以使用以下功能(可在net / core / dev.c中找到):

int dev_set_promiscuity(struct net_device *dev, int inc)

如果要将设备设置为promiscous模式,inc必须为1.要取消设置promiscous模式,请将inc设置为-1。要使功能正常工作,您需要使用rtnl锁。要获得它,您需要在调用dev_set_promiscuity()之前和之后调用以下函数(net / core / rtnetlink.c中的函数):

void rtnl_lock(void);
void rtnl_unlock(void);

答案 1 :(得分:1)

使用dev_set_promiscuity()。使用增量1将设备设置为混杂模式,使用-1将其设置为非混杂模式。

答案 2 :(得分:0)

当我使用dev_set_promiscuity(dev_eth0,1)时,它出现在dmesg命令中:

  

[550.411935] RTNL:断言在net / core / dev.c失败(4059)

     

[550.411940] Pid:5164,comm:insmod污染:P 2.6.35101

     

[550.411943]呼叫追踪:

     

[550.411951] []? printk的+ 0x25 / 0x29

     

[550.411956] [] __ dev_set_promiscuity + 0x37 / 0x127

     

[550.411960] [] dev_set_promiscuity + 0x18 / 0x37

     

[550.411965] []? hook_init + 0x0 / 0x88 [nethook]

     

[550.411969] [] hook_init + 0x3a / 0x88 [nethook]

     

[550.411973] [] do_one_initcall + 0x4f / 0x139

     

[550.411978] []? blocking_notifier_call_chain + 0×11/0×13

     

[550.411982] [] sys_init_module + 0x7f / 0x19b

     

[550.411986] [] sysenter_do_call + 0x12 / 0x28

     

[550.411989]设备eth0进入混杂模式

RTNL:断言在net / core / dev.c(4059)失败,这种情况发生了一段时间后出现了一些错误报告和内核崩溃。

有人知道如何解决这个问题吗?最诚挚的问候