gretap経由でrawソケットを使用してデータを送信する

gretap経由でrawソケットを使用してデータを送信する

プロトコルタイプISO(0x00fe)を使用してgretapインターフェイスにIS-ISパケットを書き込もうとしています。この場合、イーサネットヘッダがないため、rawソケットを使用します。 gretapは常にGREヘッダーのプロトコルタイプとして0x6558をチェックします。受信者がGREヘッダの直後に(つまり、最初のパケットなしで)IS-ISパケットを見ることを期待するようにgretapに他のプロトコルタイプ(0x00feなど)を使用させる方法はありますか?イーサネットヘッダですか?)?

フォローアップ:

プロトコルタイプがハードコーディングされていると思います(例:カーネルのip_gre.cから)。

 761 static netdev_tx_t gre_tap_xmit(struct sk_buff *skb,
 762         struct net_device *dev)
 763 {
...
 776
 777   __gre_xmit(skb, dev, &tunnel->parms.iph, htons(ETH_P_TEB));
 778   return NETDEV_TX_OK;

ETH_P_TEBシンボルはトランスペアレントイーサネットブリッジタイプ(0x6558)なので、この値を設定するオプションはありません。これは、生のソケットを使用している場合は、GREで別のラッパーを作成する必要があるため、残念です。カーネルモジュールを修正してみましょう。

ベストアンサー1

gretapの代わりにIP greインターフェイスとrawソケットを使って欲しいものを達成できるようです。この場合、sendto()呼び出しに渡されたstruct sockaddr_llのsll_protocolフィールドを使用してプロトコルタイプを設定し、rawソケットを使用してカプセル化を制御できます。

おすすめ記事