@@ -18,13 +18,47 @@ import (
18
18
"golang.org/x/sys/unix"
19
19
)
20
20
21
+ func setSrc (ep * StdNetEndpoint , addr netip.Addr , ifidx int32 ) {
22
+ var buf []byte
23
+ if addr .Is4 () {
24
+ buf = make ([]byte , unix .CmsgSpace (unix .SizeofInet4Pktinfo ))
25
+ hdr := unix.Cmsghdr {
26
+ Level : unix .IPPROTO_IP ,
27
+ Type : unix .IP_PKTINFO ,
28
+ }
29
+ hdr .SetLen (unix .CmsgLen (unix .SizeofInet4Pktinfo ))
30
+ copy (buf , unsafe .Slice ((* byte )(unsafe .Pointer (& hdr )), int (unsafe .Sizeof (hdr ))))
31
+
32
+ info := unix.Inet4Pktinfo {
33
+ Ifindex : ifidx ,
34
+ Spec_dst : addr .As4 (),
35
+ }
36
+ copy (buf [unix .CmsgLen (0 ):], unsafe .Slice ((* byte )(unsafe .Pointer (& info )), unix .SizeofInet4Pktinfo ))
37
+ } else {
38
+ buf = make ([]byte , unix .CmsgSpace (unix .SizeofInet6Pktinfo ))
39
+ hdr := unix.Cmsghdr {
40
+ Level : unix .IPPROTO_IPV6 ,
41
+ Type : unix .IPV6_PKTINFO ,
42
+ }
43
+ hdr .SetLen (unix .CmsgLen (unix .SizeofInet6Pktinfo ))
44
+ copy (buf , unsafe .Slice ((* byte )(unsafe .Pointer (& hdr )), int (unsafe .Sizeof (hdr ))))
45
+
46
+ info := unix.Inet6Pktinfo {
47
+ Ifindex : uint32 (ifidx ),
48
+ Addr : addr .As16 (),
49
+ }
50
+ copy (buf [unix .CmsgLen (0 ):], unsafe .Slice ((* byte )(unsafe .Pointer (& info )), unix .SizeofInet6Pktinfo ))
51
+ }
52
+
53
+ ep .src = buf
54
+ }
55
+
21
56
func Test_setSrcControl (t * testing.T ) {
22
57
t .Run ("IPv4" , func (t * testing.T ) {
23
58
ep := & StdNetEndpoint {
24
59
AddrPort : netip .MustParseAddrPort ("127.0.0.1:1234" ),
25
60
}
26
- ep .src .Addr = netip .MustParseAddr ("127.0.0.1" )
27
- ep .src .ifidx = 5
61
+ setSrc (ep , netip .MustParseAddr ("127.0.0.1" ), 5 )
28
62
29
63
control := make ([]byte , srcControlSize )
30
64
@@ -53,8 +87,7 @@ func Test_setSrcControl(t *testing.T) {
53
87
ep := & StdNetEndpoint {
54
88
AddrPort : netip .MustParseAddrPort ("[::1]:1234" ),
55
89
}
56
- ep .src .Addr = netip .MustParseAddr ("::1" )
57
- ep .src .ifidx = 5
90
+ setSrc (ep , netip .MustParseAddr ("::1" ), 5 )
58
91
59
92
control := make ([]byte , srcControlSize )
60
93
@@ -80,7 +113,7 @@ func Test_setSrcControl(t *testing.T) {
80
113
})
81
114
82
115
t .Run ("ClearOnNoSrc" , func (t * testing.T ) {
83
- control := make ([]byte , srcControlSize )
116
+ control := make ([]byte , unix . CmsgLen ( 0 ) )
84
117
hdr := (* unix .Cmsghdr )(unsafe .Pointer (& control [0 ]))
85
118
hdr .Level = 1
86
119
hdr .Type = 2
@@ -96,7 +129,7 @@ func Test_setSrcControl(t *testing.T) {
96
129
97
130
func Test_getSrcFromControl (t * testing.T ) {
98
131
t .Run ("IPv4" , func (t * testing.T ) {
99
- control := make ([]byte , srcControlSize )
132
+ control := make ([]byte , unix . CmsgSpace ( unix . SizeofInet4Pktinfo ) )
100
133
hdr := (* unix .Cmsghdr )(unsafe .Pointer (& control [0 ]))
101
134
hdr .Level = unix .IPPROTO_IP
102
135
hdr .Type = unix .IP_PKTINFO
@@ -108,15 +141,15 @@ func Test_getSrcFromControl(t *testing.T) {
108
141
ep := & StdNetEndpoint {}
109
142
getSrcFromControl (control , ep )
110
143
111
- if ep .src . Addr != netip .MustParseAddr ("127.0.0.1" ) {
112
- t .Errorf ("unexpected address: %v" , ep .src . Addr )
144
+ if ep .SrcIP () != netip .MustParseAddr ("127.0.0.1" ) {
145
+ t .Errorf ("unexpected address: %v" , ep .SrcIP () )
113
146
}
114
- if ep .src . ifidx != 5 {
115
- t .Errorf ("unexpected ifindex: %d" , ep .src . ifidx )
147
+ if ep .SrcIfidx () != 5 {
148
+ t .Errorf ("unexpected ifindex: %d" , ep .SrcIfidx () )
116
149
}
117
150
})
118
151
t .Run ("IPv6" , func (t * testing.T ) {
119
- control := make ([]byte , srcControlSize )
152
+ control := make ([]byte , unix . CmsgSpace ( unix . SizeofInet6Pktinfo ) )
120
153
hdr := (* unix .Cmsghdr )(unsafe .Pointer (& control [0 ]))
121
154
hdr .Level = unix .IPPROTO_IPV6
122
155
hdr .Type = unix .IPV6_PKTINFO
@@ -131,30 +164,29 @@ func Test_getSrcFromControl(t *testing.T) {
131
164
if ep .SrcIP () != netip .MustParseAddr ("::1" ) {
132
165
t .Errorf ("unexpected address: %v" , ep .SrcIP ())
133
166
}
134
- if ep .src . ifidx != 5 {
135
- t .Errorf ("unexpected ifindex: %d" , ep .src . ifidx )
167
+ if ep .SrcIfidx () != 5 {
168
+ t .Errorf ("unexpected ifindex: %d" , ep .SrcIfidx () )
136
169
}
137
170
})
138
171
t .Run ("ClearOnEmpty" , func (t * testing.T ) {
139
- control := make ( []byte , srcControlSize )
172
+ var control []byte
140
173
ep := & StdNetEndpoint {}
141
- ep .src .Addr = netip .MustParseAddr ("::1" )
142
- ep .src .ifidx = 5
174
+ setSrc (ep , netip .MustParseAddr ("::1" ), 5 )
143
175
144
176
getSrcFromControl (control , ep )
145
177
if ep .SrcIP ().IsValid () {
146
- t .Errorf ("unexpected address: %v" , ep .src . Addr )
178
+ t .Errorf ("unexpected address: %v" , ep .SrcIP () )
147
179
}
148
- if ep .src . ifidx != 0 {
149
- t .Errorf ("unexpected ifindex: %d" , ep .src . ifidx )
180
+ if ep .SrcIfidx () != 0 {
181
+ t .Errorf ("unexpected ifindex: %d" , ep .SrcIfidx () )
150
182
}
151
183
})
152
184
t .Run ("Multiple" , func (t * testing.T ) {
153
185
zeroControl := make ([]byte , unix .CmsgSpace (0 ))
154
186
zeroHdr := (* unix .Cmsghdr )(unsafe .Pointer (& zeroControl [0 ]))
155
187
zeroHdr .SetLen (unix .CmsgLen (0 ))
156
188
157
- control := make ([]byte , srcControlSize )
189
+ control := make ([]byte , unix . CmsgSpace ( unix . SizeofInet4Pktinfo ) )
158
190
hdr := (* unix .Cmsghdr )(unsafe .Pointer (& control [0 ]))
159
191
hdr .Level = unix .IPPROTO_IP
160
192
hdr .Type = unix .IP_PKTINFO
@@ -170,11 +202,11 @@ func Test_getSrcFromControl(t *testing.T) {
170
202
ep := & StdNetEndpoint {}
171
203
getSrcFromControl (combined , ep )
172
204
173
- if ep .src . Addr != netip .MustParseAddr ("127.0.0.1" ) {
174
- t .Errorf ("unexpected address: %v" , ep .src . Addr )
205
+ if ep .SrcIP () != netip .MustParseAddr ("127.0.0.1" ) {
206
+ t .Errorf ("unexpected address: %v" , ep .SrcIP () )
175
207
}
176
- if ep .src . ifidx != 5 {
177
- t .Errorf ("unexpected ifindex: %d" , ep .src . ifidx )
208
+ if ep .SrcIfidx () != 5 {
209
+ t .Errorf ("unexpected ifindex: %d" , ep .SrcIfidx () )
178
210
}
179
211
})
180
212
}
0 commit comments