virfis 0 28 октября, 2008 Опубликовано 28 октября, 2008 · Жалоба Я смог запустить uIP, работает всё, но почитал здесь пишут что LwIP побысрее будет. Скачал версию 1.3, взял для примера проект lwIPWeb (выкладывали ссылку в одной из тем). Прием TCP есть, а предачи нет. Подскажите где копать. При установлении TCP соединения вызывается функция: err_t accept(void *arg, struct tcp_pcb *newpcb, err_t err) { tcp_err(newpcb, err_callback); tcp_arg(newpcb, NULL); tcp_recv(newpcb, recv_callback); tcp_sent(newpcb, send_callback); tcp_poll(newpcb, poll_callback, 1); return ERR_OK; } Далее при получении пакета вызываеся: err_t recv_callback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) { char* rq; u32_t* newarg; if (p != NULL) { if ( p->len ) { newarg = (u32_t*) mem_malloc(sizeof(u32_t)); *newarg = 5; if (tcp_write(tpcb, &MyBuf[0], 5, 0) != ERR_OK) { mem_free(newarg); tcp_close(tpcb); } else { tcp_arg(tpcb, newarg); } } tcp_recved(tpcb, p->len); pbuf_free(p); } return ERR_OK; Пробовал sdf} tcp_write возвращает ERR_OK, но на компе я не вижу ничего. Пинги идут. Опции lwipopts.h стандартные кроме того что я сам выставил #define SYS_LIGHTWEIGHT_PROT 0 #define NO_SYS 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 28 октября, 2008 Опубликовано 28 октября, 2008 · Жалоба а tcp_tmr или tcp_slowtmr tcp_fasttmr вы вызываете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 28 октября, 2008 Опубликовано 28 октября, 2008 · Жалоба а tcp_tmr или tcp_slowtmr tcp_fasttmr вы вызываете? И fast и slow вызываю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lebiga 0 29 октября, 2008 Опубликовано 29 октября, 2008 · Жалоба write только записывает в буфферы нужно еще заставить передать if (err == ERR_OK) { err=tcp_output(pcb); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 30 октября, 2008 Опубликовано 30 октября, 2008 · Жалоба tcp_output вызываеся потом из tcp_slowtmr и возвращает ERR_OK. Поставил wireshark. Пишет что "TCP checksum incorrect". Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)] Поэтому я не вижу ответа от контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lebiga 0 2 ноября, 2008 Опубликовано 2 ноября, 2008 · Жалоба tcp_output вызываеся потом из tcp_slowtmr и возвращает ERR_OK. Поставил wireshark. Пишет что "TCP checksum incorrect". Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)] Поэтому я не вижу ответа от контроллера. На каком железе все это происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 ноября, 2008 Опубликовано 2 ноября, 2008 · Жалоба Чего-нибудь напахано с настройкой проекта под ARM. Можно посмотреть как это сделано, например, тут:http://www.freertos.org/portsam7xlwIP.html. Проверить правильности параметров упаковки структур и endian. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 2 ноября, 2008 Опубликовано 2 ноября, 2008 · Жалоба По поводу TCP checksum offload спросите у Гугля, это известная особенность WireShark/Ethereal, связанная с аппаратным расчетом checksum. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 2 ноября, 2008 Опубликовано 2 ноября, 2008 · Жалоба TCP checksum считает стек (LWIP, в данном случае), а аппаратно считается checksum ethernet кадра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 3 ноября, 2008 Опубликовано 3 ноября, 2008 · Жалоба TCP checksum считает стек (LWIP, в данном случае), а аппаратно считается checksum ethernet кадра. Уважаемый, как раз вот этот случай Поставил wireshark. Пишет что "TCP checksum incorrect". Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)] Связан с тем, что wireshark пытается вычислять CRC пакетов (TCP, а не Ethernet), используя ресурсы сетевой платы (AFAIR), что вызывает данное сообщение даже для совершенно нормальных пакетов в совершенно нормальной сети. Спрашиваем Гугл и убираем галочку в настройках Wireshark. Потом уже смотрим и проверяем чексуммы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lebiga 0 3 ноября, 2008 Опубликовано 3 ноября, 2008 · Жалоба Чего-нибудь напахано с настройкой проекта под ARM. Можно посмотреть как это сделано, например, тут:http://www.freertos.org/portsam7xlwIP.html. Проверить правильности параметров упаковки структур и endian. Если пинги идут - упаковка структур должна быть правильной, проверено. Многие сетевые карты позволяют отключать аппаратную checsum в своих опциях (вкладка свойства - настроить - дополнительно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 5 ноября, 2008 Опубликовано 5 ноября, 2008 · Жалоба Прошу прощения что не отвечал. Интернет, да и вообще плата на работе. Все это происходит на плате Olimex LPC-E2468. Я подозревал что проблема контрольной суммы не в LwIP, потому что уже сам калькулятором пересчитывал и просматривал исходящий пакет при отладке через Jtag. Аппаратно отключить не удалось в свойсвах сетевой карты. Опцию "Аппаратный контроль суммы"отключил, но все равно пишет что неверная сумма. Может надо перегрузить систему, не пробовал. Я отключил валидацию TCP в Wireshark. Значит получается ситуация такая: Я попробовал соединиться с сервером на другом компе и сделать тот же обмен что и с контроллером. Вот что в логе снифера: 1 0.000000 192.168.0.7 192.168.0.11 TCP vpsipport > iec-104 [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=6 2 0.027790 192.168.0.11 192.168.0.7 TCP iec-104 > vpsipport [PSH, ACK] Seq=1 Ack=7 Win=65529 Len=6 3 0.218945 192.168.0.7 192.168.0.11 TCP vpsipport > iec-104 [ACK] Seq=7 Ack=7 Win=65529 Len=0 И вроде все нормально. Теперь лог с контроллером: 1 0.000000 192.168.0.7 192.168.0.250 TCP 2194 > iec-104 [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=6 2 0.001688 192.168.0.250 192.168.0.7 TCP iec-104 > 2194 [PSH, ACK] Seq=1 Ack=7 Win=1500 Len=6 3 2.390097 192.168.0.250 192.168.0.7 TCP [TCP Retransmission] iec-104 > 2194 [PSH, ACK] Seq=1 Ack=7 Win=1500 Len=6 4 2.994343 192.168.0.7 192.168.0.250 TCP [TCP Retransmission] 2194 > iec-104 [PSH, ACK] Seq=1 Ack=1 Win=65535 Len=6 5 2.994923 192.168.0.250 192.168.0.7 TCP [TCP Dup ACK 3#1] iec-104 > 2194 [ACK] Seq=7 Ack=7 Win=1500 Len=0 6 7.389978 192.168.0.250 192.168.0.7 TCP [TCP Retransmission] iec-104 > 2194 [PSH, ACK] Seq=1 Ack=7 Win=1500 Len=6 7 8.889848 192.168.0.250 192.168.0.7 TCP iec-104 > 2194 [PSH, ACK] Seq=7 Ack=7 Win=1500 Len=6 Значит здесь так: 7-й адрес мой, 11-й другой комп, 250-контроллер. Единственную разницу что вижу, это в ответе от контроллера window size не 65529, а 1500. И еще - в ответе от контроллера вместо нужных 6-ти байт нули. Вот такое вот дела у меня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 5 ноября, 2008 Опубликовано 5 ноября, 2008 · Жалоба Интересное наблюдение. Изменил последний параметр при вызове tcp_write на 1 и стало нормально все доходить. Но только после каждого отправленного пакета разрывает соединение. Приходится переустанавливать заново. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lebiga 0 5 ноября, 2008 Опубликовано 5 ноября, 2008 · Жалоба Прошу прощения что не отвечал. Интернет, да и вообще плата на работе. Все это происходит на плате Olimex LPC-E2468. А это смотрели? как заведен сигнал CRS? http://electronix.ru/forum/index.php?showtopic=53056 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
virfis 0 5 ноября, 2008 Опубликовано 5 ноября, 2008 (изменено) · Жалоба А это смотрели? как заведен сигнал CRS? Смотрел, тоже заведено с ошибкой. Но проблема то не с приемом, прием 100%, а с передачей. Изменено 5 ноября, 2008 пользователем virfis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться