2012-10-31 66 views
2

我需要構建一個vlan頭文件。 我有代碼構建eh頭(struct ether_header),它工作正常。在c中構建vlan頭文件

/* Ethernet header */ 
memcpy(eh->ether_shost,src_mac_.data(), 6); 
memcpy(eh->ether_dhost,socketAddress.sll_addr , 6); 

/* Ethertype field */ 
eh->ether_type = htons(ETH_P_IP); 

我沒有找到vlan_eth_header結構,所以我創造我自己和填充像這樣:

struct vlan_ethhdr { 
    u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */ 
    u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */ 
    u_int16_t   h_vlan_proto; 
    u_int16_t   h_vlan_TCI; 
    u_int16_t ether_type; 
}; 

    /* Ethernet header */ 
    memcpy(eh->ether_shost,src_mac_.data(), 6); 
    memcpy(eh->ether_dhost,socketAddress.sll_addr , 6); 
     eh->h_vlan_proto = htons(0x8100); 
     eh->h_vlan_TCI = htons(VLAN_ID); 
    /* Ethertype field */ 
    eh->ether_type = htons(ETH_P_IP); 

看來,我這樣做是錯誤的。 看來,Wireshak甚至沒有認出這個數據包(舊的代碼發送了tcp數據包並且正確地發送它們)。 有什麼建議嗎?

+0

將十六進制打印出來(或從wireshark中複製)直至包括IP標頭應該在的位置,應該可以很容易地看到錯誤的位置。 – nos

回答

1

我的代碼構造VLAN是正確的。它dosnt首先爲我工作,因爲我忘了改變數據包的大小現在更大。 請注意,TCI不僅包含VID其包含的優先級和CFI。在我的情況下,他們都是零,所以我不需要爲TCI使用掩碼和填充。

0

你確定你的結構是正確包裝?編譯器默認添加一些填充。它可以很容易地禁用。

例如,對於GCC:

#pragma pack(push) 
#pragma pack(0) 
struct vlan_ethhdr { 
    u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */ 
    u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */ 
    u_int16_t   h_vlan_proto; 
    u_int16_t   h_vlan_TCI; 
    u_int16_t ether_type; 
}; 
#pragma pack(pop) 
+0

我基於來自linux的struct eth_header。現在我看到他們在那裏有區別} __ attribute__((__packed__));我沒有複製它。它可以是原因嗎? –

+0

你可以看到,在下面的鏈接中,它的defiend沒有包http://lxr.free-electrons.com/source/include/linux/if_vlan.h#L52有或沒有打包它的相同sizeof(18 - 附加4字節) –

+0

@ user1495181如果不確定它的確切大小,你可以在你的結構上做一個sizeof()。 – user1500049

1

http://wiki.wireshark.org/VLAN

  • DstMAC [6個字節]
  • SrcMAC [6個字節]
  • 類型[2個字節]
    • 0x8100
  • VLANTag [4個字節]
    • 優先級[0..2比特]
    • CFI [3比特]
    • ID [4..15比特]
    • 以太網類型[16 ..31]
      • 爲0x0800(IP)

我的猜測是你沒有正確設置VLAN_ID。

首先,您應該通過在byte []緩衝區中創建一些測試數據包來避免任何結構填充問題,這樣可以確保您擁有一切正確。然後你可以自信地調試你的結構和字節順序,因爲你知道正確的值應該是什麼。

+0

你有什麼猜測我應該如何設置VLAN ID? –

+0

我看到了這個參考http://osdir.com/ml/linux.network.bridge.ebtables.devel/2006-07/msg00000.html,但不知道它是否正確。我會嘗試與你建議的字節。 –

0

802.1Q 4個字節的VLAN標籤通常被認爲是0x8100+pri+cfi+vlan的形式。
描述vlan標記爲pri+cfi+vlan+etype(不包括8100,但包括數據有效載荷的etype)的wireshark方式有點獨特。
但是,整個數據包的格式和長度都是正確的。