我需要構建一個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數據包並且正確地發送它們)。 有什麼建議嗎?
將十六進制打印出來(或從wireshark中複製)直至包括IP標頭應該在的位置,應該可以很容易地看到錯誤的位置。 – nos