繁体   English   中英

是否可以从Linux内核中的驱动程序代码调用设备层代码

[英]Is it possible to call device layer code from driver code in 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++;
+
+        }
+

在上面的代码中,我尝试调用dev_queque_xmit(skb),它是设备层的接口,它与Linux QoS代码连接在一起。

我做了这些更改,希望在tx drop byte字段下ifconfig stats捕获由于Linux流量控制导致的数据包丢失,但不确定这些更改是否有效?

是否可以通过我尝试过的方式从驱动程序层调用设备层?

至于如果这段代码可以正常工作,我对此表示怀疑。 这种变化会带来麻烦,例如:

    dev_queue_xmit()
        -> enqueue to QoS (I assume you mean Qdisc)     
            -> rtl8139_start_xmit()  
                 -> dev_queue_xmit()      # creating a loop

目前,“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.

这是转储Qdisc状态,包括由于拥塞导致的丢弃数量。 它是高级用户级管理工具(不是“ifconfig”)的接口,通过rtlink消息检索更多详细信息,此外还有“/ proc / net / dev”。 但是,我不确定那些高级用户级管理工具是什么(不熟悉它们)。 也许“ip”命令可以?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM