2012-03-29 63 views
3

我開發了一個內核模塊來獲取所有的旁路和以太網接口。如何在內核模塊中將網絡接口設置爲混雜模式?

現在我想在我的模塊中,將該接口設置爲混雜模式。我該怎麼做?

我得到使用dev_get_by_name(& init_net,「eth0」)到struct net_device * dev的接口。

最好的問候

+0

什麼[你嘗試過(HTTP:// mattgemmell。COM/2008/12/08 /什麼具備的,你試了/)? – 2012-03-29 16:09:00

+0

我試圖將struct net_device中的標誌更改爲IFF_PROMISC,但無效。 – Ricardo 2012-03-29 16:12:22

回答

1

使用dev_set_promiscuity()。使用增量1將設備設置爲混雜模式,-1將其設置爲非混雜模式。

+0

該函數增加一個變量(uc_promisc,如果我是正確的)。當我通過我的模塊,我用dev_set_promiscuity(dev_eth0,1)來激活,當我刪除模塊,我用dev_set_promiscuity(dev_eth0,-1)去激活。我認爲混雜模式一直活躍並出現一些信息,如「eth0:亂交接屋頂,設置混亂失敗,設備混雜特性可能被破壞」。 – Ricardo 2012-03-29 17:39:47

+0

內核崩潰。 – Ricardo 2012-03-29 17:47:12

+0

令人印象深刻。你確定你使用過'dev_set_promiscuity(dev_eth0,1)'嗎?那麼它一定被稱爲20億次。 – ninjalj 2012-03-29 19:32:23

0

當我使用dev_set_promiscuity(dev_eth0,1)使其出現在dmesg命令此:

[550.411935] RTNL:斷言失敗在淨/型芯/ 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 + 0×37/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 + 0×12/0×28

[550.411989]設備的eth0進入混雜模式

RTNL:assertion在net/core/dev.c(4059)發生失敗,並在一段時間後出現一些錯誤報告和內核崩潰。

有人知道如何解決這個問題嗎?順祝商祺

2

您可以使用下面的函數(在網/核心/ dev.c找到):

int dev_set_promiscuity(struct net_device *dev, int inc) 

如果要設置設備在混雜模式inc必須爲1,表示取消promiscous模式,將inc設置爲-1。爲了使這個功能起作用,你需要有rtnl鎖。爲了得到它,你需要前後調用dev_set_promiscuity()(淨/核心/ rtnetlink.c發現功能)後致電以下功能:

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