如何正确格式化原始以太网帧?

时间:2014-02-25 14:04:19

标签: c ethernet

我试图通过直接拨打网络驱动程序在两个网络设备之间发送原始以太网帧。我在OSE工作,所以我将跳过这些调用的样子。我已成功发送和接收单元之间的帧,但对于某些有效负载,系统崩溃。

我正在尝试发送字符串,但问题是,当发送某些这些字符串时,整个系统崩溃,我必须重新启动。

下面的代码显示了框架的构造方式:

#define ETH_LEN 6
int sendBufLen = 1400;

/*Ethernet header*/
unsigned char dst_mac[6] = {0x00, 0x80, 0x11, 0x11, 0x11, 0x11};
unsigned char src_mac[6] = {0x00, 0x80, 0x22, 0x22, 0x22, 0x22};
unsigned char ether_type[2] = {0x08, 0x00}; //Ipv4 - does not really matter for this purpose

//1//char msg[] = "Nice med en .,stor delay och ett stort meddelande osv etc hejhopp mera text yaay012345678";
//2//char msg[] = "Lorem ipsum dolor sit amet consectetur adipiscing elitSed porta libero vitae viveruoopi";
//3//char msg[] = "Loce med en .,stor delay och ett stort meddelande osv etc hejhopp mera text yaay012345678";
//4//char msg[] = "Lorem med en .,stor delay och ett stort meddelande osv etc hejhopp mera text yaay012345678";
char msg[] = "Lorem ipsum dolor sit amet consectetur adipiscing elitSed porta libehejhopp mera text yaay012345678"; //5//

memset(sendbuf, 0, sendBufLen);
memcpy(sendbuf, dst_mac, ETH_LEN);            //Fill dst MAC
memcpy(sendbuf + ETH_LEN, src_mac, ETH_LEN);  //Fill src MAC
memcpy(sendbuf + 2 * ETH_LEN, ether_type, 2); //Fill eth type/length

memcpy(sendbuf + (2+ 2*ETH_LEN), msg, strlen(msg)); //Fill payload

//BIOScalls to the driver to send the buffer  OSE-specific

序言和CRC,司机照顾,以便我可以跳过。

现在,只能发送上面的一些消息,例如现在处于活动状态的消息5会使卡崩溃。但是消息1,3和4没有问题。消息2也会使卡崩溃。

这让我相信以太网框架没有正确格式化?但是我看到的所有例子都只填充了一个char缓冲区:

  • 6字节dst MAC
  • 6字节src MAC
  • 2字节类型/长度MAC
  • x字节有效负载

在src MAC字段之后有4字节的字段IEEE 802.1Q(可选)。据我所知,驱动程序只假设如果字段以0x8100开头,则设置此字段?该字段不相关,因为它适用于VLAN。这是否正确理解我可以忽略这个字段?

然而,现在到了真正奇怪的事情。如果我在MAC-src字段之后设置前4个字节,即设置为 0 。我可以发送所有这些消息!这只是一个巧合,还是我想念的IEEE 802.1Q领域还有什么?

我认为所有这一切都很奇怪,系统崩溃了一些消息。即使框架没有正确格式化,驱动程序也不应该忘记该消息吗?

总结我的问题:

  • 如何构建以太网帧?
  • 我可以忽略IEEE 802.1Q字段吗?
  • 当某些消息被送入网络驱动程序以进行发送(写入)时,为什么我的系统会崩溃?

0 个答案:

没有答案