@@ -74,7 +74,7 @@ type afWinRingBind struct {
74
74
type WinRingBind struct {
75
75
v4 , v6 afWinRingBind
76
76
mu sync.RWMutex
77
- isOpen uint32
77
+ isOpen atomic. Uint32 // 0, 1, or 2
78
78
}
79
79
80
80
func NewDefaultBind () Bind { return NewWinRingBind () }
@@ -212,7 +212,7 @@ func (bind *afWinRingBind) CloseAndZero() {
212
212
}
213
213
214
214
func (bind * WinRingBind ) closeAndZero () {
215
- atomic . StoreUint32 ( & bind .isOpen , 0 )
215
+ bind .isOpen . Store ( 0 )
216
216
bind .v4 .CloseAndZero ()
217
217
bind .v6 .CloseAndZero ()
218
218
}
@@ -276,7 +276,7 @@ func (bind *WinRingBind) Open(port uint16) (recvFns []ReceiveFunc, selectedPort
276
276
bind .closeAndZero ()
277
277
}
278
278
}()
279
- if atomic . LoadUint32 ( & bind .isOpen ) != 0 {
279
+ if bind .isOpen . Load ( ) != 0 {
280
280
return nil , 0 , ErrBindAlreadyOpen
281
281
}
282
282
var sa windows.Sockaddr
@@ -299,17 +299,17 @@ func (bind *WinRingBind) Open(port uint16) (recvFns []ReceiveFunc, selectedPort
299
299
return nil , 0 , err
300
300
}
301
301
}
302
- atomic . StoreUint32 ( & bind .isOpen , 1 )
302
+ bind .isOpen . Store ( 1 )
303
303
return []ReceiveFunc {bind .receiveIPv4 , bind .receiveIPv6 }, selectedPort , err
304
304
}
305
305
306
306
func (bind * WinRingBind ) Close () error {
307
307
bind .mu .RLock ()
308
- if atomic . LoadUint32 ( & bind .isOpen ) != 1 {
308
+ if bind .isOpen . Load ( ) != 1 {
309
309
bind .mu .RUnlock ()
310
310
return nil
311
311
}
312
- atomic . StoreUint32 ( & bind .isOpen , 2 )
312
+ bind .isOpen . Store ( 2 )
313
313
windows .PostQueuedCompletionStatus (bind .v4 .rx .iocp , 0 , 0 , nil )
314
314
windows .PostQueuedCompletionStatus (bind .v4 .tx .iocp , 0 , 0 , nil )
315
315
windows .PostQueuedCompletionStatus (bind .v6 .rx .iocp , 0 , 0 , nil )
@@ -345,8 +345,8 @@ func (bind *afWinRingBind) InsertReceiveRequest() error {
345
345
//go:linkname procyield runtime.procyield
346
346
func procyield (cycles uint32 )
347
347
348
- func (bind * afWinRingBind ) Receive (buf []byte , isOpen * uint32 ) (int , Endpoint , error ) {
349
- if atomic . LoadUint32 ( isOpen ) != 1 {
348
+ func (bind * afWinRingBind ) Receive (buf []byte , isOpen * atomic. Uint32 ) (int , Endpoint , error ) {
349
+ if isOpen . Load ( ) != 1 {
350
350
return 0 , nil , net .ErrClosed
351
351
}
352
352
bind .rx .mu .Lock ()
@@ -359,7 +359,7 @@ retry:
359
359
count = 0
360
360
for tries := 0 ; count == 0 && tries < receiveSpins ; tries ++ {
361
361
if tries > 0 {
362
- if atomic . LoadUint32 ( isOpen ) != 1 {
362
+ if isOpen . Load ( ) != 1 {
363
363
return 0 , nil , net .ErrClosed
364
364
}
365
365
procyield (1 )
@@ -378,7 +378,7 @@ retry:
378
378
if err != nil {
379
379
return 0 , nil , err
380
380
}
381
- if atomic . LoadUint32 ( isOpen ) != 1 {
381
+ if isOpen . Load ( ) != 1 {
382
382
return 0 , nil , net .ErrClosed
383
383
}
384
384
count = winrio .DequeueCompletion (bind .rx .cq , results [:])
@@ -395,7 +395,7 @@ retry:
395
395
// huge packets. Just try again when this happens. The infinite loop this could cause is still limited to
396
396
// attacker bandwidth, just like the rest of the receive path.
397
397
if windows .Errno (results [0 ].Status ) == windows .WSAEMSGSIZE {
398
- if atomic . LoadUint32 ( isOpen ) != 1 {
398
+ if isOpen . Load ( ) != 1 {
399
399
return 0 , nil , net .ErrClosed
400
400
}
401
401
goto retry
@@ -421,8 +421,8 @@ func (bind *WinRingBind) receiveIPv6(buf []byte) (int, Endpoint, error) {
421
421
return bind .v6 .Receive (buf , & bind .isOpen )
422
422
}
423
423
424
- func (bind * afWinRingBind ) Send (buf []byte , nend * WinRingEndpoint , isOpen * uint32 ) error {
425
- if atomic . LoadUint32 ( isOpen ) != 1 {
424
+ func (bind * afWinRingBind ) Send (buf []byte , nend * WinRingEndpoint , isOpen * atomic. Uint32 ) error {
425
+ if isOpen . Load ( ) != 1 {
426
426
return net .ErrClosed
427
427
}
428
428
if len (buf ) > bytesPerPacket {
@@ -444,7 +444,7 @@ func (bind *afWinRingBind) Send(buf []byte, nend *WinRingEndpoint, isOpen *uint3
444
444
if err != nil {
445
445
return err
446
446
}
447
- if atomic . LoadUint32 ( isOpen ) != 1 {
447
+ if isOpen . Load ( ) != 1 {
448
448
return net .ErrClosed
449
449
}
450
450
count = winrio .DequeueCompletion (bind .tx .cq , results [:])
@@ -538,7 +538,7 @@ func (bind *StdNetBind) BindSocketToInterface6(interfaceIndex uint32, blackhole
538
538
func (bind * WinRingBind ) BindSocketToInterface4 (interfaceIndex uint32 , blackhole bool ) error {
539
539
bind .mu .RLock ()
540
540
defer bind .mu .RUnlock ()
541
- if atomic . LoadUint32 ( & bind .isOpen ) != 1 {
541
+ if bind .isOpen . Load ( ) != 1 {
542
542
return net .ErrClosed
543
543
}
544
544
err := bindSocketToInterface4 (bind .v4 .sock , interfaceIndex )
@@ -552,7 +552,7 @@ func (bind *WinRingBind) BindSocketToInterface4(interfaceIndex uint32, blackhole
552
552
func (bind * WinRingBind ) BindSocketToInterface6 (interfaceIndex uint32 , blackhole bool ) error {
553
553
bind .mu .RLock ()
554
554
defer bind .mu .RUnlock ()
555
- if atomic . LoadUint32 ( & bind .isOpen ) != 1 {
555
+ if bind .isOpen . Load ( ) != 1 {
556
556
return net .ErrClosed
557
557
}
558
558
err := bindSocketToInterface6 (bind .v6 .sock , interfaceIndex )
0 commit comments