| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | package localimport (	"net"	"github.com/gravitl/netmaker/netclient/ncutils"	"golang.zx2c4.com/wireguard/wgctrl/wgtypes")// TODO handle ipv6 in future// SetPeerRoutes - sets/removes ip routes for each peer on a networkfunc SetPeerRoutes(iface, currentNodeAddr string, oldPeers map[string][]net.IPNet, newPeers []wgtypes.PeerConfig) {	// traverse through all recieved peers	for _, peer := range newPeers {		// if pubkey found in existing peers, check against existing peer		currPeerAllowedIPs := oldPeers[peer.PublicKey.String()]		if currPeerAllowedIPs != nil {			// traverse IPs, check to see if old peer contains each IP			for _, allowedIP := range peer.AllowedIPs { // compare new ones (if any) to old ones				if !ncutils.IPNetSliceContains(currPeerAllowedIPs, allowedIP) {					if err := setRoute(iface, &allowedIP, allowedIP.IP.String()); err != nil {						ncutils.PrintLog(err.Error(), 1)					}				}			}			for _, allowedIP := range currPeerAllowedIPs { // compare old ones (if any) to new ones				if !ncutils.IPNetSliceContains(peer.AllowedIPs, allowedIP) {					if err := deleteRoute(iface, &allowedIP, allowedIP.IP.String()); err != nil {						ncutils.PrintLog(err.Error(), 1)					}				}			}			delete(oldPeers, peer.PublicKey.String()) // remove peer as it was found and processed		} else {			for _, allowedIP := range peer.AllowedIPs { // add all routes as peer doesn't exist				if err := setRoute(iface, &allowedIP, allowedIP.String()); err != nil {					ncutils.PrintLog(err.Error(), 1)				}			}		}	}	// traverse through all remaining existing peers	for _, allowedIPs := range oldPeers {		for _, allowedIP := range allowedIPs {			deleteRoute(iface, &allowedIP, allowedIP.IP.String())		}	}}// SetCurrentPeerRoutes - sets all the current peersfunc SetCurrentPeerRoutes(iface, currentAddr string, peers []wgtypes.PeerConfig) {	for _, peer := range peers {		for _, allowedIP := range peer.AllowedIPs {			setRoute(iface, &allowedIP, currentAddr)		}	}}// FlushPeerRoutes - removes all current peer routesfunc FlushPeerRoutes(iface, currentAddr string, peers []wgtypes.Peer) {	for _, peer := range peers {		for _, allowedIP := range peer.AllowedIPs {			deleteRoute(iface, &allowedIP, currentAddr)		}	}}// SetCIDRRoute - sets the CIDR route, used on join and restartsfunc SetCIDRRoute(iface, currentAddr string, cidr *net.IPNet) {	setCidr(iface, currentAddr, cidr)}// RemoveCIDRRoute - removes a static cidr routefunc RemoveCIDRRoute(iface, currentAddr string, cidr *net.IPNet) {	removeCidr(iface, cidr, currentAddr)}
 |