2012-06-08 26 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