mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	clean up unused old session maps
This commit is contained in:
		
							parent
							
								
									c808be514f
								
							
						
					
					
						commit
						e7cb76cea3
					
				
					 1 changed files with 1 additions and 59 deletions
				
			
		| 
						 | 
				
			
			@ -118,12 +118,8 @@ type sessions struct {
 | 
			
		|||
	isAllowedHandler func(pubkey *crypto.BoxPubKey, initiator bool) bool // Returns true or false if session setup is allowed
 | 
			
		||||
	isAllowedMutex   sync.RWMutex                                        // Protects the above
 | 
			
		||||
	permShared       map[crypto.BoxPubKey]*crypto.BoxSharedKey           // Maps known permanent keys to their shared key, used by DHT a lot
 | 
			
		||||
	sinfos           map[crypto.Handle]*sessionInfo                      // Maps (secret) handle onto session info
 | 
			
		||||
	conns            map[crypto.Handle]*Conn                             // Maps (secret) handle onto connections
 | 
			
		||||
	byMySes          map[crypto.BoxPubKey]*crypto.Handle                 // Maps mySesPub onto handle
 | 
			
		||||
	sinfos           map[crypto.Handle]*sessionInfo                      // Maps handle onto session info
 | 
			
		||||
	byTheirPerm      map[crypto.BoxPubKey]*crypto.Handle                 // Maps theirPermPub onto handle
 | 
			
		||||
	addrToPerm       map[address.Address]*crypto.BoxPubKey
 | 
			
		||||
	subnetToPerm     map[address.Subnet]*crypto.BoxPubKey
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Initializes the session struct.
 | 
			
		||||
| 
						 | 
				
			
			@ -149,10 +145,7 @@ func (ss *sessions) init(core *Core) {
 | 
			
		|||
	}()
 | 
			
		||||
	ss.permShared = make(map[crypto.BoxPubKey]*crypto.BoxSharedKey)
 | 
			
		||||
	ss.sinfos = make(map[crypto.Handle]*sessionInfo)
 | 
			
		||||
	ss.byMySes = make(map[crypto.BoxPubKey]*crypto.Handle)
 | 
			
		||||
	ss.byTheirPerm = make(map[crypto.BoxPubKey]*crypto.Handle)
 | 
			
		||||
	ss.addrToPerm = make(map[address.Address]*crypto.BoxPubKey)
 | 
			
		||||
	ss.subnetToPerm = make(map[address.Subnet]*crypto.BoxPubKey)
 | 
			
		||||
	ss.lastCleanup = time.Now()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -175,16 +168,6 @@ func (ss *sessions) getSessionForHandle(handle *crypto.Handle) (*sessionInfo, bo
 | 
			
		|||
	return sinfo, isIn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets a session corresponding to an ephemeral session key used by this node.
 | 
			
		||||
func (ss *sessions) getByMySes(key *crypto.BoxPubKey) (*sessionInfo, bool) {
 | 
			
		||||
	h, isIn := ss.byMySes[*key]
 | 
			
		||||
	if !isIn {
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
	sinfo, isIn := ss.getSessionForHandle(h)
 | 
			
		||||
	return sinfo, isIn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets a session corresponding to a permanent key used by the remote node.
 | 
			
		||||
func (ss *sessions) getByTheirPerm(key *crypto.BoxPubKey) (*sessionInfo, bool) {
 | 
			
		||||
	h, isIn := ss.byTheirPerm[*key]
 | 
			
		||||
| 
						 | 
				
			
			@ -195,26 +178,6 @@ func (ss *sessions) getByTheirPerm(key *crypto.BoxPubKey) (*sessionInfo, bool) {
 | 
			
		|||
	return sinfo, isIn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets a session corresponding to an IPv6 address used by the remote node.
 | 
			
		||||
func (ss *sessions) getByTheirAddr(addr *address.Address) (*sessionInfo, bool) {
 | 
			
		||||
	p, isIn := ss.addrToPerm[*addr]
 | 
			
		||||
	if !isIn {
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
	sinfo, isIn := ss.getByTheirPerm(p)
 | 
			
		||||
	return sinfo, isIn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Gets a session corresponding to an IPv6 /64 subnet used by the remote node/network.
 | 
			
		||||
func (ss *sessions) getByTheirSubnet(snet *address.Subnet) (*sessionInfo, bool) {
 | 
			
		||||
	p, isIn := ss.subnetToPerm[*snet]
 | 
			
		||||
	if !isIn {
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
	sinfo, isIn := ss.getByTheirPerm(p)
 | 
			
		||||
	return sinfo, isIn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Creates a new session and lazily cleans up old existing sessions. This
 | 
			
		||||
// includse initializing session info to sane defaults (e.g. lowest supported
 | 
			
		||||
// MTU).
 | 
			
		||||
| 
						 | 
				
			
			@ -263,10 +226,7 @@ func (ss *sessions) createSession(theirPermKey *crypto.BoxPubKey) *sessionInfo {
 | 
			
		|||
	sinfo.worker = make(chan func(), 1)
 | 
			
		||||
	sinfo.recv = make(chan *wire_trafficPacket, 32)
 | 
			
		||||
	ss.sinfos[sinfo.myHandle] = &sinfo
 | 
			
		||||
	ss.byMySes[sinfo.mySesPub] = &sinfo.myHandle
 | 
			
		||||
	ss.byTheirPerm[sinfo.theirPermPub] = &sinfo.myHandle
 | 
			
		||||
	ss.addrToPerm[sinfo.theirAddr] = &sinfo.theirPermPub
 | 
			
		||||
	ss.subnetToPerm[sinfo.theirSubnet] = &sinfo.theirPermPub
 | 
			
		||||
	go sinfo.workerMain()
 | 
			
		||||
	return &sinfo
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -291,36 +251,18 @@ func (ss *sessions) cleanup() {
 | 
			
		|||
		sinfos[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	ss.sinfos = sinfos
 | 
			
		||||
	byMySes := make(map[crypto.BoxPubKey]*crypto.Handle, len(ss.byMySes))
 | 
			
		||||
	for k, v := range ss.byMySes {
 | 
			
		||||
		byMySes[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	ss.byMySes = byMySes
 | 
			
		||||
	byTheirPerm := make(map[crypto.BoxPubKey]*crypto.Handle, len(ss.byTheirPerm))
 | 
			
		||||
	for k, v := range ss.byTheirPerm {
 | 
			
		||||
		byTheirPerm[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	ss.byTheirPerm = byTheirPerm
 | 
			
		||||
	addrToPerm := make(map[address.Address]*crypto.BoxPubKey, len(ss.addrToPerm))
 | 
			
		||||
	for k, v := range ss.addrToPerm {
 | 
			
		||||
		addrToPerm[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	ss.addrToPerm = addrToPerm
 | 
			
		||||
	subnetToPerm := make(map[address.Subnet]*crypto.BoxPubKey, len(ss.subnetToPerm))
 | 
			
		||||
	for k, v := range ss.subnetToPerm {
 | 
			
		||||
		subnetToPerm[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	ss.subnetToPerm = subnetToPerm
 | 
			
		||||
	ss.lastCleanup = time.Now()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Closes a session, removing it from sessions maps and killing the worker goroutine.
 | 
			
		||||
func (sinfo *sessionInfo) close() {
 | 
			
		||||
	delete(sinfo.core.sessions.sinfos, sinfo.myHandle)
 | 
			
		||||
	delete(sinfo.core.sessions.byMySes, sinfo.mySesPub)
 | 
			
		||||
	delete(sinfo.core.sessions.byTheirPerm, sinfo.theirPermPub)
 | 
			
		||||
	delete(sinfo.core.sessions.addrToPerm, sinfo.theirAddr)
 | 
			
		||||
	delete(sinfo.core.sessions.subnetToPerm, sinfo.theirSubnet)
 | 
			
		||||
	close(sinfo.worker)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue