1

如何Ethernet II在 Linux 中创建帧头?802.3 帧头可以使用eth_header()给出skbuffer源和目标 MAC 和长度来创建。相同的函数是否也可以用于Ethernet II帧格式,我们使用类型字段而不是长度?

4

2 回答 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.cnet/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 回答