我正在实现DPLPMTUDerrno = EMSGSIZE ,当我发送的 UDP 数据包长于本地接口的 MTU 时,我想阻止 Linux 内核返回 -1 。我想避免在发送多个数据报时(特别是使用sendmmsg(2))时处理错误处理的痛苦,每个数据报可能属于不同的连接。我宁愿让内核丢弃数据包并让应用程序 DPLPMTUD 逻辑计算出 MTU。
ip(7)有这样说:
It is possible to implement RFC 4821 MTU probing with SOCK_DGRAM\n or SOCK_RAW sockets by setting a value of IP_PMTUDISC_PROBE\n (available since Linux 2.6.22). This is also particularly use\xe2\x80\x90\n ful for diagnostic tools such as tracepath(8) that wish to de\xe2\x80\x90\n liberately send probe packets larger than the observed Path MTU.\nRun Code Online (Sandbox Code Playgroud)\n然而设置此选项并不会产生预期的效果。下面是说明问题的代码:
\n It is possible to …Run Code Online (Sandbox Code Playgroud) 我在编译 BoringSSL 时发现 gcc 和 clang 之间的行为差异,并且能够将其缩减为以下测试用例来说明:
\ntypedef char *OPENSSL_STRING;\n#if USE_TYPEDEF\n#define constptr const OPENSSL_STRING\n#else\n#define constptr const char *\n#endif\n\nint\nfoo (const void **ap)\n{\n constptr a = (constptr) *ap;\n return a != 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n我测试了四种场景,如下:
\nsh$ g++ -c t2.cc -Wignored-qualifiers -DUSE_TYPEDEF\nt2.cc: In function \xe2\x80\x98int foo(const void**)\xe2\x80\x99:\nt2.cc:11:30: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]\n 11 | constptr a = (constptr) *ap;\n | ^~\nsh$ g++ -c t2.cc -Wignored-qualifiers \nsh$ clang++ -c t2.cc -Wignored-qualifiers -DUSE_TYPEDEF\nsh$ clang++ -c t2.cc -Wignored-qualifiers \nsh$ \nRun Code Online (Sandbox Code Playgroud)\n …