From c513aed5d2425a2b8590e860e8d8ba87c6d91c90 Mon Sep 17 00:00:00 2001 From: Viet Tran Date: Wed, 13 Sep 2023 12:31:46 +0100 Subject: [PATCH] Add TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT to socket options and update tests --- Network/Socket.hs | 3 ++- Network/Socket/Options.hsc | 25 +++++++++++++++++++++++++ tests/Network/SocketSpec.hs | 3 ++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Network/Socket.hs b/Network/Socket.hs index cf003a5a..b6a7a422 100644 --- a/Network/Socket.hs +++ b/Network/Socket.hs @@ -141,7 +141,8 @@ module Network.Socket ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut ,UseLoopBack,UserTimeout,IPv6Only ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo - ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo) + ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo + ,KeepIdle,KeepInterval,KeepCount) , StructLinger (..) , SocketTimeout (..) , isSupportedSocketOption diff --git a/Network/Socket/Options.hsc b/Network/Socket/Options.hsc index b8680e8e..722e6ff5 100644 --- a/Network/Socket/Options.hsc +++ b/Network/Socket/Options.hsc @@ -17,6 +17,7 @@ module Network.Socket.Options ( ,UseLoopBack,UserTimeout,IPv6Only ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo + ,KeepIdle,KeepInterval,KeepCount ,CustomSockOpt) , isSupportedSocketOption , whenSupported @@ -94,6 +95,9 @@ socketOptionBijection = , (RecvIPv6HopLimit, "RecvIPv6HopLimit") , (RecvIPv6TClass, "RecvIPv6TClass") , (RecvIPv6PktInfo, "RecvIPv6PktInfo") + , (KeepIdle, "KeepIdle") + , (KeepInterval, "KeepInterval") + , (KeepCount, "KeepCount") ] instance Show SocketOption where @@ -306,6 +310,27 @@ pattern Cork = SockOpt (#const IPPROTO_TCP) (#const TCP_CORK) #else pattern Cork = SockOpt (-1) (-1) #endif +-- | TCP_KEEPIDLE +pattern KeepIdle :: SocketOption +#ifdef TCP_KEEPIDLE +pattern KeepIdle = SockOpt (#const IPPROTO_TCP) (#const TCP_KEEPIDLE) +#else +pattern KeepIdle = SockOpt (-1) (-1) +#endif +-- | TCP_KEEPINTVL +pattern KeepInterval :: SocketOption +#ifdef TCP_KEEPINTVL +pattern KeepInterval = SockOpt (#const IPPROTO_TCP) (#const TCP_KEEPINTVL) +#else +pattern KeepInterval = SockOpt (-1) (-1) +#endif +-- | TCP_KEEPCNT +pattern KeepCount :: SocketOption +#ifdef TCP_KEEPCNT +pattern KeepCount = SockOpt (#const IPPROTO_TCP) (#const TCP_KEEPCNT) +#else +pattern KeepCount = SockOpt (-1) (-1) +#endif #endif // HAVE_DECL_IPPROTO_TCP #if HAVE_DECL_IPPROTO_IP diff --git a/tests/Network/SocketSpec.hs b/tests/Network/SocketSpec.hs index 30294050..47dff1e1 100644 --- a/tests/Network/SocketSpec.hs +++ b/tests/Network/SocketSpec.hs @@ -459,7 +459,8 @@ sockoptPatterns = nub ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut ,UseLoopBack,UserTimeout,IPv6Only ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo - ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo] + ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo + ,KeepIdle,KeepInterval,KeepCount] cmsgidPatterns :: [CmsgId] cmsgidPatterns = nub