Ami*_*mar 11 qos network-programming linux-device-driver linux-kernel
我正在浏览Linux网络设备驱动程序代码,并想知道是否可以从驱动程序代码调用设备层代码.
--- a/drivers/net/ethernet/realtek/8139too.c
+++ b/drivers/net/ethernet/realtek/8139too.c
@@ -1706,10 +1706,20 @@ static netdev_tx_t rtl8139_start_xmit (struct sk_buff *skb,
unsigned int entry;
unsigned int len = skb->len;
unsigned long flags;
-
+ int ret=0;
/* Calculate the next Tx descriptor entry. */
entry = tp->cur_tx % NUM_TX_DESC;
+
+ ret = dev_queue_xmit(skb);
+
+ if (likely(ret == NET_XMIT_SUCCESS || ret == NET_XMIT_CN)) {}
+
+ else {
+ dev->stats.tx_dropped++;
+
+ }
+
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我尝试调用dev_queque_xmit(skb),它是设备层的接口,它与Linux QoS代码连接在一起.
我做了这些更改,希望在tx drop byte字段下ifconfig stats捕获由于Linux流量控制导致的数据包丢失,但不确定这些更改是否有效?
是否有可能以我尝试过的方式从驱动程序层调用设备层?
小智 3
至于这段代码是否能正常工作,我对此表示怀疑。这种改变会带来麻烦,比如:
dev_queue_xmit()
-> enqueue to QoS (I assume you mean Qdisc)
-> rtl8139_start_xmit()
-> dev_queue_xmit() # creating a loop
Run Code Online (Sandbox Code Playgroud)
目前,“ifconfig”无法了解“丢弃数据包的数量(由于 QoS)”,因为“ifconfig”从 /proc/net/dev 读取统计信息,而这些统计信息不包含 QoS 统计信息,而只包含网卡驱动本身。
但您可以通过其他方式了解“丢弃数据包的数量(由于 QoS)”。在内核源码中,有:
rtnl_register(PF_UNSPEC, RTM_GETQDISC, tc_get_qdisc, tc_dump_qdisc, NULL); # it fill "gnet_stats_queue", and there is a drop counter internally.
Run Code Online (Sandbox Code Playgroud)
这是转储Qdisc状态,包括由于拥塞而丢弃的数量。它是高级用户级管理工具(不是“ifconfig”)的接口,除了“/proc/net/dev”之外,还可以通过 rtlink 消息检索更详细的信息。但是,我不确定那些高级用户级管理工具是什么(不熟悉它们)。也许“ip”命令可以?