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

 
 
> stm32F4 ethernet отправка фрейма
Fobes
сообщение Mar 13 2016, 14:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Всем доброго времени суток. Уже совсем измучился... Нужно отправить чисто ethernet фрейм + vlan tag + свои данные. Т.е. только канальный уровень по ОСИ.
Взял LwIp библиотеку. Как я понял в ней отправка данных происходит через буфер pbuf и при помощи функции low_level_output().
Собственно сделал свои структуры дабы время сэкономить:
CODE

struct ethernet_header
{
uint8_t dstAdr[6];
uint8_t srcAdr[6];
uint8_t type[2];
} __attribute__((packed));

struct vlan_header
{
uint8_t param[2];
uint8_t type[2];
} __attribute__((packed));

struct my_header
{
struct ethernet_header eth_hdr;
struct vlan_header vlan_hdr;
//дальше мои данные
} __attribute__((packed));


Дальше заполняю и отправляю вот так:

CODE

struct pbuf *pbuf_my;
struct my_header my_hdr;

uint32_t errCnt;
err_t error;

my_hdr.eth_hdr.dstAdr[0] = 0x01; my_hdr.eth_hdr.dstAdr[1] = 0x0C;
my_hdr.eth_hdr.dstAdr[2] = 0xCD; my_hdr.eth_hdr.dstAdr[3] = 0x04;
my_hdr.eth_hdr.dstAdr[4] = 0x00; my_hdr.eth_hdr.dstAdr[5] = 0x01;

my_hdr.eth_hdr.srcAdr[0] = 0x06; my_hdr.eth_hdr.srcAdr[1] = 0x02;
my_hdr.eth_hdr.srcAdr[2] = 0x00; my_hdr.eth_hdr.srcAdr[3] = 0xFF;
my_hdr.eth_hdr.srcAdr[4] = 0xFF; my_hdr.eth_hdr.srcAdr[4] = 0x10;

my_hdr.eth_hdr.type[0] = 0x81; my_hdr.eth_hdr.type[1] = 0x00;
//------------
my_hdr.vlan_hdr.param[0] = 0x80; my_hdr.vlan_hdr.param[1] = 0x00;
my_hdr.vlan_hdr.type[0] = 0x88; my_hdr.vlan_hdr.type[1] = 0xba;
//-----

//вот это верно делаю ? sad.gif
pbuf_my= pbuf_alloc(PBUF_RAW,sizeof(struct my_header), PBUF_RAM);
pbuf_my->payload = &my_hdr;


while (1)
{
error = gnetif.linkoutput(&gnetif, pbuf_my);

if (error != ERR_OK)
{
errCnt++;
}
}


Длина одного фрейма порядка 820 байт... Фреймы передаются,но wireshark периодически показывает "Malformed packet". И в error появляется "#define ERR_BUF -2 /* Buffer error. */" Что я делаю не так ? Как правильно использовать буфер ? sad.gif помогите плиз, знающие люди !!!
И второй вопрос, фрейм передается правильно, но vlan tag вырезается почему-то, оно где-то разрешаться должно чтоли ?

п.с. с фреймами меньшей длины такие проблемы возникают, но реже

может ли это быть связано с повреждением микросхемы физического уровня ?

Сообщение отредактировал Fobes - Mar 13 2016, 16:27
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Fobes
сообщение Mar 14 2016, 09:54
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 19-01-16
Пользователь №: 90 105



Посылаются пакеты двух типов, 127 байт - 4000 раз в секунду, 817 байт - 1600 раз в секунду.

CODE


#define ETH_TXBUFNB 4

#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE
#define ETH_MAX_PACKET_SIZE 1524




Цитата(cyrax0 @ Mar 14 2016, 08:43) *
Тут я не знаю, но, возможно, если вы не используете lwip, то есть смысл и не использовать pbuf_alloc, а делать пакет pbuf полностью самостоятельно.


А вот тут поподробнее можно или что почитать ?
Go to the top of the page
 
+Quote Post
cyrax0
сообщение Mar 14 2016, 12:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 9-12-14
Пользователь №: 84 046



Цитата(Fobes @ Mar 14 2016, 13:54) *
Посылаются пакеты двух типов, 127 байт - 4000 раз в секунду, 817 байт - 1600 раз в секунду.

Не кратные циклы получаются, вы не из разных прерываний посылаете пакеты? В некоторых реализациях low_level_output нет проверки на занятость функции, это может привести к проблемам...

Попробуйте сделать такие константы:
#define ETH_TXBUFNB 20 (лучше максимум, на сколько хватит места)
#define ETH_TX_BUF_SIZE 820

Если и на 20 не хватит места, то сделайте ETH_TX_BUF_SIZE 128 (этот вариант не могу рекомендовать, т.к. в параллельной теме у меня проблема как раз с посылкой пакетов, не влезающих в один сетевой буфер).

Цитата(Fobes @ Mar 14 2016, 13:54) *
А вот тут поподробнее можно или что почитать ?

Ну почитайте про pbuf_alloc, раз в нем не уверены, или создайте полностью struct pbuf, описанную в pbuf.h, без вызова этой функции. По идее, если посылка у вас идет, вызов сделан корректно, но лучше разобраться в функции, а такие ее параметры я не изучал, так что не подскажу, верны они или нет.
Go to the top of the page
 
+Quote Post



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

 


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


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