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

LwIP + LPC2468 без OS

Я смог запустить 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

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


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

write только записывает в буфферы

нужно еще заставить передать

 

if (err == ERR_OK)

{ err=tcp_output(pcb); }

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


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

tcp_output вызываеся потом из tcp_slowtmr и возвращает ERR_OK.

 

Поставил wireshark. Пишет что "TCP checksum incorrect".

Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)]

Поэтому я не вижу ответа от контроллера.

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


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

tcp_output вызываеся потом из tcp_slowtmr и возвращает ERR_OK.

 

Поставил wireshark. Пишет что "TCP checksum incorrect".

Checksum: 0xa33f [incorrect, should be 0x4e44 (maybe caused by "TCP checksum offload"?)]

Поэтому я не вижу ответа от контроллера.

 

На каком железе все это происходит?

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


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

Чего-нибудь напахано с настройкой проекта под ARM. Можно посмотреть как это сделано, например, тут:http://www.freertos.org/portsam7xlwIP.html. Проверить правильности параметров упаковки структур и endian.

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


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

По поводу TCP checksum offload спросите у Гугля, это известная особенность WireShark/Ethereal, связанная с аппаратным расчетом checksum.

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


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

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.

 

Потом уже смотрим и проверяем чексуммы.

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


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

Чего-нибудь напахано с настройкой проекта под ARM. Можно посмотреть как это сделано, например, тут:http://www.freertos.org/portsam7xlwIP.html. Проверить правильности параметров упаковки структур и endian.

 

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

 

Многие сетевые карты позволяют отключать аппаратную checsum в своих опциях (вкладка свойства - настроить - дополнительно)

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


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

Прошу прощения что не отвечал. Интернет, да и вообще плата на работе.

Все это происходит на плате 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-ти байт нули. Вот такое вот дела у меня.

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


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

Интересное наблюдение. Изменил последний параметр при вызове tcp_write на 1 и стало нормально все доходить. Но только после каждого отправленного пакета разрывает соединение. Приходится переустанавливать заново.

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


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

Прошу прощения что не отвечал. Интернет, да и вообще плата на работе.

Все это происходит на плате Olimex LPC-E2468.

А это смотрели? как заведен сигнал CRS?

http://electronix.ru/forum/index.php?showtopic=53056

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


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

А это смотрели? как заведен сигнал CRS?

Смотрел, тоже заведено с ошибкой. Но проблема то не с приемом, прием 100%, а с передачей.

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

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


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

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

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

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

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

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

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

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

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

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