2016-07-11 16 views
0

RAWソケットには小さな問題があります。私はそれらを修正するためにネットワークでパケットをキャプチャする必要があります。このために、タイムスタンプのような特別なデータを追加する必要があります。すべて正常に動作しますが、私はMTU(Linux)に問題があります。RAWソケットはMTUを無視する必要があります

上位層のアプリケーションの一部がMTUに近いパケットを生成する場合は、データを追加できません。だから私はシステムのMTUを小さくすることに決めました。だから、私はより小さなパケットを取得し、私のデータを広告することは可能です。しかし、RAW-Socketでパケットを送信しようとすると、動作しません。

IP_MTU_DISCOVERオプションが役立つことがわかった(google、古いStackoverflowスレッドとLinuxのマンページで)。しかしsetsockoptと一緒に使うと何も変わりません。

if ((s = socket(AF_PACKET, SOCK_RAW, ETH_P_ALL)) < 0) { 
    printf("Error: could not open socket\n"); 
    return -1; 
} 

char socket_mtu = IP_PMTUDISC_DONT; 
setsockopt(s,IPPROTO_IP,IP_MTU_DISCOVER,socket_mtu, 1); 

多分それは重要です。 MTUのダウンサイジングは、自分自身のデータを追加すると、結果パケットが1500 + ETH-Headerより大きくならないために行われました。私の問題は、Raw-SocketsがLinuxシステムのローカルMTUを無視するようにすることです。

  1. IP_MTU_DISCOVERは、MTUに設定された値を無視する正しい方法ですか。
  2. 私のRAW-SOCKETでは本当にIS IP_MTU_DISCOVERを使用できますか?
  3. レイヤー3以上のプロトコルのセグメントサイズを減らす方法はありますか?

大きすぎるとsendto()はEMSGSIZE(= 90)を返します。だから私は次のテストを行った。

int k = sendto(s, frame.buffer, frame_len, 0, 
      (struct sockaddr*)&saddrll, sizeof(saddrll)); 
    printf("K:%i\n", k); 

sendto()を呼び出すと、 "k"には "-1"が含まれます。しかし、それがパケットサイズに依存する場合、それは "90"ではないでしょうか?

パケットのサイズを設定すると、MTUを小さくしたいのですが、うまくいきます。少し奇妙です。

すべてのヘルプは

敬具、 アンドレアス

答えて

0

[OK]を素敵な:-)だろう。 CプログラムからMTUを変更するソリューションを見つけました。それが動作する最初の瞬間のために

set MTU in C programmatically

buffer.ifr_mtu = 1500; 
    if(!ioctl(s, SIOCSIFMTU, &buffer)) { 
     printf("MTU changed\n"); 
    } 

。しかし、それはほんの一例です。本当にきれいではありません。問題は、アプリケーションがMTUのサイズを変更した瞬間にパケットを送信している場合、そのパケットが大きすぎる可能性があるということです。どんな良いアイデアですか?

種類: アンドレアス

関連する問題