Вдруг пакеты перестают поступать в Ethernet PHY
У меня есть ситуация, когда пакеты не приходят в Ethernet PHY. Я использую кольцевой буфер DMA, данные копируются из физического провода в кольцевой буфер, затем я помещаю его в стек верхнего уровня. В кольцевом буфере DMA есть два счетчика: индекс потребителя и индекс производителя, а также два указателя: указатель чтения и указатель записи. Счетчик говорит, что сколько пакетов пришло с физического уровня, тогда как потребительский буфер используется для хранения индекса использованного буфера, который был передан на верхний уровень. Чтение и запись указателей используются для выбора данных.
В моей текущей ситуации мой индекс производителя и потребителя становится похожим, это означает, что в кольцевом буфере DMA нет пакетов, в то время как пакеты непрерывно перекачиваются на устройство, подключенное к ПК (журналы wireshark подтверждают, что пакет маршрутизируется).
Мы делаем нашу ОС загрузчика независимой, поэтому здесь наша реализация делает много вещей (управление потоком, анализ исходного пакета и отправка его на верхние уровни) в рамках одного выполнения (введение некоторых таймеров), как и в предыдущей реализации, которой является VxWorks., вещи происходят в разных потоках, и они использовали свой стек IP. После дальнейшей отладки проблемы я заметил, что пакеты отбрасываются из-за переполнения RX_BUFFER. Я обнаружил, что при настройке многоадресного MAC-адреса в фильтрах на аппаратном уровне есть некоторые проблемы, которые могут быть причиной того же. Мое наблюдение заключается в том, что в первый раз все работает нормально. Но после мягкого сброса я не могу снова поставить фильтр. У меня есть сомнения по поводу еще нескольких вопросов, и я исследую то же самое.
1> Инициализировать драйвер Ethernet.
2> инициализация LWIP (IP-стека).
3> Регистрация функций обратного вызова.
4> Запустите драйвер PHY Ethernet.
5> Форма DHCP-соединения.
Драйвер Ethernet 6> продолжает опрос, чтобы принять предложение DHCP.
7> Присоединяйтесь к IGMP
8> Опрос для многоадресного пакета
9> разобрать пакет и присоединиться к другой многоадресной группе
10> снова начать опрос для многоадресного пакета. Здесь после шага 4, случайно я получаю сообщение переполнения RX_BUFFER на любом шаге вперед. Максимальный установленный размер MTU составляет 1500 байт, а размер буфера равен 2 КБ.
Любое предложение, чтобы разобраться / сузить вопрос?
1 ответ
Мы связались с Broadcom по вышеуказанной проблеме, мы исправили проблему и протестировали ее. Я хотел бы обновить модификацию, которая была сделана.
После получения пакетов данных от уровня PHY мы очищаем буфер PHY RX. Этот раздел удален, потому что он уже управляется уровнем PHY.
Мы также внесли небольшие изменения в поток стека LWIP.