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

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”命令可以?