【发布时间】:2019-02-21 05:01:31
【问题描述】:
我的场景需要:
- 一个自定义可加载内核模块,用于组合数据包(skbuffs)并尝试同步发送它们
- Intel I40e 驱动程序(从内核源代码树内核版本 4.15.12 中提取)
自定义可加载内核模块
我的数据包不是复杂数据包。我可以在模块的初始化阶段初始化数据包并一遍又一遍地使用相同的数据包。这就是我暂时所做的,因为通信抖动比数据包本身的内容更重要。
...
// 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。
【问题讨论】:
标签: linux networking linux-kernel linux-device-driver kernel-module