Проблема с передачей пакетов DPDK UDP — ошибка Длина UDP больше длины полезной нагрузки IP

#rhel7 #dpdk

#rhel7 #dpdk

Вопрос:

Недавно мы обновились до версии DPDK 18.08. После обновления до последней версии наблюдается проблема с ошибкой передачи пакетов UDP для нескольких пакетов.

При передаче пакетов UDP размером 28 байт и 48 байт проблема не наблюдается. Я попытался распечатать вычисление длины пакета в своей программе непосредственно перед отправкой его в ядро с помощью rte_kni_tx_burst. Расчет длины пакета мне кажется правильным.

 1.) 
size_udp:48
sizeof(struct udp_hdr):8
size_ApplMsg:40
udphdr->dgram_len:12288
m->data_len:82
size_ip:68
l2_data_shift:14

2.)
size_udp:28
sizeof(struct udp_hdr):8
size_ApplMsg:20
udphdr->dgram_len:7168
 m->data_len:62
 ip->total_length:12288
 size_ip:48
l2_data_shift:14

Packets with UDP size 736 are not getting transmitted to the receiving end and getting dropped.

3.)
 size_udp:736
 sizeof(struct udp_hdr):8
size_ApplMsg:728
udphdr->dgram_len:57346
 m->data_len:770 
size_ip:756 
l2_data_shift:14
  

Также MTU установлен на 1500 в моей программе. Поэтому не должно быть проблем с передачей 736 байт UDP-данных, что составляет менее 1500 байт MTU.

Я попытался увеличить размер буфера ядра, но это не помогло. netstat -su -> вывод показывает 0 ошибок буфера отправки / приема.

Что изменилось в DPDK 18.08 в отношении пакетов UDP? Пожалуйста, подскажите, нужно ли мне рассмотреть возможность настройки udp, выгрузки трафика udp для решения этой проблемы.

Спасибо,

Комментарии:

1. Итак, почему UDP len всегда больше 1500 байт? Вы также проверяли контрольную сумму UDP?

2. Длина UDP составляет 736 байт <MTU 1500 байт. Я вызываю rte_kni_tx_burst для отправки этого пакета, и возвращаемое значение вызова API выполнено успешно. Но трассировка tcpdump показывает ошибку: «НЕПРАВИЛЬНАЯ ДЛИНА UDP 736> ДЛИНА полезной НАГРУЗКИ IP ] Len = 728. Является ли аппаратная разгрузка причиной этой проблемы? Необходимо установить какие-либо флаги разгрузки?

3. Я имею в виду этот len «udphdr-> dgram_len: 57346» и этот len «ip-> total_length: 12288» Почему они оба больше 1500?

4. ip-> total_length = rte_cpu_to_be_16 (size_ip); udphdr-> dgram_len = rte_cpu_to_be_16 (size_udp) . ip-> total_length и udphdr-> dgram_len — это большие конечные формы, преобразованные из 16-разрядного значения CPU order ( size_ip и size_udp).

5. Дамп пакета, полученный перед отправкой в KNI, выглядит правильно. Есть ли способ прикрепить эти трассировки дампа пакетов и tcpdump на этом форуме? Кроме того, было бы полезно, если бы вы могли предложить некоторые шаги отладки для анализа, отбрасывается ли пакет на сетевой карте или на оборудовании. Я попытался запустить dpdk-pdump. Но это выдает ошибку.# ./dpdk-pdump — —pdump ‘порт = 0, очередь = *, rx-dev =/tmp/rx.pcap’ Ошибка создания Mempool: не удается выделить память