|
|
  |
stm32F4 ethernet отправка фрейма |
|
|
|
Mar 13 2016, 14:13
|
Участник

Группа: Участник
Сообщений: 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; //----- //вот это верно делаю ?  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. */" Что я делаю не так ? Как правильно использовать буфер ?  помогите плиз, знающие люди !!! И второй вопрос, фрейм передается правильно, но vlan tag вырезается почему-то, оно где-то разрешаться должно чтоли ? п.с. с фреймами меньшей длины такие проблемы возникают, но реже может ли это быть связано с повреждением микросхемы физического уровня ?
Сообщение отредактировал Fobes - Mar 13 2016, 16:27
|
|
|
|
|
Mar 14 2016, 07:43
|
Участник

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

|
Я не особо "Знающий" но выскажусь. Такая ошибка в low_level_output и ниже происходит только в одном месте: Код /* Is this buffer available? If not, goto error */ if((DmaTxDesc->Status & ETH_DMATxDesc_OWN) != (u32)RESET) { errval = ERR_BUF; goto error; } В связи с этим вопрос: как часто посылаете? Какие размеры ETH_TX_BUF_SIZE и ETH_TXBUFNB? Цитата //вот это верно делаю ? pbuf_my= pbuf_alloc(PBUF_RAW,sizeof(struct my_header), PBUF_RAM); pbuf_my->payload = &my_hdr; Тут я не знаю, но, возможно, если вы не используете lwip, то есть смысл и не использовать pbuf_alloc, а делать пакет pbuf полностью самостоятельно.
Сообщение отредактировал cyrax0 - Mar 14 2016, 07:44
|
|
|
|
|
Mar 14 2016, 09:54
|
Участник

Группа: Участник
Сообщений: 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 полностью самостоятельно. А вот тут поподробнее можно или что почитать ?
|
|
|
|
|
Mar 14 2016, 12:16
|
Участник

Группа: Участник
Сообщений: 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, без вызова этой функции. По идее, если посылка у вас идет, вызов сделан корректно, но лучше разобраться в функции, а такие ее параметры я не изучал, так что не подскажу, верны они или нет.
|
|
|
|
|
Mar 14 2016, 13:52
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
QUOTE (Fobes @ Mar 13 2016, 16:13)  И второй вопрос, фрейм передается правильно, но vlan tag вырезается почему-то, оно где-то разрешаться должно чтоли ?
п.с. с фреймами меньшей длины такие проблемы возникают, но реже
может ли это быть связано с повреждением микросхемы физического уровня ? Телепаты в отпуске, попробую угадать. Под виндовс влан теги стрипаются драйвером до снифера
|
|
|
|
|
Mar 14 2016, 19:41
|
Участник

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

|
Цитата(cyrax0 @ Mar 14 2016, 12:16)  Попробуйте сделать такие константы: #define ETH_TXBUFNB 20 (лучше максимум, на сколько хватит места) #define ETH_TX_BUF_SIZE 820 Попробовал. ERR_BUF пропала, появилась #define ERR_USE -8 /* Address in use. */ и тот же Malformed packet в шарке... Сейчас отправляю вообще только 1 тип пакетов, на 817, даже не из прерываний а просто в главном цикле, пытаюсь понять причину не верной работы... Ради интереса выставил задержку между пакетами в 0.1с low_level_output перестал выдавать какие-либо ошибки, но шарк по прежнему периодически показывает Malformed packet... Может ли это быть неисправность физики ethernet или самого stm32f4 ? Цитата(ig_z @ Mar 14 2016, 13:52)  Телепаты в отпуске, попробую угадать. Под виндовс влан теги стрипаются драйвером до снифера Т.е. от других устройств ничего не стирается, а от моего ему не нравятся и он их обрезает ?) Причина в чем-то другом.
|
|
|
|
|
Mar 15 2016, 06:01
|
Участник

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

|
Цитата(Fobes @ Mar 14 2016, 23:41)  Попробовал. ERR_BUF пропала, появилась #define ERR_USE -8 /* Address in use. */ Эмм, такая ошибка возникает тоже в одном месте. Если ETH_TX_BUF_SIZE 820, то получается, что 817 вы назвали размер данных, а не целого пакета по логу wireshark. Если же нет, то вам надо поставить брекпоинт на это место и посмотреть, почему он происходит (по факту, похоже, что у вас пакеты делятся, а не должны). Или верните размер 1520, ошибка должна исчезнуть. Но это не относится к главному вопросу; по сути, эта и предыдущая ошибки указывают, что MAC не успевает отослать прежде чем вы пытаетесь передать следующие пакеты, что странно, потому что в моем случае данный контроллер выдает порядка 30000 пакетов (правда меньшего размера) в while(1) при числе буферов 20. Попробуйте udp-посылки с той же частотой или udp-client из куба, посмотрите как он заработает. Цитата и тот же Malformed packet в шарке... Как это выглядит? Обычно вайршарк пишет конкретную ошибку. Попробуйте отправлять один и тот же пакет, может из тех, что вы создаете, есть некорректные. Цитата Может ли это быть неисправность физики ethernet или самого stm32f4 ? Мое мнение, что это очень маловероятно.
|
|
|
|
|
Mar 15 2016, 09:48
|
Участник

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

|
Цитата(cyrax0 @ Mar 15 2016, 07:01)  Но это не относится к главному вопросу; по сути, эта и предыдущая ошибки указывают, что MAC не успевает отослать прежде чем вы пытаетесь передать следующие пакеты, что странно, потому что в моем случае данный контроллер выдает порядка 30000 пакетов (правда меньшего размера) в while(1) при числе буферов 20. Именно по этому и пишу про возможное повреждение... я сжег лапу МК большим током, и ethernet phy и stm32f4 питались от одной шины. Теоретически мог что-то повредить, именно после этого началась эта веселуха с пакетами, до этого все вроде верно работало. Цитата(cyrax0 @ Mar 15 2016, 07:01)  Как это выглядит? Обычно вайршарк пишет конкретную ошибку. Попробуйте отправлять один и тот же пакет, может из тех, что вы создаете, есть некорректные. В while(1) отправляю сейчас один и тот же пакет, без изменений. Ошибки постоянно разные.... Начиная от верных пакетов и заканчивая пакетами совершенно другой длины с другими типами и не верными контрольными суммами...
|
|
|
|
|
Mar 15 2016, 09:53
|
Участник

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

|
Цитата я сжег лапу МК большим током, и ethernet phy и stm32f4 питались от одной шины. Ну, такого я не предполагал. Имхо остается проверить стандартный пример и другой контроллер. Может, кто подскажет еще что.
|
|
|
|
|
Mar 15 2016, 16:43
|
Участник

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

|
Цитата(cyrax0 @ Mar 15 2016, 09:53)  Ну, такого я не предполагал. Имхо остается проверить стандартный пример и другой контроллер. Может, кто подскажет еще что. Новое железо заказал, жду... Не подкините примерчик для проверки, дабы время сэкономить ?
|
|
|
|
|
Mar 16 2016, 07:16
|
Участник

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

|
Цитата(cyrax0 @ Mar 16 2016, 07:04)  Ну что же вы, батенька, про куб не знаете  ? Знаю)) Но использую его только как своебразный даташит )) Не понравился мне hal)) Посмотрел архив, конкретных примеров не нашел) Может просто покажете кусок кода, отправляющий любой пакет(чем больше тем лучше) и работающий верно в бесконечном цикле, чтобы было с чем сравнить всетаки, без шанса самому наврать.
|
|
|
|
|
Mar 16 2016, 07:49
|
Участник

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

|
Плохо ищете... STM32Cube_FW_F4_V1.11.0\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_UDP_Echo_Client (вместо STM324xG_EVAL см. ваш контроллер) udp_echoclient_send, который у них сделан в коллбэке, перенесите в while(1), и получите, видимо, то, что хотите.
|
|
|
|
|
Mar 16 2016, 22:53
|
Участник

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

|
Цитата(ig_z @ Mar 14 2016, 13:52)  Телепаты в отпуске, попробую угадать. Под виндовс влан теги стрипаются драйвером до снифера Приношу свои извинения) Забыл что с других устройств снимал данные под линуксом) Вопрос с влан тегом снят. Все верно отправляется. Цитата(cyrax0 @ Mar 16 2016, 07:49)  Плохо ищете... STM32Cube_FW_F4_V1.11.0\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_UDP_Echo_Client (вместо STM324xG_EVAL см. ваш контроллер) udp_echoclient_send, который у них сделан в коллбэке, перенесите в while(1), и получите, видимо, то, что хотите. Посмотрел всетаки свой код, при отправке моих пакетов никаких ошибок не вылетает, но шарк ругается по прежнему, буду надеяться что это неисправность железа всетаки)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|