mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 11:15:07 +03:00 
			
		
		
		
	
						commit
						10d3c618c8
					
				
					 24 changed files with 135 additions and 84 deletions
				
			
		| 
						 | 
				
			
			@ -19,7 +19,7 @@ import (
 | 
			
		|||
	"net"
 | 
			
		||||
	"runtime"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type keySet struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ func main() {
 | 
			
		|||
			fmt.Println("-----")
 | 
			
		||||
			fmt.Println("Priv:", hex.EncodeToString(newKey.priv))
 | 
			
		||||
			fmt.Println("Pub:", hex.EncodeToString(newKey.pub))
 | 
			
		||||
			addr := address.AddrForKey(newKey.pub)
 | 
			
		||||
			addr := core.AddrForKey(newKey.pub)
 | 
			
		||||
			fmt.Println("IP:", net.IP(addr[:]).String())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,13 +25,13 @@ import (
 | 
			
		|||
	"github.com/kardianos/minwinsvc"
 | 
			
		||||
	"github.com/mitchellh/mapstructure"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/admin"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/config"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/defaults"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/core"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/ipv6rwc"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/ipv6rwc"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/multicast"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/tun"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/version"
 | 
			
		||||
| 
						 | 
				
			
			@ -261,6 +261,7 @@ func run(args yggArgs, ctx context.Context) {
 | 
			
		|||
	if cfg == nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	n := &node{}
 | 
			
		||||
	// Have we been asked for the node address yet? If so, print it and then stop.
 | 
			
		||||
	getNodeKey := func() ed25519.PublicKey {
 | 
			
		||||
		if pubkey, err := hex.DecodeString(cfg.PrivateKey); err == nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -271,14 +272,14 @@ func run(args yggArgs, ctx context.Context) {
 | 
			
		|||
	switch {
 | 
			
		||||
	case args.getaddr:
 | 
			
		||||
		if key := getNodeKey(); key != nil {
 | 
			
		||||
			addr := address.AddrForKey(key)
 | 
			
		||||
			addr := n.core.AddrForKey(key)
 | 
			
		||||
			ip := net.IP(addr[:])
 | 
			
		||||
			fmt.Println(ip.String())
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	case args.getsnet:
 | 
			
		||||
		if key := getNodeKey(); key != nil {
 | 
			
		||||
			snet := address.SubnetForKey(key)
 | 
			
		||||
			snet := n.core.SubnetForKey(key)
 | 
			
		||||
			ipnet := net.IPNet{
 | 
			
		||||
				IP:   append(snet[:], 0, 0, 0, 0, 0, 0, 0, 0),
 | 
			
		||||
				Mask: net.CIDRMask(len(snet)*8, 128),
 | 
			
		||||
| 
						 | 
				
			
			@ -291,7 +292,6 @@ func run(args yggArgs, ctx context.Context) {
 | 
			
		|||
	cfg.HttpAddress = args.httpaddress
 | 
			
		||||
	cfg.WwwRoot = args.wwwroot
 | 
			
		||||
 | 
			
		||||
	n := &node{}
 | 
			
		||||
	// Setup the RiV-mesh node itself.
 | 
			
		||||
	{
 | 
			
		||||
		sk, err := hex.DecodeString(cfg.PrivateKey)
 | 
			
		||||
| 
						 | 
				
			
			@ -301,6 +301,7 @@ func run(args yggArgs, ctx context.Context) {
 | 
			
		|||
		options := []core.SetupOption{
 | 
			
		||||
			core.NodeInfo(cfg.NodeInfo),
 | 
			
		||||
			core.NodeInfoPrivacy(cfg.NodeInfoPrivacy),
 | 
			
		||||
			core.NetworkDomain(cfg.NetworkDomain),
 | 
			
		||||
		}
 | 
			
		||||
		for _, addr := range cfg.Listen {
 | 
			
		||||
			options = append(options, core.ListenAddress(addr))
 | 
			
		||||
| 
						 | 
				
			
			@ -364,7 +365,7 @@ func run(args yggArgs, ctx context.Context) {
 | 
			
		|||
			tun.InterfaceName(cfg.IfName),
 | 
			
		||||
			tun.InterfaceMTU(cfg.IfMTU),
 | 
			
		||||
		}
 | 
			
		||||
		if n.tun, err = tun.New(ipv6rwc.NewReadWriteCloser(n.core), logger, options...); err != nil {
 | 
			
		||||
		if n.tun, err = tun.New(n.core, logger, options...); err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
		}
 | 
			
		||||
		if n.admin != nil && n.tun != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ import (
 | 
			
		|||
 | 
			
		||||
	"github.com/gologme/log"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/config"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/core"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/defaults"
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +176,7 @@ func (m *Mesh) GetPeersJSON() (result string) {
 | 
			
		|||
		IP string
 | 
			
		||||
	}{}
 | 
			
		||||
	for _, v := range m.core.GetPeers() {
 | 
			
		||||
		a := address.AddrForKey(v.Key)
 | 
			
		||||
		a := m.core.AddrForKey(v.Key)
 | 
			
		||||
		ip := net.IP(a[:]).String()
 | 
			
		||||
		peers = append(peers, struct {
 | 
			
		||||
			core.PeerInfo
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import (
 | 
			
		|||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type GetDHTRequest struct{}
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ func (a *AdminSocket) getDHTHandler(req *GetDHTRequest, res *GetDHTResponse) err
 | 
			
		|||
	dht := a.core.GetDHT()
 | 
			
		||||
	res.DHT = make([]DHTEntry, 0, len(dht))
 | 
			
		||||
	for _, d := range dht {
 | 
			
		||||
		addr := address.AddrForKey(d.Key)
 | 
			
		||||
		addr := a.core.AddrForKey(d.Key)
 | 
			
		||||
		res.DHT = append(res.DHT, DHTEntry{
 | 
			
		||||
			IPAddress: net.IP(addr[:]).String(),
 | 
			
		||||
			PublicKey: hex.EncodeToString(d.Key[:]),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import (
 | 
			
		|||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type GetPathsRequest struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ func (a *AdminSocket) getPathsHandler(req *GetPathsRequest, res *GetPathsRespons
 | 
			
		|||
	paths := a.core.GetPaths()
 | 
			
		||||
	res.Paths = make([]PathEntry, 0, len(paths))
 | 
			
		||||
	for _, p := range paths {
 | 
			
		||||
		addr := address.AddrForKey(p.Key)
 | 
			
		||||
		addr := a.core.AddrForKey(p.Key)
 | 
			
		||||
		res.Paths = append(res.Paths, PathEntry{
 | 
			
		||||
			IPAddress: net.IP(addr[:]).String(),
 | 
			
		||||
			PublicKey: hex.EncodeToString(p.Key),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ import (
 | 
			
		|||
	"net"
 | 
			
		||||
	"sort"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type GetPeersRequest struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ func (a *AdminSocket) getPeersHandler(req *GetPeersRequest, res *GetPeersRespons
 | 
			
		|||
	peers := a.core.GetPeers()
 | 
			
		||||
	res.Peers = make([]PeerEntry, 0, len(peers))
 | 
			
		||||
	for _, p := range peers {
 | 
			
		||||
		addr := address.AddrForKey(p.Key)
 | 
			
		||||
		addr := a.core.AddrForKey(p.Key)
 | 
			
		||||
		res.Peers = append(res.Peers, PeerEntry{
 | 
			
		||||
			IPAddress: net.IP(addr[:]).String(),
 | 
			
		||||
			PublicKey: hex.EncodeToString(p.Key),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,7 +6,7 @@ import (
 | 
			
		|||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type GetSessionsRequest struct{}
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ func (a *AdminSocket) getSessionsHandler(req *GetSessionsRequest, res *GetSessio
 | 
			
		|||
	sessions := a.core.GetSessions()
 | 
			
		||||
	res.Sessions = make([]SessionEntry, 0, len(sessions))
 | 
			
		||||
	for _, s := range sessions {
 | 
			
		||||
		addr := address.AddrForKey(s.Key)
 | 
			
		||||
		addr := a.core.AddrForKey(s.Key)
 | 
			
		||||
		res.Sessions = append(res.Sessions, SessionEntry{
 | 
			
		||||
			IPAddress: net.IP(addr[:]).String(),
 | 
			
		||||
			PublicKey: hex.EncodeToString(s.Key[:]),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,6 +39,7 @@ type NodeConfig struct {
 | 
			
		|||
	IfMTU               uint64                     `comment:"Maximum Transmission Unit (MTU) size for your local TUN interface.\nDefault is the largest supported size for your platform. The lowest\npossible value is 1280."`
 | 
			
		||||
	NodeInfoPrivacy     bool                       `comment:"By default, nodeinfo contains some defaults including the platform,\narchitecture and RiV-mesh version. These can help when surveying\nthe network and diagnosing network routing problems. Enabling\nnodeinfo privacy prevents this, so that only items specified in\n\"NodeInfo\" are sent back if specified."`
 | 
			
		||||
	NodeInfo            map[string]interface{}     `comment:"Optional node info. This must be a { \"key\": \"value\", ... } map\nor set as null. This is entirely optional but, if set, is visible\nto the whole network on request."`
 | 
			
		||||
	NetworkDomain       NetworkDomainConfig        `comment:"Address prefix used by mesh.\nThe current implementation requires this to be a multiple of 8 bits + 7 bits.4\nNodes that configure this differently will be unable to communicate with each other using IP packets."`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MulticastInterfaceConfig struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -49,6 +50,10 @@ type MulticastInterfaceConfig struct {
 | 
			
		|||
	Priority uint8
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NetworkDomainConfig struct {
 | 
			
		||||
        Prefix [1]byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewSigningKeys replaces the signing keypair in the NodeConfig with a new
 | 
			
		||||
// signing keypair. The signing keys are used by the switch to derive the
 | 
			
		||||
// structure of the spanning tree.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
// Package address contains the types used by mesh to represent IPv6 addresses or prefixes, as well as functions for working with these types.
 | 
			
		||||
// Of particular importance are the functions used to derive addresses or subnets from a NodeID, or to get the NodeID and bitmask of the bits visible from an address, which is needed for DHT searches.
 | 
			
		||||
package address
 | 
			
		||||
package core
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"crypto/ed25519"
 | 
			
		||||
| 
						 | 
				
			
			@ -16,15 +16,15 @@ type Subnet [8]byte
 | 
			
		|||
// The current implementation requires this to be a multiple of 8 bits + 7 bits.
 | 
			
		||||
// The 8th bit of the last byte is used to signal nodes (0) or /64 prefixes (1).
 | 
			
		||||
// Nodes that configure this differently will be unable to communicate with each other using IP packets, though routing and the DHT machinery *should* still work.
 | 
			
		||||
func GetPrefix() [1]byte {
 | 
			
		||||
	return [...]byte{0xfc}
 | 
			
		||||
func (c *Core) GetPrefix() [1]byte {
 | 
			
		||||
	return c.config.networkdomain.Prefix
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsValid returns true if an address falls within the range used by nodes in the network.
 | 
			
		||||
func (a *Address) IsValid() bool {
 | 
			
		||||
	prefix := GetPrefix()
 | 
			
		||||
func (c *Core) IsValidAddress(a Address) bool {
 | 
			
		||||
	prefix := c.GetPrefix()
 | 
			
		||||
	for idx := range prefix {
 | 
			
		||||
		if (*a)[idx] != prefix[idx] {
 | 
			
		||||
		if a[idx] != prefix[idx] {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -32,15 +32,15 @@ func (a *Address) IsValid() bool {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// IsValid returns true if a prefix falls within the range usable by the network.
 | 
			
		||||
func (s *Subnet) IsValid() bool {
 | 
			
		||||
	prefix := GetPrefix()
 | 
			
		||||
func (c *Core) IsValidSubnet(s Subnet) bool {
 | 
			
		||||
	prefix := c.GetPrefix()
 | 
			
		||||
	l := len(prefix)
 | 
			
		||||
	for idx := range prefix[:l-1] {
 | 
			
		||||
		if (*s)[idx] != prefix[idx] {
 | 
			
		||||
		if s[idx] != prefix[idx] {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return (*s)[l-1] == prefix[l-1]|0x01
 | 
			
		||||
	return s[l-1] == prefix[l-1]|0x01
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddrForKey takes an ed25519.PublicKey as an argument and returns an *Address.
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +48,7 @@ func (s *Subnet) IsValid() bool {
 | 
			
		|||
// This address begins with the contents of GetPrefix(), with the last bit set to 0 to indicate an address.
 | 
			
		||||
// The following 8 bits are set to the number of leading 1 bits in the bitwise inverse of the public key.
 | 
			
		||||
// The bitwise inverse of the key, excluding the leading 1 bits and the first leading 0 bit, is truncated to the appropriate length and makes up the remainder of the address.
 | 
			
		||||
func AddrForKey(publicKey ed25519.PublicKey) *Address {
 | 
			
		||||
func (c *Core) AddrForKey(publicKey ed25519.PublicKey) *Address {
 | 
			
		||||
	// 128 bit address
 | 
			
		||||
	// Begins with prefix
 | 
			
		||||
	// Next bit is a 0
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ func AddrForKey(publicKey ed25519.PublicKey) *Address {
 | 
			
		|||
			temp = append(temp, bits)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	prefix := GetPrefix()
 | 
			
		||||
	prefix := c.GetPrefix()
 | 
			
		||||
	copy(addr[:], prefix[:])
 | 
			
		||||
	addr[len(prefix)] = ones
 | 
			
		||||
	copy(addr[len(prefix)+1:], temp)
 | 
			
		||||
| 
						 | 
				
			
			@ -98,26 +98,26 @@ func AddrForKey(publicKey ed25519.PublicKey) *Address {
 | 
			
		|||
// The subnet begins with the address prefix, with the last bit set to 1 to indicate a prefix.
 | 
			
		||||
// The following 8 bits are set to the number of leading 1 bits in the bitwise inverse of the key.
 | 
			
		||||
// The bitwise inverse of the key, excluding the leading 1 bits and the first leading 0 bit, is truncated to the appropriate length and makes up the remainder of the subnet.
 | 
			
		||||
func SubnetForKey(publicKey ed25519.PublicKey) *Subnet {
 | 
			
		||||
func (c *Core) SubnetForKey(publicKey ed25519.PublicKey) *Subnet {
 | 
			
		||||
	// Exactly as the address version, with two exceptions:
 | 
			
		||||
	//  1) The first bit after the fixed prefix is a 1 instead of a 0
 | 
			
		||||
	//  2) It's truncated to a subnet prefix length instead of 128 bits
 | 
			
		||||
	addr := AddrForKey(publicKey)
 | 
			
		||||
	addr := c.AddrForKey(publicKey)
 | 
			
		||||
	if addr == nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var snet Subnet
 | 
			
		||||
	copy(snet[:], addr[:])
 | 
			
		||||
	prefix := GetPrefix() // nolint:staticcheck
 | 
			
		||||
	prefix := c.GetPrefix() // nolint:staticcheck
 | 
			
		||||
	snet[len(prefix)-1] |= 0x01
 | 
			
		||||
	return &snet
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetKet returns the partial ed25519.PublicKey for the Address.
 | 
			
		||||
// This is used for key lookup.
 | 
			
		||||
func (a *Address) GetKey() ed25519.PublicKey {
 | 
			
		||||
func (c *Core) GetAddressKey(a Address) ed25519.PublicKey {
 | 
			
		||||
	var key [ed25519.PublicKeySize]byte
 | 
			
		||||
	prefix := GetPrefix() // nolint:staticcheck
 | 
			
		||||
	prefix := c.GetPrefix() // nolint:staticcheck
 | 
			
		||||
	ones := int(a[len(prefix)])
 | 
			
		||||
	for idx := 0; idx < ones; idx++ {
 | 
			
		||||
		key[idx/8] |= 0x80 >> byte(idx%8)
 | 
			
		||||
| 
						 | 
				
			
			@ -143,8 +143,8 @@ func (a *Address) GetKey() ed25519.PublicKey {
 | 
			
		|||
 | 
			
		||||
// GetKet returns the partial ed25519.PublicKey for the Subnet.
 | 
			
		||||
// This is used for key lookup.
 | 
			
		||||
func (s *Subnet) GetKey() ed25519.PublicKey {
 | 
			
		||||
func (c *Core) GetSubnetKey(s Subnet) ed25519.PublicKey {
 | 
			
		||||
	var addr Address
 | 
			
		||||
	copy(addr[:], s[:])
 | 
			
		||||
	return addr.GetKey()
 | 
			
		||||
	return c.GetAddressKey(addr)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
package address
 | 
			
		||||
package core
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ import (
 | 
			
		|||
	//"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/Arceliar/phony"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SelfInfo struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ func (c *Core) Listen(u *url.URL, sintf string) (*Listener, error) {
 | 
			
		|||
// that application also implements either VPN functionality or deals with IP
 | 
			
		||||
// packets specifically.
 | 
			
		||||
func (c *Core) Address() net.IP {
 | 
			
		||||
	addr := net.IP(address.AddrForKey(c.public)[:])
 | 
			
		||||
	addr := net.IP(c.AddrForKey(c.public)[:])
 | 
			
		||||
	return addr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +169,7 @@ func (c *Core) Address() net.IP {
 | 
			
		|||
// that application also implements either VPN functionality or deals with IP
 | 
			
		||||
// packets specifically.
 | 
			
		||||
func (c *Core) Subnet() net.IPNet {
 | 
			
		||||
	subnet := address.SubnetForKey(c.public)[:]
 | 
			
		||||
	subnet := c.SubnetForKey(c.public)[:]
 | 
			
		||||
	subnet = append(subnet, 0, 0, 0, 0, 0, 0, 0, 0)
 | 
			
		||||
	return net.IPNet{IP: subnet, Mask: net.CIDRMask(64, 128)}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ import (
 | 
			
		|||
// The Core object represents the Mesh node. You should create a Core
 | 
			
		||||
// object for each Mesh node you plan to run.
 | 
			
		||||
type Core struct {
 | 
			
		||||
	address      Address
 | 
			
		||||
	// This is the main data structure that holds everything else for a node
 | 
			
		||||
	// We're going to keep our own copy of the provided config - that way we can
 | 
			
		||||
	// guarantee that it will be covered by the mutex
 | 
			
		||||
| 
						 | 
				
			
			@ -34,11 +35,12 @@ type Core struct {
 | 
			
		|||
	log          Logger
 | 
			
		||||
	addPeerTimer *time.Timer
 | 
			
		||||
	config       struct {
 | 
			
		||||
		_peers             map[Peer]*linkInfo          // configurable after startup
 | 
			
		||||
		_peers             map[Peer]*linkInfo         // configurable after startup
 | 
			
		||||
		_listeners         map[ListenAddress]struct{} // configurable after startup
 | 
			
		||||
		nodeinfo           NodeInfo                   // immutable after startup
 | 
			
		||||
		nodeinfoPrivacy    NodeInfoPrivacy            // immutable after startup
 | 
			
		||||
		_allowedPublicKeys map[[32]byte]struct{}      // configurable after startup
 | 
			
		||||
		networkdomain      NetworkDomain              // immutable after startup
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ import (
 | 
			
		|||
	"sync/atomic"
 | 
			
		||||
 | 
			
		||||
	"github.com/Arceliar/phony"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/Arceliar/phony" // TODO? use instead of mutexes
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -188,7 +188,7 @@ func (intf *link) handler() error {
 | 
			
		|||
	if intf.incoming {
 | 
			
		||||
		dir = "inbound"
 | 
			
		||||
	}
 | 
			
		||||
	remoteAddr := net.IP(address.AddrForKey(meta.key)[:]).String()
 | 
			
		||||
	remoteAddr := net.IP(intf.links.core.AddrForKey(meta.key)[:]).String()
 | 
			
		||||
	remoteStr := fmt.Sprintf("%s@%s", remoteAddr, intf.info.remote)
 | 
			
		||||
	localStr := intf.conn.LocalAddr()
 | 
			
		||||
	intf.links.core.log.Infof("Connected %s %s: %s, source %s",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,8 @@ func (c *Core) _applyOption(opt SetupOption) {
 | 
			
		|||
		c.config.nodeinfo = v
 | 
			
		||||
	case NodeInfoPrivacy:
 | 
			
		||||
		c.config.nodeinfoPrivacy = v
 | 
			
		||||
	case NetworkDomain:
 | 
			
		||||
		c.config.networkdomain = v
 | 
			
		||||
	case AllowedPublicKey:
 | 
			
		||||
		pk := [32]byte{}
 | 
			
		||||
		copy(pk[:], v)
 | 
			
		||||
| 
						 | 
				
			
			@ -32,10 +34,14 @@ type Peer struct {
 | 
			
		|||
}
 | 
			
		||||
type NodeInfo map[string]interface{}
 | 
			
		||||
type NodeInfoPrivacy bool
 | 
			
		||||
type NetworkDomain struct {
 | 
			
		||||
	Prefix          [1]byte
 | 
			
		||||
}
 | 
			
		||||
type AllowedPublicKey ed25519.PublicKey
 | 
			
		||||
 | 
			
		||||
func (a ListenAddress) isSetupOption()    {}
 | 
			
		||||
func (a Peer) isSetupOption()             {}
 | 
			
		||||
func (a NodeInfo) isSetupOption()         {}
 | 
			
		||||
func (a NodeInfoPrivacy) isSetupOption()  {}
 | 
			
		||||
func (a NetworkDomain) isSetupOption()    {}
 | 
			
		||||
func (a AllowedPublicKey) isSetupOption() {}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ import (
 | 
			
		|||
	iwt "github.com/Arceliar/ironwood/types"
 | 
			
		||||
	"github.com/Arceliar/phony"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +266,7 @@ func (p *protoHandler) getSelfHandler(in json.RawMessage) (interface{}, error) {
 | 
			
		|||
		if err := msg.UnmarshalJSON(info); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		ip := net.IP(address.AddrForKey(kbs)[:])
 | 
			
		||||
		ip := net.IP(p.core.AddrForKey(kbs)[:])
 | 
			
		||||
		res := DebugGetSelfResponse{ip.String(): msg}
 | 
			
		||||
		return res, nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +316,7 @@ func (p *protoHandler) getPeersHandler(in json.RawMessage) (interface{}, error)
 | 
			
		|||
		if err := msg.UnmarshalJSON(js); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		ip := net.IP(address.AddrForKey(kbs)[:])
 | 
			
		||||
		ip := net.IP(p.core.AddrForKey(kbs)[:])
 | 
			
		||||
		res := DebugGetPeersResponse{ip.String(): msg}
 | 
			
		||||
		return res, nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -366,7 +366,7 @@ func (p *protoHandler) getDHTHandler(in json.RawMessage) (interface{}, error) {
 | 
			
		|||
		if err := msg.UnmarshalJSON(js); err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		ip := net.IP(address.AddrForKey(kbs)[:])
 | 
			
		||||
		ip := net.IP(p.core.AddrForKey(kbs)[:])
 | 
			
		||||
		res := DebugGetDHTResponse{ip.String(): msg}
 | 
			
		||||
		return res, nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ package defaults
 | 
			
		|||
import "github.com/RiV-chain/RiV-mesh/src/config"
 | 
			
		||||
 | 
			
		||||
type MulticastInterfaceConfig = config.MulticastInterfaceConfig
 | 
			
		||||
type NetworkDomainConfig = config.NetworkDomainConfig
 | 
			
		||||
 | 
			
		||||
var defaultConfig = ""      // LDFLAGS='-X github.com/yggdrasil-network/yggdrasil-go/src/defaults.defaultConfig=/path/to/config
 | 
			
		||||
var defaultAdminListen = "" // LDFLAGS='-X github.com/yggdrasil-network/yggdrasil-go/src/defaults.defaultAdminListen=unix://path/to/sock'
 | 
			
		||||
| 
						 | 
				
			
			@ -20,6 +21,9 @@ type platformDefaultParameters struct {
 | 
			
		|||
	// Multicast interfaces
 | 
			
		||||
	DefaultMulticastInterfaces []MulticastInterfaceConfig
 | 
			
		||||
 | 
			
		||||
	//Network domain
 | 
			
		||||
	DefaultNetworkDomain NetworkDomainConfig
 | 
			
		||||
 | 
			
		||||
	// TUN
 | 
			
		||||
	MaximumIfMTU  uint64
 | 
			
		||||
	DefaultIfMTU  uint64
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +56,7 @@ func GenerateConfig() *config.NodeConfig {
 | 
			
		|||
	cfg.InterfacePeers = map[string][]string{}
 | 
			
		||||
	cfg.AllowedPublicKeys = []string{}
 | 
			
		||||
	cfg.MulticastInterfaces = defaults.DefaultMulticastInterfaces
 | 
			
		||||
	cfg.NetworkDomain = defaults.DefaultNetworkDomain
 | 
			
		||||
	cfg.IfName = defaults.DefaultIfName
 | 
			
		||||
	cfg.IfMTU = defaults.DefaultIfMTU
 | 
			
		||||
	cfg.NodeInfoPrivacy = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,11 @@ func getDefaults() platformDefaultParameters {
 | 
			
		|||
			{Regex: "bridge.*", Beacon: true, Listen: true},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		// Network domain
 | 
			
		||||
                DefaultNetworkDomain: NetworkDomainConfig{
 | 
			
		||||
                        Prefix: [...]byte{0xfc},
 | 
			
		||||
                },
 | 
			
		||||
 | 
			
		||||
		// TUN
 | 
			
		||||
		MaximumIfMTU:  65535,
 | 
			
		||||
		DefaultIfMTU:  65535,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters {
 | 
			
		|||
			{Regex: ".*", Beacon: true, Listen: true},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
                // Network domain
 | 
			
		||||
                DefaultNetworkDomain: NetworkDomainConfig{
 | 
			
		||||
                        Prefix: [...]byte{0xfc},
 | 
			
		||||
                },
 | 
			
		||||
 | 
			
		||||
		// TUN
 | 
			
		||||
		MaximumIfMTU:  32767,
 | 
			
		||||
		DefaultIfMTU:  32767,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters {
 | 
			
		|||
			{Regex: ".*", Beacon: true, Listen: true},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
                // Network domain
 | 
			
		||||
                DefaultNetworkDomain: NetworkDomainConfig{
 | 
			
		||||
                        Prefix: [...]byte{0xfc},
 | 
			
		||||
                },
 | 
			
		||||
 | 
			
		||||
		// TUN
 | 
			
		||||
		MaximumIfMTU:  65535,
 | 
			
		||||
		DefaultIfMTU:  65535,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters {
 | 
			
		|||
			{Regex: ".*", Beacon: true, Listen: true},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
                // Network domain
 | 
			
		||||
                DefaultNetworkDomain: NetworkDomainConfig{
 | 
			
		||||
                        Prefix: [...]byte{0xfc},
 | 
			
		||||
                },
 | 
			
		||||
 | 
			
		||||
		// TUN
 | 
			
		||||
		MaximumIfMTU:  16384,
 | 
			
		||||
		DefaultIfMTU:  16384,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters {
 | 
			
		|||
			{Regex: ".*", Beacon: true, Listen: true},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
                // Network domain
 | 
			
		||||
                DefaultNetworkDomain: NetworkDomainConfig{
 | 
			
		||||
                        Prefix: [...]byte{0xfc},
 | 
			
		||||
                },
 | 
			
		||||
 | 
			
		||||
		// TUN
 | 
			
		||||
		MaximumIfMTU:  65535,
 | 
			
		||||
		DefaultIfMTU:  65535,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters {
 | 
			
		|||
			{Regex: ".*", Beacon: true, Listen: true},
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
                // Network domain
 | 
			
		||||
                DefaultNetworkDomain: NetworkDomainConfig{
 | 
			
		||||
                        Prefix: [...]byte{0xfc},
 | 
			
		||||
                },
 | 
			
		||||
 | 
			
		||||
		// TUN
 | 
			
		||||
		MaximumIfMTU:  65535,
 | 
			
		||||
		DefaultIfMTU:  65535,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import (
 | 
			
		|||
 | 
			
		||||
	iwt "github.com/Arceliar/ironwood/types"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/core"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -30,21 +30,21 @@ type keyArray [ed25519.PublicKeySize]byte
 | 
			
		|||
 | 
			
		||||
type keyStore struct {
 | 
			
		||||
	core         *core.Core
 | 
			
		||||
	address      address.Address
 | 
			
		||||
	subnet       address.Subnet
 | 
			
		||||
	address      core.Address
 | 
			
		||||
	subnet       core.Subnet
 | 
			
		||||
	mutex        sync.Mutex
 | 
			
		||||
	keyToInfo    map[keyArray]*keyInfo
 | 
			
		||||
	addrToInfo   map[address.Address]*keyInfo
 | 
			
		||||
	addrBuffer   map[address.Address]*buffer
 | 
			
		||||
	subnetToInfo map[address.Subnet]*keyInfo
 | 
			
		||||
	subnetBuffer map[address.Subnet]*buffer
 | 
			
		||||
	addrToInfo   map[core.Address]*keyInfo
 | 
			
		||||
	addrBuffer   map[core.Address]*buffer
 | 
			
		||||
	subnetToInfo map[core.Subnet]*keyInfo
 | 
			
		||||
	subnetBuffer map[core.Subnet]*buffer
 | 
			
		||||
	mtu          uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type keyInfo struct {
 | 
			
		||||
	key     keyArray
 | 
			
		||||
	address address.Address
 | 
			
		||||
	subnet  address.Subnet
 | 
			
		||||
	address core.Address
 | 
			
		||||
	subnet  core.Subnet
 | 
			
		||||
	timeout *time.Timer // From calling a time.AfterFunc to do cleanup
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,21 +55,21 @@ type buffer struct {
 | 
			
		|||
 | 
			
		||||
func (k *keyStore) init(c *core.Core) {
 | 
			
		||||
	k.core = c
 | 
			
		||||
	k.address = *address.AddrForKey(k.core.PublicKey())
 | 
			
		||||
	k.subnet = *address.SubnetForKey(k.core.PublicKey())
 | 
			
		||||
	k.address = *c.AddrForKey(k.core.PublicKey())
 | 
			
		||||
	k.subnet = *c.SubnetForKey(k.core.PublicKey())
 | 
			
		||||
	if err := k.core.SetOutOfBandHandler(k.oobHandler); err != nil {
 | 
			
		||||
		err = fmt.Errorf("tun.core.SetOutOfBandHander: %w", err)
 | 
			
		||||
		panic(err)
 | 
			
		||||
	}
 | 
			
		||||
	k.keyToInfo = make(map[keyArray]*keyInfo)
 | 
			
		||||
	k.addrToInfo = make(map[address.Address]*keyInfo)
 | 
			
		||||
	k.addrBuffer = make(map[address.Address]*buffer)
 | 
			
		||||
	k.subnetToInfo = make(map[address.Subnet]*keyInfo)
 | 
			
		||||
	k.subnetBuffer = make(map[address.Subnet]*buffer)
 | 
			
		||||
	k.addrToInfo = make(map[core.Address]*keyInfo)
 | 
			
		||||
	k.addrBuffer = make(map[core.Address]*buffer)
 | 
			
		||||
	k.subnetToInfo = make(map[core.Subnet]*keyInfo)
 | 
			
		||||
	k.subnetBuffer = make(map[core.Subnet]*buffer)
 | 
			
		||||
	k.mtu = 1280 // Default to something safe, expect user to set this
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *keyStore) sendToAddress(addr address.Address, bs []byte) {
 | 
			
		||||
func (k *keyStore) sendToAddress(addr core.Address, bs []byte) {
 | 
			
		||||
	k.mutex.Lock()
 | 
			
		||||
	if info := k.addrToInfo[addr]; info != nil {
 | 
			
		||||
		k.resetTimeout(info)
 | 
			
		||||
| 
						 | 
				
			
			@ -94,11 +94,11 @@ func (k *keyStore) sendToAddress(addr address.Address, bs []byte) {
 | 
			
		|||
			}
 | 
			
		||||
		})
 | 
			
		||||
		k.mutex.Unlock()
 | 
			
		||||
		k.sendKeyLookup(addr.GetKey())
 | 
			
		||||
		k.sendKeyLookup(k.core.GetAddressKey(addr))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (k *keyStore) sendToSubnet(subnet address.Subnet, bs []byte) {
 | 
			
		||||
func (k *keyStore) sendToSubnet(subnet core.Subnet, bs []byte) {
 | 
			
		||||
	k.mutex.Lock()
 | 
			
		||||
	if info := k.subnetToInfo[subnet]; info != nil {
 | 
			
		||||
		k.resetTimeout(info)
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +123,7 @@ func (k *keyStore) sendToSubnet(subnet address.Subnet, bs []byte) {
 | 
			
		|||
			}
 | 
			
		||||
		})
 | 
			
		||||
		k.mutex.Unlock()
 | 
			
		||||
		k.sendKeyLookup(subnet.GetKey())
 | 
			
		||||
		k.sendKeyLookup(k.core.GetSubnetKey(subnet))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -136,8 +136,8 @@ func (k *keyStore) update(key ed25519.PublicKey) *keyInfo {
 | 
			
		|||
	if info = k.keyToInfo[kArray]; info == nil {
 | 
			
		||||
		info = new(keyInfo)
 | 
			
		||||
		info.key = kArray
 | 
			
		||||
		info.address = *address.AddrForKey(ed25519.PublicKey(info.key[:]))
 | 
			
		||||
		info.subnet = *address.SubnetForKey(ed25519.PublicKey(info.key[:]))
 | 
			
		||||
		info.address = *k.core.AddrForKey(ed25519.PublicKey(info.key[:]))
 | 
			
		||||
		info.subnet = *k.core.SubnetForKey(ed25519.PublicKey(info.key[:]))
 | 
			
		||||
		k.keyToInfo[info.key] = info
 | 
			
		||||
		k.addrToInfo[info.address] = info
 | 
			
		||||
		k.subnetToInfo[info.subnet] = info
 | 
			
		||||
| 
						 | 
				
			
			@ -184,7 +184,7 @@ func (k *keyStore) oobHandler(fromKey, toKey ed25519.PublicKey, data []byte) {
 | 
			
		|||
	sig := data[1:]
 | 
			
		||||
	switch data[0] {
 | 
			
		||||
	case typeKeyLookup:
 | 
			
		||||
		snet := *address.SubnetForKey(toKey)
 | 
			
		||||
		snet := *k.core.SubnetForKey(toKey)
 | 
			
		||||
		if snet == k.subnet && ed25519.Verify(fromKey, toKey[:], sig) {
 | 
			
		||||
			// This is looking for at least our subnet (possibly our address)
 | 
			
		||||
			// Send a response
 | 
			
		||||
| 
						 | 
				
			
			@ -248,8 +248,8 @@ func (k *keyStore) readPC(p []byte) (int, error) {
 | 
			
		|||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		var srcAddr, dstAddr address.Address
 | 
			
		||||
		var srcSubnet, dstSubnet address.Subnet
 | 
			
		||||
		var srcAddr, dstAddr core.Address
 | 
			
		||||
		var srcSubnet, dstSubnet core.Subnet
 | 
			
		||||
		copy(srcAddr[:], bs[8:])
 | 
			
		||||
		copy(dstAddr[:], bs[24:])
 | 
			
		||||
		copy(srcSubnet[:], bs[8:])
 | 
			
		||||
| 
						 | 
				
			
			@ -274,8 +274,8 @@ func (k *keyStore) writePC(bs []byte) (int, error) {
 | 
			
		|||
		strErr := fmt.Sprint("undersized IPv6 packet, length: ", len(bs))
 | 
			
		||||
		return 0, errors.New(strErr)
 | 
			
		||||
	}
 | 
			
		||||
	var srcAddr, dstAddr address.Address
 | 
			
		||||
	var srcSubnet, dstSubnet address.Subnet
 | 
			
		||||
	var srcAddr, dstAddr core.Address
 | 
			
		||||
	var srcSubnet, dstSubnet core.Subnet
 | 
			
		||||
	copy(srcAddr[:], bs[8:])
 | 
			
		||||
	copy(dstAddr[:], bs[24:])
 | 
			
		||||
	copy(srcSubnet[:], bs[8:])
 | 
			
		||||
| 
						 | 
				
			
			@ -286,9 +286,9 @@ func (k *keyStore) writePC(bs []byte) (int, error) {
 | 
			
		|||
		strErr := fmt.Sprint("incorrect source address: ", net.IP(srcAddr[:]).String())
 | 
			
		||||
		return 0, errors.New(strErr)
 | 
			
		||||
	}
 | 
			
		||||
	if dstAddr.IsValid() {
 | 
			
		||||
	if k.core.IsValidAddress(dstAddr) {
 | 
			
		||||
		k.sendToAddress(dstAddr, bs)
 | 
			
		||||
	} else if dstSubnet.IsValid() {
 | 
			
		||||
	} else if k.core.IsValidSubnet(dstSubnet) {
 | 
			
		||||
		k.sendToSubnet(dstSubnet, bs)
 | 
			
		||||
	} else {
 | 
			
		||||
		return 0, errors.New("invalid destination address")
 | 
			
		||||
| 
						 | 
				
			
			@ -331,11 +331,11 @@ func NewReadWriteCloser(c *core.Core) *ReadWriteCloser {
 | 
			
		|||
	return rwc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (rwc *ReadWriteCloser) Address() address.Address {
 | 
			
		||||
func (rwc *ReadWriteCloser) Address() core.Address {
 | 
			
		||||
	return rwc.address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (rwc *ReadWriteCloser) Subnet() address.Subnet {
 | 
			
		||||
func (rwc *ReadWriteCloser) Subnet() core.Subnet {
 | 
			
		||||
	return rwc.subnet
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ import (
 | 
			
		|||
	"github.com/Arceliar/phony"
 | 
			
		||||
	"golang.zx2c4.com/wireguard/tun"
 | 
			
		||||
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	//"github.com/RiV-chain/RiV-mesh/src/address"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/core"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/defaults"
 | 
			
		||||
	"github.com/RiV-chain/RiV-mesh/src/ipv6rwc"
 | 
			
		||||
| 
						 | 
				
			
			@ -26,10 +26,11 @@ type MTU uint16
 | 
			
		|||
// should pass this object to the mesh.SetRouterAdapter() function before
 | 
			
		||||
// calling mesh.Start().
 | 
			
		||||
type TunAdapter struct {
 | 
			
		||||
	core        *core.Core
 | 
			
		||||
	rwc         *ipv6rwc.ReadWriteCloser
 | 
			
		||||
	log         core.Logger
 | 
			
		||||
	addr        address.Address
 | 
			
		||||
	subnet      address.Subnet
 | 
			
		||||
	addr        core.Address
 | 
			
		||||
	subnet      core.Subnet
 | 
			
		||||
	mtu         uint64
 | 
			
		||||
	iface       tun.Device
 | 
			
		||||
	phony.Inbox // Currently only used for _handlePacket from the reader, TODO: all the stuff that currently needs a mutex below
 | 
			
		||||
| 
						 | 
				
			
			@ -90,9 +91,10 @@ func MaximumMTU() uint64 {
 | 
			
		|||
 | 
			
		||||
// Init initialises the TUN module. You must have acquired a Listener from
 | 
			
		||||
// the Mesh	 core before this point and it must not be in use elsewhere.
 | 
			
		||||
func New(rwc *ipv6rwc.ReadWriteCloser, log core.Logger, opts ...SetupOption) (*TunAdapter, error) {
 | 
			
		||||
func New(core *core.Core, log core.Logger, opts ...SetupOption) (*TunAdapter, error) {
 | 
			
		||||
	tun := &TunAdapter{
 | 
			
		||||
		rwc: rwc,
 | 
			
		||||
		core: core,
 | 
			
		||||
		rwc: ipv6rwc.NewReadWriteCloser(core),
 | 
			
		||||
		log: log,
 | 
			
		||||
	}
 | 
			
		||||
	for _, opt := range opts {
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +109,7 @@ func (tun *TunAdapter) _start() error {
 | 
			
		|||
	}
 | 
			
		||||
	tun.addr = tun.rwc.Address()
 | 
			
		||||
	tun.subnet = tun.rwc.Subnet()
 | 
			
		||||
	addr := fmt.Sprintf("%s/%d", net.IP(tun.addr[:]).String(), 8*len(address.GetPrefix())-1)
 | 
			
		||||
	addr := fmt.Sprintf("%s/%d", net.IP(tun.addr[:]).String(), 8*len(tun.core.GetPrefix())-1)
 | 
			
		||||
	if tun.config.name == "none" || tun.config.name == "dummy" {
 | 
			
		||||
		tun.log.Debugln("Not starting TUN as ifname is none or dummy")
 | 
			
		||||
		tun.isEnabled = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue