2011-12-30 32 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); 

你可以改變分配的字節數量和/或根據您要添加到該數據包是什麼推動。