2012-06-08 73 views
1

我有一個網絡設備,其中以太網交換機芯片的端口連接到CPU的網絡控制器。交換芯片將來自其他端口的數據包轉發到CPU端口,並在包含諸如入口端口等信息的特殊報頭(在MAC報頭之前)等。Linux用戶空間L2控制協議

我可以在網絡控制器驅動程序中接收數據包時去掉報頭,因此Linux網絡堆棧可以以正常方式與交換機通信。然而,我的目標是將特殊頭文件中的一些信息傳遞給用戶空間第2層控制協議套件。

在我的情況下,第2層控制協議通常會使用原始套接字來接收其控制幀。例如,生成樹協議必須能夠確定數據包來自哪個交換機端口。

另外,諸如http,telnet服務器等服務應該能夠使用相同的網絡接口。

是否有任何Linux內置的手段將這些信息從驅動程序傳遞到用戶空間網絡服務器/客戶端? 如果沒有,關於實施這個的任何建議?

我可以實現一個簡單的ioctl調用來查詢驅動程序關於讀取的最後一個數據包的頭信息。但是,不保證該設備未被recv()ioctl()之間的其他進程使用。

回答

1

我認爲實現這個最好的方法是在sk_buff中添加一個字段來存儲你的特殊L2報頭。如果我理解正確,在將sk_buff從一層傳遞到另一層時應保留標題,儘管您可能需要向skb_clone添加一些代碼。

如果您達到這一點,將此值發送到用戶空間僅受限於您的想象力。例如,你可以

  1. 店在插座結構sock和返回值後來使用ioctl;
  2. 返回recvfromsrc_addr直接

希望這有助於價值。

+0

聽起來很有希望,我會試試看:) – LRipa