(DPDK) Есть ли способ заставить устройство Ethe rnet мгновенно отправлять пакеты? - PullRequest
0 голосов
/ 07 марта 2020

Я использую DPDK. Он предоставляет функцию для отправки пакетов: rte_eth_tx_burst. Но эта функция только помещает пакеты в очередь отправки устройства Ethe rnet, и устройство Ethe rnet затем ожидает больше пакетов, а затем отправляет их в связке.

Есть ли способ поместить пакет в очередь отправки устройства Ethe rnet и заставить его немедленно отправить пакет?

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Обычно rte_eth_tx_burst() не только помещает пакеты в очередь TX, но также уведомляет NI C о начале передачи. Конечно, это зависит от PMD и устройства, но устройство довольно редко ожидает еще несколько пакетов.

Например, для e1000 PMD (который поддерживает целое семейство сетевых карт), rte_eth_tx_burst() заканчивается в eth_igb_xmit_pkts(). В самом низу этой функции есть сигнал для NI C:

    /*
     * Set the Transmit Descriptor Tail (TDT).
     */
    E1000_PCI_REG_WRITE_RELAXED(txq->tdt_reg_addr, tx_id);

По сути, это запись в регистр устройства, обновление хвоста очереди и перевод NI C в ( проснуться и) начать передачу. Благодаря DMA NI C имеет прямой доступ в ОЗУ к очереди TX и буферам для передачи, поэтому передача (в конечном итоге) будет выполняться NI C без блокировки ЦП.

1 голос
/ 09 марта 2020

rte_eth_tx_burst фактически отправит пакеты как можно скорее. Устройство ethe rnet не ожидает больше пакетов. Часть «пакета» предназначена для освобождения ресурсов ЦП, а не ресурсов NI C, и немедленно помещает все дескрипторы пакетов в очередь. Если очередь передачи пуста (и поскольку DPDK захватывает ваш порт, это должно быть), то пакеты должны быть отправлены немедленно.

Если вы хотите прочитать, как работает передача данных между памятью и NI C , вот хорошее резюме.

Если вы хотите по какой-то причине обрабатывать пакеты один за другим, вы можете просто использовать 1 в качестве размера пакета.

...