IPv4 と v6 の両方の PMTUD アプリを作成しています。私はUbuntu 12.04でこれを行っていますが、可能な限りOSに依存しないようにしたいと考えており、そこで問題に遭遇しました。
IPv6 パケットはデフォルトで送信者によって断片化されますが、この動作をオフにする方法がわかりません。IPV6_MTU_DISCOVER や IPV6_DONTFRAG などのソケット オプションをいくつか見つけましたが、これらは linux/in6.h の下で見つかりました。これは、netinet ヘッダー ファミリを使用していて、どちらも netinet/in.h の下にないため、役に立ちません。ただし、IPV6_MTU_DISCOVER はありますのでこれにて。何か不足していますか?
編集:少し明確にさせてください。ソケット (AF_INET6、SOCK_RAW、IPPROTO_ICMPV6) を使用して、サイズが大きすぎるという応答を受け取るようなサイズの ICMPv6 パケットを送信し、その応答からパス MTU を取得します。ただし、パス全体で MTU を真に取得するには、発信デバイスの MTU も考慮に入れる必要があります。
私は miredo を使用して IPv6 をトンネリングしていますが、これには 1280 などの最小サイズの MTU が設定されています。1280 より大きいパケットを送信すると、そのパケットが断片化されます (この動作は Wireshark で観察されました)が、拒否するソケットが必要です。パケットをフラグメント化するのではなく、送信して通知してください。