如何Ethernet II
在 Linux 中创建帧头?802.3 帧头可以使用eth_header()
给出skbuffer
源和目标 MAC 和长度来创建。相同的函数是否也可以用于Ethernet II
帧格式,我们使用类型字段而不是长度?
问问题
2401 次
2 回答
1
(当前)内核源代码以下列方式定义相关方法:
int eth_header(struct sk_buff *skb, struct net_device *dev,
unsigned short type,
const void *daddr, const void *saddr, unsigned len);
所以我们确实有一个type
领域。到目前为止,一切都很好。
让我们看看方法的实现,是否以及如何考虑的值type
。该方法开始如下:
{
struct ethhdr *eth = ...
if (type != ETH_P_802_3 && type != ETH_P_802_2)
eth->h_proto = htons(type);
else
eth->h_proto = htons(len);
...
正如我们所看到的,对于除 802.2/3 之外的所有类型,type
(传递给函数)的值用于初始化帧头,这就是我们想要的以太网 II 帧头。
问题的结论和答案:是的,可以eth_header()
用来创建以太网 II 帧头。
于 2011-12-30T19:39:50.473 回答
0
参照。net/ipv6/netfilter/ip6t_REJECT.c
和net/ethernet/eth.c
.:
nskb = skb_alloc(...);
...
struct ethhdr *eh = skb_push(nskb, sizeof(struct ethhdr));
eh->h_proto = htons(ETH_P_IPV6);
您可以根据要添加到数据包的内容更改分配和/或推送的字节数。
于 2012-01-03T19:22:55.257 回答