diff --git a/src/common.c b/src/common.c index abd847b..a2d23f8 100644 --- a/src/common.c +++ b/src/common.c @@ -130,6 +130,10 @@ open_dns(int localport, in_addr_t listen_ip) setsockopt(fd, IPPROTO_IP, DSTADDR_SOCKOPT, (const void*) &flag, sizeof(flag)); #endif + /* Set dont-fragment ip header flag */ + flag = DONT_FRAG_VALUE; + setsockopt(fd, IPPROTO_IP, IP_OPT_DONT_FRAG, (const void*) &flag, sizeof(flag)); + if(bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) err(1, "bind"); diff --git a/src/common.h b/src/common.h index 5daef40..a6d1137 100644 --- a/src/common.h +++ b/src/common.h @@ -19,7 +19,6 @@ #ifdef WINDOWS32 #include "windows.h" -#include #else #include #include @@ -45,6 +44,20 @@ # define dstaddr(x) (&(((struct in_pktinfo *)(CMSG_DATA(x)))->ipi_addr)) #endif +#if defined IP_MTUDISC +# define IP_OPT_DONT_FRAG IP_MTUDISC +# define DONT_FRAG_VALUE 1 +#elif defined IP_MTU_DISCOVER +# define IP_OPT_DONT_FRAG IP_MTU_DISCOVER +# define DONT_FRAG_VALUE IP_PMTUDISC_DO +#elif defined IP_DONTFRAG +# define IP_OPT_DONT_FRAG IP_DONTFRAG +# define DONT_FRAG_VALUE 1 +#elif defined IP_DONTFRAGMENT +# define IP_OPT_DONT_FRAG IP_DONTFRAGMENT +# define DONT_FRAG_VALUE 1 +#endif + struct packet { int len; /* Total packet length */