|
|
  |
LWIP Как послать данные (tcp_write) по событию? |
|
|
|
Jun 4 2014, 06:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(scifi @ Jun 4 2014, 13:21)  Что-то не видно, как кадры из Ethernet принимаются и обрабатываются. В обработчике прерывания что ли? Кстати, есть ещё ARP. Он тоже может задерживать отправку пакетов, и там есть таймеры. Я пока отправку пытаюсь сделать, или Вы хотите сказать, что посылать данные без настройки приёма оно не будет? ARP и ICMP начинают работать уже после Код lwIPInit(pucMACArray, board_ip, net_mask, 0, IPADDR_USE_STATIC); и ничего более не требуют.
|
|
|
|
|
Jun 4 2014, 07:02
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(doom13 @ Jun 4 2014, 15:06)  По идее должна работать Интересно, как? SEND: ARP REQUEST RECEIVE: ARP RESPONSE SEND: UDP Если уберёте вторую строчку, то всё заглохнет.
|
|
|
|
|
Jun 4 2014, 07:14
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(scifi @ Jun 4 2014, 14:12)  Мы наверное с Вами про разные отправку/приём говорим. Я про то, что UDP должен работать на передачу, вне зависимости от приёма (настроен обработчик принимаемых сообщений или нет). Вы про ARP, где должны быть реализованы и приём и передача, но арп начинает работать уже после инициализации LwIP, там да, должен работать и приём и передача, для UDP мне пока приёмник не нужен, только начинаю разбираться с либой, хочу передачу затестить.
|
|
|
|
|
Jun 4 2014, 07:21
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(doom13 @ Jun 4 2014, 15:24)  Вы про ARP, где должны быть реализованы и приём и передача, но арп начинает работать уже после инициализации LwIP, там да, должен работать и приём и передача, для UDP мне пока приёмник не нужен, только начинаю разбираться с либой, хочу передачу затестить. То есть приём кадров Ethernet уже есть? Вот я и поинтересовался, где он. Потому что если он в обработчике прерывания, то это - бяка, так нельзя.
|
|
|
|
|
Jun 4 2014, 08:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Короче передача заработала, проблема была в том, что дефайн IP4_ADDR задаёт IP в обратном порядке следования байт, что и необходимо функциям LwIP, я задавал в прямом. Как итог библиотечная функция udp_sendto_if() при проверке IP выкидывала ошибку и ничего не отправляла. CODE .... .... // Инициализация LwIP ....
// UDP struct udp_pcb *pcb; pcb = udp_new();
unsigned short port_rmt, port_local; struct ip_addr ip_rmt, ip_local;
IP4_ADDR(&ip_rmt, 192, 168, 1, 66); IP4_ADDR(&ip_local, 192, 168, 1, 16); port_rmt = 12000; port_local = 11000;
udp_bind(pcb, &ip_local, port_local); udp_connect(pcb, &ip_rmt, port_rmt);
unsigned char buffer[128]; int i; for(i = 0; i < 128; i++) { buffer[i] = i; }
struct pbuf * pb; pb = pbuf_alloc(PBUF_TRANSPORT, 128, PBUF_RAM); memcpy(pb->payload, buffer, sizeof(buffer));
int tx_en = 0; err_t error = 55;
while(1) { if(tx_en) { error = udp_send(pcb, pb); pbuf_free(pb); tx_en = 0; } } Цитата(scifi @ Jun 4 2014, 14:31)  То есть приём кадров Ethernet уже есть? Вот я и поинтересовался, где он. Потому что если он в обработчике прерывания, то это - бяка, так нельзя. Ну я так глубоко пока не копал, взял пример http сервера для моей платы, и пытаюсь передрать его под UDP, что потом и буду использовать, правда, уже на другой борде. Поэтому связку LwIP->драйвер PHY оставил на потом. Следующий шаг - это отправить UDP-пакет за несколько фрагментов. Очередной вопрос, как отправить фрагментированный UDP пакет?
Сообщение отредактировал IgorKossak - Jun 4 2014, 14:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Jun 4 2014, 13:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(scifi @ Jun 4 2014, 17:54)  Что значит "фрагментированный"? Фрагментация на уровне IP должна работать автомагически. Как бы да, это и имел ввиду. Когда флаги выставляются More Fragments, Last Fragment и поле Fragment offset. Попробовал сделать так: Код .......... .......... unsigned char buffer[4096]; int i; for(i = 0; i < 4096; i++) { buffer[i] = i; }
struct pbuf * pb; pb = pbuf_alloc(PBUF_TRANSPORT, 4096, PBUF_RAM); memcpy(pb->payload, buffer, sizeof(buffer));
int tx_en = 0;
while(1) { if(tx_en) { udp_send(pcb, pb); pbuf_free(pb); tx_en = 0; } } т.е. передать данные длинной 4096 байт, в итоге отправилось три пакета, в сумме то, что надо - 4096 байт. Стек сам поделил на фрагменты, вроде как круто, но потом стал разбираться, оказалось в третьем фрагменте данные повторяют данные второго фрагмента, а флаги выставились неправильно, во втором фрагменте уже стоит Last Fragment, что не верно. Может либа старая или ещё что, примеры от Техаса используется LwIP v1.3.2? Да, и поле Fragment Offset у второго и третьего фрагментов одинаковое.
|
|
|
|
|
Jun 5 2014, 02:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
WireShark для некоторых пакетов, отправляемых LwIP, выдаёт ETHERNET FRAME CHECK SEQUENCE INCORRECT, например, для ответа на ARP запрос выдаёт эту месагу. Кто такой этот ETHERNET FRAME CHECK SEQUENCE, который получился как 5A D2 36 08, а должен был быть 4F 8F 14 D1? Ведь ethernet CRC формируется MAC-контроллером и WireShark-ом я его, по идее, не вижу.
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 5 2014, 07:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(jcxz @ Jun 5 2014, 14:15)  ARP-кадр у вас вроде верный. Не забыли, что пре передаче по Ethernet, кадр дополняется до некоей величины (не помню точно, 50 с чем-то байт, вроде 54 или 56) паддингом. Вы его имеете в виду? Да. Так вот, на втором скриншоте ARP RESPONSE от нашего сервака (в конце данные ARP добиты нулями, как и должно быть), на первом - ответ от платы с LwIP (посылка больше на 4 байта и они какой-то ерундой забиты). Если кто может проверить, посмотрите плиз, как у Вас отвечает на ARP запросы. Просто интересно, это баг LwIP v1.3.2 или техасовцы cо своими примерами где-то прокололись. Пока поставил заглушку, для ответа на ARP, уменьшаю длину пакета на 4 байта.
|
|
|
|
|
Jun 10 2014, 04:54
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(doom13 @ Jun 10 2014, 12:57)  Можно ли использовать LwIP с #define PACK_STRUCT_STRUCT вместо #define PACK_STRUCT_STRUCT __attribute__ ((__packed__)), во что это может вылится? Надо наладить упаковку структур, иначе работать не будет. У меня, к примеру, сделано так: в файле cc.h: Код ... /* Compiler hints for packing structures */ #define PACK_STRUCT_USE_INCLUDES #define PACK_STRUCT_FIELD(x) x #define PACK_STRUCT_STRUCT #define PACK_STRUCT_BEGIN #define PACK_STRUCT_END ... в файле bpstruct.h: Код #pragma pack(push,1) в файле epstruct.h: Код #pragma pack(pop)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|