Всем доброго времени суток. Уже совсем измучился... Нужно отправить чисто 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