вторник, 12 апреля 2011 г.

mbuf overrun

Наткнулся на интересную проблему...

Не буду винить команду FreeBSD, как я люблю, ибо в стандартной комплектации FreeBSD-6 вообще не поддерживает данный адаптер. Нам, для поддержки необходимого оборудования пришлось взять самый последний драйвер от Intel. Драйвер изначально ориентирован на FreeBSD-7, но нам удалось прикрутить его к шестерке. Оригинальные драйвера от Intel используются во FreeBSD практически без изменений. Только фря старая, и драйвер седьмой версии в нее не втащить. До сего дня использовался 6.9.12

Но это все была присказка, приоткрывающая завесу тайны. Началось все с того, что на новой платформе версия продукта начала падать...

Наших менеджеров хлебом не корми, дай что нибудь продать. А продукт у нас аппаратно-программный. И для продаж последней версии закупили новую платформу. Очень новую... для FreeBSD 6.3 просто невозможно новую... Но драйвер em из семерки мы втащили в ядро раньше. Надо сказать семерка, в своих ранних проявлениях, не сильно отличается от шестерки.

Все имеющиеся платформы оттестировали вдоль и поперек, но на новой продукт почему-то стал падать при прохождении трафика. И мало того, Из за него начали падать соседние шлюзы, которые раньше прекрасно работали.

Почти неделя прошла в медитациях.

Сперва, как обычно, грешил на невыясненные глюки в коде, даже работающее решение предоставил, где ничего не падает и почти полное счастье. Но истинная причина оставалась неизвестной.

Потом выяснилось, что в пакете, пока он находится в очереди на шифрование, не просто портится длина, а весь пакет чудесным образом заменяется на другой. А FreeBSD ведет себя хитро, чтобы работать с пакетом в заголовке пакета длину меняют на host order. Представляете себе удивление ip_fragment, когда он пытался фрагментировать пакет у которого длинна оказалась в некорректном (сетевом) порядке байт.

Причина падения ясна - а вот причина чудесной подмены пакетов - нет. Собственно лечить FreeBSD - не входило в мои планы. В таких случаях я обычно начинаю читать svn.freebsd.org... Но сейчас это не помогло. В шестерке драйвер значительно старее нашего, а в семерке - уже значительно новее.

Нашелся новый драйвер от Intel (6.9.21), который решил проблему окончательно, подмены пакетов прекратились.

Не знаю какая мораль из всего этого. Обновление драйверов спасает нас почти при любых проблемах с новым железом. Но с каждым новым железом сделать это все труднее, FreeBSD-6 уже не развивается. Как мы дальше будем ее поддерживать? - не знаю...

2 коммент.:

alexp комментирует...

а что за костыль в софте ты придумал, чтобы компенсировать глюки драйвере?

Andrey Valyaev комментирует...

При получении пакета из очереди я сравниваю - соответствует ли длина из заголовка собственно длине mbuf. :) - если нет, пакет отбрасывался...

Вообще это происходило достаточно редко... 1 на 100000 пакетов. Но все равно некрасивое решение. :)