summaryrefslogtreecommitdiffhomepage
path: root/pkg/tcpip/transport/internal
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2021-09-14 23:51:43 +0000
committergVisor bot <gvisor-bot@google.com>2021-09-14 23:51:43 +0000
commit0b41b6b22dce67a32d16db90dd25a419ec36e690 (patch)
tree1e0b712514fd091fada7bb4fb5eb32c9111b9a42 /pkg/tcpip/transport/internal
parentbc8649720ff020c7c40825792c94ab9448053749 (diff)
parent8d14edb14b6b757f049faf760c72d58616903d7a (diff)
Merge release-20210906.0-20-g8d14edb14 (automated)
Diffstat (limited to 'pkg/tcpip/transport/internal')
-rw-r--r--pkg/tcpip/transport/internal/network/endpoint.go23
-rw-r--r--pkg/tcpip/transport/internal/network/network_state_autogen.go47
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 {