Skip to content
Snippets Groups Projects
client_manager.go 1.87 KiB
Newer Older
  • Learn to ignore specific revisions
  • package routingtable
    
    
    Oliver Herms's avatar
    Oliver Herms committed
    import (
    	"sync"
    )
    
    // ClientOptions represents options for a client
    type ClientOptions struct {
    	BestOnly bool
    	EcmpOnly bool
    	MaxPaths uint
    }
    
    // GetMaxPaths calculates the maximum amount of wanted paths given that ecmpPaths paths exist
    func (c *ClientOptions) GetMaxPaths(ecmpPaths uint) uint {
    	if c.BestOnly {
    		return 1
    	}
    
    	if c.EcmpOnly {
    		return ecmpPaths
    	}
    
    	return c.MaxPaths
    }
    
    
    // ClientManager manages clients of routing tables (observer pattern)
    
    type ClientManager struct {
    
    Oliver Herms's avatar
    Oliver Herms committed
    	clients map[RouteTableClient]ClientOptions
    
    Oliver Herms's avatar
    Oliver Herms committed
    	master  RouteTableClient
    
    Oliver Herms's avatar
    Oliver Herms committed
    	mu      sync.RWMutex
    
    }
    
    // NewClientManager creates and initializes a new client manager
    
    Oliver Herms's avatar
    Oliver Herms committed
    func NewClientManager(master RouteTableClient) ClientManager {
    
    Oliver Herms's avatar
    Oliver Herms committed
    		clients: make(map[RouteTableClient]ClientOptions, 0),
    
    Oliver Herms's avatar
    Oliver Herms committed
    		master:  master,
    
    Oliver Herms's avatar
    Oliver Herms committed
    // GetOptions gets the options for a registred client
    func (c *ClientManager) GetOptions(client RouteTableClient) ClientOptions {
    	c.mu.RLock()
    	defer c.mu.RUnlock()
    
    	return c.clients[client]
    }
    
    
    // Register registers a client for updates
    
    func (c *ClientManager) Register(client RouteTableClient) {
    
    Oliver Herms's avatar
    Oliver Herms committed
    	c.RegisterWithOptions(client, ClientOptions{BestOnly: true})
    }
    
    // RegisterWithOptions registers a client with options for updates
    func (c *ClientManager) RegisterWithOptions(client RouteTableClient, opt ClientOptions) {
    	c.mu.Lock()
    	defer c.mu.Unlock()
    
    	c.clients[client] = opt
    
    Oliver Herms's avatar
    Oliver Herms committed
    	c.master.UpdateNewClient(client)
    
    // Unregister unregisters a client
    
    func (c *ClientManager) Unregister(client RouteTableClient) {
    
    	c.mu.Lock()
    	defer c.mu.Unlock()
    
    	if _, ok := c.clients[client]; !ok {
    		return
    	}
    	delete(c.clients, client)
    }
    
    
    // Clients returns a list of registered clients
    
    Oliver Herms's avatar
    Oliver Herms committed
    func (c *ClientManager) Clients() []RouteTableClient {
    
    	c.mu.RLock()
    	defer c.mu.RUnlock()
    
    Oliver Herms's avatar
    Oliver Herms committed
    	ret := make([]RouteTableClient, 0)
    
    	for rtc := range c.clients {
    		ret = append(ret, rtc)
    	}
    
    	return ret
    }