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

时间:2014-02-11 18:19:28

标签: linux-kernel network-programming linux-device-driver qos

我正在浏览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流量控制导致的数据包丢失,但不确定这些更改是否有效?

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

1 个答案:

答案 0 :(得分:3)

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

    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统计信息,但只是NIC驱动程序本身。

但是你可以通过其他方式了解“丢弃数据包的数量(由于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”命令可以??

相关问题