mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-11-15 15:30:29 +00:00
71 lines
1.6 KiB
Go
71 lines
1.6 KiB
Go
|
package yggdrasil
|
||
|
|
||
|
import (
|
||
|
"encoding/hex"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/yggdrasil-network/yggdrasil-go/src/crypto"
|
||
|
)
|
||
|
|
||
|
// Dialer represents an Yggdrasil connection dialer.
|
||
|
type Dialer struct {
|
||
|
core *Core
|
||
|
}
|
||
|
|
||
|
// Dial opens a session to the given node. The first paramter should be "nodeid"
|
||
|
// and the second parameter should contain a hexadecimal representation of the
|
||
|
// target node ID.
|
||
|
func (d *Dialer) Dial(network, address string) (Conn, error) {
|
||
|
conn := Conn{
|
||
|
mutex: &sync.RWMutex{},
|
||
|
}
|
||
|
nodeID := crypto.NodeID{}
|
||
|
nodeMask := crypto.NodeID{}
|
||
|
// Process
|
||
|
switch network {
|
||
|
case "nodeid":
|
||
|
// A node ID was provided - we don't need to do anything special with it
|
||
|
if tokens := strings.Split(address, "/"); len(tokens) == 2 {
|
||
|
len, err := strconv.Atoi(tokens[1])
|
||
|
if err != nil {
|
||
|
return Conn{}, err
|
||
|
}
|
||
|
dest, err := hex.DecodeString(tokens[0])
|
||
|
if err != nil {
|
||
|
return Conn{}, err
|
||
|
}
|
||
|
copy(nodeID[:], dest)
|
||
|
for idx := 0; idx < len; idx++ {
|
||
|
nodeMask[idx/8] |= 0x80 >> byte(idx%8)
|
||
|
}
|
||
|
fmt.Println(nodeID)
|
||
|
fmt.Println(nodeMask)
|
||
|
} else {
|
||
|
dest, err := hex.DecodeString(tokens[0])
|
||
|
if err != nil {
|
||
|
return Conn{}, err
|
||
|
}
|
||
|
copy(nodeID[:], dest)
|
||
|
for i := range nodeMask {
|
||
|
nodeMask[i] = 0xFF
|
||
|
}
|
||
|
}
|
||
|
default:
|
||
|
// An unexpected address type was given, so give up
|
||
|
return Conn{}, errors.New("unexpected address type")
|
||
|
}
|
||
|
conn.core = d.core
|
||
|
conn.nodeID = &nodeID
|
||
|
conn.nodeMask = &nodeMask
|
||
|
conn.core.router.doAdmin(func() {
|
||
|
conn.startSearch()
|
||
|
})
|
||
|
conn.mutex.Lock()
|
||
|
defer conn.mutex.Unlock()
|
||
|
return conn, nil
|
||
|
}
|