1

我有一个网络设备,其中以太网交换机芯片的端口连接到 CPU 的网络控制器。交换芯片将数据包从其他端口转发到 CPU 端口,并添加特殊的头(在 MAC 头之前),其中包含入口端口等信息。

我可以在网络控制器驱动程序中接收数据包时剥离头部,这样Linux网络堆栈就可以与交换机正常通信。然而,我的目标是将特殊标头中的一些信息传递给用户空间第 2 层控制协议套件。

在我的例子中,第 2 层控制协议通常会使用原始套接字来接收其控制帧。例如,生成树协议必须能够分辨数据包来自哪个交换机端口。

此外,http、telnet 服务器等服务应该能够使用相同的网络接口。

是否有任何 Linux 内置方法可以将此类信息从驱动程序传递到用户空间网络服务器/客户端?如果没有,有什么建议可以实施吗?

我可以实现一个简单的 ioctl 调用来向驱动程序查询所读取的最后一个数据包的标头信息。但是,不能保证该设备没有被 和 之间的其他进程recv()使用ioctl()

4

1 回答 1

1

我认为实现这一点的最佳方法是添加一个字段sk_buff来存储您的特殊 L2 标头。sk_buff如果我理解正确,则在将s 从一层传递到另一层时应保留标头,尽管您可能需要向skb_clone.

如果你达到了这一点,那么将这个值发送到用户空间只会受到你的想象力的限制。例如,您可以

  1. 将值存储在套接字结构中sock,稍后使用ioctl;将其返回
  2. 直接返回recvfrom's中的值src_addr

希望这有帮助。

于 2012-06-08T11:32:15.823 回答