@@ -53,6 +53,8 @@ type StdNetBind struct {
53
53
connect connector
54
54
mh * multihost.MH
55
55
56
+ reserved []byte // overwrite the 3 wg reserved bytes
57
+
56
58
mu sync.Mutex // protects following fields
57
59
ipv4 * net.UDPConn
58
60
ipv6 * net.UDPConn
@@ -63,8 +65,9 @@ type StdNetBind struct {
63
65
lastSendAddr netip.AddrPort // may be invalid
64
66
}
65
67
66
- func NewEndpoint (id string , d connector , ep * multihost.MH , f rwlistener ) * StdNetBind {
67
- return & StdNetBind {id : id , connect : d , mh : ep , listener : f }
68
+ // TODO: get d, ep, f, rb through an Opts bag?
69
+ func NewEndpoint (id string , d connector , ep * multihost.MH , f rwlistener , rb [3 ]byte ) * StdNetBind {
70
+ return & StdNetBind {id : id , connect : d , mh : ep , listener : f , reserved : rb [:3 ]}
68
71
}
69
72
70
73
type StdNetEndpoint netip.AddrPort
@@ -308,6 +311,7 @@ func (s *StdNetBind) Send(buf [][]byte, peer conn.Endpoint) (err error) {
308
311
}
309
312
s .mu .Unlock ()
310
313
314
+ var overwriteReserved = s .overwriteReserved ()
311
315
var nn int
312
316
var errs error
313
317
for _ , data := range buf {
@@ -322,6 +326,13 @@ func (s *StdNetBind) Send(buf [][]byte, peer conn.Endpoint) (err error) {
322
326
return syscall .EAFNOSUPPORT
323
327
}
324
328
329
+ // from: github.com/bepass-org/warp-plus/blob/19ac233cc6/wireguard/device/peer.go#L138
330
+ if overwriteReserved {
331
+ if len (data ) > 3 && data [0 ] > 0 && data [0 ] < 5 {
332
+ copy (data [1 :4 ], s .reserved )
333
+ }
334
+ }
335
+
325
336
s .lastSendAddr = dst
326
337
327
338
extend (uc , wgtimeout )
@@ -331,10 +342,18 @@ func (s *StdNetBind) Send(buf [][]byte, peer conn.Endpoint) (err error) {
331
342
nn += n
332
343
}
333
344
334
- loge (err , "wg: bind: send: %s addr(%v) parcels(%d) tx(%d); err? %v" , s .id , dst , len (buf ), nn , errs )
345
+ loge (err , "wg: bind: send: %s addr(%v) parcels(%d) tx(%d) overwrite(%t); err? %v" ,
346
+ s .id , dst , len (buf ), nn , overwriteReserved , errs )
335
347
return err
336
348
}
337
349
350
+ func (s * StdNetBind ) overwriteReserved () bool {
351
+ return len (s .reserved ) == 3 &&
352
+ s .reserved [0 ] != 0 ||
353
+ s .reserved [1 ] != 0 ||
354
+ s .reserved [2 ] != 0
355
+ }
356
+
338
357
func (s * StdNetBind ) BatchSize () int {
339
358
return 1
340
359
}
0 commit comments