使用当前虚拟设备传输第二个 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
有返回。
我是不是漏掉了什么?
我修改了一个虚拟网络设备的传输函数 (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
有返回。
我是不是漏掉了什么?