mirror of
https://github.com/KusakabeShi/EtherGuard-VPN.git
synced 2025-02-23 02:30:46 +01:00
shrink header to inc MTU to 1416
This commit is contained in:
parent
72e4ebc91d
commit
29b53884ba
@ -37,11 +37,18 @@ type SuperConfig struct {
|
|||||||
ListenPort int
|
ListenPort int
|
||||||
LogLevel LoggerInfo
|
LogLevel LoggerInfo
|
||||||
RePushConfigInterval float64
|
RePushConfigInterval float64
|
||||||
StatePassword string
|
Passwords Passwords
|
||||||
GraphRecalculateSetting GraphRecalculateSetting
|
GraphRecalculateSetting GraphRecalculateSetting
|
||||||
|
EdgeTemplate string
|
||||||
Peers []SuperPeerInfo
|
Peers []SuperPeerInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Passwords struct {
|
||||||
|
ShowState string
|
||||||
|
AddPeer string
|
||||||
|
DelPeer string
|
||||||
|
}
|
||||||
|
|
||||||
type InterfaceConf struct {
|
type InterfaceConf struct {
|
||||||
Itype string
|
Itype string
|
||||||
Name string
|
Name string
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/KusakabeSi/EtherGuardVPN/path"
|
||||||
"golang.org/x/crypto/blake2s"
|
"golang.org/x/crypto/blake2s"
|
||||||
"golang.org/x/crypto/chacha20poly1305"
|
"golang.org/x/crypto/chacha20poly1305"
|
||||||
)
|
)
|
||||||
@ -154,7 +155,7 @@ func (st *CookieChecker) CreateReply(
|
|||||||
smac1 := smac2 - blake2s.Size128
|
smac1 := smac2 - blake2s.Size128
|
||||||
|
|
||||||
reply := new(MessageCookieReply)
|
reply := new(MessageCookieReply)
|
||||||
reply.Type = MessageCookieReplyType
|
reply.Type = path.MessageCookieReplyType
|
||||||
reply.Receiver = recv
|
reply.Receiver = recv
|
||||||
|
|
||||||
_, err := rand.Read(reply.Nonce[:])
|
_, err := rand.Read(reply.Nonce[:])
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
package device
|
package device
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -392,7 +393,7 @@ func (device *Device) LookupPeerIDAtConfig(pk NoisePublicKey) (ID config.Vertex,
|
|||||||
return 0, errors.New("Superconfig is nil")
|
return 0, errors.New("Superconfig is nil")
|
||||||
}
|
}
|
||||||
peerlist = device.SuperConfig.Peers
|
peerlist = device.SuperConfig.Peers
|
||||||
pkstr := PubKey2Str(pk)
|
pkstr := pk.ToString()
|
||||||
for _, peerinfo := range peerlist {
|
for _, peerinfo := range peerlist {
|
||||||
if peerinfo.PubKey == pkstr {
|
if peerinfo.PubKey == pkstr {
|
||||||
return peerinfo.NodeID, nil
|
return peerinfo.NodeID, nil
|
||||||
@ -404,7 +405,7 @@ func (device *Device) LookupPeerIDAtConfig(pk NoisePublicKey) (ID config.Vertex,
|
|||||||
return 0, errors.New("EdgeConfig is nil")
|
return 0, errors.New("EdgeConfig is nil")
|
||||||
}
|
}
|
||||||
peerlist = device.EdgeConfig.Peers
|
peerlist = device.EdgeConfig.Peers
|
||||||
pkstr := PubKey2Str(pk)
|
pkstr := pk.ToString()
|
||||||
for _, peerinfo := range peerlist {
|
for _, peerinfo := range peerlist {
|
||||||
if peerinfo.PubKey == pkstr {
|
if peerinfo.PubKey == pkstr {
|
||||||
return peerinfo.NodeID, nil
|
return peerinfo.NodeID, nil
|
||||||
@ -429,34 +430,51 @@ func (device *Device) LookupPeerByStr(pks string) *Peer {
|
|||||||
return device.LookupPeer(pk)
|
return device.LookupPeer(pk)
|
||||||
}
|
}
|
||||||
|
|
||||||
func PubKey2Str(pk NoisePublicKey) (result string) {
|
func (pk *NoisePublicKey) ToString() string {
|
||||||
result = string(base64.StdEncoding.EncodeToString(pk[:]))
|
if bytes.Equal(pk[:], make([]byte, len(pk))) {
|
||||||
return
|
return ""
|
||||||
|
}
|
||||||
|
return string(base64.StdEncoding.EncodeToString(pk[:]))
|
||||||
}
|
}
|
||||||
|
|
||||||
func PriKey2Str(pk NoisePrivateKey) (result string) {
|
func (pk *NoisePrivateKey) ToString() (result string) {
|
||||||
result = string(base64.StdEncoding.EncodeToString(pk[:]))
|
if bytes.Equal(pk[:], make([]byte, len(pk))) {
|
||||||
return
|
return ""
|
||||||
|
}
|
||||||
|
return string(base64.StdEncoding.EncodeToString(pk[:]))
|
||||||
}
|
}
|
||||||
func PSKeyStr(pk NoisePresharedKey) (result string) {
|
func (pk *NoisePresharedKey) ToString() (result string) {
|
||||||
result = string(base64.StdEncoding.EncodeToString(pk[:]))
|
if bytes.Equal(pk[:], make([]byte, len(pk))) {
|
||||||
return
|
return ""
|
||||||
|
}
|
||||||
|
return string(base64.StdEncoding.EncodeToString(pk[:]))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Str2PubKey(k string) (pk NoisePublicKey) {
|
func Str2PubKey(k string) (pk NoisePublicKey, err error) {
|
||||||
sk_slice, _ := base64.StdEncoding.DecodeString(k)
|
if k == "" {
|
||||||
|
err = errors.New("Empty public key string")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sk_slice, err := base64.StdEncoding.DecodeString(k)
|
||||||
copy(pk[:], sk_slice)
|
copy(pk[:], sk_slice)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func Str2PriKey(k string) (pk NoisePrivateKey) {
|
func Str2PriKey(k string) (pk NoisePrivateKey, err error) {
|
||||||
sk_slice, _ := base64.StdEncoding.DecodeString(k)
|
if k == "" {
|
||||||
|
err = errors.New("Empty private key string")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sk_slice, err := base64.StdEncoding.DecodeString(k)
|
||||||
copy(pk[:], sk_slice)
|
copy(pk[:], sk_slice)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func Str2PSKey(k string) (pk NoisePresharedKey) {
|
func Str2PSKey(k string) (pk NoisePresharedKey, err error) {
|
||||||
sk_slice, _ := base64.StdEncoding.DecodeString(k)
|
if k == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sk_slice, err := base64.StdEncoding.DecodeString(k)
|
||||||
copy(pk[:], sk_slice)
|
copy(pk[:], sk_slice)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import (
|
|||||||
"golang.org/x/crypto/chacha20poly1305"
|
"golang.org/x/crypto/chacha20poly1305"
|
||||||
"golang.org/x/crypto/poly1305"
|
"golang.org/x/crypto/poly1305"
|
||||||
|
|
||||||
|
"github.com/KusakabeSi/EtherGuardVPN/path"
|
||||||
"github.com/KusakabeSi/EtherGuardVPN/tai64n"
|
"github.com/KusakabeSi/EtherGuardVPN/tai64n"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -53,26 +54,19 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MessageInitiationType = 1
|
MessageInitiationSize = 145 // size of handshake initiation message
|
||||||
MessageResponseType = 2
|
MessageResponseSize = 89 // size of response message
|
||||||
MessageCookieReplyType = 3
|
MessageCookieReplySize = 61 // size of cookie reply message
|
||||||
MessageTransportType = 4
|
MessageTransportHeaderSize = 13 // size of data preceding content in transport message
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
MessageInitiationSize = 148 // size of handshake initiation message
|
|
||||||
MessageResponseSize = 92 // size of response message
|
|
||||||
MessageCookieReplySize = 64 // size of cookie reply message
|
|
||||||
MessageTransportHeaderSize = 16 // size of data preceding content in transport message
|
|
||||||
MessageTransportSize = MessageTransportHeaderSize + poly1305.TagSize // size of empty transport
|
MessageTransportSize = MessageTransportHeaderSize + poly1305.TagSize // size of empty transport
|
||||||
MessageKeepaliveSize = MessageTransportSize // size of keepalive
|
MessageKeepaliveSize = MessageTransportSize // size of keepalive
|
||||||
MessageHandshakeSize = MessageInitiationSize // size of largest handshake related message
|
MessageHandshakeSize = MessageInitiationSize // size of largest handshake related message
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MessageTransportOffsetReceiver = 4
|
MessageTransportOffsetReceiver = 1
|
||||||
MessageTransportOffsetCounter = 8
|
MessageTransportOffsetCounter = 5
|
||||||
MessageTransportOffsetContent = 16
|
MessageTransportOffsetContent = 13
|
||||||
)
|
)
|
||||||
|
|
||||||
/* Type is an 8-bit field, followed by 3 nul bytes,
|
/* Type is an 8-bit field, followed by 3 nul bytes,
|
||||||
@ -82,7 +76,7 @@ const (
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
type MessageInitiation struct {
|
type MessageInitiation struct {
|
||||||
Type uint32
|
Type path.Usage
|
||||||
Sender uint32
|
Sender uint32
|
||||||
Ephemeral NoisePublicKey
|
Ephemeral NoisePublicKey
|
||||||
Static [NoisePublicKeySize + poly1305.TagSize]byte
|
Static [NoisePublicKeySize + poly1305.TagSize]byte
|
||||||
@ -92,7 +86,7 @@ type MessageInitiation struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MessageResponse struct {
|
type MessageResponse struct {
|
||||||
Type uint32
|
Type path.Usage
|
||||||
Sender uint32
|
Sender uint32
|
||||||
Receiver uint32
|
Receiver uint32
|
||||||
Ephemeral NoisePublicKey
|
Ephemeral NoisePublicKey
|
||||||
@ -102,14 +96,14 @@ type MessageResponse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MessageTransport struct {
|
type MessageTransport struct {
|
||||||
Type uint32
|
Type path.Usage
|
||||||
Receiver uint32
|
Receiver uint32
|
||||||
Counter uint64
|
Counter uint64
|
||||||
Content []byte
|
Content []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
type MessageCookieReply struct {
|
type MessageCookieReply struct {
|
||||||
Type uint32
|
Type path.Usage
|
||||||
Receiver uint32
|
Receiver uint32
|
||||||
Nonce [chacha20poly1305.NonceSizeX]byte
|
Nonce [chacha20poly1305.NonceSizeX]byte
|
||||||
Cookie [blake2s.Size128 + poly1305.TagSize]byte
|
Cookie [blake2s.Size128 + poly1305.TagSize]byte
|
||||||
@ -196,7 +190,7 @@ func (device *Device) CreateMessageInitiation(peer *Peer) (*MessageInitiation, e
|
|||||||
handshake.mixHash(handshake.remoteStatic[:])
|
handshake.mixHash(handshake.remoteStatic[:])
|
||||||
|
|
||||||
msg := MessageInitiation{
|
msg := MessageInitiation{
|
||||||
Type: MessageInitiationType,
|
Type: path.MessageInitiationType,
|
||||||
Ephemeral: handshake.localEphemeral.publicKey(),
|
Ephemeral: handshake.localEphemeral.publicKey(),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,7 +246,7 @@ func (device *Device) ConsumeMessageInitiation(msg *MessageInitiation) *Peer {
|
|||||||
chainKey [blake2s.Size]byte
|
chainKey [blake2s.Size]byte
|
||||||
)
|
)
|
||||||
|
|
||||||
if msg.Type != MessageInitiationType {
|
if msg.Type != path.MessageInitiationType {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,7 +364,7 @@ func (device *Device) CreateMessageResponse(peer *Peer) (*MessageResponse, error
|
|||||||
}
|
}
|
||||||
|
|
||||||
var msg MessageResponse
|
var msg MessageResponse
|
||||||
msg.Type = MessageResponseType
|
msg.Type = path.MessageResponseType
|
||||||
msg.Sender = handshake.localIndex
|
msg.Sender = handshake.localIndex
|
||||||
msg.Receiver = handshake.remoteIndex
|
msg.Receiver = handshake.remoteIndex
|
||||||
|
|
||||||
@ -418,7 +412,7 @@ func (device *Device) CreateMessageResponse(peer *Peer) (*MessageResponse, error
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) ConsumeMessageResponse(msg *MessageResponse) *Peer {
|
func (device *Device) ConsumeMessageResponse(msg *MessageResponse) *Peer {
|
||||||
if msg.Type != MessageResponseType {
|
if msg.Type != path.MessageResponseType {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ package device
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"container/list"
|
"container/list"
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -18,6 +17,7 @@ import (
|
|||||||
|
|
||||||
"github.com/KusakabeSi/EtherGuardVPN/config"
|
"github.com/KusakabeSi/EtherGuardVPN/config"
|
||||||
"github.com/KusakabeSi/EtherGuardVPN/conn"
|
"github.com/KusakabeSi/EtherGuardVPN/conn"
|
||||||
|
orderedmap "github.com/KusakabeSi/EtherGuardVPN/orderdmap"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ type Peer struct {
|
|||||||
handshake Handshake
|
handshake Handshake
|
||||||
device *Device
|
device *Device
|
||||||
endpoint conn.Endpoint
|
endpoint conn.Endpoint
|
||||||
endpoint_trylist sync.Map //map[string]time.Time
|
endpoint_trylist orderedmap.OrderedMap //map[string]time.Time
|
||||||
LastPingReceived time.Time
|
LastPingReceived time.Time
|
||||||
stopping sync.WaitGroup // routines pending stop
|
stopping sync.WaitGroup // routines pending stop
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ func (device *Device) NewPeer(pk NoisePublicKey, id config.Vertex) (*Peer, error
|
|||||||
|
|
||||||
// create peer
|
// create peer
|
||||||
if device.LogLevel.LogControl {
|
if device.LogLevel.LogControl {
|
||||||
fmt.Println("Control: Create peer with ID : " + id.ToString() + " and PubKey:" + base64.StdEncoding.EncodeToString(pk[:]))
|
fmt.Println("Control: Create peer with ID : " + id.ToString() + " and PubKey:" + pk.ToString())
|
||||||
}
|
}
|
||||||
peer := new(Peer)
|
peer := new(Peer)
|
||||||
peer.Lock()
|
peer.Lock()
|
||||||
@ -103,6 +103,7 @@ func (device *Device) NewPeer(pk NoisePublicKey, id config.Vertex) (*Peer, error
|
|||||||
|
|
||||||
peer.cookieGenerator.Init(pk)
|
peer.cookieGenerator.Init(pk)
|
||||||
peer.device = device
|
peer.device = device
|
||||||
|
peer.endpoint_trylist = orderedmap.New()
|
||||||
peer.queue.outbound = newAutodrainingOutboundQueue(device)
|
peer.queue.outbound = newAutodrainingOutboundQueue(device)
|
||||||
peer.queue.inbound = newAutodrainingInboundQueue(device)
|
peer.queue.inbound = newAutodrainingInboundQueue(device)
|
||||||
peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize)
|
peer.queue.staged = make(chan *QueueOutboundElement, QueueStagedSize)
|
||||||
@ -342,8 +343,8 @@ func (device *Device) SaveToConfig(peer *Peer, endpoint conn.Endpoint) {
|
|||||||
|
|
||||||
url := endpoint.DstToString()
|
url := endpoint.DstToString()
|
||||||
foundInFile := false
|
foundInFile := false
|
||||||
pubkeystr := PubKey2Str(peer.handshake.remoteStatic)
|
pubkeystr := peer.handshake.remoteStatic.ToString()
|
||||||
pskstr := PSKeyStr(peer.handshake.presharedKey)
|
pskstr := peer.handshake.presharedKey.ToString()
|
||||||
if bytes.Equal(peer.handshake.presharedKey[:], make([]byte, 32)) {
|
if bytes.Equal(peer.handshake.presharedKey[:], make([]byte, 32)) {
|
||||||
pskstr = ""
|
pskstr = ""
|
||||||
}
|
}
|
||||||
|
@ -25,13 +25,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type QueueHandshakeElement struct {
|
type QueueHandshakeElement struct {
|
||||||
msgType uint32
|
msgType path.Usage
|
||||||
packet []byte
|
packet []byte
|
||||||
endpoint conn.Endpoint
|
endpoint conn.Endpoint
|
||||||
buffer *[MaxMessageSize]byte
|
buffer *[MaxMessageSize]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
type QueueInboundElement struct {
|
type QueueInboundElement struct {
|
||||||
|
Type path.Usage
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
buffer *[MaxMessageSize]byte
|
buffer *[MaxMessageSize]byte
|
||||||
packet []byte
|
packet []byte
|
||||||
@ -122,15 +123,19 @@ func (device *Device) RoutineReceiveIncoming(recv conn.ReceiveFunc) {
|
|||||||
// check size of packet
|
// check size of packet
|
||||||
|
|
||||||
packet := buffer[:size]
|
packet := buffer[:size]
|
||||||
msgType := binary.LittleEndian.Uint32(packet[:4])
|
msgType := path.Usage(packet[0])
|
||||||
|
msgType_wg := msgType
|
||||||
|
if msgType >= path.MessageTransportType {
|
||||||
|
msgType_wg = path.MessageTransportType
|
||||||
|
}
|
||||||
|
|
||||||
var okay bool
|
var okay bool
|
||||||
|
|
||||||
switch msgType {
|
switch msgType_wg {
|
||||||
|
|
||||||
// check if transport
|
// check if transport
|
||||||
|
|
||||||
case MessageTransportType:
|
case path.MessageTransportType:
|
||||||
|
|
||||||
// check size
|
// check size
|
||||||
|
|
||||||
@ -158,6 +163,7 @@ func (device *Device) RoutineReceiveIncoming(recv conn.ReceiveFunc) {
|
|||||||
// create work element
|
// create work element
|
||||||
peer := value.peer
|
peer := value.peer
|
||||||
elem := device.GetInboundElement()
|
elem := device.GetInboundElement()
|
||||||
|
elem.Type = msgType
|
||||||
elem.packet = packet
|
elem.packet = packet
|
||||||
elem.buffer = buffer
|
elem.buffer = buffer
|
||||||
elem.keypair = keypair
|
elem.keypair = keypair
|
||||||
@ -178,13 +184,13 @@ func (device *Device) RoutineReceiveIncoming(recv conn.ReceiveFunc) {
|
|||||||
|
|
||||||
// otherwise it is a fixed size & handshake related packet
|
// otherwise it is a fixed size & handshake related packet
|
||||||
|
|
||||||
case MessageInitiationType:
|
case path.MessageInitiationType:
|
||||||
okay = len(packet) == MessageInitiationSize
|
okay = len(packet) == MessageInitiationSize
|
||||||
|
|
||||||
case MessageResponseType:
|
case path.MessageResponseType:
|
||||||
okay = len(packet) == MessageResponseSize
|
okay = len(packet) == MessageResponseSize
|
||||||
|
|
||||||
case MessageCookieReplyType:
|
case path.MessageCookieReplyType:
|
||||||
okay = len(packet) == MessageCookieReplySize
|
okay = len(packet) == MessageCookieReplySize
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -250,7 +256,7 @@ func (device *Device) RoutineHandshake(id int) {
|
|||||||
|
|
||||||
switch elem.msgType {
|
switch elem.msgType {
|
||||||
|
|
||||||
case MessageCookieReplyType:
|
case path.MessageCookieReplyType:
|
||||||
|
|
||||||
// unmarshal packet
|
// unmarshal packet
|
||||||
|
|
||||||
@ -281,7 +287,7 @@ func (device *Device) RoutineHandshake(id int) {
|
|||||||
|
|
||||||
goto skip
|
goto skip
|
||||||
|
|
||||||
case MessageInitiationType, MessageResponseType:
|
case path.MessageInitiationType, path.MessageResponseType:
|
||||||
|
|
||||||
// check mac fields and maybe ratelimit
|
// check mac fields and maybe ratelimit
|
||||||
|
|
||||||
@ -316,7 +322,7 @@ func (device *Device) RoutineHandshake(id int) {
|
|||||||
// handle handshake initiation/response content
|
// handle handshake initiation/response content
|
||||||
|
|
||||||
switch elem.msgType {
|
switch elem.msgType {
|
||||||
case MessageInitiationType:
|
case path.MessageInitiationType:
|
||||||
|
|
||||||
// unmarshal
|
// unmarshal
|
||||||
|
|
||||||
@ -349,7 +355,7 @@ func (device *Device) RoutineHandshake(id int) {
|
|||||||
|
|
||||||
peer.SendHandshakeResponse()
|
peer.SendHandshakeResponse()
|
||||||
|
|
||||||
case MessageResponseType:
|
case path.MessageResponseType:
|
||||||
|
|
||||||
// unmarshal
|
// unmarshal
|
||||||
|
|
||||||
@ -454,7 +460,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
|||||||
src_nodeID = EgHeader.GetSrc()
|
src_nodeID = EgHeader.GetSrc()
|
||||||
dst_nodeID = EgHeader.GetDst()
|
dst_nodeID = EgHeader.GetDst()
|
||||||
elem.packet = elem.packet[:EgHeader.GetPacketLength()+path.EgHeaderLen] // EG header + true packet
|
elem.packet = elem.packet[:EgHeader.GetPacketLength()+path.EgHeaderLen] // EG header + true packet
|
||||||
packet_type = EgHeader.GetUsage()
|
packet_type = elem.Type
|
||||||
|
|
||||||
if device.IsSuperNode {
|
if device.IsSuperNode {
|
||||||
peer.LastPingReceived = time.Now()
|
peer.LastPingReceived = time.Now()
|
||||||
@ -506,12 +512,12 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
|||||||
} else {
|
} else {
|
||||||
EgHeader.SetTTL(l2ttl - 1)
|
EgHeader.SetTTL(l2ttl - 1)
|
||||||
if dst_nodeID == config.Boardcast { //Regular transfer algorithm
|
if dst_nodeID == config.Boardcast { //Regular transfer algorithm
|
||||||
device.TransitBoardcastPacket(src_nodeID, peer.ID, elem.packet, MessageTransportOffsetContent)
|
device.TransitBoardcastPacket(src_nodeID, peer.ID, elem.Type, elem.packet, MessageTransportOffsetContent)
|
||||||
} else if dst_nodeID == config.ControlMessage { // Control Message will try send to every know node regardless the connectivity
|
} else if dst_nodeID == config.ControlMessage { // Control Message will try send to every know node regardless the connectivity
|
||||||
skip_list := make(map[config.Vertex]bool)
|
skip_list := make(map[config.Vertex]bool)
|
||||||
skip_list[src_nodeID] = true //Don't send to conimg peer and source peer
|
skip_list[src_nodeID] = true //Don't send to conimg peer and source peer
|
||||||
skip_list[peer.ID] = true
|
skip_list[peer.ID] = true
|
||||||
device.SpreadPacket(skip_list, elem.packet, MessageTransportOffsetContent)
|
device.SpreadPacket(skip_list, elem.Type, elem.packet, MessageTransportOffsetContent)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
next_id := device.graph.Next(device.ID, dst_nodeID)
|
next_id := device.graph.Next(device.ID, dst_nodeID)
|
||||||
@ -520,7 +526,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
|||||||
if device.LogLevel.LogTransit {
|
if device.LogLevel.LogTransit {
|
||||||
fmt.Printf("Transit: Transfer packet from %d through %d to %d\n", peer.ID, device.ID, peer_out.ID)
|
fmt.Printf("Transit: Transfer packet from %d through %d to %d\n", peer.ID, device.ID, peer_out.ID)
|
||||||
}
|
}
|
||||||
device.SendPacket(peer_out, elem.packet, MessageTransportOffsetContent)
|
device.SendPacket(peer_out, elem.Type, elem.packet, MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@ package device
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -17,7 +16,7 @@ import (
|
|||||||
"github.com/KusakabeSi/EtherGuardVPN/path"
|
"github.com/KusakabeSi/EtherGuardVPN/path"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (device *Device) SendPacket(peer *Peer, packet []byte, offset int) {
|
func (device *Device) SendPacket(peer *Peer, usage path.Usage, packet []byte, offset int) {
|
||||||
if peer == nil {
|
if peer == nil {
|
||||||
return
|
return
|
||||||
} else if peer.endpoint == nil {
|
} else if peer.endpoint == nil {
|
||||||
@ -25,16 +24,15 @@ func (device *Device) SendPacket(peer *Peer, packet []byte, offset int) {
|
|||||||
}
|
}
|
||||||
if device.LogLevel.LogNormal {
|
if device.LogLevel.LogNormal {
|
||||||
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
|
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
|
||||||
if EgHeader.GetUsage() == path.NornalPacket {
|
if usage == path.NornalPacket {
|
||||||
dst_nodeID := EgHeader.GetDst()
|
dst_nodeID := EgHeader.GetDst()
|
||||||
fmt.Println("Normal: Send Normal packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(packet)))
|
fmt.Println("Normal: Send Normal packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(packet)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if device.LogLevel.LogControl {
|
if device.LogLevel.LogControl {
|
||||||
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
|
if usage != path.NornalPacket {
|
||||||
if EgHeader.GetUsage() != path.NornalPacket {
|
|
||||||
if peer.GetEndpointDstStr() != "" {
|
if peer.GetEndpointDstStr() != "" {
|
||||||
fmt.Println("Control: Send To:" + peer.GetEndpointDstStr() + " " + device.sprint_received(EgHeader.GetUsage(), packet[path.EgHeaderLen:]))
|
fmt.Println("Control: Send To:" + peer.GetEndpointDstStr() + " " + device.sprint_received(usage, packet[path.EgHeaderLen:]))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -42,6 +40,7 @@ func (device *Device) SendPacket(peer *Peer, packet []byte, offset int) {
|
|||||||
var elem *QueueOutboundElement
|
var elem *QueueOutboundElement
|
||||||
elem = device.NewOutboundElement()
|
elem = device.NewOutboundElement()
|
||||||
copy(elem.buffer[offset:offset+len(packet)], packet)
|
copy(elem.buffer[offset:offset+len(packet)], packet)
|
||||||
|
elem.Type = usage
|
||||||
elem.packet = elem.buffer[offset : offset+len(packet)]
|
elem.packet = elem.buffer[offset : offset+len(packet)]
|
||||||
if peer.isRunning.Get() {
|
if peer.isRunning.Get() {
|
||||||
peer.StagePacket(elem)
|
peer.StagePacket(elem)
|
||||||
@ -50,7 +49,7 @@ func (device *Device) SendPacket(peer *Peer, packet []byte, offset int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) BoardcastPacket(skip_list map[config.Vertex]bool, packet []byte, offset int) { // Send packet to all connected peers
|
func (device *Device) BoardcastPacket(skip_list map[config.Vertex]bool, usage path.Usage, packet []byte, offset int) { // Send packet to all connected peers
|
||||||
send_list := device.graph.GetBoardcastList(device.ID)
|
send_list := device.graph.GetBoardcastList(device.ID)
|
||||||
for node_id, _ := range skip_list {
|
for node_id, _ := range skip_list {
|
||||||
send_list[node_id] = false
|
send_list[node_id] = false
|
||||||
@ -58,13 +57,13 @@ func (device *Device) BoardcastPacket(skip_list map[config.Vertex]bool, packet [
|
|||||||
device.peers.RLock()
|
device.peers.RLock()
|
||||||
for node_id, should_send := range send_list {
|
for node_id, should_send := range send_list {
|
||||||
if should_send {
|
if should_send {
|
||||||
device.SendPacket(device.peers.IDMap[node_id], packet, offset)
|
device.SendPacket(device.peers.IDMap[node_id], usage, packet, offset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
device.peers.RUnlock()
|
device.peers.RUnlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) SpreadPacket(skip_list map[config.Vertex]bool, packet []byte, offset int) { // Send packet to all peers no matter it is alive
|
func (device *Device) SpreadPacket(skip_list map[config.Vertex]bool, usage path.Usage, packet []byte, offset int) { // Send packet to all peers no matter it is alive
|
||||||
device.peers.RLock()
|
device.peers.RLock()
|
||||||
for peer_id, peer_out := range device.peers.IDMap {
|
for peer_id, peer_out := range device.peers.IDMap {
|
||||||
if _, ok := skip_list[peer_id]; ok {
|
if _, ok := skip_list[peer_id]; ok {
|
||||||
@ -73,12 +72,12 @@ func (device *Device) SpreadPacket(skip_list map[config.Vertex]bool, packet []by
|
|||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
device.SendPacket(peer_out, packet, MessageTransportOffsetContent)
|
device.SendPacket(peer_out, usage, packet, MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
device.peers.RUnlock()
|
device.peers.RUnlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) TransitBoardcastPacket(src_nodeID config.Vertex, in_id config.Vertex, packet []byte, offset int) {
|
func (device *Device) TransitBoardcastPacket(src_nodeID config.Vertex, in_id config.Vertex, usage path.Usage, packet []byte, offset int) {
|
||||||
node_boardcast_list := device.graph.GetBoardcastThroughList(device.ID, in_id, src_nodeID)
|
node_boardcast_list := device.graph.GetBoardcastThroughList(device.ID, in_id, src_nodeID)
|
||||||
device.peers.RLock()
|
device.peers.RLock()
|
||||||
for peer_id := range node_boardcast_list {
|
for peer_id := range node_boardcast_list {
|
||||||
@ -86,19 +85,19 @@ func (device *Device) TransitBoardcastPacket(src_nodeID config.Vertex, in_id con
|
|||||||
if device.LogLevel.LogTransit {
|
if device.LogLevel.LogTransit {
|
||||||
fmt.Printf("Transit: Transfer packet from %d through %d to %d\n", in_id, device.ID, peer_out.ID)
|
fmt.Printf("Transit: Transfer packet from %d through %d to %d\n", in_id, device.ID, peer_out.ID)
|
||||||
}
|
}
|
||||||
device.SendPacket(peer_out, packet, offset)
|
device.SendPacket(peer_out, usage, packet, offset)
|
||||||
}
|
}
|
||||||
device.peers.RUnlock()
|
device.peers.RUnlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) Send2Super(packet []byte, offset int) {
|
func (device *Device) Send2Super(usage path.Usage, packet []byte, offset int) {
|
||||||
device.peers.RLock()
|
device.peers.RLock()
|
||||||
if device.DRoute.SuperNode.UseSuperNode {
|
if device.DRoute.SuperNode.UseSuperNode {
|
||||||
for _, peer_out := range device.peers.SuperPeer {
|
for _, peer_out := range device.peers.SuperPeer {
|
||||||
/*if device.LogTransit {
|
/*if device.LogTransit {
|
||||||
fmt.Printf("Send to supernode %s\n", peer_out.endpoint.DstToString())
|
fmt.Printf("Send to supernode %s\n", peer_out.endpoint.DstToString())
|
||||||
}*/
|
}*/
|
||||||
device.SendPacket(peer_out, packet, offset)
|
device.SendPacket(peer_out, usage, packet, offset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
device.peers.RUnlock()
|
device.peers.RUnlock()
|
||||||
@ -236,11 +235,10 @@ func (device *Device) server_process_RegisterMsg(peer *Peer, content path.Regist
|
|||||||
header, err := path.NewEgHeader(buf[:path.EgHeaderLen])
|
header, err := path.NewEgHeader(buf[:path.EgHeaderLen])
|
||||||
header.SetSrc(device.ID)
|
header.SetSrc(device.ID)
|
||||||
header.SetTTL(device.DefaultTTL)
|
header.SetTTL(device.DefaultTTL)
|
||||||
header.SetUsage(path.UpdateError)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
header.SetDst(peer.ID)
|
header.SetDst(peer.ID)
|
||||||
device.SendPacket(peer, buf, MessageTransportOffsetContent)
|
device.SendPacket(peer, path.UpdateError, buf, MessageTransportOffsetContent)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
device.Event_server_register <- content
|
device.Event_server_register <- content
|
||||||
@ -270,16 +268,15 @@ func (device *Device) process_ping(peer *Peer, content path.PingMsg) error {
|
|||||||
header, err := path.NewEgHeader(buf[:path.EgHeaderLen])
|
header, err := path.NewEgHeader(buf[:path.EgHeaderLen])
|
||||||
header.SetSrc(device.ID)
|
header.SetSrc(device.ID)
|
||||||
header.SetTTL(device.DefaultTTL)
|
header.SetTTL(device.DefaultTTL)
|
||||||
header.SetUsage(path.PongPacket)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
if device.DRoute.SuperNode.UseSuperNode {
|
if device.DRoute.SuperNode.UseSuperNode {
|
||||||
header.SetDst(config.SuperNodeMessage)
|
header.SetDst(config.SuperNodeMessage)
|
||||||
device.Send2Super(buf, MessageTransportOffsetContent)
|
device.Send2Super(path.PongPacket, buf, MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
if device.DRoute.P2P.UseP2P {
|
if device.DRoute.P2P.UseP2P {
|
||||||
header.SetDst(config.ControlMessage)
|
header.SetDst(config.ControlMessage)
|
||||||
device.SpreadPacket(make(map[config.Vertex]bool), buf, MessageTransportOffsetContent)
|
device.SpreadPacket(make(map[config.Vertex]bool), path.PongPacket, buf, MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -301,10 +298,9 @@ func (device *Device) process_pong(peer *Peer, content path.PongMsg) error {
|
|||||||
header, err := path.NewEgHeader(buf[:path.EgHeaderLen])
|
header, err := path.NewEgHeader(buf[:path.EgHeaderLen])
|
||||||
header.SetSrc(device.ID)
|
header.SetSrc(device.ID)
|
||||||
header.SetTTL(device.DefaultTTL)
|
header.SetTTL(device.DefaultTTL)
|
||||||
header.SetUsage(path.QueryPeer)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
device.SendPacket(peer, buf, MessageTransportOffsetContent)
|
device.SendPacket(peer, path.QueryPeer, buf, MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -327,7 +323,7 @@ func (device *Device) process_UpdatePeerMsg(peer *Peer, content path.UpdatePeerM
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
downloadurl := device.DRoute.SuperNode.APIUrl + "/peerinfo?PubKey=" + url.QueryEscape(PubKey2Str(device.staticIdentity.publicKey)) + "&State=" + url.QueryEscape(string(content.State_hash[:]))
|
downloadurl := device.DRoute.SuperNode.APIUrl + "/peerinfo?PubKey=" + url.QueryEscape(device.staticIdentity.publicKey.ToString()) + "&State=" + url.QueryEscape(string(content.State_hash[:]))
|
||||||
if device.LogLevel.LogControl {
|
if device.LogLevel.LogControl {
|
||||||
fmt.Println("Control: Download peerinfo from :" + downloadurl)
|
fmt.Println("Control: Download peerinfo from :" + downloadurl)
|
||||||
}
|
}
|
||||||
@ -353,11 +349,33 @@ func (device *Device) process_UpdatePeerMsg(peer *Peer, content path.UpdatePeerM
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for nodeID, thepeer := range device.peers.IDMap {
|
||||||
|
pk := thepeer.handshake.remoteStatic
|
||||||
|
psk := thepeer.handshake.presharedKey
|
||||||
|
if val, ok := peer_infos[pk.ToString()]; ok {
|
||||||
|
if val.NodeID != nodeID {
|
||||||
|
device.RemovePeer(pk)
|
||||||
|
continue
|
||||||
|
} else if val.PSKey != psk.ToString() {
|
||||||
|
device.RemovePeer(pk)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
device.RemovePeer(pk)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
for pubkey, peerinfo := range peer_infos {
|
for pubkey, peerinfo := range peer_infos {
|
||||||
if len(peerinfo.Connurl) == 0 {
|
if len(peerinfo.Connurl) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
sk := Str2PubKey(pubkey)
|
sk, err := Str2PubKey(pubkey)
|
||||||
|
if err != nil {
|
||||||
|
device.log.Errorf("Error decode base64:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
if bytes.Equal(sk[:], device.staticIdentity.publicKey[:]) {
|
if bytes.Equal(sk[:], device.staticIdentity.publicKey[:]) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -375,7 +393,11 @@ func (device *Device) process_UpdatePeerMsg(peer *Peer, content path.UpdatePeerM
|
|||||||
device.NewPeer(sk, peerinfo.NodeID)
|
device.NewPeer(sk, peerinfo.NodeID)
|
||||||
thepeer = device.LookupPeer(sk)
|
thepeer = device.LookupPeer(sk)
|
||||||
if peerinfo.PSKey != "" {
|
if peerinfo.PSKey != "" {
|
||||||
pk := Str2PSKey(peerinfo.PSKey)
|
pk, err := Str2PSKey(peerinfo.PSKey)
|
||||||
|
if err != nil {
|
||||||
|
device.log.Errorf("Error decode base64:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
thepeer.handshake.presharedKey = pk
|
thepeer.handshake.presharedKey = pk
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -383,7 +405,9 @@ func (device *Device) process_UpdatePeerMsg(peer *Peer, content path.UpdatePeerM
|
|||||||
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.P2P.PeerAliveTimeout)).Before(time.Now()) {
|
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.P2P.PeerAliveTimeout)).Before(time.Now()) {
|
||||||
//Peer died, try to switch to this new endpoint
|
//Peer died, try to switch to this new endpoint
|
||||||
for url, _ := range peerinfo.Connurl {
|
for url, _ := range peerinfo.Connurl {
|
||||||
thepeer.endpoint_trylist.Store(url, time.Time{}) //another gorouting will process it
|
thepeer.Lock()
|
||||||
|
thepeer.endpoint_trylist.Set(url, time.Time{}) //another gorouting will process it
|
||||||
|
thepeer.Unlock()
|
||||||
send_signal = true
|
send_signal = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -415,7 +439,7 @@ func (device *Device) process_UpdateNhTableMsg(peer *Peer, content path.UpdateNh
|
|||||||
if bytes.Equal(device.graph.NhTableHash[:], content.State_hash[:]) {
|
if bytes.Equal(device.graph.NhTableHash[:], content.State_hash[:]) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
downloadurl := device.DRoute.SuperNode.APIUrl + "/nhtable?PubKey=" + url.QueryEscape(PubKey2Str(device.staticIdentity.publicKey)) + "&State=" + url.QueryEscape(string(content.State_hash[:]))
|
downloadurl := device.DRoute.SuperNode.APIUrl + "/nhtable?PubKey=" + url.QueryEscape(device.staticIdentity.publicKey.ToString()) + "&State=" + url.QueryEscape(string(content.State_hash[:]))
|
||||||
if device.LogLevel.LogControl {
|
if device.LogLevel.LogControl {
|
||||||
fmt.Println("Control: Download NhTable from :" + downloadurl)
|
fmt.Println("Control: Download NhTable from :" + downloadurl)
|
||||||
}
|
}
|
||||||
@ -471,37 +495,51 @@ func (device *Device) RoutineSetEndpoint() {
|
|||||||
for _, thepeer := range device.peers.IDMap {
|
for _, thepeer := range device.peers.IDMap {
|
||||||
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.P2P.PeerAliveTimeout)).After(time.Now()) {
|
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.P2P.PeerAliveTimeout)).After(time.Now()) {
|
||||||
//Peer alives
|
//Peer alives
|
||||||
thepeer.endpoint_trylist.Range(func(key, value interface{}) bool {
|
thepeer.Lock()
|
||||||
|
for _, key := range thepeer.endpoint_trylist.Keys() { // delete whole endpoint_trylist
|
||||||
thepeer.endpoint_trylist.Delete(key)
|
thepeer.endpoint_trylist.Delete(key)
|
||||||
return true
|
}
|
||||||
})
|
thepeer.Unlock()
|
||||||
} else {
|
} else {
|
||||||
thepeer.endpoint_trylist.Range(func(key interface{}, value interface{}) bool {
|
thepeer.RLock()
|
||||||
url := key.(string)
|
trylist := thepeer.endpoint_trylist.Keys()
|
||||||
trytime := value.(time.Time)
|
thepeer.RUnlock()
|
||||||
if trytime.Sub(time.Time{}) != time.Duration(0) && time.Now().Sub(trytime) > path.S2TD(device.DRoute.ConnTimeOut) {
|
for _, key := range trylist { // try next endpoint
|
||||||
|
connurl := key
|
||||||
|
thepeer.RLock()
|
||||||
|
val, hasval := thepeer.endpoint_trylist.Get(key)
|
||||||
|
thepeer.RUnlock()
|
||||||
|
if !hasval {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
trytime := val.(time.Time)
|
||||||
|
if trytime.Sub(time.Time{}) != time.Duration(0) && time.Now().Sub(trytime) > path.S2TD(device.DRoute.ConnTimeOut) { // tried before, but no response
|
||||||
|
thepeer.Lock()
|
||||||
thepeer.endpoint_trylist.Delete(key)
|
thepeer.endpoint_trylist.Delete(key)
|
||||||
|
thepeer.Unlock()
|
||||||
} else {
|
} else {
|
||||||
endpoint, err := device.Bind().ParseEndpoint(url) //trying to bind first url in the list and wait device.DRoute.P2P.PeerAliveTimeout seconds
|
endpoint, err := device.Bind().ParseEndpoint(connurl) //trying to bind first url in the list and wait device.DRoute.P2P.PeerAliveTimeout seconds
|
||||||
if err != nil {
|
if err != nil {
|
||||||
device.log.Errorf("Can't bind " + url)
|
device.log.Errorf("Can't bind " + connurl)
|
||||||
thepeer.endpoint_trylist.Delete(url)
|
thepeer.Lock()
|
||||||
return true
|
thepeer.endpoint_trylist.Delete(connurl)
|
||||||
|
thepeer.Unlock()
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
if device.LogLevel.LogControl {
|
if device.LogLevel.LogControl {
|
||||||
fmt.Println("Control: Set endpoint to " + endpoint.DstToString() + " for NodeID:" + thepeer.ID.ToString())
|
fmt.Println("Control: Set endpoint to " + endpoint.DstToString() + " for NodeID:" + thepeer.ID.ToString())
|
||||||
}
|
}
|
||||||
thepeer.SetEndpointFromPacket(endpoint)
|
thepeer.SetEndpointFromPacket(endpoint)
|
||||||
NextRun = true
|
NextRun = true
|
||||||
thepeer.endpoint_trylist.Store(key, time.Now())
|
thepeer.Lock()
|
||||||
|
thepeer.endpoint_trylist.Set(key, time.Now())
|
||||||
|
thepeer.Unlock()
|
||||||
//Send Ping message to it
|
//Send Ping message to it
|
||||||
packet, err := device.GeneratePingPacket(device.ID)
|
packet, usage, err := device.GeneratePingPacket(device.ID)
|
||||||
device.SendPacket(thepeer, packet, MessageTransportOffsetContent)
|
device.SendPacket(thepeer, usage, packet, MessageTransportOffsetContent)
|
||||||
|
break
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
return true
|
}
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ClearChanLoop:
|
ClearChanLoop:
|
||||||
@ -524,8 +562,8 @@ func (device *Device) RoutineSendPing() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
packet, _ := device.GeneratePingPacket(device.ID)
|
packet, usage, _ := device.GeneratePingPacket(device.ID)
|
||||||
device.SpreadPacket(make(map[config.Vertex]bool), packet, MessageTransportOffsetContent)
|
device.SpreadPacket(make(map[config.Vertex]bool), usage, packet, MessageTransportOffsetContent)
|
||||||
time.Sleep(path.S2TD(device.DRoute.SendPingInterval))
|
time.Sleep(path.S2TD(device.DRoute.SendPingInterval))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -547,10 +585,9 @@ func (device *Device) RoutineRegister() {
|
|||||||
header.SetDst(config.SuperNodeMessage)
|
header.SetDst(config.SuperNodeMessage)
|
||||||
header.SetTTL(0)
|
header.SetTTL(0)
|
||||||
header.SetSrc(device.ID)
|
header.SetSrc(device.ID)
|
||||||
header.SetUsage(path.Register)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
device.Send2Super(buf, MessageTransportOffsetContent)
|
device.Send2Super(path.Register, buf, MessageTransportOffsetContent)
|
||||||
time.Sleep(path.S2TD(device.DRoute.SendPingInterval))
|
time.Sleep(path.S2TD(device.DRoute.SendPingInterval))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -612,26 +649,25 @@ func (device *Device) RoutineResetConn() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) GeneratePingPacket(src_nodeID config.Vertex) ([]byte, error) {
|
func (device *Device) GeneratePingPacket(src_nodeID config.Vertex) ([]byte, path.Usage, error) {
|
||||||
body, err := path.GetByte(&path.PingMsg{
|
body, err := path.GetByte(&path.PingMsg{
|
||||||
Src_nodeID: src_nodeID,
|
Src_nodeID: src_nodeID,
|
||||||
Time: device.graph.GetCurrentTime(),
|
Time: device.graph.GetCurrentTime(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, path.PingPacket, err
|
||||||
}
|
}
|
||||||
buf := make([]byte, path.EgHeaderLen+len(body))
|
buf := make([]byte, path.EgHeaderLen+len(body))
|
||||||
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
|
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, path.PingPacket, err
|
||||||
}
|
}
|
||||||
header.SetDst(config.ControlMessage)
|
header.SetDst(config.ControlMessage)
|
||||||
header.SetTTL(0)
|
header.SetTTL(0)
|
||||||
header.SetSrc(device.ID)
|
header.SetSrc(device.ID)
|
||||||
header.SetUsage(path.PingPacket)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
return buf, nil
|
return buf, path.PingPacket, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error { //Send all my peers to all my peers
|
func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error { //Send all my peers to all my peers
|
||||||
@ -663,10 +699,9 @@ func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error {
|
|||||||
header.SetDst(config.ControlMessage)
|
header.SetDst(config.ControlMessage)
|
||||||
header.SetTTL(device.DefaultTTL)
|
header.SetTTL(device.DefaultTTL)
|
||||||
header.SetSrc(device.ID)
|
header.SetSrc(device.ID)
|
||||||
header.SetUsage(path.BoardcastPeer)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
device.SpreadPacket(make(map[config.Vertex]bool), buf, MessageTransportOffsetContent)
|
device.SpreadPacket(make(map[config.Vertex]bool), path.BoardcastPeer, buf, MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
device.peers.RUnlock()
|
device.peers.RUnlock()
|
||||||
}
|
}
|
||||||
@ -675,18 +710,18 @@ func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error {
|
|||||||
|
|
||||||
func (device *Device) process_BoardcastPeerMsg(peer *Peer, content path.BoardcastPeerMsg) error {
|
func (device *Device) process_BoardcastPeerMsg(peer *Peer, content path.BoardcastPeerMsg) error {
|
||||||
if device.DRoute.P2P.UseP2P {
|
if device.DRoute.P2P.UseP2P {
|
||||||
var sk NoisePublicKey
|
var pk NoisePublicKey
|
||||||
if content.Request_ID == uint32(device.ID) {
|
if content.Request_ID == uint32(device.ID) {
|
||||||
peer.AskedForNeighbor = true
|
peer.AskedForNeighbor = true
|
||||||
}
|
}
|
||||||
if bytes.Equal(content.PubKey[:], device.staticIdentity.publicKey[:]) {
|
if bytes.Equal(content.PubKey[:], device.staticIdentity.publicKey[:]) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
copy(sk[:], content.PubKey[:])
|
copy(pk[:], content.PubKey[:])
|
||||||
thepeer := device.LookupPeer(sk)
|
thepeer := device.LookupPeer(pk)
|
||||||
if thepeer == nil { //not exist in local
|
if thepeer == nil { //not exist in local
|
||||||
if device.LogLevel.LogControl {
|
if device.LogLevel.LogControl {
|
||||||
fmt.Println("Control: Add new peer to local ID:" + content.NodeID.ToString() + " PubKey:" + base64.StdEncoding.EncodeToString(content.PubKey[:]))
|
fmt.Println("Control: Add new peer to local ID:" + content.NodeID.ToString() + " PubKey:" + pk.ToString())
|
||||||
}
|
}
|
||||||
if device.graph.Weight(device.ID, content.NodeID) == path.Infinity { // add node to graph
|
if device.graph.Weight(device.ID, content.NodeID) == path.Infinity { // add node to graph
|
||||||
device.graph.UpdateLentancy(device.ID, content.NodeID, path.S2TD(path.Infinity), true, false)
|
device.graph.UpdateLentancy(device.ID, content.NodeID, path.S2TD(path.Infinity), true, false)
|
||||||
@ -694,15 +729,17 @@ func (device *Device) process_BoardcastPeerMsg(peer *Peer, content path.Boardcas
|
|||||||
if device.graph.Weight(content.NodeID, device.ID) == path.Infinity { // add node to graph
|
if device.graph.Weight(content.NodeID, device.ID) == path.Infinity { // add node to graph
|
||||||
device.graph.UpdateLentancy(content.NodeID, device.ID, path.S2TD(path.Infinity), true, false)
|
device.graph.UpdateLentancy(content.NodeID, device.ID, path.S2TD(path.Infinity), true, false)
|
||||||
}
|
}
|
||||||
device.NewPeer(sk, content.NodeID)
|
device.NewPeer(pk, content.NodeID)
|
||||||
thepeer = device.LookupPeer(sk)
|
thepeer = device.LookupPeer(pk)
|
||||||
var pk NoisePresharedKey
|
var pk NoisePresharedKey
|
||||||
copy(pk[:], content.PSKey[:])
|
copy(pk[:], content.PSKey[:])
|
||||||
thepeer.handshake.presharedKey = pk
|
thepeer.handshake.presharedKey = pk
|
||||||
}
|
}
|
||||||
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.P2P.PeerAliveTimeout)).Before(time.Now()) {
|
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.P2P.PeerAliveTimeout)).Before(time.Now()) {
|
||||||
//Peer died, try to switch to this new endpoint
|
//Peer died, try to switch to this new endpoint
|
||||||
thepeer.endpoint_trylist.Store(content.ConnURL, time.Time{}) //another gorouting will process it
|
thepeer.Lock()
|
||||||
|
thepeer.endpoint_trylist.Set(content.ConnURL, time.Time{}) //another gorouting will process it
|
||||||
|
thepeer.Unlock()
|
||||||
device.event_tryendpoint <- struct{}{}
|
device.event_tryendpoint <- struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import (
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
type QueueOutboundElement struct {
|
type QueueOutboundElement struct {
|
||||||
|
Type path.Usage
|
||||||
sync.Mutex
|
sync.Mutex
|
||||||
buffer *[MaxMessageSize]byte // slice holding the packet data
|
buffer *[MaxMessageSize]byte // slice holding the packet data
|
||||||
packet []byte // slice of "buffer" (always!)
|
packet []byte // slice of "buffer" (always!)
|
||||||
@ -263,7 +264,7 @@ func (device *Device) RoutineReadFromTUN() {
|
|||||||
EgBody.SetDst(dst_nodeID)
|
EgBody.SetDst(dst_nodeID)
|
||||||
EgBody.SetPacketLength(uint16(len(elem.packet) - path.EgHeaderLen))
|
EgBody.SetPacketLength(uint16(len(elem.packet) - path.EgHeaderLen))
|
||||||
EgBody.SetTTL(device.DefaultTTL)
|
EgBody.SetTTL(device.DefaultTTL)
|
||||||
EgBody.SetUsage(path.NornalPacket)
|
elem.Type = path.NornalPacket
|
||||||
|
|
||||||
if dst_nodeID != config.Boardcast {
|
if dst_nodeID != config.Boardcast {
|
||||||
var peer *Peer
|
var peer *Peer
|
||||||
@ -283,7 +284,7 @@ func (device *Device) RoutineReadFromTUN() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
device.BoardcastPacket(make(map[config.Vertex]bool, 0), elem.packet, offset)
|
device.BoardcastPacket(make(map[config.Vertex]bool, 0),elem.Type, elem.packet, offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -388,11 +389,10 @@ func (device *Device) RoutineEncryption(id int) {
|
|||||||
// populate header fields
|
// populate header fields
|
||||||
header := elem.buffer[:MessageTransportHeaderSize]
|
header := elem.buffer[:MessageTransportHeaderSize]
|
||||||
|
|
||||||
fieldType := header[0:4]
|
fieldReceiver := header[1:5]
|
||||||
fieldReceiver := header[4:8]
|
fieldNonce := header[5:13]
|
||||||
fieldNonce := header[8:16]
|
|
||||||
|
|
||||||
binary.LittleEndian.PutUint32(fieldType, MessageTransportType)
|
header[0] = uint8(elem.Type)
|
||||||
binary.LittleEndian.PutUint32(fieldReceiver, elem.keypair.remoteIndex)
|
binary.LittleEndian.PutUint32(fieldReceiver, elem.keypair.remoteIndex)
|
||||||
binary.LittleEndian.PutUint64(fieldNonce, elem.nonce)
|
binary.LittleEndian.PutUint64(fieldNonce, elem.nonce)
|
||||||
|
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap1
|
name: tap1
|
||||||
vppifaceid: 1
|
vppifaceid: 1
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4001
|
recvaddr: 127.0.0.1:4001
|
||||||
sendaddr: 127.0.0.1:5001
|
sendaddr: 127.0.0.1:5001
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap2
|
name: tap2
|
||||||
vppifaceid: 2
|
vppifaceid: 2
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4002
|
recvaddr: 127.0.0.1:4002
|
||||||
sendaddr: 127.0.0.1:5002
|
sendaddr: 127.0.0.1:5002
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap3
|
name: tap3
|
||||||
vppifaceid: 3
|
vppifaceid: 3
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4003
|
recvaddr: 127.0.0.1:4003
|
||||||
sendaddr: 127.0.0.1:5003
|
sendaddr: 127.0.0.1:5003
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap4
|
name: tap4
|
||||||
vppifaceid: 4
|
vppifaceid: 4
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4004
|
recvaddr: 127.0.0.1:4004
|
||||||
sendaddr: 127.0.0.1:5004
|
sendaddr: 127.0.0.1:5004
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap5
|
name: tap5
|
||||||
vppifaceid: 5
|
vppifaceid: 5
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4005
|
recvaddr: 127.0.0.1:4005
|
||||||
sendaddr: 127.0.0.1:5005
|
sendaddr: 127.0.0.1:5005
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap6
|
name: tap6
|
||||||
vppifaceid: 6
|
vppifaceid: 6
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4006
|
recvaddr: 127.0.0.1:4006
|
||||||
sendaddr: 127.0.0.1:5006
|
sendaddr: 127.0.0.1:5006
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap1
|
name: tap1
|
||||||
vppifaceid: 1
|
vppifaceid: 1
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4001
|
recvaddr: 127.0.0.1:4001
|
||||||
sendaddr: 127.0.0.1:5001
|
sendaddr: 127.0.0.1:5001
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap2
|
name: tap2
|
||||||
vppifaceid: 2
|
vppifaceid: 2
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4002
|
recvaddr: 127.0.0.1:4002
|
||||||
sendaddr: 127.0.0.1:5002
|
sendaddr: 127.0.0.1:5002
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap3
|
name: tap3
|
||||||
vppifaceid: 3
|
vppifaceid: 3
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4003
|
recvaddr: 127.0.0.1:4003
|
||||||
sendaddr: 127.0.0.1:5003
|
sendaddr: 127.0.0.1:5003
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap4
|
name: tap4
|
||||||
vppifaceid: 4
|
vppifaceid: 4
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4004
|
recvaddr: 127.0.0.1:4004
|
||||||
sendaddr: 127.0.0.1:5004
|
sendaddr: 127.0.0.1:5004
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap5
|
name: tap5
|
||||||
vppifaceid: 5
|
vppifaceid: 5
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4005
|
recvaddr: 127.0.0.1:4005
|
||||||
sendaddr: 127.0.0.1:5005
|
sendaddr: 127.0.0.1:5005
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap6
|
name: tap6
|
||||||
vppifaceid: 6
|
vppifaceid: 6
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4006
|
recvaddr: 127.0.0.1:4006
|
||||||
sendaddr: 127.0.0.1:5006
|
sendaddr: 127.0.0.1:5006
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap1
|
name: tap1
|
||||||
vppifaceid: 1
|
vppifaceid: 1
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4001
|
recvaddr: 127.0.0.1:4001
|
||||||
sendaddr: 127.0.0.1:5001
|
sendaddr: 127.0.0.1:5001
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
@ -20,7 +20,7 @@ loglevel:
|
|||||||
lognormal: true
|
lognormal: true
|
||||||
logntp: true
|
logntp: true
|
||||||
dynamicroute:
|
dynamicroute:
|
||||||
sendpinginterval: 20
|
sendpinginterval: 16
|
||||||
dupchecktimeout: 40
|
dupchecktimeout: 40
|
||||||
conntimeout: 30
|
conntimeout: 30
|
||||||
savenewpeers: true
|
savenewpeers: true
|
||||||
@ -28,10 +28,10 @@ dynamicroute:
|
|||||||
usesupernode: true
|
usesupernode: true
|
||||||
connurlv4: 127.0.0.1:3000
|
connurlv4: 127.0.0.1:3000
|
||||||
pubkeyv4: LJ8KKacUcIoACTGB/9Ed9w0osrJ3WWeelzpL2u4oUic=
|
pubkeyv4: LJ8KKacUcIoACTGB/9Ed9w0osrJ3WWeelzpL2u4oUic=
|
||||||
connurlv6: ''
|
connurlv6: '[::1]:3000'
|
||||||
pubkeyv6: HCfL6YJtpJEGHTlJ2LgVXIWKB/K95P57LHTJ42ZG8VI=
|
pubkeyv6: HCfL6YJtpJEGHTlJ2LgVXIWKB/K95P57LHTJ42ZG8VI=
|
||||||
apiurl: http://127.0.0.1:3000/api
|
apiurl: http://127.0.0.1:3000/api
|
||||||
supernodeinfotimeout: 40
|
supernodeinfotimeout: 50
|
||||||
p2p:
|
p2p:
|
||||||
usep2p: false
|
usep2p: false
|
||||||
sendpeerinterval: 20
|
sendpeerinterval: 20
|
||||||
|
@ -3,8 +3,8 @@ interface:
|
|||||||
name: tap2
|
name: tap2
|
||||||
vppifaceid: 2
|
vppifaceid: 2
|
||||||
vppbridgeid: 4242
|
vppbridgeid: 4242
|
||||||
macaddrprefix: AA:BB:CC:DD:EE
|
macaddrprefix: AA:BB:CC:DD
|
||||||
mtu: 1404
|
mtu: 1416
|
||||||
recvaddr: 127.0.0.1:4002
|
recvaddr: 127.0.0.1:4002
|
||||||
sendaddr: 127.0.0.1:5002
|
sendaddr: 127.0.0.1:5002
|
||||||
l2headermode: kbdbg
|
l2headermode: kbdbg
|
||||||
@ -20,7 +20,7 @@ loglevel:
|
|||||||
lognormal: true
|
lognormal: true
|
||||||
logntp: true
|
logntp: true
|
||||||
dynamicroute:
|
dynamicroute:
|
||||||
sendpinginterval: 20
|
sendpinginterval: 16
|
||||||
dupchecktimeout: 40
|
dupchecktimeout: 40
|
||||||
conntimeout: 30
|
conntimeout: 30
|
||||||
savenewpeers: true
|
savenewpeers: true
|
||||||
@ -28,10 +28,10 @@ dynamicroute:
|
|||||||
usesupernode: true
|
usesupernode: true
|
||||||
connurlv4: 127.0.0.1:3000
|
connurlv4: 127.0.0.1:3000
|
||||||
pubkeyv4: LJ8KKacUcIoACTGB/9Ed9w0osrJ3WWeelzpL2u4oUic=
|
pubkeyv4: LJ8KKacUcIoACTGB/9Ed9w0osrJ3WWeelzpL2u4oUic=
|
||||||
connurlv6: ''
|
connurlv6: '[::1]:3000'
|
||||||
pubkeyv6: HCfL6YJtpJEGHTlJ2LgVXIWKB/K95P57LHTJ42ZG8VI=
|
pubkeyv6: HCfL6YJtpJEGHTlJ2LgVXIWKB/K95P57LHTJ42ZG8VI=
|
||||||
apiurl: http://127.0.0.1:3000/api
|
apiurl: http://127.0.0.1:3000/api
|
||||||
supernodeinfotimeout: 40
|
supernodeinfotimeout: 50
|
||||||
p2p:
|
p2p:
|
||||||
usep2p: false
|
usep2p: false
|
||||||
sendpeerinterval: 20
|
sendpeerinterval: 20
|
||||||
|
@ -2,7 +2,10 @@ nodename: NodeSuper
|
|||||||
privkeyv4: mL5IW0GuqbjgDeOJuPHBU2iJzBPNKhaNEXbIGwwYWWk=
|
privkeyv4: mL5IW0GuqbjgDeOJuPHBU2iJzBPNKhaNEXbIGwwYWWk=
|
||||||
privkeyv6: +EdOKIoBp/EvIusHDsvXhV1RJYbyN3Qr8nxlz35wl3I=
|
privkeyv6: +EdOKIoBp/EvIusHDsvXhV1RJYbyN3Qr8nxlz35wl3I=
|
||||||
listenport: 3000
|
listenport: 3000
|
||||||
statepassword: passwd
|
passwords:
|
||||||
|
showstate: passwd
|
||||||
|
addpeer: passwd_addpeer
|
||||||
|
delpeer: passwd_delpeer
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: normal
|
||||||
logtransit: true
|
logtransit: true
|
||||||
@ -12,8 +15,9 @@ repushconfiginterval: 30
|
|||||||
graphrecalculatesetting:
|
graphrecalculatesetting:
|
||||||
jittertolerance: 5
|
jittertolerance: 5
|
||||||
jittertolerancemultiplier: 1.01
|
jittertolerancemultiplier: 1.01
|
||||||
nodereporttimeout: 40
|
nodereporttimeout: 50
|
||||||
recalculatecooldown: 5
|
recalculatecooldown: 5
|
||||||
|
edgetemplate: "example_config/super_mode/s1.yaml"
|
||||||
peers:
|
peers:
|
||||||
- nodeid: 1
|
- nodeid: 1
|
||||||
name: "Node_01"
|
name: "Node_01"
|
||||||
@ -22,4 +26,4 @@ peers:
|
|||||||
- nodeid: 2
|
- nodeid: 2
|
||||||
name: "Node_02"
|
name: "Node_02"
|
||||||
pubkey: dHeWQtlTPQGy87WdbUARS4CtwVaR2y7IQ1qcX4GKSXk=
|
pubkey: dHeWQtlTPQGy87WdbUARS4CtwVaR2y7IQ1qcX4GKSXk=
|
||||||
pskey: ""
|
pskey: ""
|
||||||
|
2
main.go
2
main.go
@ -55,7 +55,7 @@ var (
|
|||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
if *version == true {
|
if *version == true {
|
||||||
fmt.Printf("etherguard-go v%s\n%s\n\nA full mesh VPN %s-%s.\nInformation available at https://github.com/KusakabeSi/EtherGuardVPN.\nCopyright (C) Kusakabe Si <si@kskb.eu.org>.\n", Version, tap.VPP_SUPPORT, runtime.GOOS, runtime.GOARCH)
|
fmt.Printf("etherguard-go %s\n%s\n\nA full mesh VPN %s-%s.\nInformation available at https://github.com/KusakabeSi/EtherGuardVPN.\nCopyright (C) Kusakabe Si <si@kskb.eu.org>.\n", Version, tap.VPP_SUPPORT, runtime.GOOS, runtime.GOARCH)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if *help == true {
|
if *help == true {
|
||||||
|
41
main_edge.go
41
main_edge.go
@ -8,7 +8,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
@ -210,24 +209,29 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
graph := path.NewGraph(3, false, econfig.DynamicRoute.P2P.GraphRecalculateSetting, econfig.DynamicRoute.NTPconfig, econfig.LogLevel.LogNTP)
|
graph := path.NewGraph(3, false, econfig.DynamicRoute.P2P.GraphRecalculateSetting, econfig.DynamicRoute.NTPconfig, econfig.LogLevel.LogNTP)
|
||||||
graph.SetNHTable(econfig.NextHopTable, [32]byte{})
|
graph.SetNHTable(econfig.NextHopTable, [32]byte{})
|
||||||
|
|
||||||
the_device := device.NewDevice(thetap, econfig.NodeID, conn.NewDefaultBind(), logger, graph, false, configPath, &econfig, nil, nil,Version)
|
the_device := device.NewDevice(thetap, econfig.NodeID, conn.NewDefaultBind(), logger, graph, false, configPath, &econfig, nil, nil, Version)
|
||||||
defer the_device.Close()
|
defer the_device.Close()
|
||||||
var sk [32]byte
|
pk, err := device.Str2PriKey(econfig.PrivKey)
|
||||||
sk_slice, _ := base64.StdEncoding.DecodeString(econfig.PrivKey)
|
if err != nil {
|
||||||
copy(sk[:], sk_slice)
|
fmt.Println("Error decode base64 ", err)
|
||||||
the_device.SetPrivateKey(sk)
|
return err
|
||||||
|
}
|
||||||
|
the_device.SetPrivateKey(pk)
|
||||||
the_device.IpcSet("fwmark=0\n")
|
the_device.IpcSet("fwmark=0\n")
|
||||||
the_device.IpcSet("listen_port=" + strconv.Itoa(econfig.ListenPort) + "\n")
|
the_device.IpcSet("listen_port=" + strconv.Itoa(econfig.ListenPort) + "\n")
|
||||||
the_device.IpcSet("replace_peers=true\n")
|
the_device.IpcSet("replace_peers=true\n")
|
||||||
for _, peerconf := range econfig.Peers {
|
for _, peerconf := range econfig.Peers {
|
||||||
sk_slice, _ = base64.StdEncoding.DecodeString(peerconf.PubKey)
|
pk, err := device.Str2PubKey(peerconf.PubKey)
|
||||||
copy(sk[:], sk_slice)
|
if err != nil {
|
||||||
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
if peerconf.NodeID >= config.SuperNodeMessage {
|
if peerconf.NodeID >= config.SuperNodeMessage {
|
||||||
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
|
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
|
||||||
}
|
}
|
||||||
the_device.NewPeer(sk, peerconf.NodeID)
|
the_device.NewPeer(pk, peerconf.NodeID)
|
||||||
if peerconf.EndPoint != "" {
|
if peerconf.EndPoint != "" {
|
||||||
peer := the_device.LookupPeer(sk)
|
peer := the_device.LookupPeer(pk)
|
||||||
endpoint, err := the_device.Bind().ParseEndpoint(peerconf.EndPoint)
|
endpoint, err := the_device.Bind().ParseEndpoint(peerconf.EndPoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Failed to set endpoint %v: %w", peerconf.EndPoint, err)
|
logger.Errorf("Failed to set endpoint %v: %w", peerconf.EndPoint, err)
|
||||||
@ -241,13 +245,16 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
|
|
||||||
if econfig.DynamicRoute.SuperNode.UseSuperNode {
|
if econfig.DynamicRoute.SuperNode.UseSuperNode {
|
||||||
if econfig.DynamicRoute.SuperNode.ConnURLV4 != "" {
|
if econfig.DynamicRoute.SuperNode.ConnURLV4 != "" {
|
||||||
sk_slice, _ = base64.StdEncoding.DecodeString(econfig.DynamicRoute.SuperNode.PubKeyV4)
|
pk, err := device.Str2PubKey(econfig.DynamicRoute.SuperNode.PubKeyV4)
|
||||||
copy(sk[:], sk_slice)
|
if err != nil {
|
||||||
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
endpoint, err := the_device.Bind().ParseEndpoint(econfig.DynamicRoute.SuperNode.ConnURLV4)
|
endpoint, err := the_device.Bind().ParseEndpoint(econfig.DynamicRoute.SuperNode.ConnURLV4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
peer, err := the_device.NewPeer(sk, config.SuperNodeMessage)
|
peer, err := the_device.NewPeer(pk, config.SuperNodeMessage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -256,13 +263,15 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
peer.SetEndpointFromPacket(endpoint)
|
peer.SetEndpointFromPacket(endpoint)
|
||||||
}
|
}
|
||||||
if econfig.DynamicRoute.SuperNode.ConnURLV6 != "" {
|
if econfig.DynamicRoute.SuperNode.ConnURLV6 != "" {
|
||||||
sk_slice, _ = base64.StdEncoding.DecodeString(econfig.DynamicRoute.SuperNode.PubKeyV6)
|
pk, err := device.Str2PubKey(econfig.DynamicRoute.SuperNode.PubKeyV6)
|
||||||
copy(sk[:], sk_slice)
|
if err != nil {
|
||||||
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
}
|
||||||
endpoint, err := the_device.Bind().ParseEndpoint(econfig.DynamicRoute.SuperNode.ConnURLV6)
|
endpoint, err := the_device.Bind().ParseEndpoint(econfig.DynamicRoute.SuperNode.ConnURLV6)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
peer, err := the_device.NewPeer(sk, config.SuperNodeMessage)
|
peer, err := the_device.NewPeer(pk, config.SuperNodeMessage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
119
main_super.go
119
main_super.go
@ -10,7 +10,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"encoding/base64"
|
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
@ -105,52 +104,54 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
http_PeerID2Map = make(map[config.Vertex]string)
|
http_PeerID2Map = make(map[config.Vertex]string)
|
||||||
http_PeerInfos = make(map[string]config.HTTP_Peerinfo)
|
http_PeerInfos = make(map[string]config.HTTP_Peerinfo)
|
||||||
http_HashSalt = []byte(config.RandomStr(32, "Salt generate failed"))
|
http_HashSalt = []byte(config.RandomStr(32, "Salt generate failed"))
|
||||||
http_StatePWD = sconfig.StatePassword
|
http_StatePWD = sconfig.Passwords.ShowState
|
||||||
|
|
||||||
super_chains := path.SUPER_Events{
|
super_chains := path.SUPER_Events{
|
||||||
Event_server_pong: make(chan path.PongMsg, 1<<5),
|
Event_server_pong: make(chan path.PongMsg, 1<<5),
|
||||||
Event_server_register: make(chan path.RegisterMsg, 1<<5),
|
Event_server_register: make(chan path.RegisterMsg, 1<<5),
|
||||||
Event_server_NhTable_changed: make(chan struct{}, 1<<4),
|
Event_server_NhTable_changed: make(chan struct{}, 1<<4),
|
||||||
}
|
}
|
||||||
|
http_graph = path.NewGraph(3, true, sconfig.GraphRecalculateSetting, config.NTPinfo{}, sconfig.LogLevel.LogNTP)
|
||||||
|
|
||||||
thetap4, _ := tap.CreateDummyTAP()
|
thetap4, _ := tap.CreateDummyTAP()
|
||||||
thetap6, _ := tap.CreateDummyTAP()
|
|
||||||
http_graph = path.NewGraph(3, true, sconfig.GraphRecalculateSetting, config.NTPinfo{}, sconfig.LogLevel.LogNTP)
|
|
||||||
http_device4 = device.NewDevice(thetap4, config.SuperNodeMessage, conn.NewCustomBind(true, false), logger4, http_graph, true, configPath, nil, &sconfig, &super_chains, Version)
|
http_device4 = device.NewDevice(thetap4, config.SuperNodeMessage, conn.NewCustomBind(true, false), logger4, http_graph, true, configPath, nil, &sconfig, &super_chains, Version)
|
||||||
http_device6 = device.NewDevice(thetap6, config.SuperNodeMessage, conn.NewCustomBind(false, true), logger6, http_graph, true, configPath, nil, &sconfig, &super_chains, Version)
|
|
||||||
defer http_device4.Close()
|
defer http_device4.Close()
|
||||||
|
thetap6, _ := tap.CreateDummyTAP()
|
||||||
|
http_device6 = device.NewDevice(thetap6, config.SuperNodeMessage, conn.NewCustomBind(false, true), logger6, http_graph, true, configPath, nil, &sconfig, &super_chains, Version)
|
||||||
defer http_device6.Close()
|
defer http_device6.Close()
|
||||||
var sk [32]byte
|
if sconfig.PrivKeyV4 != "" {
|
||||||
sk_slice, err := base64.StdEncoding.DecodeString(sconfig.PrivKeyV4)
|
pk4, err := device.Str2PriKey(sconfig.PrivKeyV4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Can't decode base64:%v\n", sconfig.PrivKeyV4)
|
fmt.Println("Error decode base64 ", err)
|
||||||
return err
|
return err
|
||||||
|
}
|
||||||
|
http_device4.SetPrivateKey(pk4)
|
||||||
|
http_device4.IpcSet("fwmark=0\n")
|
||||||
|
http_device4.IpcSet("listen_port=" + strconv.Itoa(sconfig.ListenPort) + "\n")
|
||||||
|
http_device4.IpcSet("replace_peers=true\n")
|
||||||
}
|
}
|
||||||
copy(sk[:], sk_slice)
|
|
||||||
http_device4.SetPrivateKey(sk)
|
if sconfig.PrivKeyV6 != "" {
|
||||||
sk_slice, err = base64.StdEncoding.DecodeString(sconfig.PrivKeyV6)
|
|
||||||
if err != nil {
|
pk6, err := device.Str2PriKey(sconfig.PrivKeyV6)
|
||||||
fmt.Printf("Can't decode base64:%v\n", sconfig.PrivKeyV6)
|
if err != nil {
|
||||||
return err
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
http_device6.SetPrivateKey(pk6)
|
||||||
|
http_device6.IpcSet("fwmark=0\n")
|
||||||
|
http_device6.IpcSet("listen_port=" + strconv.Itoa(sconfig.ListenPort) + "\n")
|
||||||
|
http_device6.IpcSet("replace_peers=true\n")
|
||||||
}
|
}
|
||||||
copy(sk[:], sk_slice)
|
|
||||||
http_device6.SetPrivateKey(sk)
|
|
||||||
http_device4.IpcSet("fwmark=0\n")
|
|
||||||
http_device6.IpcSet("fwmark=0\n")
|
|
||||||
http_device4.IpcSet("listen_port=" + strconv.Itoa(sconfig.ListenPort) + "\n")
|
|
||||||
http_device6.IpcSet("listen_port=" + strconv.Itoa(sconfig.ListenPort) + "\n")
|
|
||||||
http_device4.IpcSet("replace_peers=true\n")
|
|
||||||
http_device6.IpcSet("replace_peers=true\n")
|
|
||||||
|
|
||||||
for _, peerconf := range sconfig.Peers {
|
for _, peerconf := range sconfig.Peers {
|
||||||
http_peerinfos.Store(peerconf.NodeID, peerconf.Name)
|
http_peerinfos.Store(peerconf.NodeID, peerconf.Name)
|
||||||
var pk device.NoisePublicKey
|
pk, err := device.Str2PubKey(peerconf.PubKey)
|
||||||
|
|
||||||
pk_slice, err := base64.StdEncoding.DecodeString(peerconf.PubKey)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error decode base64 ", err)
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
copy(pk[:], pk_slice)
|
|
||||||
if peerconf.NodeID >= config.SuperNodeMessage {
|
if peerconf.NodeID >= config.SuperNodeMessage {
|
||||||
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
|
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
|
||||||
}
|
}
|
||||||
@ -161,31 +162,43 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
PSKey: peerconf.PSKey,
|
PSKey: peerconf.PSKey,
|
||||||
Connurl: make(map[string]bool),
|
Connurl: make(map[string]bool),
|
||||||
}
|
}
|
||||||
peer4, err := http_device4.NewPeer(pk, peerconf.NodeID)
|
if sconfig.PrivKeyV4 != "" {
|
||||||
if err != nil {
|
peer4, err := http_device4.NewPeer(pk, peerconf.NodeID)
|
||||||
fmt.Printf("Error create peer id %v\n", peerconf.NodeID)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
peer4.StaticConn = true
|
|
||||||
peer6, err := http_device6.NewPeer(pk, peerconf.NodeID)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("Error create peer id %v\n", peerconf.NodeID)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
peer6.StaticConn = true
|
|
||||||
if peerconf.PSKey != "" {
|
|
||||||
var psk device.NoisePresharedKey
|
|
||||||
psk_slice, err := base64.StdEncoding.DecodeString(peerconf.PSKey)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error decode base64 ", err)
|
fmt.Printf("Error create peer id %v\n", peerconf.NodeID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
peer4.StaticConn = true
|
||||||
|
if peerconf.PSKey != "" {
|
||||||
|
psk, err := device.Str2PSKey(peerconf.PSKey)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
peer4.SetPSK(psk)
|
||||||
}
|
}
|
||||||
copy(psk[:], psk_slice)
|
|
||||||
peer4.SetPSK(psk)
|
|
||||||
peer6.SetPSK(psk)
|
|
||||||
}
|
}
|
||||||
|
if sconfig.PrivKeyV6 != "" {
|
||||||
|
peer6, err := http_device6.NewPeer(pk, peerconf.NodeID)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error create peer id %v\n", peerconf.NodeID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
peer6.StaticConn = true
|
||||||
|
if peerconf.PSKey != "" {
|
||||||
|
psk, err := device.Str2PSKey(peerconf.PSKey)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error decode base64 ", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
peer6.SetPSK(psk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
http_PeerState[peerconf.PubKey] = &PeerState{}
|
http_PeerState[peerconf.PubKey] = &PeerState{}
|
||||||
}
|
}
|
||||||
logger4.Verbosef("Device started")
|
logger4.Verbosef("Device4 started")
|
||||||
|
logger6.Verbosef("Device6 started")
|
||||||
|
|
||||||
errs := make(chan error, 1<<3)
|
errs := make(chan error, 1<<3)
|
||||||
term := make(chan os.Signal, 1)
|
term := make(chan os.Signal, 1)
|
||||||
@ -290,14 +303,13 @@ func PushNhTable() {
|
|||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
header.SetSrc(config.SuperNodeMessage)
|
header.SetSrc(config.SuperNodeMessage)
|
||||||
header.SetTTL(0)
|
header.SetTTL(0)
|
||||||
header.SetUsage(path.UpdateNhTable)
|
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
for pkstr, _ := range http_PeerState {
|
for pkstr, _ := range http_PeerState {
|
||||||
if peer := http_device4.LookupPeerByStr(pkstr); peer != nil && peer.GetEndpointDstStr() != "" {
|
if peer := http_device4.LookupPeerByStr(pkstr); peer != nil && peer.GetEndpointDstStr() != "" {
|
||||||
http_device4.SendPacket(peer, buf, device.MessageTransportOffsetContent)
|
http_device4.SendPacket(peer, path.UpdateNhTable, buf, device.MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
if peer := http_device6.LookupPeerByStr(pkstr); peer != nil && peer.GetEndpointDstStr() != "" {
|
if peer := http_device6.LookupPeerByStr(pkstr); peer != nil && peer.GetEndpointDstStr() != "" {
|
||||||
http_device6.SendPacket(peer, buf, device.MessageTransportOffsetContent)
|
http_device6.SendPacket(peer, path.UpdateNhTable, buf, device.MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -317,15 +329,14 @@ func PushUpdate() {
|
|||||||
header.SetPacketLength(uint16(len(body)))
|
header.SetPacketLength(uint16(len(body)))
|
||||||
header.SetSrc(config.SuperNodeMessage)
|
header.SetSrc(config.SuperNodeMessage)
|
||||||
header.SetTTL(0)
|
header.SetTTL(0)
|
||||||
header.SetUsage(path.UpdatePeer)
|
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
for pkstr, peerstate := range http_PeerState {
|
for pkstr, peerstate := range http_PeerState {
|
||||||
if peerstate.PeerInfoState != http_PeerInfo_hash {
|
if peerstate.PeerInfoState != http_PeerInfo_hash {
|
||||||
if peer := http_device4.LookupPeerByStr(pkstr); peer != nil {
|
if peer := http_device4.LookupPeerByStr(pkstr); peer != nil {
|
||||||
http_device4.SendPacket(peer, buf, device.MessageTransportOffsetContent)
|
http_device4.SendPacket(peer, path.UpdatePeer, buf, device.MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
if peer := http_device6.LookupPeerByStr(pkstr); peer != nil {
|
if peer := http_device6.LookupPeerByStr(pkstr); peer != nil {
|
||||||
http_device6.SendPacket(peer, buf, device.MessageTransportOffsetContent)
|
http_device6.SendPacket(peer, path.UpdatePeer, buf, device.MessageTransportOffsetContent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,12 +34,12 @@ type OrderedMap struct {
|
|||||||
escapeHTML bool
|
escapeHTML bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func New() *OrderedMap {
|
func New() OrderedMap {
|
||||||
o := OrderedMap{}
|
o := OrderedMap{}
|
||||||
o.keys = []string{}
|
o.keys = []string{}
|
||||||
o.values = map[string]interface{}{}
|
o.values = map[string]interface{}{}
|
||||||
o.escapeHTML = true
|
o.escapeHTML = true
|
||||||
return &o
|
return o
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *OrderedMap) SetEscapeHTML(on bool) {
|
func (o *OrderedMap) SetEscapeHTML(on bool) {
|
||||||
@ -77,7 +77,11 @@ func (o *OrderedMap) Delete(key string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (o *OrderedMap) Keys() []string {
|
func (o *OrderedMap) Keys() []string {
|
||||||
return o.keys
|
ret := make([]string, len(o.keys))
|
||||||
|
for i, v := range o.keys {
|
||||||
|
ret[i] = v
|
||||||
|
}
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// SortKeys Sort the map keys using your sort func
|
// SortKeys Sort the map keys using your sort func
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
"github.com/KusakabeSi/EtherGuardVPN/config"
|
"github.com/KusakabeSi/EtherGuardVPN/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
const EgHeaderLen = 8
|
const EgHeaderLen = 7
|
||||||
|
|
||||||
type EgHeader struct {
|
type EgHeader struct {
|
||||||
buf []byte
|
buf []byte
|
||||||
@ -16,8 +16,13 @@ type EgHeader struct {
|
|||||||
type Usage uint8
|
type Usage uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
NornalPacket Usage = iota
|
MessageInitiationType Usage = iota
|
||||||
Register //Register to server
|
MessageResponseType
|
||||||
|
MessageCookieReplyType
|
||||||
|
MessageTransportType
|
||||||
|
|
||||||
|
NornalPacket
|
||||||
|
Register //Register to server
|
||||||
|
|
||||||
UpdatePeer //Comes from server
|
UpdatePeer //Comes from server
|
||||||
UpdateNhTable
|
UpdateNhTable
|
||||||
@ -56,20 +61,12 @@ func (e EgHeader) GetTTL() uint8 {
|
|||||||
return e.buf[4]
|
return e.buf[4]
|
||||||
}
|
}
|
||||||
func (e EgHeader) SetTTL(ttl uint8) {
|
func (e EgHeader) SetTTL(ttl uint8) {
|
||||||
|
|
||||||
e.buf[4] = ttl
|
e.buf[4] = ttl
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e EgHeader) GetUsage() Usage {
|
|
||||||
return Usage(e.buf[5])
|
|
||||||
}
|
|
||||||
func (e EgHeader) SetUsage(usage Usage) {
|
|
||||||
e.buf[5] = uint8(usage)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e EgHeader) GetPacketLength() uint16 {
|
func (e EgHeader) GetPacketLength() uint16 {
|
||||||
return binary.BigEndian.Uint16(e.buf[6:8])
|
return binary.BigEndian.Uint16(e.buf[5:7])
|
||||||
}
|
}
|
||||||
func (e EgHeader) SetPacketLength(length uint16) {
|
func (e EgHeader) SetPacketLength(length uint16) {
|
||||||
binary.BigEndian.PutUint16(e.buf[6:8], length)
|
binary.BigEndian.PutUint16(e.buf[5:7], length)
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ func (g *IG) InitNTP() {
|
|||||||
g.ntp_info.UseNTP = false
|
g.ntp_info.UseNTP = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
g.ntp_servers = *orderedmap.New()
|
g.ntp_servers = orderedmap.New()
|
||||||
for _, url := range g.ntp_info.Servers {
|
for _, url := range g.ntp_info.Servers {
|
||||||
g.ntp_servers.Set(url, ntp.Response{
|
g.ntp_servers.Set(url, ntp.Response{
|
||||||
RTT: forever,
|
RTT: forever,
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
VPP_SUPPORT = "No VPP support"
|
VPP_SUPPORT = "VPP support disabled"
|
||||||
)
|
)
|
||||||
|
|
||||||
type VppTap struct {
|
type VppTap struct {
|
||||||
@ -18,8 +18,8 @@ type VppTap struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// New creates and returns a new TUN interface for the application.
|
// New creates and returns a new TUN interface for the application.
|
||||||
func CreateVppTAP(iconfig config.InterfaceConf,NodeID config.Vertex, loglevel string) (tapdev Device, err error) {
|
func CreateVppTAP(iconfig config.InterfaceConf, NodeID config.Vertex, loglevel string) (tapdev Device, err error) {
|
||||||
return nil, errors.New("VPP module not compiled.")
|
return nil, errors.New("VPP support disabled.")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tap *VppTap) Read([]byte, int) (int, error) {
|
func (tap *VppTap) Read([]byte, int) (int, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user