创建以太网II帧头?

时间:2011-12-30 08:53:04

标签: c linux networking kernel raw-ethernet

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

2 个答案:

答案 0 :(得分:2)

(当前)内核源以下列方式定义相关方法:

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帧头。

答案 1 :(得分: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);

您可以根据要添加到数据包的内容来更改分配和/或推送的字节数。