Skip to content

Commit 5c749e3

Browse files
committed
🧮 conn: unify socket control message buffer size calculation
Always use the maximum possible size.
1 parent 9658c78 commit 5c749e3

File tree

5 files changed

+10
-10
lines changed

5 files changed

+10
-10
lines changed

conn/cmsg_darwin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"golang.org/x/sys/unix"
1010
)
1111

12-
const socketControlMessageBufferSize = unix.SizeofCmsghdr + alignedSizeofInet6Pktinfo
12+
const socketControlMessageBufferSize = unix.SizeofCmsghdr + max(alignedSizeofInet4Pktinfo, alignedSizeofInet6Pktinfo)
1313

1414
const cmsgAlignTo = 4
1515

conn/cmsg_linux.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import (
99
"golang.org/x/sys/unix"
1010
)
1111

12-
const socketControlMessageBufferSize = unix.SizeofCmsghdr + alignedSizeofInet6Pktinfo +
13-
unix.SizeofCmsghdr + alignedSizeofGROSegmentSize
12+
const socketControlMessageBufferSize = unix.SizeofCmsghdr + max(alignedSizeofInet4Pktinfo, alignedSizeofInet6Pktinfo) +
13+
unix.SizeofCmsghdr + max(alignedSizeofSockaddrInet4, alignedSizeofSockaddrInet6) +
14+
unix.SizeofCmsghdr + max(alignedSizeofGSOSegmentSize, alignedSizeofGROSegmentSize)
1415

1516
const (
1617
sizeofGSOSegmentSize = 2 // int(unsafe.Sizeof(uint16(0)))
@@ -89,6 +90,8 @@ func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error)
8990
const (
9091
alignedSizeofInet4Pktinfo = (unix.SizeofInet4Pktinfo + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
9192
alignedSizeofInet6Pktinfo = (unix.SizeofInet6Pktinfo + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
93+
alignedSizeofSockaddrInet4 = (unix.SizeofSockaddrInet4 + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
94+
alignedSizeofSockaddrInet6 = (unix.SizeofSockaddrInet6 + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
9295
alignedSizeofGSOSegmentSize = (sizeofGSOSegmentSize + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
9396
alignedSizeofGROSegmentSize = (sizeofGROSegmentSize + unix.SizeofPtr - 1) & ^(unix.SizeofPtr - 1)
9497
)

conn/cmsg_windows.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
"golang.org/x/sys/windows"
1010
)
1111

12-
const socketControlMessageBufferSize = sizeofCmsghdr + alignedSizeofInet6Pktinfo +
13-
sizeofCmsghdr + alignedSizeofCoalescedInfo
12+
const socketControlMessageBufferSize = sizeofCmsghdr + max(alignedSizeofInet4Pktinfo, alignedSizeofInet6Pktinfo) +
13+
sizeofCmsghdr + max(alignedSizeofSendMsgSize, alignedSizeofCoalescedInfo)
1414

1515
const (
1616
sizeofPtr = int(unsafe.Sizeof(uintptr(0)))

conn/conn_linux.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ import (
66
"golang.org/x/sys/unix"
77
)
88

9-
// TransparentSocketControlMessageBufferSize specifies the buffer size for receiving IPV6_RECVORIGDSTADDR socket control messages.
10-
const TransparentSocketControlMessageBufferSize = unix.SizeofCmsghdr + (unix.SizeofSockaddrInet6+unix.SizeofPtr-1) & ^(unix.SizeofPtr-1)
11-
129
func setSendBufferSize(fd, size int) error {
1310
if err := unix.SetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_SNDBUF, size); err != nil {
1411
return fmt.Errorf("failed to set socket option SO_SNDBUF: %w", err)

service/udp_transparent_linux.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (s *UDPTransparentRelay) recvFromServerConnRecvmmsg(ctx context.Context, ln
164164
msgvec := make([]conn.Mmsghdr, n)
165165

166166
for i := range msgvec {
167-
cmsgBuf := make([]byte, conn.TransparentSocketControlMessageBufferSize)
167+
cmsgBuf := make([]byte, conn.SocketControlMessageBufferSize)
168168
cmsgvec[i] = cmsgBuf
169169
msgvec[i].Msghdr.Name = (*byte)(unsafe.Pointer(&namevec[i]))
170170
msgvec[i].Msghdr.Namelen = unix.SizeofSockaddrInet6
@@ -187,7 +187,7 @@ func (s *UDPTransparentRelay) recvFromServerConnRecvmmsg(ctx context.Context, ln
187187
qpvec[i] = queuedPacket
188188
iovec[i].Base = &queuedPacket.buf[s.packetBufFrontHeadroom]
189189
iovec[i].SetLen(s.packetBufRecvSize)
190-
msgvec[i].Msghdr.SetControllen(conn.TransparentSocketControlMessageBufferSize)
190+
msgvec[i].Msghdr.SetControllen(conn.SocketControlMessageBufferSize)
191191
}
192192

193193
n, err = serverConn.ReadMsgs(msgvec, 0)

0 commit comments

Comments
 (0)