Вопрос или проблема
Я пишу анализатор протоколов Wireshark для нашего протокола CAN-шины и заметил, что tcpdump захватывает фреймы CAN дважды, и его выходные данные отличаются от программы candump.
Например, когда я выполняю следующие команды
$ cansend vcan0 123#R
$ cansend vcan0 123#22
tcpdump показывает следующий вывод
$ tcpdump -i vcan0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vcan0, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
00:19:18.372611
0x0000: 2301 0040 0000 0000 0000 0000 0000 0000 #..@............
00:19:18.374097
0x0000: 2301 0040 0000 0000 0000 0000 0000 0000 #..@............
00:19:33.605064
0x0000: 2301 0000 0100 0000 2200 0000 0000 0000 #.......".......
00:19:33.610799
0x0000: 2301 0000 0100 0000 2200 0000 0000 0000 #.......".......
но candump отображает их корректно.
$ candump vcan0
vcan0 123 [0] remote request
vcan0 123 [1] 22
Версия tcpdump
$ tcpdump --version
tcpdump version 4.9.2
libpcap version 1.9.0-PRE-GIT (with TPACKET_V3)
У меня есть два вопроса
- Существует ли какое-либо решение этой проблемы, или она решена в более новой версии?
- Если решения нет или требуется новая версия, могу ли я использовать candump в удаленном захвате Wireshark? Я знаю, что могу просматривать логи candump, но предпочел бы проводить живую инспекцию с использованием удаленного захвата.
Ответ или решение
Для решения вашей задачи с захватом фреймов шины CAN в double при использовании tcpdump, давайте рассмотрим несколько аспектов вашей проблемы и возможные решения.
Проблема удвоенного захвата фреймов в tcpdump
Вы указали, что при использовании tcpdump на виртуальной сети CAN (vcan0), каждая передача фрейма захватывается дважды. Обратите внимание, что такая проблема может быть связана с разбиением трафика на уровне ядра или с особенностями работы tcpdump с виртуальными интерфейсами.
Возможные причины:
- Особенности libpcap: Версия libpcap, которую использует tcpdump, может не полностью поддерживать специфические функции виртуальных CAN-интерфейсов, что приводит к дублированию пакетов.
- Фильтры захвата: У старых версий tcpdump иногда возникают ошибки, связанные с фильтрацией пакетов в виртуальных интерфейсах. Это может приводить к их дублированию.
- Проблемы с ядром Linux: Иногда ядро может дублировать пакеты на виртуальных интерфейсах при определённых настройках сетевых фильтров или драйверов.
Решения и рекомендации:
-
Обновление tcpdump/libpcap: Проверьте, доступны ли обновления для tcpdump или libpcap. Новые версии могли исправить баги, связанные с дублированием пакетов.
sudo apt update sudo apt install tcpdump
-
Использование фильтров: Попробуйте настроить более специфичные фильтры в tcpdump, чтобы избежать дублирования, если возможно.
-
Заменить инструмент на candump: Поскольку candump отображает результаты корректно, возможно, стоит рассмотреть его использование для специфичных тестов CAN-бус.
Использование candump в Wireshark
Вопрос об интеграции candump в Wireshark для удалённого захвата несколько сложнее, так как Wireshark ожидает работу с pcap-потоками. Однако есть несколько обходных путей:
-
Интеграция через скрипты: Создайте скрипт, который будет перенаправлять вывод candump в формат pcap, и использовать его как источник для Wireshark.
-
Использование других утилит: Рассмотрите использование таких программ, как
can2pcap
, которые позволяют преобразовать данные CAN в pcap-формат, совместимый с Wireshark. -
Удалённый захват: Реализуйте удалённый захват данных и передачу через сети, используя вспомогательные приложения, сохраняя данные в pcap-формате для их дальнейшего анализа.
Заключение
Таким образом, для решения вашей проблемы, в первую очередь, следует рассматривать обновление используемых инструментов и проверку сетевых настроек на уровне Linux. В случае необходимости работы с данными в реальном времени воспользуйтесь скриптами для конвертации данных CAN в формат, подходящий для Wireshark, что увеличит гибкость в вашей технической инфраструктуре.