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

我开发了一个内核模块来获取所有的旁路和以太网接口。

现在我想在我的模块中,将该接口设置为混杂模式。 我怎么能做到这一点?

我得到的接口使用dev_get_by_name(&init_net,“eth0”)到一个struct net_device *开发。

最好的祝福

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

您可以使用以下函数(可在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); 

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

[550.411935] RTNL:assertion在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:assertion在net / core / dev.c(4059)发生了这种情况,并在一段时间后出现一些错误报告和内核崩溃。

有人知道如何解决这个问题? 最好的祝福