Беркут-ET/Как мы боролись с IGMP
Материал из b4wiki
Предыстория
Вчера (2009-03-19) позвонили счастливые обладатели прибора Беркут-ET и собщили, что он зависает. Зависает насмерть. То есть, выйти из такого состояния помогает только ресет.
А схема подключения — почти лабораторные условия: Беркут-ЕТ порт «A» → wi-fi роутер → Беркут-ЕТ порт «B» в режиме loopback.
Беркут-ET(он же b3et) генерирует трафик с порта «A», прогоняет через роутер и заворачивает обратно. И работает, работает, работает... пока не зависнет. Причём, как утверждали пользователи, напрочь.
А воспроизвести в наших условиях не получилось. И случайный трафик на вход подавали, и пинг без пауз с достаточно мощной машины, а ему хоть бы хны. Правда, параллельно другой баг нашли, но сейчас речь не об этом.
Логично предположить, что роутер генерирует какой-то трафик. Но откуда? Ведь к нему ничего не подключено, только b3et. А на свои пакеты, приходящие по гигабитному каналу дивайс, как мы знаем, реагирует адекватно. Обрабатывает, то есть, без особого напряжения. Идём на сайт производителя роутера, читаем: помимо всего прочего он поддерживает igmp snooping. Смотрим в наш (ну, не наш, а ethernut'овский) код обработки входящих пакетов и видим, что при получении igmp-фрейма память-то не освобождается! Правда, это лишь догадка и нужно её подтверждение («Какие ваши доказателства?» © А.Шварцнегер).
Где взять генератор трафика?
Где взять igmp-пакеты? Видео мы не транслируем. Прикручивать VLC-стример как-то не хочется.
На помощь приходит киножурнал «Хочу всё знать» генератор пакетов для ethernet packeth. Несмотря на запутанный графический интерфейс, нам удалось создать трафик с десятком тысяч igmp-пакетов, который успешно записали в файл tcpdump'ом, а потом проиграли программой bittwist. Et voilà! Прибор висит. После наложения заплатки зависаний нет. Ура.
