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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> LWIP Как послать данные (tcp_write) по событию?
doom13
сообщение Jun 4 2014, 06:16
Сообщение #31


Профессионал
*****

Группа: Свой
Сообщений: 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);

и ничего более не требуют.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 06:47
Сообщение #32


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 14:26) *
Я пока отправку пытаюсь сделать, или Вы хотите сказать, что посылать данные без настройки приёма оно не будет?

Отправка без приёма работать не должна. Если только не сделаете заранее статическую таблицу ARP.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 06:56
Сообщение #33


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(scifi @ Jun 4 2014, 13:57) *
Отправка без приёма работать не должна. Если только не сделаете заранее статическую таблицу ARP.

По идее должна работать, скоро проверим, похоже, нашёл проблему, udp_send ошибку выдаёт ERR_VAL.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 07:02
Сообщение #34


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 15:06) *
По идее должна работать

Интересно, как?
SEND: ARP REQUEST
RECEIVE: ARP RESPONSE
SEND: UDP
Если уберёте вторую строчку, то всё заглохнет.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 07:14
Сообщение #35


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(scifi @ Jun 4 2014, 14:12) *

Мы наверное с Вами про разные отправку/приём говорим. Я про то, что UDP должен работать на передачу, вне зависимости от приёма (настроен обработчик принимаемых сообщений или нет). Вы про ARP, где должны быть реализованы и приём и передача, но арп начинает работать уже после инициализации LwIP, там да, должен работать и приём и передача, для UDP мне пока приёмник не нужен, только начинаю разбираться с либой, хочу передачу затестить.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 07:21
Сообщение #36


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 15:24) *
Вы про ARP, где должны быть реализованы и приём и передача, но арп начинает работать уже после инициализации LwIP, там да, должен работать и приём и передача, для UDP мне пока приёмник не нужен, только начинаю разбираться с либой, хочу передачу затестить.

То есть приём кадров Ethernet уже есть? Вот я и поинтересовался, где он. Потому что если он в обработчике прерывания, то это - бяка, так нельзя.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 08:13
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 4 2014, 10:44
Сообщение #38


Гуру
******

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



Цитата(doom13 @ Jun 4 2014, 16:23) *
Очередной вопрос, как отправить фрагментированный UDP пакет?

Что значит "фрагментированный"? Фрагментация на уровне IP должна работать автомагически.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 4 2014, 13:33
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 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 у второго и третьего фрагментов одинаковое.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 5 2014, 02:35
Сообщение #40


Профессионал
*****

Группа: Свой
Сообщений: 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-ом я его, по идее, не вижу.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 5 2014, 03:48
Сообщение #41


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Смотрю, что в ARP протоколе этих четырёх последних байт нету, зачем LwIP их добавляет?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 5 2014, 07:05
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



ARP-кадр у вас вроде верный.
Не забыли, что пре передаче по Ethernet, кадр дополняется до некоей величины (не помню точно, 50 с чем-то байт, вроде 54 или 56) паддингом.
Вы его имеете в виду?

PS: пользуемся своим TCP/IP-стеком, ругани от WireShark на его кадры не замечал.
Хотя у нас только ARP, IP, ICMP, TCP. UDP - не используется.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 5 2014, 07:32
Сообщение #43


Профессионал
*****

Группа: Свой
Сообщений: 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 байта.
Go to the top of the page
 
+Quote Post
doom13
сообщение Jun 10 2014, 04:47
Сообщение #44


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Разбирался с работой LwIP на плате с Cortex-M3, всё было good. Счас пробую переделать проект для ARM9 (TI - AM1808) и компилятор не хочет кушать __attribute__ ((__packed__)), который используется для всех структур в LwIP. Без него всё компилится и даже работает (на плате с M3).
Можно ли использовать LwIP с #define PACK_STRUCT_STRUCT вместо #define PACK_STRUCT_STRUCT __attribute__ ((__packed__)), во что это может вылится?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 10 2014, 04:54
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post

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

 


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


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