使用当前虚拟设备传输第二个 sk_buff

Transmit second sk_buff using current virtual device

我修改了一个虚拟网络设备的传输函数 (ndo_start_xmit),它得到一个 struct sk_buff skb_one 作为输入。

在传输流中的某一点,我生成了第二个 struct sk_buff skb_second。这应该通过相同的流程 skb_one 进行,因此它应该由我当前所在的虚拟设备发送。此外,它应该在 after skb_one.

我想到了两种不同的方法。一个是修改队列 skb_one 在:

    skb_second->next = skb_one->next;
    skb_second->prev = skb_one;
    skb_one->next = skb_frag;

使用这种方法,它会在 skb_one 之后发送,但不会通过虚拟网络设备的传输流。

第二种方法就是使用

dev_queue_xmit(skb_second);

使用这种方法,skb_second 通过传输流 "again",但它在 skb_one 之前发送。

是否有可能实现这两个目标?

dev_queue_xmit 最终会尝试获取设备的 xmit_lock,但它会失败,因为在 ndo_start_xmit 你应该已经持有它了。

因此帧将在 NET_TX_SOFTIRQ skb_one 发出后排队到 运行 并且 ndo_start_xmit 有返回。

我是不是漏掉了什么?