|
|
|
|
@ -333,7 +333,7 @@ func (ns *Impl) UpdateNetstackIPs(nm *netmap.NetworkMap) { |
|
|
|
|
ns.atomicIsLocalIPFunc.Store(tsaddr.FalseContainsIPFunc()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
oldIPs := make(map[netip.Prefix]bool) |
|
|
|
|
oldPfx := make(map[netip.Prefix]bool) |
|
|
|
|
for _, protocolAddr := range ns.ipstack.AllAddresses()[nicID] { |
|
|
|
|
ap := protocolAddr.AddressWithPrefix |
|
|
|
|
ip := netaddrIPFromNetstackIP(ap.Address) |
|
|
|
|
@ -343,71 +343,77 @@ func (ns *Impl) UpdateNetstackIPs(nm *netmap.NetworkMap) { |
|
|
|
|
// ours to delete.
|
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
oldIPs[netip.PrefixFrom(ip, ap.PrefixLen)] = true |
|
|
|
|
p := netip.PrefixFrom(ip, ap.PrefixLen) |
|
|
|
|
oldPfx[p] = true |
|
|
|
|
} |
|
|
|
|
newIPs := make(map[netip.Prefix]bool) |
|
|
|
|
newPfx := make(map[netip.Prefix]bool) |
|
|
|
|
|
|
|
|
|
if selfNode.Valid() { |
|
|
|
|
for i := range selfNode.Addresses().LenIter() { |
|
|
|
|
ipp := selfNode.Addresses().At(i) |
|
|
|
|
newIPs[ipp] = true |
|
|
|
|
p := selfNode.Addresses().At(i) |
|
|
|
|
newPfx[p] = true |
|
|
|
|
} |
|
|
|
|
if ns.ProcessSubnets { |
|
|
|
|
for i := range selfNode.AllowedIPs().LenIter() { |
|
|
|
|
ipp := selfNode.AllowedIPs().At(i) |
|
|
|
|
newIPs[ipp] = true |
|
|
|
|
p := selfNode.AllowedIPs().At(i) |
|
|
|
|
newPfx[p] = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ipsToBeAdded := make(map[netip.Prefix]bool) |
|
|
|
|
for ipp := range newIPs { |
|
|
|
|
if !oldIPs[ipp] { |
|
|
|
|
ipsToBeAdded[ipp] = true |
|
|
|
|
pfxToAdd := make(map[netip.Prefix]bool) |
|
|
|
|
for p := range newPfx { |
|
|
|
|
if !oldPfx[p] { |
|
|
|
|
pfxToAdd[p] = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
ipsToBeRemoved := make(map[netip.Prefix]bool) |
|
|
|
|
for ip := range oldIPs { |
|
|
|
|
if !newIPs[ip] { |
|
|
|
|
ipsToBeRemoved[ip] = true |
|
|
|
|
pfxToRemove := make(map[netip.Prefix]bool) |
|
|
|
|
for p := range oldPfx { |
|
|
|
|
if !newPfx[p] { |
|
|
|
|
pfxToRemove[p] = true |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
ns.mu.Lock() |
|
|
|
|
for ip := range ns.connsOpenBySubnetIP { |
|
|
|
|
delete(ipsToBeRemoved, netip.PrefixFrom(ip, ip.BitLen())) |
|
|
|
|
// TODO(maisem): this looks like a bug, remove or document. It seems as
|
|
|
|
|
// though we might end up either leaking the address on the netstack
|
|
|
|
|
// NIC, or where we do accounting for connsOpenBySubnetIP from 1 to 0,
|
|
|
|
|
// we might end up removing the address from the netstack NIC that was
|
|
|
|
|
// still being advertised.
|
|
|
|
|
delete(pfxToRemove, netip.PrefixFrom(ip, ip.BitLen())) |
|
|
|
|
} |
|
|
|
|
ns.mu.Unlock() |
|
|
|
|
|
|
|
|
|
for ipp := range ipsToBeRemoved { |
|
|
|
|
err := ns.ipstack.RemoveAddress(nicID, tcpip.AddrFromSlice(ipp.Addr().AsSlice())) |
|
|
|
|
for p := range pfxToRemove { |
|
|
|
|
err := ns.ipstack.RemoveAddress(nicID, tcpip.AddrFromSlice(p.Addr().AsSlice())) |
|
|
|
|
if err != nil { |
|
|
|
|
ns.logf("netstack: could not deregister IP %s: %v", ipp, err) |
|
|
|
|
ns.logf("netstack: could not deregister IP %s: %v", p, err) |
|
|
|
|
} else { |
|
|
|
|
ns.logf("[v2] netstack: deregistered IP %s", ipp) |
|
|
|
|
ns.logf("[v2] netstack: deregistered IP %s", p) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for ipp := range ipsToBeAdded { |
|
|
|
|
if !ipp.IsValid() { |
|
|
|
|
ns.logf("netstack: [unexpected] skipping invalid IP (%v/%v)", ipp.Addr(), ipp.Bits()) |
|
|
|
|
for p := range pfxToAdd { |
|
|
|
|
if !p.IsValid() { |
|
|
|
|
ns.logf("netstack: [unexpected] skipping invalid IP (%v/%v)", p.Addr(), p.Bits()) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
pa := tcpip.ProtocolAddress{ |
|
|
|
|
AddressWithPrefix: ipPrefixToAddressWithPrefix(ipp), |
|
|
|
|
tcpAddr := tcpip.ProtocolAddress{ |
|
|
|
|
AddressWithPrefix: ipPrefixToAddressWithPrefix(p), |
|
|
|
|
} |
|
|
|
|
if ipp.Addr().Is6() { |
|
|
|
|
pa.Protocol = ipv6.ProtocolNumber |
|
|
|
|
if p.Addr().Is6() { |
|
|
|
|
tcpAddr.Protocol = ipv6.ProtocolNumber |
|
|
|
|
} else { |
|
|
|
|
pa.Protocol = ipv4.ProtocolNumber |
|
|
|
|
tcpAddr.Protocol = ipv4.ProtocolNumber |
|
|
|
|
} |
|
|
|
|
var tcpErr tcpip.Error // not error
|
|
|
|
|
tcpErr = ns.ipstack.AddProtocolAddress(nicID, pa, stack.AddressProperties{ |
|
|
|
|
tcpErr = ns.ipstack.AddProtocolAddress(nicID, tcpAddr, stack.AddressProperties{ |
|
|
|
|
PEB: stack.CanBePrimaryEndpoint, // zero value default
|
|
|
|
|
ConfigType: stack.AddressConfigStatic, // zero value default
|
|
|
|
|
}) |
|
|
|
|
if tcpErr != nil { |
|
|
|
|
ns.logf("netstack: could not register IP %s: %v", ipp, tcpErr) |
|
|
|
|
ns.logf("netstack: could not register IP %s: %v", p, tcpErr) |
|
|
|
|
} else { |
|
|
|
|
ns.logf("[v2] netstack: registered IP %s", ipp) |
|
|
|
|
ns.logf("[v2] netstack: registered IP %s", p) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|