我有一个在RAW套接字上使用sendmsg()
的应用程序。我的应用程序使用IP_HDRINCL
套接字选项,因为它设置了IP标头。
我将出口数据包中的DF
位设置为1(不要分段)。
以下是我要做的事情......当内核尝试发送数据包时,它正在查找目标的路由条目,并从条目中获取用于该主机的MTU
(有时因PMTU
发现而降低。)
当我尝试发送更大的数据包时,sendmsg()
调用失败,错误代码为"message too big"
。
我现在想要的是在应用程序中弄清楚MTU
应该是什么。我一直在尝试使用辅助数据。我在套接字选项中设置IP_RECVERR
,然后在设置了recvmsg()
标志的同一发送文件描述符上调用MSG_ERRQUEUE
,但该调用失败。
这是正确的路径吗?我在手册页中读到辅助数据行为因不同套接字类型而异。这适用于RAW吗?
或者是否有更好的内核API从路由条目中获取正确的MTU
?