|
|
|
|
@ -241,13 +241,21 @@ func (ns *Impl) addSubnetAddress(ip netaddr.IP) { |
|
|
|
|
ns.mu.Unlock() |
|
|
|
|
// Only register address into netstack for first concurrent connection.
|
|
|
|
|
if needAdd { |
|
|
|
|
var pn tcpip.NetworkProtocolNumber |
|
|
|
|
pa := tcpip.ProtocolAddress{ |
|
|
|
|
AddressWithPrefix: tcpip.AddressWithPrefix{ |
|
|
|
|
Address: tcpip.Address(ip.IPAddr().IP), |
|
|
|
|
PrefixLen: int(ip.BitLen()), |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
if ip.Is4() { |
|
|
|
|
pn = ipv4.ProtocolNumber |
|
|
|
|
pa.Protocol = ipv4.ProtocolNumber |
|
|
|
|
} else if ip.Is6() { |
|
|
|
|
pn = ipv6.ProtocolNumber |
|
|
|
|
pa.Protocol = ipv6.ProtocolNumber |
|
|
|
|
} |
|
|
|
|
ns.ipstack.AddAddress(nicID, pn, tcpip.Address(ip.IPAddr().IP)) |
|
|
|
|
ns.ipstack.AddProtocolAddress(nicID, pa, stack.AddressProperties{ |
|
|
|
|
PEB: stack.CanBePrimaryEndpoint, // zero value default
|
|
|
|
|
ConfigType: stack.AddressConfigStatic, // zero value default
|
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -318,12 +326,19 @@ func (ns *Impl) updateIPs(nm *netmap.NetworkMap) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for ipp := range ipsToBeAdded { |
|
|
|
|
var err tcpip.Error |
|
|
|
|
pa := tcpip.ProtocolAddress{ |
|
|
|
|
AddressWithPrefix: ipp, |
|
|
|
|
} |
|
|
|
|
if ipp.Address.To4() == "" { |
|
|
|
|
err = ns.ipstack.AddAddressWithPrefix(nicID, ipv6.ProtocolNumber, ipp) |
|
|
|
|
pa.Protocol = ipv6.ProtocolNumber |
|
|
|
|
} else { |
|
|
|
|
err = ns.ipstack.AddAddressWithPrefix(nicID, ipv4.ProtocolNumber, ipp) |
|
|
|
|
pa.Protocol = ipv4.ProtocolNumber |
|
|
|
|
} |
|
|
|
|
var err tcpip.Error |
|
|
|
|
err = ns.ipstack.AddProtocolAddress(nicID, pa, stack.AddressProperties{ |
|
|
|
|
PEB: stack.CanBePrimaryEndpoint, // zero value default
|
|
|
|
|
ConfigType: stack.AddressConfigStatic, // zero value default
|
|
|
|
|
}) |
|
|
|
|
if err != nil { |
|
|
|
|
ns.logf("netstack: could not register IP %s: %v", ipp, err) |
|
|
|
|
} else { |
|
|
|
|
@ -572,8 +587,8 @@ func (ns *Impl) forwardTCP(client *gonet.TCPConn, clientRemoteIP netaddr.IP, wq |
|
|
|
|
|
|
|
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
|
|
defer cancel() |
|
|
|
|
waitEntry, notifyCh := waiter.NewChannelEntry(nil) |
|
|
|
|
wq.EventRegister(&waitEntry, waiter.EventHUp) |
|
|
|
|
waitEntry, notifyCh := waiter.NewChannelEntry(waiter.EventHUp) // TODO(bradfitz): right EventMask?
|
|
|
|
|
wq.EventRegister(&waitEntry) |
|
|
|
|
defer wq.EventUnregister(&waitEntry) |
|
|
|
|
done := make(chan bool) |
|
|
|
|
// netstack doesn't close the notification channel automatically if there was no
|
|
|
|
|
|