Bass 0 31 мая, 2012 Опубликовано 31 мая, 2012 (изменено) · Жалоба Доброго времени суток! Знакомлюсь с 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 подскажите куда копать? Изменено 31 мая, 2012 пользователем Bass Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gunner 0 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба Доброго времени суток! Знакомлюсь с LwIP, сеть завелась, но возникла такая проблема ... А если отключить аппаратное вычисление суммы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bass 0 31 мая, 2012 Опубликовано 31 мая, 2012 · Жалоба если отключить, то стэк софтварно будет считать (судя по коду. если принципиально, могу завтра проверить). Дело в том, что стэк выставляет эти нули в ответе и после формирования пакета передает в функцию отправки (драйвер), а та в свою очередь в буферы DMA. А там где-то перед передачей в PHY модуль должен уже просчитать все, на сколько я понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Попробуйте примеры с сайта ST. Они у меня работают без вопросов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба А какая версия стека? Была такая проблема когда переходили на версию 1.4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bass 0 1 июня, 2012 Опубликовано 1 июня, 2012 (изменено) · Жалоба Попробуйте примеры с сайта 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 соответственно нету. Неужели в этом дело? Хотя нигде не встречал упоминаний, что для аппаратного подсчета там должны быть нули. Или плохо искал? Изменено 1 июня, 2012 пользователем Bass Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Сделали так: В файле 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 */ Теперь полёт нормальный. Плата пингуется, страница загружается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Сделали так: В файле icmp.c ф ф-ции icmp_input() строки: Что интересно, в феврале был сделан именно такой commit. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bass 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Оказывается действительно плохо искал. Из 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. Спасибо всем откликнувшимся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem 0 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Интересная ссылочка, спасибо. Знал бы про неё, не мучился бы два дня подряд.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 июня, 2012 Опубликовано 1 июня, 2012 · Жалоба Интересная ссылочка, спасибо. Знал бы про неё, не мучился бы два дня подряд.. Ну так Саймон трудится, не покладая рук. Респект ему и уважуха, конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bass 0 14 июня, 2012 Опубликовано 14 июня, 2012 · Жалоба Созрел еще вопросик: первое прерывание по получению фрэйма приходит только спустя 30сек после сброса, хотя разрешаются прерывания сразу во время инициализации: ETH_DMAITConfig( ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE ); с чем это может быть связано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться