2

VLAN ヘッダーを作成する必要があります。ehヘッダー(struct ether_header)を構築するコードがあり、正常に動作します。

/* 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 パケットを送信し、それらを正しく送信しました)。何かアドバイス?

4

4 に答える 4

1

VLAN を構築するための私のコードは正しいです。そもそも、パケットのサイズを大きくするのを忘れていたので、うまくいきませんでした。TCI は VID に含まれるプライオリティと CFI だけではないことに注意してください。私の場合、両方ともゼロなので、TCI にマスクとパディングを使用する必要はありません。

于 2012-11-01T08:51:58.900 に答える
1

http://wiki.wireshark.org/VLAN

  • DstMAC [6 バイト]
  • SrcMAC [6 バイト]
  • タイプ [2 バイト]
    • 0x8100
  • VLANTag [4 バイト]
    • 優先度 [0..2 ビット]
      • 0
    • CFI [3ビット]
      • 0
    • ID [4..15 ビット]
    • イーサネット タイプ [16..31]
      • 0x0800 (IP)

私の推測では、VLAN_ID を正しく設定していません。

最初に、すべてが正しいことを確認できるように、byte[] バッファーにいくつかのテスト パケットを作成するだけで、構造パディングの問題を回避する必要があります。そうすれば、構造と htons のバイト順を自信を持ってデバッグできます。これは、正しい値がどうあるべきかを知っているためです。

于 2012-10-31T19:52:24.580 に答える
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)
于 2012-10-31T19:27:18.947 に答える