Можно ли вызвать код уровня устройства из кода драйвера в ядре Linux

Я просматриваю код драйвера устройства Linux Networking и хочу знать, возможно ли это код кода устройства вызова из кода драйвера.

--- 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), который является интерфейсом к слою устройства, и он подключился к QoS-коду Linux.

Я сделал эти изменения в надежде, что падение пакета из-за управления трафиком Linux будет зафиксировано с помощью статистики ifconfig в поле tx drop byte, но не уверены, что эти изменения будут работать?

Можно ли вызывать уровень устройства из уровня драйвера таким образом, который я пробовал?

Ответ 1

Что касается, если этот код может работать правильно, я сомневаюсь. Это изменение вызовет проблемы, например:

    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, включая номер капли из-за перегрузки. Это интерфейс для Advanced user-level admin tool (а не "ifconfig" ) для получения более подробной информации через сообщение rtlink, в дополнение к "/proc/net/dev". Тем не менее, я не уверен, что такое продвинутый пользовательский администратор (не знакомый с ними). Может быть, команда "ip" может?