]> 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 14:19:23 +0000 (16:19 +0200)
This commits add isc__nm_socket_dontfrag() helper functions.

(cherry picked from commit d685bbc82240b8f1c20bec748a5725844221c61d)

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 128fdafd5cb335d37bec64299f6cff7cdba6d4cd..b7debda70ac774ffc05fd71cdf40c0a7da3fdad2 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 4fa7aa8a72e248d491ec4f825dd573649f5f259d..b224d72a3c0599d2479221582190c020a3875a3e 100644 (file)
@@ -66,6 +66,8 @@ typedef uint32_t socklen_t;
 
 #undef MSG_TRUNC
 
+typedef uint16_t sa_family_t;
+
 /*
  * Define if the platform has <sys/un.h>.
  */