Я просматриваю код драйвера сетевого устройства 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.
Я внес эти изменения в надежде, что отбрасывание пакетов из-за управления трафиком Linux будет зафиксировано статистикой ifconfig в поле tx drop byte. Но не уверен, что эти изменения будут работать?
Можно ли вызвать уровень устройства из уровня драйвера таким образом, как я пытался?
dev_queue_xmit()
обычный экспорт ядром для драйверов устройств, я думаю, что ваш код должен работать. - person Alexey Bureev   schedule 12.02.2014