From 6319d6231b029c5b63883aabed211f8d37641cc6 Mon Sep 17 00:00:00 2001 From: vadym Date: Sun, 30 Oct 2022 21:58:42 +0200 Subject: [PATCH 1/5] 1. moved address to core --- cmd/genkeys/main.go | 4 +-- cmd/mesh/main.go | 8 ++--- contrib/mobile/mobile.go | 4 +-- src/admin/getdht.go | 4 +-- src/admin/getpaths.go | 4 +-- src/admin/getpeers.go | 4 +-- src/admin/getsessions.go | 4 +-- src/{address => core}/address.go | 8 ++--- src/{address => core}/address_test.go | 2 +- src/core/api.go | 6 ++-- src/core/core.go | 1 + src/core/link.go | 4 +-- src/core/proto.go | 8 ++--- src/ipv6rwc/ipv6rwc.go | 52 +++++++++++++-------------- src/tun/tun.go | 8 ++--- 15 files changed, 61 insertions(+), 60 deletions(-) rename src/{address => core}/address.go (96%) rename src/{address => core}/address_test.go (99%) diff --git a/cmd/genkeys/main.go b/cmd/genkeys/main.go index 30b7d604..db807ec0 100644 --- a/cmd/genkeys/main.go +++ b/cmd/genkeys/main.go @@ -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()) } } diff --git a/cmd/mesh/main.go b/cmd/mesh/main.go index adf0e467..5a70b9d7 100644 --- a/cmd/mesh/main.go +++ b/cmd/mesh/main.go @@ -25,7 +25,7 @@ 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" @@ -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) diff --git a/contrib/mobile/mobile.go b/contrib/mobile/mobile.go index d5e01d2d..37a9244f 100644 --- a/contrib/mobile/mobile.go +++ b/contrib/mobile/mobile.go @@ -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 diff --git a/src/admin/getdht.go b/src/admin/getdht.go index 074c717a..71248a2f 100644 --- a/src/admin/getdht.go +++ b/src/admin/getdht.go @@ -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[:]), diff --git a/src/admin/getpaths.go b/src/admin/getpaths.go index 9324097b..45760db5 100644 --- a/src/admin/getpaths.go +++ b/src/admin/getpaths.go @@ -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), diff --git a/src/admin/getpeers.go b/src/admin/getpeers.go index 04927a6e..9a4d0454 100644 --- a/src/admin/getpeers.go +++ b/src/admin/getpeers.go @@ -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), diff --git a/src/admin/getsessions.go b/src/admin/getsessions.go index 190edd7c..a5ae0d1b 100644 --- a/src/admin/getsessions.go +++ b/src/admin/getsessions.go @@ -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[:]), diff --git a/src/address/address.go b/src/core/address.go similarity index 96% rename from src/address/address.go rename to src/core/address.go index 723f1aca..b9440a47 100644 --- a/src/address/address.go +++ b/src/core/address.go @@ -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" @@ -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 @@ -98,11 +98,11 @@ 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 } diff --git a/src/address/address_test.go b/src/core/address_test.go similarity index 99% rename from src/address/address_test.go rename to src/core/address_test.go index c5e202eb..f7673ca4 100644 --- a/src/address/address_test.go +++ b/src/core/address_test.go @@ -1,4 +1,4 @@ -package address +package core import ( "bytes" diff --git a/src/core/api.go b/src/core/api.go index d93be4c7..f789af20 100644 --- a/src/core/api.go +++ b/src/core/api.go @@ -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)} } diff --git a/src/core/core.go b/src/core/core.go index f5e1234b..3d5ec2e8 100644 --- a/src/core/core.go +++ b/src/core/core.go @@ -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 diff --git a/src/core/link.go b/src/core/link.go index 6957cff3..8378b087 100644 --- a/src/core/link.go +++ b/src/core/link.go @@ -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", diff --git a/src/core/proto.go b/src/core/proto.go index a1749c53..76ad4b25 100644 --- a/src/core/proto.go +++ b/src/core/proto.go @@ -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 } diff --git a/src/ipv6rwc/ipv6rwc.go b/src/ipv6rwc/ipv6rwc.go index ee44e302..646bd74d 100644 --- a/src/ipv6rwc/ipv6rwc.go +++ b/src/ipv6rwc/ipv6rwc.go @@ -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) @@ -98,7 +98,7 @@ func (k *keyStore) sendToAddress(addr address.Address, bs []byte) { } } -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) @@ -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:]) @@ -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 } diff --git a/src/tun/tun.go b/src/tun/tun.go index abef70ba..d4579095 100644 --- a/src/tun/tun.go +++ b/src/tun/tun.go @@ -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" @@ -28,8 +28,8 @@ type MTU uint16 type TunAdapter struct { 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 @@ -107,7 +107,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(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 From 09d4564282f52562711acfa1b1ed6011c7c7d44b Mon Sep 17 00:00:00 2001 From: vadym Date: Sun, 30 Oct 2022 22:22:56 +0200 Subject: [PATCH 2/5] 1. added NetworkDomain and default values --- src/config/config.go | 5 +++++ src/defaults/defaults.go | 5 +++++ src/defaults/defaults_darwin.go | 5 +++++ src/defaults/defaults_freebsd.go | 5 +++++ src/defaults/defaults_linux.go | 5 +++++ src/defaults/defaults_openbsd.go | 5 +++++ src/defaults/defaults_other.go | 5 +++++ src/defaults/defaults_windows.go | 5 +++++ 8 files changed, 40 insertions(+) diff --git a/src/config/config.go b/src/config/config.go index cf88f2c4..f1a5249a 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -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. diff --git a/src/defaults/defaults.go b/src/defaults/defaults.go index fa097e5c..ef358ed8 100644 --- a/src/defaults/defaults.go +++ b/src/defaults/defaults.go @@ -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 diff --git a/src/defaults/defaults_darwin.go b/src/defaults/defaults_darwin.go index 9698d2ba..660d7644 100644 --- a/src/defaults/defaults_darwin.go +++ b/src/defaults/defaults_darwin.go @@ -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, diff --git a/src/defaults/defaults_freebsd.go b/src/defaults/defaults_freebsd.go index a0b8658b..15be4ffe 100644 --- a/src/defaults/defaults_freebsd.go +++ b/src/defaults/defaults_freebsd.go @@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, + // Network domain + DefaultNetworkDomain: NetworkDomainConfig{ + Prefix: [...]byte{0xfc}, + }, + // TUN MaximumIfMTU: 32767, DefaultIfMTU: 32767, diff --git a/src/defaults/defaults_linux.go b/src/defaults/defaults_linux.go index 8ade70c1..9fb40565 100644 --- a/src/defaults/defaults_linux.go +++ b/src/defaults/defaults_linux.go @@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, + // Network domain + DefaultNetworkDomain: NetworkDomainConfig{ + Prefix: [...]byte{0xfc}, + }, + // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535, diff --git a/src/defaults/defaults_openbsd.go b/src/defaults/defaults_openbsd.go index a07092ad..ce5db723 100644 --- a/src/defaults/defaults_openbsd.go +++ b/src/defaults/defaults_openbsd.go @@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, + // Network domain + DefaultNetworkDomain: NetworkDomainConfig{ + Prefix: [...]byte{0xfc}, + }, + // TUN MaximumIfMTU: 16384, DefaultIfMTU: 16384, diff --git a/src/defaults/defaults_other.go b/src/defaults/defaults_other.go index 53b68be4..3adb05e7 100644 --- a/src/defaults/defaults_other.go +++ b/src/defaults/defaults_other.go @@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, + // Network domain + DefaultNetworkDomain: NetworkDomainConfig{ + Prefix: [...]byte{0xfc}, + }, + // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535, diff --git a/src/defaults/defaults_windows.go b/src/defaults/defaults_windows.go index 911a3cdb..82b05de7 100644 --- a/src/defaults/defaults_windows.go +++ b/src/defaults/defaults_windows.go @@ -18,6 +18,11 @@ func getDefaults() platformDefaultParameters { {Regex: ".*", Beacon: true, Listen: true}, }, + // Network domain + DefaultNetworkDomain: NetworkDomainConfig{ + Prefix: [...]byte{0xfc}, + }, + // TUN MaximumIfMTU: 65535, DefaultIfMTU: 65535, From c7bca5d21286ef98741ddb8d42c37190f267c216 Mon Sep 17 00:00:00 2001 From: vadym Date: Sun, 30 Oct 2022 23:03:28 +0200 Subject: [PATCH 3/5] 1. preparing for NetworkDomain load from config --- src/core/address.go | 28 ++++++++++++++-------------- src/core/core.go | 3 ++- src/core/options.go | 3 +++ src/ipv6rwc/ipv6rwc.go | 8 ++++---- src/tun/tun.go | 3 ++- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/core/address.go b/src/core/address.go index b9440a47..a472cc7f 100644 --- a/src/core/address.go +++ b/src/core/address.go @@ -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 { +func (c *Core) GetPrefix() [1]byte { return [...]byte{0xfc} } // 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. @@ -86,7 +86,7 @@ func (c *Core) 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) @@ -108,16 +108,16 @@ func (c *Core) SubnetForKey(publicKey ed25519.PublicKey) *Subnet { } 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) } diff --git a/src/core/core.go b/src/core/core.go index 3d5ec2e8..bdbe8ee5 100644 --- a/src/core/core.go +++ b/src/core/core.go @@ -35,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 } } diff --git a/src/core/options.go b/src/core/options.go index 66aa16ce..7ad793e9 100644 --- a/src/core/options.go +++ b/src/core/options.go @@ -32,6 +32,9 @@ 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() {} diff --git a/src/ipv6rwc/ipv6rwc.go b/src/ipv6rwc/ipv6rwc.go index 646bd74d..d121a48f 100644 --- a/src/ipv6rwc/ipv6rwc.go +++ b/src/ipv6rwc/ipv6rwc.go @@ -94,7 +94,7 @@ func (k *keyStore) sendToAddress(addr core.Address, bs []byte) { } }) k.mutex.Unlock() - k.sendKeyLookup(addr.GetKey()) + k.sendKeyLookup(k.core.GetAddressKey(addr)) } } @@ -123,7 +123,7 @@ func (k *keyStore) sendToSubnet(subnet core.Subnet, bs []byte) { } }) k.mutex.Unlock() - k.sendKeyLookup(subnet.GetKey()) + k.sendKeyLookup(k.core.GetSubnetKey(subnet)) } } @@ -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") diff --git a/src/tun/tun.go b/src/tun/tun.go index d4579095..f01e90ec 100644 --- a/src/tun/tun.go +++ b/src/tun/tun.go @@ -26,6 +26,7 @@ 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 core.Address @@ -107,7 +108,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(core.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 From ff860e71c35be095fd8a032838deafe133c60d0b Mon Sep 17 00:00:00 2001 From: vadym Date: Mon, 31 Oct 2022 00:00:15 +0200 Subject: [PATCH 4/5] 1. implemented network prefix load from config file --- cmd/mesh/main.go | 5 +++-- src/core/address.go | 2 +- src/core/options.go | 3 +++ src/tun/tun.go | 5 +++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/cmd/mesh/main.go b/cmd/mesh/main.go index 5a70b9d7..1b2a67b0 100644 --- a/cmd/mesh/main.go +++ b/cmd/mesh/main.go @@ -31,7 +31,7 @@ import ( "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" @@ -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 { diff --git a/src/core/address.go b/src/core/address.go index a472cc7f..713fb920 100644 --- a/src/core/address.go +++ b/src/core/address.go @@ -17,7 +17,7 @@ type Subnet [8]byte // 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 (c *Core) GetPrefix() [1]byte { - return [...]byte{0xfc} + return c.config.networkdomain.Prefix } // IsValid returns true if an address falls within the range used by nodes in the network. diff --git a/src/core/options.go b/src/core/options.go index 7ad793e9..80c374e8 100644 --- a/src/core/options.go +++ b/src/core/options.go @@ -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) @@ -41,4 +43,5 @@ func (a ListenAddress) isSetupOption() {} func (a Peer) isSetupOption() {} func (a NodeInfo) isSetupOption() {} func (a NodeInfoPrivacy) isSetupOption() {} +func (a NetworkDomain) isSetupOption() {} func (a AllowedPublicKey) isSetupOption() {} diff --git a/src/tun/tun.go b/src/tun/tun.go index f01e90ec..dc572b6e 100644 --- a/src/tun/tun.go +++ b/src/tun/tun.go @@ -91,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 { From 0e00ec37e3f6baeb84bca28284febe279bf9abd7 Mon Sep 17 00:00:00 2001 From: Vadym Vikulin Date: Wed, 2 Nov 2022 13:34:07 +0000 Subject: [PATCH 5/5] Update version.go Ygg version support --- src/core/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/version.go b/src/core/version.go index 41c0e80e..0bfbbcbc 100644 --- a/src/core/version.go +++ b/src/core/version.go @@ -20,7 +20,7 @@ type version_metadata struct { // Gets a base metadata with no keys set, but with the correct version numbers. func version_getBaseMetadata() version_metadata { return version_metadata{ - meta: [4]byte{'z', 'e', 't', 'a'}, + meta: [4]byte{'m', 'e', 't', 'a'}, ver: 0, minorVer: 4, }