Перейти к содержанию
    

stm32f2xx lwip icmp error

Доброго времени суток!

Знакомлюсь с LwIP, сеть завелась, но возникла такая проблема:

при пинге PC->МК вываливается "Превышен интервал ожидания для запроса.", хотя в wireshark виден ответ от МК, причем с ошибочной контрольной суммой (0x0000) в заголовке icmp.

При инициализации интерфейса в МК выставляется железное вычесление суммы

for(i = 0; i < ETH_TXBUFNB; i++) {
    ETH_DMATxDescChecksumInsertionConfig(&DMATxDscrTab[i], ETH_DMATxDesc_ChecksumTCPUDPICMPFull);
}

а в lwipopts.h

#define CHECKSUM_BY_HARDWARE                1

#ifdef CHECKSUM_BY_HARDWARE
  /* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/
  #define CHECKSUM_GEN_IP                 0
  /* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/
  #define CHECKSUM_GEN_UDP                0
  /* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/
  #define CHECKSUM_GEN_TCP                0
  /* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/
  #define CHECKSUM_CHECK_IP               0
  /* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/
  #define CHECKSUM_CHECK_UDP              0
  /* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/
  #define CHECKSUM_CHECK_TCP              0
#else
  /* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/
  #define CHECKSUM_GEN_IP                 1
  /* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/
  #define CHECKSUM_GEN_UDP                1
  /* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/
  #define CHECKSUM_GEN_TCP                1
  /* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/
  #define CHECKSUM_CHECK_IP               1
  /* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/
  #define CHECKSUM_CHECK_UDP              1
  /* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/
  #define CHECKSUM_CHECK_TCP              1
#endif

 

подскажите куда копать?

Изменено пользователем Bass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток!

Знакомлюсь с LwIP, сеть завелась, но возникла такая проблема ...

А если отключить аппаратное вычисление суммы?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если отключить, то стэк софтварно будет считать (судя по коду. если принципиально, могу завтра проверить).

Дело в том, что стэк выставляет эти нули в ответе и после формирования пакета передает в функцию отправки (драйвер), а та в свою очередь в буферы DMA. А там где-то перед передачей в PHY модуль должен уже просчитать все, на сколько я понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте примеры с сайта ST.

Они у меня работают без вопросов

Да в общем-то большая часть кода с этих примеров и используется. Хотелось бы не просто запустить, а понять и разобраться где накосячил.

 

По поводу отключения аппаратного подсчета сумм имеются такие наблюдения:

При полном отключении и включении подсчета програмно (в стэке), естественно все работает нормально.

При аппаратном вычислении ситуация такая:

Режим                                        ICMP        TCP
ETH_DMATxDesc_ChecksumTCPUDPICMPFull        -            +
ETH_DMATxDesc_ChecksumTCPUDPICMPSegment    -            +
ETH_DMATxDesc_ChecksumIPV4Header            +            -

Ерунда какая-то :(

 

А какая версия стека? Была такая проблема когда переходили на версию 1.4

о_О, да стэк именно 1.4.0. Как решили вопрос?

 

upd:

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

Сравнивая обработку ICMP пакетов в core/ipv4/icmp.c заметил, что в 1.3.2 есть явное обнуление контрольной суммы в заголовке ICMP при ответе, а в 1.4.0 соответственно нету. Неужели в этом дело? Хотя нигде не встречал упоминаний, что для аппаратного подсчета там должны быть нули. Или плохо искал?

Изменено пользователем Bass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделали так: В файле icmp.c ф ф-ции icmp_input() строки:

   // adjust the checksum 
   if (iecho->chksum >= PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
     iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1;
   } else {
     iecho->chksum += PP_HTONS(ICMP_ECHO << 8);
   }

закомментировали, а сделали так:

#if CHECKSUM_GEN_ICMP
   /* adjust the checksum */
   if (iecho->chksum >= PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {
     iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1;
   } else {
     iecho->chksum += PP_HTONS(ICMP_ECHO << 8);
   }
#else /* CHECKSUM_GEN_ICMP */
   iecho->chksum = 0;
#endif /* CHECKSUM_GEN_ICMP */

 

Теперь полёт нормальный. Плата пингуется, страница загружается.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделали так: В файле icmp.c ф ф-ции icmp_input() строки:

Что интересно, в феврале был сделан именно такой commit.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оказывается действительно плохо искал. Из Reference Manual:

Note that: for ICMP-over-IPv4 packets, the checksum field in the ICMP packet must

always be 0x0000 in both modes, because pseudo-headers are not defined for such

packets. If it does not equal 0x0000, an incorrect checksum may be inserted into the

packet.

 

Спасибо всем откликнувшимся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересная ссылочка, спасибо. Знал бы про неё, не мучился бы два дня подряд..

Ну так Саймон трудится, не покладая рук. Респект ему и уважуха, конечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Созрел еще вопросик: первое прерывание по получению фрэйма приходит только спустя 30сек после сброса, хотя разрешаются прерывания сразу во время инициализации:

ETH_DMAITConfig( ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE );

с чем это может быть связано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...