我的情况要求:
自定义可加载内核模块
我的数据包不是复杂的数据包。我可以在模块的初始化阶段初始化数据包,并反复使用相同的数据包。这是我目前所做的,因为通信抖动比数据包本身的内容重要。
...
// I was doing
// txq = skb_get_tx_queue(skb->dev, skb);
// but it seemed that I will not be allowed to choose my desired queue in this case.
// thus, I tried to hardcode it for the time being.
txq = &dev->_tx[7];
local_bh_disable();
HARD_TX_LOCK(skb->dev, txq, 7);
if (unlikely(netif_xmit_frozen_or_drv_stopped(txq))) {
ret = NETDEV_TX_BUSY;
goto unlock;
}
// prior to this approach, I was using ndo_start_xmit directly as
// skb->dev->netdev_ops->ndo_start_xmit(skb, skb->dev);
// but, with this I was not able to use XPS, thus I was trying [netdev_start_xmit()][1] [which ultimately invokes ndo_start_xmit]
ret = netdev_start_xmit(skb, skb->dev, txq, 0);
unlock:
HARD_TX_UNLOCK(skb->dev, txq);
local_bh_enable();
...
我从https://elixir.bootlin.com/linux/v4.15.12/source/net/core/pktgen.c#L3487那里获取了数据包传输代码参考
我不确定我是否做对了。结果不这么说。我原本希望数据包流经Tx Queue 7,但它们仍在流经默认的一个TX-Queue 0。
答案 0 :(得分:0)
以防万一,如果有人正在寻找快速解决问题的方法,那么对以下两行进行修改对我有用。
txq = &dev->_tx[7];
local_bh_disable();
更改为
skb_set_queue_mapping(skb, 7);
txq = skb_get_tx_queue(dev, skb);
有了这个,我就可以引导我的数据包通过Tx Queue 7,但是我仍然遇到抖动,这可能是由其他来源引起的。
https://elixir.bootlin.com/linux/v4.19-rc3/ident/netdev_pick_tx
https://elixir.bootlin.com/linux/v4.19-rc3/ident/skb_set_queue_mapping
https://elixir.bootlin.com/linux/v4.15.12/source/net/core/pktgen.c#L3487
此致
Coshal。