реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> stm32f2xx lwip icmp error
Bass
сообщение May 31 2012, 08:38
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 5-08-10
Из: Томск
Пользователь №: 58 761



Доброго времени суток!
Знакомлюсь с 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 - May 31 2012, 08:39
Go to the top of the page
 
+Quote Post
Gunner
сообщение May 31 2012, 11:19
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 23-06-04
Из: Kiev
Пользователь №: 146



QUOTE (Bass @ May 31 2012, 12:38) *
Доброго времени суток!
Знакомлюсь с LwIP, сеть завелась, но возникла такая проблема ...

А если отключить аппаратное вычисление суммы?
Go to the top of the page
 
+Quote Post
Bass
сообщение May 31 2012, 17:08
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 5-08-10
Из: Томск
Пользователь №: 58 761



если отключить, то стэк софтварно будет считать (судя по коду. если принципиально, могу завтра проверить).
Дело в том, что стэк выставляет эти нули в ответе и после формирования пакета передает в функцию отправки (драйвер), а та в свою очередь в буферы DMA. А там где-то перед передачей в PHY модуль должен уже просчитать все, на сколько я понял.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jun 1 2012, 03:12
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Попробуйте примеры с сайта ST.
Они у меня работают без вопросов


--------------------
Руслан
Go to the top of the page
 
+Quote Post
Artem
сообщение Jun 1 2012, 05:53
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424



А какая версия стека? Была такая проблема когда переходили на версию 1.4
Go to the top of the page
 
+Quote Post
Bass
сообщение Jun 1 2012, 06:55
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 5-08-10
Из: Томск
Пользователь №: 58 761



Цитата(athlon64 @ Jun 1 2012, 10:12) *
Попробуйте примеры с сайта ST.
Они у меня работают без вопросов

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

По поводу отключения аппаратного подсчета сумм имеются такие наблюдения:
При полном отключении и включении подсчета програмно (в стэке), естественно все работает нормально.
При аппаратном вычислении ситуация такая:
Код
Режим                                        ICMP        TCP
ETH_DMATxDesc_ChecksumTCPUDPICMPFull        -            +
ETH_DMATxDesc_ChecksumTCPUDPICMPSegment    -            +
ETH_DMATxDesc_ChecksumIPV4Header            +            -

Ерунда какая-то sad.gif

Цитата(Artem @ Jun 1 2012, 12:53) *
А какая версия стека? Была такая проблема когда переходили на версию 1.4

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

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

Сообщение отредактировал Bass - Jun 1 2012, 07:00
Go to the top of the page
 
+Quote Post
Artem
сообщение Jun 1 2012, 08:14
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424



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

// 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);
}

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

#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 */


Теперь полёт нормальный. Плата пингуется, страница загружается.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 1 2012, 08:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Artem @ Jun 1 2012, 12:14) *
Сделали так: В файле icmp.c ф ф-ции icmp_input() строки:

Что интересно, в феврале был сделан именно такой commit.
Go to the top of the page
 
+Quote Post
Bass
сообщение Jun 1 2012, 08:43
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 5-08-10
Из: Томск
Пользователь №: 58 761



Оказывается действительно плохо искал. Из 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.


Спасибо всем откликнувшимся.
Go to the top of the page
 
+Quote Post
Artem
сообщение Jun 1 2012, 08:56
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 4-02-05
Пользователь №: 2 424



Интересная ссылочка, спасибо. Знал бы про неё, не мучился бы два дня подряд..
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 1 2012, 09:10
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Artem @ Jun 1 2012, 12:56) *
Интересная ссылочка, спасибо. Знал бы про неё, не мучился бы два дня подряд..

Ну так Саймон трудится, не покладая рук. Респект ему и уважуха, конечно.
Go to the top of the page
 
+Quote Post
Bass
сообщение Jun 14 2012, 08:54
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 5-08-10
Из: Томск
Пользователь №: 58 761



Созрел еще вопросик: первое прерывание по получению фрэйма приходит только спустя 30сек после сброса, хотя разрешаются прерывания сразу во время инициализации:
Код
ETH_DMAITConfig( ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE );

с чем это может быть связано?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 15:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016