diff options
author | gVisor bot <gvisor-bot@google.com> | 2021-09-14 23:51:43 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2021-09-14 23:51:43 +0000 |
commit | 0b41b6b22dce67a32d16db90dd25a419ec36e690 (patch) | |
tree | 1e0b712514fd091fada7bb4fb5eb32c9111b9a42 /pkg/tcpip/transport/internal | |
parent | bc8649720ff020c7c40825792c94ab9448053749 (diff) | |
parent | 8d14edb14b6b757f049faf760c72d58616903d7a (diff) |
Merge release-20210906.0-20-g8d14edb14 (automated)
Diffstat (limited to 'pkg/tcpip/transport/internal')
-rw-r--r-- | pkg/tcpip/transport/internal/network/endpoint.go | 23 | ||||
-rw-r--r-- | pkg/tcpip/transport/internal/network/network_state_autogen.go | 47 |
2 files changed, 43 insertions, 27 deletions
diff --git a/pkg/tcpip/transport/internal/network/endpoint.go b/pkg/tcpip/transport/internal/network/endpoint.go index c5b575e1c..09b629022 100644 --- a/pkg/tcpip/transport/internal/network/endpoint.go +++ b/pkg/tcpip/transport/internal/network/endpoint.go @@ -44,8 +44,9 @@ type Endpoint struct { state uint32 // The following fields are protected by mu. - mu sync.RWMutex `state:"nosave"` - info stack.TransportEndpointInfo + mu sync.RWMutex `state:"nosave"` + wasBound bool + info stack.TransportEndpointInfo // owner is the owner of transmitted packets. owner tcpip.PacketOwner writeShutdown bool @@ -248,6 +249,9 @@ func (e *Endpoint) AcquireContextForWrite(opts tcpip.WriteOptions) (WriteContext nicID = e.info.BindNICID } + if nicID == 0 { + nicID = e.info.RegisterNICID + } dst, netProto, err := e.checkV4MappedLocked(*opts.To) if err != nil { @@ -294,9 +298,9 @@ func (e *Endpoint) Disconnect() { } // Exclude ephemerally bound endpoints. - if e.info.BindNICID != 0 || e.info.ID.LocalAddress == "" { + if e.wasBound { e.info.ID = stack.TransportEndpointID{ - LocalAddress: e.info.ID.LocalAddress, + LocalAddress: e.info.BindAddr, } e.setEndpointState(transport.DatagramEndpointStateBound) } else { @@ -477,10 +481,12 @@ func (e *Endpoint) BindAndThen(addr tcpip.FullAddress, f func(tcpip.NetworkProto return err } + e.wasBound = true + e.info.ID = stack.TransportEndpointID{ LocalAddress: addr.Addr, } - e.info.BindNICID = nicID + e.info.BindNICID = addr.NIC e.info.RegisterNICID = nicID e.info.BindAddr = addr.Addr e.effectiveNetProto = netProto @@ -488,6 +494,13 @@ func (e *Endpoint) BindAndThen(addr tcpip.FullAddress, f func(tcpip.NetworkProto return nil } +// WasBound returns true iff the endpoint was ever bound. +func (e *Endpoint) WasBound() bool { + e.mu.RLock() + defer e.mu.RUnlock() + return e.wasBound +} + // GetLocalAddress returns the address that the endpoint is bound to. func (e *Endpoint) GetLocalAddress() tcpip.FullAddress { e.mu.RLock() diff --git a/pkg/tcpip/transport/internal/network/network_state_autogen.go b/pkg/tcpip/transport/internal/network/network_state_autogen.go index 0ce695bb8..f72149c1c 100644 --- a/pkg/tcpip/transport/internal/network/network_state_autogen.go +++ b/pkg/tcpip/transport/internal/network/network_state_autogen.go @@ -16,6 +16,7 @@ func (e *Endpoint) StateFields() []string { "netProto", "transProto", "state", + "wasBound", "info", "owner", "writeShutdown", @@ -39,17 +40,18 @@ func (e *Endpoint) StateSave(stateSinkObject state.Sink) { stateSinkObject.Save(1, &e.netProto) stateSinkObject.Save(2, &e.transProto) stateSinkObject.Save(3, &e.state) - stateSinkObject.Save(4, &e.info) - stateSinkObject.Save(5, &e.owner) - stateSinkObject.Save(6, &e.writeShutdown) - stateSinkObject.Save(7, &e.effectiveNetProto) - stateSinkObject.Save(8, &e.multicastMemberships) - stateSinkObject.Save(9, &e.ttl) - stateSinkObject.Save(10, &e.multicastTTL) - stateSinkObject.Save(11, &e.multicastAddr) - stateSinkObject.Save(12, &e.multicastNICID) - stateSinkObject.Save(13, &e.ipv4TOS) - stateSinkObject.Save(14, &e.ipv6TClass) + stateSinkObject.Save(4, &e.wasBound) + stateSinkObject.Save(5, &e.info) + stateSinkObject.Save(6, &e.owner) + stateSinkObject.Save(7, &e.writeShutdown) + stateSinkObject.Save(8, &e.effectiveNetProto) + stateSinkObject.Save(9, &e.multicastMemberships) + stateSinkObject.Save(10, &e.ttl) + stateSinkObject.Save(11, &e.multicastTTL) + stateSinkObject.Save(12, &e.multicastAddr) + stateSinkObject.Save(13, &e.multicastNICID) + stateSinkObject.Save(14, &e.ipv4TOS) + stateSinkObject.Save(15, &e.ipv6TClass) } func (e *Endpoint) afterLoad() {} @@ -60,17 +62,18 @@ func (e *Endpoint) StateLoad(stateSourceObject state.Source) { stateSourceObject.Load(1, &e.netProto) stateSourceObject.Load(2, &e.transProto) stateSourceObject.Load(3, &e.state) - stateSourceObject.Load(4, &e.info) - stateSourceObject.Load(5, &e.owner) - stateSourceObject.Load(6, &e.writeShutdown) - stateSourceObject.Load(7, &e.effectiveNetProto) - stateSourceObject.Load(8, &e.multicastMemberships) - stateSourceObject.Load(9, &e.ttl) - stateSourceObject.Load(10, &e.multicastTTL) - stateSourceObject.Load(11, &e.multicastAddr) - stateSourceObject.Load(12, &e.multicastNICID) - stateSourceObject.Load(13, &e.ipv4TOS) - stateSourceObject.Load(14, &e.ipv6TClass) + stateSourceObject.Load(4, &e.wasBound) + stateSourceObject.Load(5, &e.info) + stateSourceObject.Load(6, &e.owner) + stateSourceObject.Load(7, &e.writeShutdown) + stateSourceObject.Load(8, &e.effectiveNetProto) + stateSourceObject.Load(9, &e.multicastMemberships) + stateSourceObject.Load(10, &e.ttl) + stateSourceObject.Load(11, &e.multicastTTL) + stateSourceObject.Load(12, &e.multicastAddr) + stateSourceObject.Load(13, &e.multicastNICID) + stateSourceObject.Load(14, &e.ipv4TOS) + stateSourceObject.Load(15, &e.ipv6TClass) } func (m *multicastMembership) StateTypeName() string { |