【发布时间】:2017-04-28 20:20:13
【问题描述】:
我已经阅读了我可以阅读的文档,例如 (https://www.mjmwired.net/kernel/Documentation/networking/packet_mmap.txt) 和其他各种博客等。
我仍然不清楚映射到内核的 RX 缓冲区是否也可用于 TX 操作,或者我是否需要在设置发送状态标志和调用 sendto() 之前从 RX 缓冲区复制到 TX .
从文档中,以下是状态:
// RX statuses
#define TP_STATUS_KERNEL 0
#define TP_STATUS_USER 1
// TX statuses
#define TP_STATUS_AVAILABLE 0 // Frame is available
#define TP_STATUS_SEND_REQUEST 1 // Frame will be sent on next send()
#define TP_STATUS_SENDING 2 // Frame is currently in transmission
#define TP_STATUS_WRONG_FORMAT 4 // Frame format is not correct
流程似乎是:
- 数据包通过 TP_STATUS_USER 从内核到达 RX 缓冲区
- 我有办法处理数据包,然后设置 TP_STATUS_SEND_REQUEST
- 内核设置 TP_STATUS_SENDING,同时发送
- 发送完成后内核设置 TP_STATUS_AVAILABLE
- 我设置了 TP_STATUS_KERNEL 来告诉内核我已经完成了这些数据包,它们可能会被覆盖
但是,由于 TP_STATUS_AVAILABLE 与 TP_STATUS_KERNEL 保持相同的值,如果此流程正确,内核将在完成 TX 操作后立即清除数据包。在我看来,可能需要复制到单独的 TX 缓冲区。关于使用 packet_mmap 和 packet_tx_ring 的信息有限。我发现的例子主要是 RX(我有工作 atm)。我想要一个 RX/TX 场景的示例(例如桥接原始数据包)。
有人对此有更好的理解吗?示例桥接也是最有帮助的!
【问题讨论】:
标签: c++ c linux network-programming