| 
					
				 | 
			
			
				@@ -25,6 +25,7 @@ type HostMap struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	sync.RWMutex    //Because we concurrently read and write to our maps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	name            string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Indexes         map[uint32]*HostInfo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	RemoteIndexes   map[uint32]*HostInfo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Hosts           map[uint32]*HostInfo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	preferredRanges []*net.IPNet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	vpnCIDR         *net.IPNet 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -77,9 +78,11 @@ type Probe struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func NewHostMap(name string, vpnCIDR *net.IPNet, preferredRanges []*net.IPNet) *HostMap { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	h := map[uint32]*HostInfo{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	i := map[uint32]*HostInfo{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	r := map[uint32]*HostInfo{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	m := HostMap{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		name:            name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Indexes:         i, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		RemoteIndexes:   r, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Hosts:           h, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		preferredRanges: preferredRanges, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		vpnCIDR:         vpnCIDR, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -94,10 +97,12 @@ func (hm *HostMap) EmitStats(name string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.RLock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hostLen := len(hm.Hosts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	indexLen := len(hm.Indexes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	remoteIndexLen := len(hm.RemoteIndexes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	metrics.GetOrRegisterGauge("hostmap."+name+".hosts", nil).Update(int64(hostLen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	metrics.GetOrRegisterGauge("hostmap."+name+".indexes", nil).Update(int64(indexLen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	metrics.GetOrRegisterGauge("hostmap."+name+".remoteIndexes", nil).Update(int64(remoteIndexLen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (hm *HostMap) GetIndexByVpnIP(vpnIP uint32) (uint32, error) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,17 +116,6 @@ func (hm *HostMap) GetIndexByVpnIP(vpnIP uint32) (uint32, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 0, errors.New("vpn IP not found") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (hm *HostMap) GetVpnIPByIndex(index uint32) (uint32, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	hm.RLock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if i, ok := hm.Indexes[index]; ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		vpnIP := i.hostId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return vpnIP, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return 0, errors.New("vpn IP not found") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (hm *HostMap) Add(ip uint32, hostinfo *HostInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.Lock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.Hosts[ip] = hostinfo 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -198,10 +192,26 @@ func (hm *HostMap) AddIndexHostInfo(index uint32, h *HostInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Only used by pendingHostMap when the remote index is not initially known 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (hm *HostMap) addRemoteIndexHostInfo(index uint32, h *HostInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.Lock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	h.remoteIndexId = index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.RemoteIndexes[index] = h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.Unlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if l.Level > logrus.DebugLevel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		l.WithField("hostMap", m{"mapName": hm.name, "indexNumber": index, "mapTotalSize": len(hm.Indexes), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"hostinfo": m{"existing": true, "localIndexId": h.localIndexId, "hostId": IntIp(h.hostId)}}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Debug("Hostmap remoteIndex added") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (hm *HostMap) AddVpnIPHostInfo(vpnIP uint32, h *HostInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.Lock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	h.hostId = vpnIP 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.Hosts[vpnIP] = h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.Indexes[h.localIndexId] = h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.RemoteIndexes[h.remoteIndexId] = h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.Unlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if l.Level > logrus.DebugLevel { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -225,6 +235,29 @@ func (hm *HostMap) DeleteIndex(index uint32) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (hm *HostMap) DeleteHostInfo(hostinfo *HostInfo) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.Lock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	delete(hm.Hosts, hostinfo.hostId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(hm.Hosts) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		hm.Hosts = map[uint32]*HostInfo{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	delete(hm.Indexes, hostinfo.localIndexId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(hm.Indexes) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		hm.Indexes = map[uint32]*HostInfo{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	delete(hm.RemoteIndexes, hostinfo.remoteIndexId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(hm.RemoteIndexes) == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		hm.RemoteIndexes = map[uint32]*HostInfo{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	hm.Unlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if l.Level >= logrus.DebugLevel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		l.WithField("hostMap", m{"mapName": hm.name, "mapTotalSize": len(hm.Hosts), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			"vpnIp": IntIp(hostinfo.hostId), "indexNumber": hostinfo.localIndexId, "remoteIndexNumber": hostinfo.remoteIndexId}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Debug("Hostmap hostInfo deleted") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (hm *HostMap) QueryIndex(index uint32) (*HostInfo, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	//TODO: we probably just want ot return bool instead of error, or at least a static error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.RLock() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -237,23 +270,15 @@ func (hm *HostMap) QueryIndex(index uint32) (*HostInfo, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// This function needs to range because we don't keep a map of remote indexes. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (hm *HostMap) QueryReverseIndex(index uint32) (*HostInfo, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	hm.RLock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, h := range hm.Indexes { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if h.ConnectionState != nil && h.remoteIndexId == index { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return h, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	for _, h := range hm.Hosts { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if h.ConnectionState != nil && h.remoteIndexId == index { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return h, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if h, ok := hm.RemoteIndexes[index]; ok { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return h, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil, fmt.Errorf("unable to find reverse index or connectionstate nil in %s hostmap", hm.name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	hm.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return nil, fmt.Errorf("unable to find reverse index or connectionstate nil in %s hostmap", hm.name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (hm *HostMap) AddRemote(vpnIp uint32, remote *udpAddr) *HostInfo { 
			 |