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

时间:2018-01-27 22:14:07

标签: c networking linux-kernel linux-device-driver

我修改了获得ndo_start_xmit作为输入的虚拟网络设备的传输功能(struct sk_buff skb_one)。

在传输流程中的某一点,我生成第二个struct sk_buff skb_second。这个应该经过相同的流程skb_one,因此它应该由我当前所在的虚拟设备发送。此外,它应该在 skb_one之后发送。< / p>

我想到了两种不同的方法。一个是队列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会再次“传输”传输流,但会在skb_one之前发送。

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

1 个答案:

答案 0 :(得分:1)

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

因此,在 NET_TX_SOFTIRQ发出并skb_one返回后,该框架将排队等候ndo_start_xmit

我错过了什么吗?