diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+# CHANGELOG for network
+
+## Version 3.2.8.0
+
+* sockopt: add IP_DONTFRAG/IP_MTU_DISCOVER option.
+  [#603](https://github.com/haskell/network/pull/603)
+* Add new SocketOption KeepInit.
+  [#600](https://github.com/haskell/network/pull/600)
+* Remove withSocketsDo from examples.
+  [#596](https://github.com/haskell/network/pull/596)
+
 ## Version 3.2.7.0
 
 * Using nested `bracket` for `gracefulClose`.
diff --git a/Network/Socket.hs b/Network/Socket.hs
--- a/Network/Socket.hs
+++ b/Network/Socket.hs
@@ -48,7 +48,7 @@
 -- >
 -- > -- from the "network-run" package.
 -- > runTCPServer :: Maybe HostName -> ServiceName -> (Socket -> IO a) -> IO a
--- > runTCPServer mhost port server = withSocketsDo $ do
+-- > runTCPServer mhost port server = do
 -- >     addr <- resolve
 -- >     E.bracket (open addr) close loop
 -- >   where
@@ -91,7 +91,7 @@
 -- >
 -- > -- from the "network-run" package.
 -- > runTCPClient :: HostName -> ServiceName -> (Socket -> IO a) -> IO a
--- > runTCPClient host port client = withSocketsDo $ do
+-- > runTCPClient host port client = do
 -- >     addr <- resolve
 -- >     E.bracket (open addr) close client
 -- >   where
@@ -108,9 +108,6 @@
 -- threads vs a single 'Socket': one thread reads data from a 'Socket'
 -- only and the other thread writes data to the 'Socket' only.
 module Network.Socket (
-    -- * Initialisation
-    withSocketsDo,
-
     -- * Address information
     getAddrInfo,
 
@@ -152,6 +149,7 @@
         SendBuffer,
         RecvBuffer,
         KeepAlive,
+        KeepInit,
         OOBInline,
         TimeToLive,
         MaxSegment,
@@ -169,6 +167,7 @@
         RecvIPv4TTL,
         RecvIPv4TOS,
         RecvIPv4PktInfo,
+        DontFragment,
         RecvIPv6HopLimit,
         RecvIPv6TClass,
         RecvIPv6PktInfo
@@ -177,11 +176,13 @@
     whenSupported,
     getSocketOption,
     setSocketOption,
+
     -- ** General socket options
     StructLinger (..),
     SocketTimeout (..),
     getSockOpt,
     setSockOpt,
+
     -- ** Integrated socket options
     SockOptValue (..),
     setSockOptValue,
@@ -394,6 +395,9 @@
     waitAndCancelReadSocketSTM,
     waitWriteSocketSTM,
     waitAndCancelWriteSocketSTM,
+
+    -- * Deprecated
+    withSocketsDo,
 ) where
 
 import Network.Socket.Buffer hiding (
diff --git a/Network/Socket/Options.hsc b/Network/Socket/Options.hsc
--- a/Network/Socket/Options.hsc
+++ b/Network/Socket/Options.hsc
@@ -12,11 +12,11 @@
     SocketOption(SockOpt
                 ,UnsupportedSocketOption
                 ,AcceptConn,Debug,ReuseAddr,SoDomain,Type,SoProtocol,SoError
-                ,DontRoute,Broadcast,SendBuffer,RecvBuffer,KeepAlive,OOBInline
-                ,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort
+                ,DontRoute,Broadcast,SendBuffer,RecvBuffer,KeepAlive,KeepInit
+                ,OOBInline,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort
                 ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut
                 ,UseLoopBack,UserTimeout,IPv6Only
-                ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo
+                ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,DontFragment
                 ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo
                 ,CustomSockOpt)
   , isSupportedSocketOption
@@ -77,6 +77,7 @@
     , (SendBuffer, "SendBuffer")
     , (RecvBuffer, "RecvBuffer")
     , (KeepAlive, "KeepAlive")
+    , (KeepInit, "KeepInit")
     , (OOBInline, "OOBInline")
     , (Linger, "Linger")
     , (ReusePort, "ReusePort")
@@ -93,6 +94,7 @@
     , (RecvIPv4TTL, "RecvIPv4TTL")
     , (RecvIPv4TOS, "RecvIPv4TOS")
     , (RecvIPv4PktInfo, "RecvIPv4PktInfo")
+    , (DontFragment, "DontFragment")
     , (IPv6Only, "IPv6Only")
     , (RecvIPv6HopLimit, "RecvIPv6HopLimit")
     , (RecvIPv6TClass, "RecvIPv6TClass")
@@ -220,6 +222,15 @@
 #else
 pattern KeepAlive      = SockOpt (-1) (-1)
 #endif
+-- | TCP_KEEPINIT
+pattern KeepInit :: SocketOption
+#ifdef TCP_KEEPINIT
+pattern KeepInit       = SockOpt (#const IPPROTO_TCP) (#const TCP_KEEPINIT)
+#elif defined(TCP_CONNECTIONTIMEOUT)
+pattern KeepInit       = SockOpt (#const IPPROTO_TCP) (#const TCP_CONNECTIONTIMEOUT)
+#else
+pattern KeepInit       = SockOpt (-1) (-1)
+#endif
 -- | SO_OOBINLINE
 pattern OOBInline :: SocketOption
 #ifdef SO_OOBINLINE
@@ -341,6 +352,15 @@
 pattern RecvIPv4PktInfo  = SockOpt (#const IPPROTO_IP) (#const IP_PKTINFO)
 #else
 pattern RecvIPv4PktInfo  = SockOpt (-1) (-1)
+#endif
+-- | IP_DONTFRAG
+pattern DontFragment :: SocketOption
+#if HAVE_DECL_IP_DONTFRAG
+pattern DontFragment   = SockOpt (#const IPPROTO_IP) (#const IP_DONTFRAG)
+#elif HAVE_DECL_IP_MTU_DISCOVER
+pattern DontFragment   = SockOpt (#const IPPROTO_IP) (#const IP_MTU_DISCOVER)
+#else
+pattern DontFragment   = SockOpt (-1) (-1)
 #endif
 #endif // HAVE_DECL_IPPROTO_IP
 
diff --git a/Network/Socket/Shutdown.hs b/Network/Socket/Shutdown.hs
--- a/Network/Socket/Shutdown.hs
+++ b/Network/Socket/Shutdown.hs
@@ -74,10 +74,10 @@
 recvEOF s tmout0 buf = do
     mevmgr <- Ev.getSystemEventManager
     case mevmgr of
-      Nothing -> recvEOFloop s tmout0 buf
+      Nothing -> recvEOFtimeout s tmout0 buf
       Just _ -> recvEOFevent s tmout0 buf
 #else
-recvEOF = recvEOFloop
+recvEOF = recvEOFtimeout
 #endif
 
 -- Don't use 4092 here. The GHC runtime takes the global lock
@@ -85,8 +85,8 @@
 bufSize :: Int
 bufSize = 1024
 
-recvEOFloop :: Socket -> Int -> Ptr Word8 -> IO ()
-recvEOFloop s tmout0 buf = void $ timeout tmout0 $ recvBuf s buf bufSize
+recvEOFtimeout :: Socket -> Int -> Ptr Word8 -> IO ()
+recvEOFtimeout s tmout0 buf = void $ timeout tmout0 $ recvBuf s buf bufSize
 
 #if !defined(mingw32_HOST_OS)
 data Wait = MoreData | TimeoutTripped
diff --git a/Network/Socket/Syscall.hs b/Network/Socket/Syscall.hs
--- a/Network/Socket/Syscall.hs
+++ b/Network/Socket/Syscall.hs
@@ -83,6 +83,7 @@
     -- This socket is not managed by the IO manager yet.
     -- So, we don't have to call "close" which uses "closeFdWith".
     unsetIPv6Only s
+    setDontFragment s
     return s
   where
     create = do
@@ -119,6 +120,15 @@
 #else
     unsetIPv6Only _ = return ()
 #endif
+
+    setDontFragment s = when (family == AF_INET) $
+#if HAVE_DECL_IP_DONTFRAG || HAVE_DECL_IP_MTU_DISCOVER
+      setSocketOption s DontFragment 1
+#else
+      -- do nothing
+      return ()
+#endif
+
 
 -----------------------------------------------------------------------------
 -- Binding a socket
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.72 for Haskell network package 3.2.5.0.
+# Generated by GNU Autoconf 2.72 for Haskell network package 3.2.7.0.
 #
 # Report bugs to <libraries@haskell.org>.
 #
@@ -603,8 +603,8 @@
 # Identity of this package.
 PACKAGE_NAME='Haskell network package'
 PACKAGE_TARNAME='network'
-PACKAGE_VERSION='3.2.5.0'
-PACKAGE_STRING='Haskell network package 3.2.5.0'
+PACKAGE_VERSION='3.2.7.0'
+PACKAGE_STRING='Haskell network package 3.2.7.0'
 PACKAGE_BUGREPORT='libraries@haskell.org'
 PACKAGE_URL=''
 
@@ -1258,7 +1258,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-'configure' configures Haskell network package 3.2.5.0 to adapt to many kinds of systems.
+'configure' configures Haskell network package 3.2.7.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1324,7 +1324,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Haskell network package 3.2.5.0:";;
+     short | recursive ) echo "Configuration of Haskell network package 3.2.7.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1409,7 +1409,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Haskell network package configure 3.2.5.0
+Haskell network package configure 3.2.7.0
 generated by GNU Autoconf 2.72
 
 Copyright (C) 2023 Free Software Foundation, Inc.
@@ -1809,7 +1809,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Haskell network package $as_me 3.2.5.0, which was
+It was created by Haskell network package $as_me 3.2.7.0, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4165,7 +4165,27 @@
 fi
 printf "%s\n" "#define HAVE_DECL_SO_PEERCRED $ac_have_decl" >>confdefs.h
 
+ac_fn_check_decl "$LINENO" "IP_DONTFRAG" "ac_cv_have_decl_IP_DONTFRAG" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_IP_DONTFRAG" = xyes
+then :
+  ac_have_decl=1
+else case e in #(
+  e) ac_have_decl=0 ;;
+esac
+fi
+printf "%s\n" "#define HAVE_DECL_IP_DONTFRAG $ac_have_decl" >>confdefs.h
 
+ac_fn_check_decl "$LINENO" "IP_MTU_DISCOVER" "ac_cv_have_decl_IP_MTU_DISCOVER" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_IP_MTU_DISCOVER" = xyes
+then :
+  ac_have_decl=1
+else case e in #(
+  e) ac_have_decl=0 ;;
+esac
+fi
+printf "%s\n" "#define HAVE_DECL_IP_MTU_DISCOVER $ac_have_decl" >>confdefs.h
+
+
 ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_control" "ac_cv_member_struct_msghdr_msg_control" "$ac_includes_default"
 if test "x$ac_cv_member_struct_msghdr_msg_control" = xyes
 then :
@@ -4699,7 +4719,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Haskell network package $as_me 3.2.5.0, which was
+This file was extended by Haskell network package $as_me 3.2.7.0, which was
 generated by GNU Autoconf 2.72.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4754,7 +4774,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-Haskell network package config.status 3.2.5.0
+Haskell network package config.status 3.2.7.0
 configured by $0, generated by GNU Autoconf 2.72,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -86,6 +86,8 @@
 AC_CHECK_DECLS([IPV6_V6ONLY])
 AC_CHECK_DECLS([IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6])
 AC_CHECK_DECLS([SO_PEERCRED])
+AC_CHECK_DECLS([IP_DONTFRAG])
+AC_CHECK_DECLS([IP_MTU_DISCOVER])
 
 AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights])
 AC_CHECK_MEMBERS([struct sockaddr.sa_len])
diff --git a/include/HsNetworkConfig.h.in b/include/HsNetworkConfig.h.in
--- a/include/HsNetworkConfig.h.in
+++ b/include/HsNetworkConfig.h.in
@@ -38,6 +38,14 @@
    don't. */
 #undef HAVE_DECL_IPV6_V6ONLY
 
+/* Define to 1 if you have the declaration of 'IP_DONTFRAG', and to 0 if you
+   don't. */
+#undef HAVE_DECL_IP_DONTFRAG
+
+/* Define to 1 if you have the declaration of 'IP_MTU_DISCOVER', and to 0 if
+   you don't. */
+#undef HAVE_DECL_IP_MTU_DISCOVER
+
 /* Define to 1 if you have the declaration of 'SO_PEERCRED', and to 0 if you
    don't. */
 #undef HAVE_DECL_SO_PEERCRED
diff --git a/network.cabal b/network.cabal
--- a/network.cabal
+++ b/network.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               network
-version:            3.2.7.0
+version:            3.2.8.0
 license:            BSD3
 license-file:       LICENSE
 maintainer:         Kazu Yamamoto, Tamar Christina
diff --git a/tests/Network/SocketSpec.hs b/tests/Network/SocketSpec.hs
--- a/tests/Network/SocketSpec.hs
+++ b/tests/Network/SocketSpec.hs
@@ -456,11 +456,11 @@
 sockoptPatterns = nub
     [UnsupportedSocketOption
     ,Debug,ReuseAddr,SoDomain,Type,SoProtocol,SoError,DontRoute
-    ,Broadcast,SendBuffer,RecvBuffer,KeepAlive,OOBInline,TimeToLive
-    ,MaxSegment,NoDelay,Cork,Linger,ReusePort
+    ,Broadcast,SendBuffer,RecvBuffer,KeepAlive,KeepInit,OOBInline
+    ,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort
     ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut
     ,UseLoopBack,UserTimeout,IPv6Only
-    ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo
+    ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,DontFragment
     ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo]
 
 cmsgidPatterns :: [CmsgId]
