2011-12-30 77 views
1

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

回答

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

+0

感谢您的回复。举例来说,我有一个类型字段为8100(vlan tagging),所以当我调用这个函数时,我应该通过ETH_P_802_2来输入字段,并且将8100输入到len字段。那是否正确? – user1023527 2012-01-02 06:28:36

+0

@ user1023527:Actullay这可以工作(至少使用当前源) - 但我建议通过'ETH_P_8021Q'(通过'/ usr/src/linux/include/linux/if_ether.h') 'type'并通过'len'传递任何东西('0')。 – alk 2012-01-02 07:54:27

+0

@ user1023527:*“VLAN tagging *”为802.1Q('ETH_P_8021Q'),'ETH_P_8021Q'又定义为'#define'为'8100'。 – alk 2012-01-04 07:54:12

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); 

你可以改变分配的字节数量和/或根据您要添加到该数据包是什么推动。