@@ -9,14 +9,17 @@ import (
99 "golang.org/x/sys/unix"
1010)
1111
12- const socketControlMessageBufferSize = unix .SizeofCmsghdr + max (alignedSizeofInet4Addr , alignedSizeofInet6Pktinfo ) +
13- unix .SizeofCmsghdr + max (alignedSizeofSockaddrInet4 , alignedSizeofSockaddrInet6 )
12+ const (
13+ socketControlMessageBufferSize = alignedSizeofCmsghdr + max (alignedSizeofInet4Addr , alignedSizeofInet6Pktinfo ) +
14+ alignedSizeofCmsghdr + max (alignedSizeofSockaddrInet4 , alignedSizeofSockaddrInet6 )
1415
15- const sizeofInet4Addr = 4 // sizeof(struct in_addr)
16+ alignedSizeofInet4Addr = (sizeofInet4Addr + cmsgAlignTo - 1 ) & ^ (cmsgAlignTo - 1 )
17+ alignedSizeofInet6Pktinfo = (unix .SizeofInet6Pktinfo + cmsgAlignTo - 1 ) & ^ (cmsgAlignTo - 1 )
18+ alignedSizeofSockaddrInet4 = (unix .SizeofSockaddrInet4 + cmsgAlignTo - 1 ) & ^ (cmsgAlignTo - 1 )
19+ alignedSizeofSockaddrInet6 = (unix .SizeofSockaddrInet6 + cmsgAlignTo - 1 ) & ^ (cmsgAlignTo - 1 )
1620
17- func cmsgAlign (n int ) int {
18- return (n + unix .SizeofPtr - 1 ) & ^ (unix .SizeofPtr - 1 )
19- }
21+ sizeofInet4Addr = 4 // sizeof(struct in_addr)
22+ )
2023
2124func parseSocketControlMessage (cmsg []byte ) (m SocketControlMessage , err error ) {
2225 for len (cmsg ) >= unix .SizeofCmsghdr {
@@ -30,38 +33,38 @@ func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error)
3033 case unix .IPPROTO_IP :
3134 switch cmsghdr .Type {
3235 case unix .IP_RECVDSTADDR :
33- if len (cmsg ) < unix . SizeofCmsghdr + sizeofInet4Addr {
36+ if len (cmsg ) < alignedSizeofCmsghdr + sizeofInet4Addr {
3437 return m , fmt .Errorf ("invalid IP_RECVDSTADDR control message length %d" , cmsghdr .Len )
3538 }
36- addr := [sizeofInet4Addr ]byte (cmsg [unix . SizeofCmsghdr :])
39+ addr := [sizeofInet4Addr ]byte (cmsg [alignedSizeofCmsghdr :])
3740 m .PktinfoAddr = netip .AddrFrom4 (addr )
3841
3942 case unix .IP_ORIGDSTADDR :
40- if len (cmsg ) < unix . SizeofCmsghdr + unix .SizeofSockaddrInet4 {
43+ if len (cmsg ) < alignedSizeofCmsghdr + unix .SizeofSockaddrInet4 {
4144 return m , fmt .Errorf ("invalid IP_ORIGDSTADDR control message length %d" , cmsghdr .Len )
4245 }
4346 var rsa4 unix.RawSockaddrInet4
44- _ = copy (unsafe .Slice ((* byte )(unsafe .Pointer (& rsa4 )), unix .SizeofSockaddrInet4 ), cmsg [unix . SizeofCmsghdr :])
47+ _ = copy (unsafe .Slice ((* byte )(unsafe .Pointer (& rsa4 )), unix .SizeofSockaddrInet4 ), cmsg [alignedSizeofCmsghdr :])
4548 m .OriginalDestinationAddrPort = netip .AddrPortFrom (netip .AddrFrom4 (rsa4 .Addr ), rsa4 .Port )
4649 }
4750
4851 case unix .IPPROTO_IPV6 :
4952 switch cmsghdr .Type {
5053 case unix .IPV6_PKTINFO :
51- if len (cmsg ) < unix . SizeofCmsghdr + unix .SizeofInet6Pktinfo {
54+ if len (cmsg ) < alignedSizeofCmsghdr + unix .SizeofInet6Pktinfo {
5255 return m , fmt .Errorf ("invalid IPV6_PKTINFO control message length %d" , cmsghdr .Len )
5356 }
5457 var pktinfo unix.Inet6Pktinfo
55- _ = copy (unsafe .Slice ((* byte )(unsafe .Pointer (& pktinfo )), unix .SizeofInet6Pktinfo ), cmsg [unix . SizeofCmsghdr :])
58+ _ = copy (unsafe .Slice ((* byte )(unsafe .Pointer (& pktinfo )), unix .SizeofInet6Pktinfo ), cmsg [alignedSizeofCmsghdr :])
5659 m .PktinfoAddr = netip .AddrFrom16 (pktinfo .Addr )
5760 m .PktinfoIfindex = pktinfo .Ifindex
5861
5962 case unix .IPV6_ORIGDSTADDR :
60- if len (cmsg ) < unix . SizeofCmsghdr + unix .SizeofSockaddrInet6 {
63+ if len (cmsg ) < alignedSizeofCmsghdr + unix .SizeofSockaddrInet6 {
6164 return m , fmt .Errorf ("invalid IPV6_ORIGDSTADDR control message length %d" , cmsghdr .Len )
6265 }
6366 var rsa6 unix.RawSockaddrInet6
64- _ = copy (unsafe .Slice ((* byte )(unsafe .Pointer (& rsa6 )), unix .SizeofSockaddrInet6 ), cmsg [unix . SizeofCmsghdr :])
67+ _ = copy (unsafe .Slice ((* byte )(unsafe .Pointer (& rsa6 )), unix .SizeofSockaddrInet6 ), cmsg [alignedSizeofCmsghdr :])
6568 m .OriginalDestinationAddrPort = netip .AddrPortFrom (netip .AddrFrom16 (rsa6 .Addr ), rsa6 .Port )
6669 }
6770 }
@@ -72,43 +75,36 @@ func parseSocketControlMessage(cmsg []byte) (m SocketControlMessage, err error)
7275 return m , nil
7376}
7477
75- const (
76- alignedSizeofInet4Addr = (sizeofInet4Addr + unix .SizeofPtr - 1 ) & ^ (unix .SizeofPtr - 1 )
77- alignedSizeofInet6Pktinfo = (unix .SizeofInet6Pktinfo + unix .SizeofPtr - 1 ) & ^ (unix .SizeofPtr - 1 )
78- alignedSizeofSockaddrInet4 = (unix .SizeofSockaddrInet4 + unix .SizeofPtr - 1 ) & ^ (unix .SizeofPtr - 1 )
79- alignedSizeofSockaddrInet6 = (unix .SizeofSockaddrInet6 + unix .SizeofPtr - 1 ) & ^ (unix .SizeofPtr - 1 )
80- )
81-
8278func (m SocketControlMessage ) appendTo (b []byte ) []byte {
8379 switch {
8480 case m .PktinfoAddr .Is4 ():
8581 bLen := len (b )
86- b = slices .Grow (b , unix . SizeofCmsghdr + alignedSizeofInet4Addr )[:bLen + unix . SizeofCmsghdr + alignedSizeofInet4Addr ]
82+ b = slices .Grow (b , alignedSizeofCmsghdr + alignedSizeofInet4Addr )[:bLen + alignedSizeofCmsghdr + alignedSizeofInet4Addr ]
8783 msgBuf := b [bLen :]
8884 cmsghdr := (* unix .Cmsghdr )(unsafe .Pointer (unsafe .SliceData (msgBuf )))
8985 * cmsghdr = unix.Cmsghdr {
90- Len : unix . SizeofCmsghdr + sizeofInet4Addr ,
86+ Len : alignedSizeofCmsghdr + sizeofInet4Addr ,
9187 Level : unix .IPPROTO_IP ,
9288 Type : unix .IP_SENDSRCADDR ,
9389 }
9490 addr := m .PktinfoAddr .As4 ()
95- _ = copy (msgBuf [unix . SizeofCmsghdr :], addr [:])
91+ _ = copy (msgBuf [alignedSizeofCmsghdr :], addr [:])
9692
9793 case m .PktinfoAddr .Is6 ():
9894 bLen := len (b )
99- b = slices .Grow (b , unix . SizeofCmsghdr + alignedSizeofInet6Pktinfo )[:bLen + unix . SizeofCmsghdr + alignedSizeofInet6Pktinfo ]
95+ b = slices .Grow (b , alignedSizeofCmsghdr + alignedSizeofInet6Pktinfo )[:bLen + alignedSizeofCmsghdr + alignedSizeofInet6Pktinfo ]
10096 msgBuf := b [bLen :]
10197 cmsghdr := (* unix .Cmsghdr )(unsafe .Pointer (unsafe .SliceData (msgBuf )))
10298 * cmsghdr = unix.Cmsghdr {
103- Len : unix . SizeofCmsghdr + unix .SizeofInet6Pktinfo ,
99+ Len : alignedSizeofCmsghdr + unix .SizeofInet6Pktinfo ,
104100 Level : unix .IPPROTO_IPV6 ,
105101 Type : unix .IPV6_PKTINFO ,
106102 }
107103 pktinfo := unix.Inet6Pktinfo {
108104 Addr : m .PktinfoAddr .As16 (),
109105 Ifindex : m .PktinfoIfindex ,
110106 }
111- _ = copy (msgBuf [unix . SizeofCmsghdr :], unsafe .Slice ((* byte )(unsafe .Pointer (& pktinfo )), unix .SizeofInet6Pktinfo ))
107+ _ = copy (msgBuf [alignedSizeofCmsghdr :], unsafe .Slice ((* byte )(unsafe .Pointer (& pktinfo )), unix .SizeofInet6Pktinfo ))
112108 }
113109
114110 return b
0 commit comments