sarali Ответов: 1

Стриптиз код DPDK VLAN с использованием memcpy приводит к повреждению данных


Код полосы VLAN для выходных пакетов GTP приводит к повреждению исходного IP-адреса ac150569. После удаления тега VLAN(4 байта) исходный IP-адрес в пакете становится ac150000, что неверно.

Дамп пакетов перед удалением тега VLAN: 0ca402e8 deb15254 00b3fb19 81000873 08004500 002a00fc 00003e11 bf42ac15 05690a5f 00aa0868 08680016 001c3202 000600

Код для полосы VLAN:
memcpy( (rte_pktmbuf_mtod(m, unsigned char *)+12),
       ( rte_pktmbuf_mtod(m, unsigned char *)+16), m->pkt.data_len-16);
Дамп пакетов после удаления тега VLAN: 0ca402e8 deb15254 00b3fb19 08004500 002a00fc 00003e11 bf42ac15 00000a5f 00aa0868 08680016 001c3202 1bdb0000 0000004e 00000e00

Не могли бы вы сообщить мне, как 0000 добавляется вместо 0569 для исходного IP-адреса в измененном пакете после удаления тега vlan? Какие изменения в коде необходимо внести?

Спасибо,

Что я уже пробовал:

memcpy( (rte_pktmbuf_mtod(m, unsigned char *)+12),
        (rte_pktmbuf_mtod(m, unsigned char *)+16), m->pkt.data_len-16 );
m->pkt.data_len -= 4;
m->pkt.pkt_len -= 4;

1 Ответов

Рейтинг:
7

Rick York

Я считаю полезным расширить отображение пакетов и добавить к ним смещенные метки:

81 00 08 73  08 00 45 00  00 2a 00 fc  00 00 3e 11  bf 42 ac 15  05 69 0a 5f  00 aa 08 68 
12 13 14 15  16 17 18 19  20 21 22 23  24 25 26 27  28 29 30 31  32 33 34 35  36 37 38 39

08 00 45 00  00 2a 00 fc  00 00 3e 11  bf 42 ac 15  00 00 0a 5f  00 aa 08 68  08 68 00 16
12 13 14 15  16 17 18 19  20 21 22 23  24 25 26 27  28 29 30 31  32 33 34 35  36 37 38 39
Я не вижу в коде ничего, что могло бы объяснить, почему два байта нулей попадают в эту последовательность байтов. Это выглядит правильно, за исключением этих двух байтов. Я бы посмотрел данные в отладчике и убедился, что они выглядят именно так до и после вызова memcpy. Внимательно посмотрите на определение структуры пакета данных и обратите внимание, где находятся члены data_len и pkt_len. Вполне возможно, что операция вычитания очищает эти байты. Также проверьте, что делает rte_pktmbuf_mtod. Если вы просто не можете разобраться в этом, то вы можете сохранить адрес во временной переменной перед вызовом memcpy для последующего использования.


sarali

Спасибо за Ваш вклад.