]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add helper function to enable DF (don't fragment) flag on UDP sockets
authorOndřej Surý <ondrej@isc.org>
Mon, 5 Oct 2020 08:51:40 +0000 (10:51 +0200)
committerOndřej Surý <ondrej@sury.org>
Mon, 5 Oct 2020 12:55:20 +0000 (14:55 +0200)
This commits add isc__nm_socket_dontfrag() helper functions.

lib/isc/netmgr/netmgr-int.h
lib/isc/netmgr/netmgr.c
lib/isc/win32/include/isc/platform.h.in

index c565825385c56239588c0fd68ca1ad72986fa3d1..d6c4032dc635f12300a6fd79747039c5261e8302 100644 (file)
@@ -850,3 +850,9 @@ isc__nm_socket_incoming_cpu(uv_os_fd_t fd);
 /*%<
  * Set the SO_INCOMING_CPU socket option on the fd if available
  */
+
+isc_result_t
+isc__nm_socket_dontfrag(uv_os_fd_t fd, sa_family_t sa_family);
+/*%<
+ * Set the SO_IP_DONTFRAG (or equivalent) socket option of the fd if available
+ */
index 85ce46c4f958b52206f22d6eb17ad0eb19cf08d9..e39c882408e521b32d1ec7b2cb66b2ed84db118d 100644 (file)
@@ -1687,6 +1687,54 @@ isc__nm_socket_incoming_cpu(uv_os_fd_t fd) {
        return (ISC_R_NOTIMPLEMENTED);
 }
 
+isc_result_t
+isc__nm_socket_dontfrag(uv_os_fd_t fd, sa_family_t sa_family) {
+       /*
+        * Set the Don't Fragment flag on IP packets
+        */
+       if (sa_family == AF_INET6) {
+#if defined(IPV6_DONTFRAG)
+               if (setsockopt_on(fd, IPPROTO_IPV6, IPV6_DONTFRAG) == -1) {
+                       return (ISC_R_FAILURE);
+               } else {
+                       return (ISC_R_SUCCESS);
+               }
+#elif defined(IPV6_MTU_DISCOVER)
+               if (setsockopt(fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER,
+                              &(int){ IP_PMTUDISC_DO }, sizeof(int)) == -1)
+               {
+                       return (ISC_R_FAILURE);
+               } else {
+                       return (ISC_R_SUCCESS);
+               }
+#else
+               UNUSED(fd);
+#endif
+       } else if (sa_family == AF_INET) {
+#if defined(IP_DONTFRAG)
+               if (setsockopt_on(fd, IPPROTO_IP, IP_DONTFRAG) == -1) {
+                       return (ISC_R_FAILURE);
+               } else {
+                       return (ISC_R_SUCCESS);
+               }
+#elif defined(IP_MTU_DISCOVER)
+               if (setsockopt(fd, IPPROTO_IP, IP_MTU_DISCOVER,
+                              &(int){ IP_PMTUDISC_DO }, sizeof(int)) == -1)
+               {
+                       return (ISC_R_FAILURE);
+               } else {
+                       return (ISC_R_SUCCESS);
+               }
+#else
+               UNUSED(fd);
+#endif
+       } else {
+               return (ISC_R_FAMILYNOSUPPORT);
+       }
+
+       return (ISC_R_NOTIMPLEMENTED);
+}
+
 #ifdef NETMGR_TRACE
 /*
  * Dump all active sockets in netmgr. We output to stderr
index d51197ff2a9db2fa98f9e5a16e8753c0957b5acd..a8b645007c85279c4e70429e9d115b55b4d6f24a 100644 (file)
@@ -56,6 +56,8 @@ typedef uint32_t socklen_t;
 
 #undef MSG_TRUNC
 
+typedef uint16_t sa_family_t;
+
 /*
  * Set up a macro for importing and exporting from the DLL
  */