Skip to content

Commit faab872

Browse files
committed
🦨 conn, service: improve sockaddr API
1 parent beccd40 commit faab872

File tree

7 files changed

+105
-147
lines changed

7 files changed

+105
-147
lines changed

conn/sockaddr_linuxsolaris.go

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,51 +10,45 @@ import (
1010
"golang.org/x/sys/unix"
1111
)
1212

13-
func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 unix.RawSockaddrInet6, namelen uint32) {
13+
func SockaddrPutAddrPort(name *unix.RawSockaddrInet6, namelen *uint32, addrPort netip.AddrPort) {
1414
if !addrPort.IsValid() {
15+
*name = unix.RawSockaddrInet6{}
16+
*namelen = 0
1517
return
1618
}
1719
addr, port := addrPort.Addr(), addrPort.Port()
18-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
20+
p := (*[2]byte)(unsafe.Pointer(&name.Port))
1921
p[0] = byte(port >> 8)
2022
p[1] = byte(port)
2123
if addr.Is4() {
22-
rsa6.Family = unix.AF_INET
23-
a := (*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo))
24+
name.Family = unix.AF_INET
25+
a := (*[4]byte)(unsafe.Pointer(&name.Flowinfo))
2426
*a = addr.As4()
25-
namelen = unix.SizeofSockaddrInet4
27+
*namelen = unix.SizeofSockaddrInet4
2628
return
2729
}
28-
rsa6.Family = unix.AF_INET6
29-
rsa6.Addr = addr.As16()
30-
rsa6.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
31-
namelen = unix.SizeofSockaddrInet6
32-
return
30+
name.Family = unix.AF_INET6
31+
name.Addr = addr.As16()
32+
name.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
33+
*namelen = unix.SizeofSockaddrInet6
3334
}
3435

35-
func AddrPortToSockaddrInet4(addrPort netip.AddrPort) unix.RawSockaddrInet4 {
36-
addr := addrPort.Addr()
36+
func SockaddrInet4PutAddrPort(sa *unix.RawSockaddrInet4, addrPort netip.AddrPort) {
37+
sa.Family = unix.AF_INET
3738
port := addrPort.Port()
38-
rsa4 := unix.RawSockaddrInet4{
39-
Family: unix.AF_INET,
40-
Addr: addr.As4(),
41-
}
42-
p := (*[2]byte)(unsafe.Pointer(&rsa4.Port))
39+
p := (*[2]byte)(unsafe.Pointer(&sa.Port))
4340
p[0] = byte(port >> 8)
4441
p[1] = byte(port)
45-
return rsa4
42+
sa.Addr = addrPort.Addr().As4()
4643
}
4744

48-
func AddrPortToSockaddrInet6(addrPort netip.AddrPort) unix.RawSockaddrInet6 {
49-
addr := addrPort.Addr()
45+
func SockaddrInet6PutAddrPort(sa *unix.RawSockaddrInet6, addrPort netip.AddrPort) {
46+
sa.Family = unix.AF_INET6
5047
port := addrPort.Port()
51-
rsa6 := unix.RawSockaddrInet6{
52-
Family: unix.AF_INET6,
53-
Addr: addr.As16(),
54-
Scope_id: uint32(netx.ZoneCache.Index(addr.Zone())),
55-
}
56-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
48+
p := (*[2]byte)(unsafe.Pointer(&sa.Port))
5749
p[0] = byte(port >> 8)
5850
p[1] = byte(port)
59-
return rsa6
51+
addr := addrPort.Addr()
52+
sa.Addr = addr.As16()
53+
sa.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
6054
}

conn/sockaddr_notlinuxsolariswindows.go

Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,55 +10,49 @@ import (
1010
"golang.org/x/sys/unix"
1111
)
1212

13-
func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 unix.RawSockaddrInet6, namelen uint32) {
13+
func SockaddrPutAddrPort(name *unix.RawSockaddrInet6, namelen *uint32, addrPort netip.AddrPort) {
1414
if !addrPort.IsValid() {
15+
*name = unix.RawSockaddrInet6{}
16+
*namelen = 0
1517
return
1618
}
1719
addr, port := addrPort.Addr(), addrPort.Port()
18-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
20+
p := (*[2]byte)(unsafe.Pointer(&name.Port))
1921
p[0] = byte(port >> 8)
2022
p[1] = byte(port)
2123
if addr.Is4() {
22-
rsa6.Len = unix.SizeofSockaddrInet4
23-
rsa6.Family = unix.AF_INET
24-
a := (*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo))
24+
name.Len = unix.SizeofSockaddrInet4
25+
name.Family = unix.AF_INET
26+
a := (*[4]byte)(unsafe.Pointer(&name.Flowinfo))
2527
*a = addr.As4()
26-
namelen = unix.SizeofSockaddrInet4
28+
*namelen = unix.SizeofSockaddrInet4
2729
return
2830
}
29-
rsa6.Len = unix.SizeofSockaddrInet6
30-
rsa6.Family = unix.AF_INET6
31-
rsa6.Addr = addr.As16()
32-
rsa6.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
33-
namelen = unix.SizeofSockaddrInet6
34-
return
31+
name.Len = unix.SizeofSockaddrInet6
32+
name.Family = unix.AF_INET6
33+
name.Addr = addr.As16()
34+
name.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
35+
*namelen = unix.SizeofSockaddrInet6
3536
}
3637

37-
func AddrPortToSockaddrInet4(addrPort netip.AddrPort) unix.RawSockaddrInet4 {
38-
addr := addrPort.Addr()
38+
func SockaddrInet4PutAddrPort(sa *unix.RawSockaddrInet4, addrPort netip.AddrPort) {
39+
sa.Len = unix.SizeofSockaddrInet4
40+
sa.Family = unix.AF_INET
3941
port := addrPort.Port()
40-
rsa4 := unix.RawSockaddrInet4{
41-
Len: unix.SizeofSockaddrInet4,
42-
Family: unix.AF_INET,
43-
Addr: addr.As4(),
44-
}
45-
p := (*[2]byte)(unsafe.Pointer(&rsa4.Port))
42+
p := (*[2]byte)(unsafe.Pointer(&sa.Port))
4643
p[0] = byte(port >> 8)
4744
p[1] = byte(port)
48-
return rsa4
45+
sa.Addr = addrPort.Addr().As4()
4946
}
5047

51-
func AddrPortToSockaddrInet6(addrPort netip.AddrPort) unix.RawSockaddrInet6 {
52-
addr := addrPort.Addr()
48+
func SockaddrInet6PutAddrPort(sa *unix.RawSockaddrInet6, addrPort netip.AddrPort) {
49+
sa.Len = unix.SizeofSockaddrInet6
50+
sa.Family = unix.AF_INET6
5351
port := addrPort.Port()
54-
rsa6 := unix.RawSockaddrInet6{
55-
Len: unix.SizeofSockaddrInet6,
56-
Family: unix.AF_INET6,
57-
Addr: addr.As16(),
58-
Scope_id: uint32(netx.ZoneCache.Index(addr.Zone())),
59-
}
60-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
52+
p := (*[2]byte)(unsafe.Pointer(&sa.Port))
6153
p[0] = byte(port >> 8)
6254
p[1] = byte(port)
63-
return rsa6
55+
addr := addrPort.Addr()
56+
sa.Addr = addr.As16()
57+
sa.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
6458
}

conn/sockaddr_notwindows.go

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,17 @@ import (
1111
"golang.org/x/sys/unix"
1212
)
1313

14-
func SockaddrValueToAddrPort(rsa6 unix.RawSockaddrInet6, namelen uint32) (netip.AddrPort, error) {
15-
if namelen == 0 {
16-
return netip.AddrPort{}, nil
17-
}
18-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
19-
port := uint16(p[0])<<8 + uint16(p[1])
20-
var addr netip.Addr
21-
switch namelen {
22-
case unix.SizeofSockaddrInet4:
23-
addr = netip.AddrFrom4(*(*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo)))
24-
case unix.SizeofSockaddrInet6:
25-
addr = netip.AddrFrom16(rsa6.Addr).WithZone(netx.ZoneCache.Name(int(rsa6.Scope_id)))
26-
default:
27-
return netip.AddrPort{}, fmt.Errorf("bad sockaddr length: %d", namelen)
28-
}
29-
return netip.AddrPortFrom(addr, port), nil
30-
}
31-
3214
func AddrPortToSockaddr(addrPort netip.AddrPort) (name *byte, namelen uint32) {
3315
switch {
3416
case !addrPort.IsValid():
3517
return nil, 0
3618
case addrPort.Addr().Is4():
37-
rsa4 := AddrPortToSockaddrInet4(addrPort)
19+
var rsa4 unix.RawSockaddrInet4
20+
SockaddrInet4PutAddrPort(&rsa4, addrPort)
3821
return (*byte)(unsafe.Pointer(&rsa4)), unix.SizeofSockaddrInet4
3922
default:
40-
rsa6 := AddrPortToSockaddrInet6(addrPort)
23+
var rsa6 unix.RawSockaddrInet6
24+
SockaddrInet6PutAddrPort(&rsa6, addrPort)
4125
return (*byte)(unsafe.Pointer(&rsa6)), unix.SizeofSockaddrInet6
4226
}
4327
}
@@ -47,10 +31,12 @@ func AddrPortUnmappedToSockaddr(addrPort netip.AddrPort) (name *byte, namelen ui
4731
case !addrPort.IsValid():
4832
return nil, 0
4933
case addrPort.Addr().Is4() || addrPort.Addr().Is4In6():
50-
rsa4 := AddrPortToSockaddrInet4(addrPort)
34+
var rsa4 unix.RawSockaddrInet4
35+
SockaddrInet4PutAddrPort(&rsa4, addrPort)
5136
return (*byte)(unsafe.Pointer(&rsa4)), unix.SizeofSockaddrInet4
5237
default:
53-
rsa6 := AddrPortToSockaddrInet6(addrPort)
38+
var rsa6 unix.RawSockaddrInet6
39+
SockaddrInet6PutAddrPort(&rsa6, addrPort)
5440
return (*byte)(unsafe.Pointer(&rsa6)), unix.SizeofSockaddrInet6
5541
}
5642
}

conn/sockaddr_windows.go

Lines changed: 41 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,17 @@ const (
1414
SizeofSockaddrInet6 = uint32(unsafe.Sizeof(windows.RawSockaddrInet6{}))
1515
)
1616

17-
func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 windows.RawSockaddrInet6, namelen uint32) {
18-
if !addrPort.IsValid() {
19-
return
20-
}
21-
addr, port := addrPort.Addr(), addrPort.Port()
22-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
23-
p[0] = byte(port >> 8)
24-
p[1] = byte(port)
25-
if addr.Is4() {
26-
rsa6.Family = windows.AF_INET
27-
a := (*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo))
28-
*a = addr.As4()
29-
namelen = SizeofSockaddrInet4
30-
return
31-
}
32-
rsa6.Family = windows.AF_INET6
33-
rsa6.Addr = addr.As16()
34-
rsa6.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
35-
namelen = SizeofSockaddrInet6
36-
return
37-
}
38-
39-
func SockaddrValueToAddrPort(rsa6 windows.RawSockaddrInet6, namelen uint32) (netip.AddrPort, error) {
40-
if namelen == 0 {
41-
return netip.AddrPort{}, nil
42-
}
43-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
44-
port := uint16(p[0])<<8 + uint16(p[1])
45-
var addr netip.Addr
46-
switch namelen {
47-
case SizeofSockaddrInet4:
48-
addr = netip.AddrFrom4(*(*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo)))
49-
case SizeofSockaddrInet6:
50-
addr = netip.AddrFrom16(rsa6.Addr).WithZone(netx.ZoneCache.Name(int(rsa6.Scope_id)))
51-
default:
52-
return netip.AddrPort{}, fmt.Errorf("bad sockaddr length: %d", namelen)
53-
}
54-
return netip.AddrPortFrom(addr, port), nil
55-
}
56-
5717
func AddrPortToSockaddr(addrPort netip.AddrPort) (name *byte, namelen uint32) {
5818
switch {
5919
case !addrPort.IsValid():
6020
return nil, 0
6121
case addrPort.Addr().Is4():
62-
rsa4 := AddrPortToSockaddrInet4(addrPort)
22+
var rsa4 windows.RawSockaddrInet4
23+
SockaddrInet4PutAddrPort(&rsa4, addrPort)
6324
return (*byte)(unsafe.Pointer(&rsa4)), SizeofSockaddrInet4
6425
default:
65-
rsa6 := AddrPortToSockaddrInet6(addrPort)
26+
var rsa6 windows.RawSockaddrInet6
27+
SockaddrInet6PutAddrPort(&rsa6, addrPort)
6628
return (*byte)(unsafe.Pointer(&rsa6)), SizeofSockaddrInet6
6729
}
6830
}
@@ -72,39 +34,57 @@ func AddrPortUnmappedToSockaddr(addrPort netip.AddrPort) (name *byte, namelen ui
7234
case !addrPort.IsValid():
7335
return nil, 0
7436
case addrPort.Addr().Is4() || addrPort.Addr().Is4In6():
75-
rsa4 := AddrPortToSockaddrInet4(addrPort)
37+
var rsa4 windows.RawSockaddrInet4
38+
SockaddrInet4PutAddrPort(&rsa4, addrPort)
7639
return (*byte)(unsafe.Pointer(&rsa4)), SizeofSockaddrInet4
7740
default:
78-
rsa6 := AddrPortToSockaddrInet6(addrPort)
41+
var rsa6 windows.RawSockaddrInet6
42+
SockaddrInet6PutAddrPort(&rsa6, addrPort)
7943
return (*byte)(unsafe.Pointer(&rsa6)), SizeofSockaddrInet6
8044
}
8145
}
8246

83-
func AddrPortToSockaddrInet4(addrPort netip.AddrPort) windows.RawSockaddrInet4 {
84-
addr := addrPort.Addr()
85-
port := addrPort.Port()
86-
rsa4 := windows.RawSockaddrInet4{
87-
Family: windows.AF_INET,
88-
Addr: addr.As4(),
47+
func SockaddrPutAddrPort(name *windows.RawSockaddrInet6, namelen *uint32, addrPort netip.AddrPort) {
48+
if !addrPort.IsValid() {
49+
*name = windows.RawSockaddrInet6{}
50+
*namelen = 0
51+
return
8952
}
90-
p := (*[2]byte)(unsafe.Pointer(&rsa4.Port))
53+
addr, port := addrPort.Addr(), addrPort.Port()
54+
p := (*[2]byte)(unsafe.Pointer(&name.Port))
9155
p[0] = byte(port >> 8)
9256
p[1] = byte(port)
93-
return rsa4
57+
if addr.Is4() {
58+
name.Family = windows.AF_INET
59+
a := (*[4]byte)(unsafe.Pointer(&name.Flowinfo))
60+
*a = addr.As4()
61+
*namelen = SizeofSockaddrInet4
62+
return
63+
}
64+
name.Family = windows.AF_INET6
65+
name.Addr = addr.As16()
66+
name.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
67+
*namelen = SizeofSockaddrInet6
9468
}
9569

96-
func AddrPortToSockaddrInet6(addrPort netip.AddrPort) windows.RawSockaddrInet6 {
97-
addr := addrPort.Addr()
70+
func SockaddrInet4PutAddrPort(sa *windows.RawSockaddrInet4, addrPort netip.AddrPort) {
71+
sa.Family = windows.AF_INET
9872
port := addrPort.Port()
99-
rsa6 := windows.RawSockaddrInet6{
100-
Family: windows.AF_INET6,
101-
Addr: addr.As16(),
102-
Scope_id: uint32(netx.ZoneCache.Index(addr.Zone())),
103-
}
104-
p := (*[2]byte)(unsafe.Pointer(&rsa6.Port))
73+
p := (*[2]byte)(unsafe.Pointer(&sa.Port))
10574
p[0] = byte(port >> 8)
10675
p[1] = byte(port)
107-
return rsa6
76+
sa.Addr = addrPort.Addr().As4()
77+
}
78+
79+
func SockaddrInet6PutAddrPort(sa *windows.RawSockaddrInet6, addrPort netip.AddrPort) {
80+
sa.Family = windows.AF_INET6
81+
port := addrPort.Port()
82+
p := (*[2]byte)(unsafe.Pointer(&sa.Port))
83+
p[0] = byte(port >> 8)
84+
p[1] = byte(port)
85+
addr := addrPort.Addr()
86+
sa.Addr = addr.As16()
87+
sa.Scope_id = uint32(netx.ZoneCache.Index(addr.Zone()))
10888
}
10989

11090
func SockaddrToAddrPort(name *byte, namelen uint32) (netip.AddrPort, error) {

service/udp_nat_mmsg.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ main:
456456

457457
qpvec[count] = queuedPacket
458458
dapvec[count] = destAddrPort
459-
namevec[count] = conn.AddrPortToSockaddrInet6(destAddrPort)
459+
conn.SockaddrInet6PutAddrPort(&namevec[count], destAddrPort)
460460
iovec[count].Base = &queuedPacket.buf[packetStart]
461461
iovec[count].SetLen(packetLength)
462462
count++

service/udp_session_mmsg.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ main:
513513

514514
qpvec[count] = queuedPacket
515515
dapvec[count] = destAddrPort
516-
namevec[count] = conn.AddrPortToSockaddrInet6(destAddrPort)
516+
conn.SockaddrInet6PutAddrPort(&namevec[count], destAddrPort)
517517
iovec[count].Base = &queuedPacket.buf[packetStart]
518518
iovec[count].SetLen(packetLength)
519519
count++
@@ -609,7 +609,11 @@ func (s *UDPSessionRelay) relayNatConnToServerConnSendmmsg(downlink sessionDownl
609609
burstBatchSize int
610610
)
611611

612-
rsa6, namelen := conn.AddrPortToSockaddrValue(clientAddrPort)
612+
var (
613+
name unix.RawSockaddrInet6
614+
namelen uint32
615+
)
616+
conn.SockaddrPutAddrPort(&name, &namelen, clientAddrPort)
613617
savec := make([]unix.RawSockaddrInet6, downlink.relayBatchSize)
614618
bufvec := make([][]byte, downlink.relayBatchSize)
615619
riovec := make([]unix.Iovec, downlink.relayBatchSize)
@@ -629,7 +633,7 @@ func (s *UDPSessionRelay) relayNatConnToServerConnSendmmsg(downlink sessionDownl
629633
rmsgvec[i].Msghdr.Iov = &riovec[i]
630634
rmsgvec[i].Msghdr.SetIovlen(1)
631635

632-
smsgvec[i].Msghdr.Name = (*byte)(unsafe.Pointer(&rsa6))
636+
smsgvec[i].Msghdr.Name = (*byte)(unsafe.Pointer(&name))
633637
smsgvec[i].Msghdr.Namelen = namelen
634638
smsgvec[i].Msghdr.Iov = &siovec[i]
635639
smsgvec[i].Msghdr.SetIovlen(1)
@@ -659,7 +663,7 @@ func (s *UDPSessionRelay) relayNatConnToServerConnSendmmsg(downlink sessionDownl
659663
clientAddrPort = caip.addrPort
660664
clientPktinfo = caip.pktinfo
661665
maxClientPacketSize = zerocopy.MaxPacketSizeForAddr(s.mtu, clientAddrPort.Addr())
662-
rsa6, _ = conn.AddrPortToSockaddrValue(clientAddrPort) // namelen won't change
666+
conn.SockaddrPutAddrPort(&name, &namelen, clientAddrPort) // namelen won't change
663667

664668
for i := range smsgvec {
665669
smsgvec[i].Msghdr.Control = unsafe.SliceData(clientPktinfo)

0 commit comments

Comments
 (0)