Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LwIP + LPC2468 без OS
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
virfis
Я смог запустить 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
а tcp_tmr или tcp_slowtmr tcp_fasttmr
вы вызываете?
virfis
Цитата(KRS @ Oct 28 2008, 17:17) *
а tcp_tmr или tcp_slowtmr tcp_fasttmr
вы вызываете?

И fast и slow вызываю.
lebiga
write только записывает в буфферы
нужно еще заставить передать

if (err == ERR_OK)
{ err=tcp_output(pcb); }
virfis
tcp_output вызываеся потом из tcp_slowtmr и возвращает ERR_OK.

Поставил wireshark. Пишет что "TCP checksum incorrect".
Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)]
Поэтому я не вижу ответа от контроллера.
lebiga
Цитата(virfis @ Oct 30 2008, 11:06) *
tcp_output вызываеся потом из tcp_slowtmr и возвращает ERR_OK.

Поставил wireshark. Пишет что "TCP checksum incorrect".
Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)]
Поэтому я не вижу ответа от контроллера.


На каком железе все это происходит?
sergeeff
Чего-нибудь напахано с настройкой проекта под ARM. Можно посмотреть как это сделано, например, тут:http://www.freertos.org/portsam7xlwIP.html. Проверить правильности параметров упаковки структур и endian.
_dem
По поводу TCP checksum offload спросите у Гугля, это известная особенность WireShark/Ethereal, связанная с аппаратным расчетом checksum.
sergeeff
TCP checksum считает стек (LWIP, в данном случае), а аппаратно считается checksum ethernet кадра.
_dem
Цитата(sergeeff @ Nov 2 2008, 22:59) *
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
Цитата(sergeeff @ Nov 2 2008, 14:55) *
Чего-нибудь напахано с настройкой проекта под ARM. Можно посмотреть как это сделано, например, тут:http://www.freertos.org/portsam7xlwIP.html. Проверить правильности параметров упаковки структур и endian.


Если пинги идут - упаковка структур должна быть правильной, проверено.

Многие сетевые карты позволяют отключать аппаратную checsum в своих опциях (вкладка свойства - настроить - дополнительно)
virfis
Прошу прощения что не отвечал. Интернет, да и вообще плата на работе.
Все это происходит на плате 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
Интересное наблюдение. Изменил последний параметр при вызове tcp_write на 1 и стало нормально все доходить. Но только после каждого отправленного пакета разрывает соединение. Приходится переустанавливать заново.
lebiga
Цитата(virfis @ Nov 5 2008, 10:09) *
Прошу прощения что не отвечал. Интернет, да и вообще плата на работе.
Все это происходит на плате Olimex LPC-E2468.

А это смотрели? как заведен сигнал CRS?
http://electronix.ru/forum/index.php?showtopic=53056
virfis
Цитата
А это смотрели? как заведен сигнал CRS?

Смотрел, тоже заведено с ошибкой. Но проблема то не с приемом, прием 100%, а с передачей.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.