背景:我是UCSB的第四年計算機工程專業。我已經參加了網絡和操作系統課程。我在用戶空間中創建了一個程序,它將UDP數據包廣播到子網上,並在自組織網絡中接收UDP數據包。我想要完成的是將這個程序轉換成一個內核模塊,該模塊可以在一個帶有Angstrom Linux的ARM嵌入式系統上工作,內核版本爲2.6.39(x86到ARM架構交叉編譯是另一個問題)。這個轉移到內核的原因是爲了減少用戶空間函數的一些開銷,並儘可能快地使發送和接收部分。在內核模塊中發送UDP數據包
我以前從未在任何課程中做過這樣的事情,所以請告訴我,我說的任何內容都是不正確,無用或效率低下的!
經過與谷歌的研究,我已經總結出典型的方法是徹底取消套接字並使用sockbuf
結構並自己填寫必要的標題。這會影響在子網上廣播數據包的能力嗎? 我目前正在按照這裏的代碼: UDP packet send with linux-kernel module without using sockets
我已經想通了後面的大部分代碼的推理,但最後的部分是什麼讓我困惑:
eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
skb_reset_mac_header(skb);
skb->protocol = eth->h_proto = htons(ETH_P_IP);
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
memcpy(eth->h_dest, remote_mac, ETH_ALEN);
skb->dev = dev;
dev_queue_xmit(skb);
- 所有以太網報頭似乎是純粹由內核中除源MAC地址之外定義的報頭構成的,這是正確的嗎?我將要廣播我的數據包,那麼究竟應該把什麼東西放到目的MAC地址字段?
- 更重要的是,
skb->dev = dev;
行中的設備是什麼?從我的調查來看,它是一個指向它所關聯的設備驅動程序的指針。根據我的理解,我希望這個指向無線芯片設備驅動程序,因爲我使用802.11進行通信。我是否必須爲無線驅動程序創建我自己的dev
結構?如果是這樣,那麼有關於如何完成這一任務的指導?如果沒有,我如何訪問現有的設備驅動程序並在內核模塊中使用它?
我已經嘗試過註釋開發線和運行代碼,但毫不奇怪,一旦它執行dev_queue_xmit(skb);
就會發生內核恐慌。
再一次,我從來沒有做過這樣的事情,所以任何建議都會有幫助,即使這意味着完全改變我的方法!我也明白,這可能是一個問題的利基,但任何形式的指導表示讚賞!
預先感謝您!
的源MAC地址字段應該有相同的信息,像往常一樣:地址正如您的示例中所示,該設備的設置是正確的。在目標MAC地址字段中放置以太網廣播地址(FF:FF:FF:FF:FF:FF)。我認爲你使用現有的設備驅動程序結構並將其放入skb中,以便dev_queue_xmit方法知道發送數據包的驅動程序;但是不確定。 –
感謝您的反饋。你說的是有道理的。雖然看起來我們都不太瞭解設備驅動程序!我讚賞雖然:) –
我會說,而是,設備驅動程序高度依賴於設備和平臺。 –