summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pkg/tcpip/network/ipv6/ndp.go32
-rw-r--r--pkg/tcpip/stack/neighbor_entry.go38
2 files changed, 11 insertions, 59 deletions
diff --git a/pkg/tcpip/network/ipv6/ndp.go b/pkg/tcpip/network/ipv6/ndp.go
index a55330b7e..53c043dcd 100644
--- a/pkg/tcpip/network/ipv6/ndp.go
+++ b/pkg/tcpip/network/ipv6/ndp.go
@@ -466,20 +466,6 @@ type ndpState struct {
temporaryAddressDesyncFactor time.Duration
}
-type remainingCounter struct {
- mu struct {
- sync.Mutex
-
- remaining uint8
- }
-}
-
-func (r *remainingCounter) init(max uint8) {
- r.mu.Lock()
- defer r.mu.Unlock()
- r.mu.remaining = max
-}
-
// defaultRouterState holds data associated with a default router discovered by
// a Router Advertisement (RA).
type defaultRouterState struct {
@@ -1687,7 +1673,8 @@ func (ndp *ndpState) startSolicitingRouters() {
return
}
- if ndp.configs.MaxRtrSolicitations == 0 {
+ remaining := ndp.configs.MaxRtrSolicitations
+ if remaining == 0 {
return
}
@@ -1698,9 +1685,6 @@ func (ndp *ndpState) startSolicitingRouters() {
delay = time.Duration(rand.Int63n(int64(ndp.configs.MaxRtrSolicitationDelay)))
}
- var remaining remainingCounter
- remaining.init(ndp.configs.MaxRtrSolicitations)
-
// Protected by ndp.ep.mu.
done := false
@@ -1754,19 +1738,13 @@ func (ndp *ndpState) startSolicitingRouters() {
panic(fmt.Sprintf("failed to add IP header: %s", err))
}
- // Okay to hold this lock while writing packets since we use a different
- // lock per router solicitaiton timer so there will not be any lock
- // contention.
- remaining.mu.Lock()
- defer remaining.mu.Unlock()
-
if err := ndp.ep.nic.WritePacketToRemote(header.EthernetAddressFromMulticastIPv6Address(header.IPv6AllRoutersMulticastAddress), nil /* gso */, ProtocolNumber, pkt); err != nil {
sent.dropped.Increment()
// Don't send any more messages if we had an error.
- remaining.mu.remaining = 0
+ remaining = 0
} else {
sent.routerSolicit.Increment()
- remaining.mu.remaining--
+ remaining--
}
ndp.ep.mu.Lock()
@@ -1777,7 +1755,7 @@ func (ndp *ndpState) startSolicitingRouters() {
return
}
- if remaining.mu.remaining == 0 {
+ if remaining == 0 {
// We are done soliciting routers.
ndp.stopSolicitingRouters()
return
diff --git a/pkg/tcpip/stack/neighbor_entry.go b/pkg/tcpip/stack/neighbor_entry.go
index 78c6cb681..4ed149ee8 100644
--- a/pkg/tcpip/stack/neighbor_entry.go
+++ b/pkg/tcpip/stack/neighbor_entry.go
@@ -146,20 +146,6 @@ func newStaticNeighborEntry(cache *neighborCache, addr tcpip.Address, linkAddr t
return n
}
-type remainingCounter struct {
- mu struct {
- sync.Mutex
-
- remaining uint32
- }
-}
-
-func (r *remainingCounter) init(max uint32) {
- r.mu.Lock()
- defer r.mu.Unlock()
- r.mu.remaining = max
-}
-
// notifyCompletionLocked notifies those waiting for address resolution, with
// the link address if resolution completed successfully.
//
@@ -298,8 +284,7 @@ func (e *neighborEntry) setStateLocked(next NeighborState) {
// Protected by e.mu.
done := false
- var remaining remainingCounter
- remaining.init(config.MaxUnicastProbes)
+ remaining := config.MaxUnicastProbes
addr := e.mu.neigh.Addr
linkAddr := e.mu.neigh.LinkAddr
@@ -310,13 +295,8 @@ func (e *neighborEntry) setStateLocked(next NeighborState) {
e.mu.timer = timer{
done: &done,
timer: e.cache.nic.stack.Clock().AfterFunc(0, func() {
- // Okay to hold this lock while writing packets since we use a different
- // lock per probe timer so there will not be any lock contention.
- remaining.mu.Lock()
- defer remaining.mu.Unlock()
-
var err tcpip.Error
- timedoutResolution := remaining.mu.remaining == 0
+ timedoutResolution := remaining == 0
if !timedoutResolution {
err = e.cache.linkRes.LinkAddressRequest(addr, "" /* localAddr */, linkAddr)
}
@@ -335,7 +315,7 @@ func (e *neighborEntry) setStateLocked(next NeighborState) {
return
}
- remaining.mu.remaining--
+ remaining--
e.mu.timer.timer.Reset(config.RetransmitTimer)
}),
}
@@ -373,8 +353,7 @@ func (e *neighborEntry) handlePacketQueuedLocked(localAddr tcpip.Address) {
// Protected by e.mu.
done := false
- var remaining remainingCounter
- remaining.init(config.MaxMulticastProbes)
+ remaining := config.MaxMulticastProbes
addr := e.mu.neigh.Addr
// Send a probe in another gorountine to free this thread of execution
@@ -384,13 +363,8 @@ func (e *neighborEntry) handlePacketQueuedLocked(localAddr tcpip.Address) {
e.mu.timer = timer{
done: &done,
timer: e.cache.nic.stack.Clock().AfterFunc(0, func() {
- // Okay to hold this lock while writing packets since we use a different
- // lock per probe timer so there will not be any lock contention.
- remaining.mu.Lock()
- defer remaining.mu.Unlock()
-
var err tcpip.Error
- timedoutResolution := remaining.mu.remaining == 0
+ timedoutResolution := remaining == 0
if !timedoutResolution {
// As per RFC 4861 section 7.2.2:
//
@@ -416,7 +390,7 @@ func (e *neighborEntry) handlePacketQueuedLocked(localAddr tcpip.Address) {
return
}
- remaining.mu.remaining--
+ remaining--
e.mu.timer.timer.Reset(config.RetransmitTimer)
}),
}