Skip to content

Commit a8c0a2a

Browse files
Merge pull request #603 from thehajime/feature-sockopt-df
sockopt: add IP_DONTFRAG/IP_MTU_DISCOVER option
2 parents c00be44 + 086ca1b commit a8c0a2a

File tree

5 files changed

+25
-2
lines changed

5 files changed

+25
-2
lines changed

Network/Socket.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ module Network.Socket (
167167
RecvIPv4TTL,
168168
RecvIPv4TOS,
169169
RecvIPv4PktInfo,
170+
DontFragment,
170171
RecvIPv6HopLimit,
171172
RecvIPv6TClass,
172173
RecvIPv6PktInfo

Network/Socket/Options.hsc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module Network.Socket.Options (
1616
,OOBInline,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort
1717
,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut
1818
,UseLoopBack,UserTimeout,IPv6Only
19-
,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo
19+
,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,DontFragment
2020
,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo
2121
,CustomSockOpt)
2222
, isSupportedSocketOption
@@ -94,6 +94,7 @@ socketOptionBijection =
9494
, (RecvIPv4TTL, "RecvIPv4TTL")
9595
, (RecvIPv4TOS, "RecvIPv4TOS")
9696
, (RecvIPv4PktInfo, "RecvIPv4PktInfo")
97+
, (DontFragment, "DontFragment")
9798
, (IPv6Only, "IPv6Only")
9899
, (RecvIPv6HopLimit, "RecvIPv6HopLimit")
99100
, (RecvIPv6TClass, "RecvIPv6TClass")
@@ -352,6 +353,15 @@ pattern RecvIPv4PktInfo = SockOpt (#const IPPROTO_IP) (#const IP_PKTINFO)
352353
#else
353354
pattern RecvIPv4PktInfo = SockOpt (-1) (-1)
354355
#endif
356+
-- | IP_DONTFRAG
357+
pattern DontFragment :: SocketOption
358+
#if HAVE_DECL_IP_DONTFRAG
359+
pattern DontFragment = SockOpt (#const IPPROTO_IP) (#const IP_DONTFRAG)
360+
#elif HAVE_DECL_IP_MTU_DISCOVER
361+
pattern DontFragment = SockOpt (#const IPPROTO_IP) (#const IP_MTU_DISCOVER)
362+
#else
363+
pattern DontFragment = SockOpt (-1) (-1)
364+
#endif
355365
#endif // HAVE_DECL_IPPROTO_IP
356366

357367
#if HAVE_DECL_IPPROTO_IPV6

Network/Socket/Syscall.hs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ socket family stype protocol = E.bracketOnError create c_close $ \fd -> do
8383
-- This socket is not managed by the IO manager yet.
8484
-- So, we don't have to call "close" which uses "closeFdWith".
8585
unsetIPv6Only s
86+
setDontFragment s
8687
return s
8788
where
8889
create = do
@@ -120,6 +121,15 @@ socket family stype protocol = E.bracketOnError create c_close $ \fd -> do
120121
unsetIPv6Only _ = return ()
121122
#endif
122123

124+
setDontFragment s = when (family == AF_INET) $
125+
#if HAVE_DECL_IP_DONTFRAG || HAVE_DECL_IP_MTU_DISCOVER
126+
setSocketOption s DontFragment 1
127+
#else
128+
-- do nothing
129+
return ()
130+
#endif
131+
132+
123133
-----------------------------------------------------------------------------
124134
-- Binding a socket
125135

configure.ac

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED])
8686
AC_CHECK_DECLS([IPV6_V6ONLY])
8787
AC_CHECK_DECLS([IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6])
8888
AC_CHECK_DECLS([SO_PEERCRED])
89+
AC_CHECK_DECLS([IP_DONTFRAG])
90+
AC_CHECK_DECLS([IP_MTU_DISCOVER])
8991

9092
AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights])
9193
AC_CHECK_MEMBERS([struct sockaddr.sa_len])

tests/Network/SocketSpec.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ sockoptPatterns = nub
460460
,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort
461461
,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut
462462
,UseLoopBack,UserTimeout,IPv6Only
463-
,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo
463+
,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,DontFragment
464464
,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo]
465465

466466
cmsgidPatterns :: [CmsgId]

0 commit comments

Comments
 (0)