New log option: LogNormal

This commit is contained in:
KusakabeSi 2021-08-25 08:13:53 +00:00
parent ad196d3f95
commit 89f3069e7f
28 changed files with 148 additions and 81 deletions

2
.vscode/launch.json vendored
View File

@ -11,7 +11,7 @@
"mode": "auto",
"program": "${workspaceFolder}",
"env": {"CGO_CFLAGS":"-I/usr/include/memif"},
"args":["-config","example_config/static_mode/n1.yaml","-mode","edge"/*,"-example"*/],
"args":["-config","example_config/super_mode/n1.yaml","-mode","edge"/*,"-example"*/],
}
]
}

View File

@ -2,6 +2,16 @@ package config
import (
"crypto/rand"
"strconv"
"math"
)
const (
Boardcast Vertex = math.MaxUint32 - iota // Normal boardcast, boardcast with route table
ControlMessage Vertex = math.MaxUint32 - iota // p2p mode: boardcast to every know keer and prevent dup/ super mode: send to supernode
PingMessage Vertex = math.MaxUint32 - iota // boardsact to every know peer but don't transit
SuperNodeMessage Vertex = math.MaxUint32 - iota
Special_NodeID Vertex = SuperNodeMessage
)
type EdgeConfig struct {
@ -24,7 +34,7 @@ type SuperConfig struct {
ListenPort int
LogLevel LoggerInfo
RePushConfigInterval float64
statepasswordd string
StatePassword string
GraphRecalculateSetting GraphRecalculateSetting
Peers []PeerInfo
}
@ -53,11 +63,27 @@ type LoggerInfo struct {
LogLevel string
LogTransit bool
LogControl bool
LogNormal bool
}
// Nonnegative integer ID of vertex
type Vertex uint32
func (v *Vertex) ToString() string {
switch *v{
case Boardcast:
return "B"
case ControlMessage:
return "C"
case PingMessage:
return "P"
case SuperNodeMessage:
return "S"
default:
return strconv.Itoa(int(*v))
}
}
type DynamicRouteInfo struct {
SendPingInterval float64
DupCheckTimeout float64

View File

@ -82,6 +82,8 @@ type Device struct {
Event_server_NhTable_changed chan struct{}
Event_save_config chan struct{}
Event_Supernode_OK chan struct{}
indexTable IndexTable
cookieChecker CookieChecker
@ -90,8 +92,7 @@ type Device struct {
ID config.Vertex
graph *path.IG
l2fib sync.Map
LogTransit bool
LogControl bool
LogLevel config.LoggerInfo
DRoute config.DynamicRouteInfo
DupData fixed_time_cache.Cache
@ -160,7 +161,7 @@ func removePeerLocked(device *Device, peer *Peer, key NoisePublicKey) {
// remove from peer map
id := peer.ID
delete(device.peers.keyMap, key)
if id == path.SuperNodeMessage {
if id == config.SuperNodeMessage {
delete(device.peers.SuperPeer, key)
} else {
delete(device.peers.IDMap, id)
@ -335,8 +336,7 @@ func NewDevice(tapDevice tap.Device, id config.Vertex, bind conn.Bind, logger *L
device.Event_server_pong = superevents.Event_server_pong
device.Event_server_register = superevents.Event_server_register
device.Event_server_NhTable_changed = superevents.Event_server_NhTable_changed
device.LogTransit = sconfig.LogLevel.LogTransit
device.LogControl = sconfig.LogLevel.LogControl
device.LogLevel = sconfig.LogLevel
device.SuperConfig = sconfig
device.SuperConfigPath = configpath
go device.RoutineRecalculateNhTable()
@ -347,8 +347,8 @@ func NewDevice(tapDevice tap.Device, id config.Vertex, bind conn.Bind, logger *L
device.DupData = *fixed_time_cache.NewCache(path.S2TD(econfig.DynamicRoute.DupCheckTimeout), false, path.S2TD(60))
device.event_tryendpoint = make(chan struct{}, 1<<6)
device.Event_save_config = make(chan struct{}, 1<<5)
device.LogTransit = econfig.LogLevel.LogTransit
device.LogControl = econfig.LogLevel.LogControl
device.Event_Supernode_OK = make(chan struct{}, 4)
device.LogLevel = econfig.LogLevel
device.ResetConnInterval = device.EdgeConfig.ResetConnInterval
go device.RoutineSetEndpoint()
go device.RoutineRegister()

View File

@ -12,14 +12,12 @@ import (
"errors"
"fmt"
"io/ioutil"
"strconv"
"sync"
"sync/atomic"
"time"
"github.com/KusakabeSi/EtherGuardVPN/config"
"github.com/KusakabeSi/EtherGuardVPN/conn"
"github.com/KusakabeSi/EtherGuardVPN/path"
"gopkg.in/yaml.v2"
)
@ -96,8 +94,8 @@ func (device *Device) NewPeer(pk NoisePublicKey, id config.Vertex) (*Peer, error
}
// create peer
if device.LogControl {
fmt.Println("Create peer with ID : " + strconv.Itoa(int(id)) + " and PubKey:" + base64.StdEncoding.EncodeToString(pk[:]))
if device.LogLevel.LogControl {
fmt.Println("Create peer with ID : " + id.ToString() + " and PubKey:" + base64.StdEncoding.EncodeToString(pk[:]))
}
peer := new(Peer)
peer.Lock()
@ -130,7 +128,7 @@ func (device *Device) NewPeer(pk NoisePublicKey, id config.Vertex) (*Peer, error
peer.endpoint = nil
// add
if id == path.SuperNodeMessage { // To communicate with supernode
if id == config.SuperNodeMessage { // To communicate with supernode
device.peers.SuperPeer[pk] = peer
device.peers.keyMap[pk] = peer
} else { // Regular peer, other edgenodes
@ -356,7 +354,7 @@ func (device *Device) SaveToConfig(peer *Peer, endpoint conn.Endpoint) {
peerfile.EndPoint = url
}
} else if peerfile.NodeID == peer.ID || peerfile.PubKey == pubkeystr {
panic("Found NodeID match " + strconv.Itoa(int(peer.ID)) + ", but PubKey Not match %s enrties in config file" + pubkeystr)
panic("Found NodeID match " + peer.ID.ToString() + ", but PubKey Not match %s enrties in config file" + pubkeystr)
}
}
if !foundInFile {

View File

@ -459,24 +459,24 @@ func (peer *Peer) RoutineSequentialReceiver() {
if device.IsSuperNode {
peer.LastPingReceived = time.Now()
switch dst_nodeID {
case path.ControlMessage:
case config.ControlMessage:
should_process = true
case path.SuperNodeMessage:
case config.SuperNodeMessage:
should_process = true
default:
device.log.Errorf("Invalid dst_nodeID received. Check your code for bug")
}
} else {
switch dst_nodeID {
case path.Boardcast:
case config.Boardcast:
should_receive = true
should_transfer = true
case path.PingMessage:
case config.PingMessage:
peer.LastPingReceived = time.Now()
should_process = true
case path.SuperNodeMessage:
case config.SuperNodeMessage:
should_process = true
case path.ControlMessage:
case config.ControlMessage:
packet := elem.packet[path.EgHeaderLen:] //true packet
if device.CheckNoDup(packet) {
should_process = true
@ -484,7 +484,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
} else {
should_process = false
should_transfer = false
if device.LogTransit {
if device.LogLevel.LogTransit {
fmt.Printf("Duplicate packet received from %d through %d , src_nodeID = %d . Dropeed.\n", peer.ID, device.ID, src_nodeID)
}
}
@ -508,9 +508,9 @@ func (peer *Peer) RoutineSequentialReceiver() {
device.log.Verbosef("TTL is 0 %v", dst_nodeID)
} else {
EgHeader.SetTTL(l2ttl - 1)
if dst_nodeID == path.Boardcast { //Regular transfer algorithm
if dst_nodeID == config.Boardcast { //Regular transfer algorithm
device.TransitBoardcastPacket(src_nodeID, peer.ID, elem.packet, MessageTransportOffsetContent)
} else if dst_nodeID == path.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[src_nodeID] = true //Don't send to conimg peer and source peer
skip_list[peer.ID] = true
@ -519,7 +519,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
} else {
next_id := *device.graph.NhTable[device.ID][dst_nodeID]
peer_out = device.peers.IDMap[next_id]
if device.LogTransit {
if device.LogLevel.LogTransit {
fmt.Printf("Transfer packet from %d through %d to %d\n", peer.ID, device.ID, peer_out.ID)
}
device.SendPacket(peer_out, elem.packet, MessageTransportOffsetContent)
@ -529,7 +529,7 @@ func (peer *Peer) RoutineSequentialReceiver() {
if should_process {
if packet_type != path.NornalPacket {
if device.LogControl {
if device.LogLevel.LogControl {
if peer.GetEndpointDstStr() != "" {
fmt.Printf("Received MID:" + strconv.Itoa(int(EgHeader.GetMessageID())) + " From:" + peer.GetEndpointDstStr() + " " + device.sprint_received(packet_type, elem.packet[path.EgHeaderLen:]) + "\n")
}
@ -543,6 +543,9 @@ func (peer *Peer) RoutineSequentialReceiver() {
if should_receive { // Write message to tap device
if packet_type == path.NornalPacket {
if device.LogLevel.LogNormal {
fmt.Println("Reveived Normal packet From:" + peer.GetEndpointDstStr() + " SrcID:" + src_nodeID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(elem.packet)))
}
if len(elem.packet) <= path.EgHeaderLen+12 {
device.log.Errorf("Invalid normal packet from peer %v", peer)
goto skip

View File

@ -20,7 +20,14 @@ func (device *Device) SendPacket(peer *Peer, packet []byte, offset int) {
if peer == nil {
return
}
if device.LogControl {
if device.LogLevel.LogNormal {
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
if EgHeader.GetUsage() == path.NornalPacket {
dst_nodeID := EgHeader.GetDst()
fmt.Println("Send Normal packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(packet)))
}
}
if device.LogLevel.LogControl {
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
if EgHeader.GetUsage() != path.NornalPacket {
device.MsgCount += 1
@ -30,6 +37,7 @@ func (device *Device) SendPacket(peer *Peer, packet []byte, offset int) {
}
}
}
var elem *QueueOutboundElement
elem = device.NewOutboundElement()
copy(elem.buffer[offset:offset+len(packet)], packet)
@ -59,7 +67,7 @@ func (device *Device) SpreadPacket(skip_list map[config.Vertex]bool, packet []by
device.peers.RLock()
for peer_id, peer_out := range device.peers.IDMap {
if _, ok := skip_list[peer_id]; ok {
if device.LogTransit {
if device.LogLevel.LogTransit {
fmt.Printf("Skipped Spread Packet packet through %d to %d\n", device.ID, peer_out.ID)
}
continue
@ -74,7 +82,7 @@ func (device *Device) TransitBoardcastPacket(src_nodeID config.Vertex, in_id con
device.peers.RLock()
for peer_id := range node_boardcast_list {
peer_out := device.peers.IDMap[peer_id]
if device.LogTransit {
if device.LogLevel.LogTransit {
fmt.Printf("Transfer packet from %d through %d to %d\n", in_id, device.ID, peer_out.ID)
}
device.SendPacket(peer_out, packet, offset)
@ -86,9 +94,9 @@ func (device *Device) Send2Super(packet []byte, offset int) {
device.peers.RLock()
if device.DRoute.SuperNode.UseSuperNode {
for _, peer_out := range device.peers.SuperPeer {
if device.LogTransit {
/*if device.LogTransit {
fmt.Printf("Send to supernode %s\n", peer_out.endpoint.DstToString())
}
}*/
device.SendPacket(peer_out, packet, offset)
}
}
@ -216,11 +224,11 @@ func (device *Device) process_ping(content path.PingMsg) error {
header.SetPacketLength(uint16(len(body)))
copy(buf[path.EgHeaderLen:], body)
if device.DRoute.SuperNode.UseSuperNode {
header.SetDst(path.SuperNodeMessage)
header.SetDst(config.SuperNodeMessage)
device.Send2Super(buf, MessageTransportOffsetContent)
}
if device.DRoute.P2P.UseP2P {
header.SetDst(path.ControlMessage)
header.SetDst(config.ControlMessage)
device.SpreadPacket(make(map[config.Vertex]bool), buf, MessageTransportOffsetContent)
}
return nil
@ -259,7 +267,7 @@ func (device *Device) process_UpdatePeerMsg(content path.UpdatePeerMsg) error {
}
downloadurl := device.DRoute.SuperNode.APIUrl + "/peerinfo?PubKey=" + url.QueryEscape(PubKey2Str(device.staticIdentity.publicKey)) + "&State=" + url.QueryEscape(string(content.State_hash[:]))
if device.LogControl {
if device.LogLevel.LogControl {
fmt.Println("Download peerinfo from :" + downloadurl)
}
client := http.Client{
@ -276,6 +284,9 @@ func (device *Device) process_UpdatePeerMsg(content path.UpdatePeerMsg) error {
device.log.Errorf(err.Error())
return err
}
if device.LogLevel.LogControl {
fmt.Println("Download result :" + string(allbytes))
}
if err := json.Unmarshal(allbytes, &peer_infos); err != nil {
device.log.Errorf(err.Error())
return err
@ -348,8 +359,8 @@ func (device *Device) RoutineSetEndpoint() {
thepeer.endpoint_trylist.Delete(url)
return true
}
if device.LogControl {
fmt.Println("Set endpoint to " + endpoint.DstToString() + " for NodeID:" + strconv.Itoa(int(thepeer.ID)))
if device.LogLevel.LogControl {
fmt.Println("Set endpoint to " + endpoint.DstToString() + " for NodeID:" + thepeer.ID.ToString())
}
thepeer.SetEndpointFromPacket(endpoint)
NextRun = true
@ -394,15 +405,17 @@ func (device *Device) RoutineRegister() {
if !(device.DRoute.SuperNode.UseSuperNode) {
return
}
_ = <-device.Event_Supernode_OK
for {
body, _ := path.GetByte(path.RegisterMsg{
Node_id: device.ID,
PeerStateHash: device.peers.Peer_state,
NhStateHash: device.graph.NhTableHash,
Name: device.EdgeConfig.NodeName,
})
buf := make([]byte, path.EgHeaderLen+len(body))
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
header.SetDst(path.SuperNodeMessage)
header.SetDst(config.SuperNodeMessage)
header.SetTTL(0)
header.SetSrc(device.ID)
header.SetUsage(path.Register)
@ -441,7 +454,7 @@ func (device *Device) RoutineSpreadAllMyNeighbor() {
}
for {
device.process_RequestPeerMsg(path.QueryPeerMsg{
Request_ID: uint32(path.Boardcast),
Request_ID: uint32(config.Boardcast),
})
time.Sleep(path.S2TD(device.DRoute.P2P.SendPeerInterval))
}
@ -483,7 +496,7 @@ func (device *Device) GeneratePingPacket(src_nodeID config.Vertex) ([]byte, erro
if err != nil {
return nil, err
}
header.SetDst(path.PingMessage)
header.SetDst(config.PingMessage)
header.SetTTL(0)
header.SetSrc(device.ID)
header.SetUsage(path.PingPacket)
@ -502,7 +515,7 @@ func (device *Device) process_UpdateNhTableMsg(content path.UpdateNhTableMsg) er
return nil
}
downloadurl := device.DRoute.SuperNode.APIUrl + "/nhtable?PubKey=" + url.QueryEscape(PubKey2Str(device.staticIdentity.publicKey)) + "&State=" + url.QueryEscape(string(content.State_hash[:]))
if device.LogControl {
if device.LogLevel.LogControl {
fmt.Println("Download NhTable from :" + downloadurl)
}
client := http.Client{
@ -519,6 +532,9 @@ func (device *Device) process_UpdateNhTableMsg(content path.UpdateNhTableMsg) er
device.log.Errorf(err.Error())
return err
}
if device.LogLevel.LogControl {
fmt.Println("Download result :" + string(allbytes))
}
if err := json.Unmarshal(allbytes, &NhTable); err != nil {
device.log.Errorf(err.Error())
return err
@ -532,7 +548,7 @@ func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error {
if device.DRoute.P2P.UseP2P {
device.peers.RLock()
for pubkey, peer := range device.peers.keyMap {
if peer.ID >= path.Special_NodeID {
if peer.ID >= config.Special_NodeID {
continue
}
if peer.endpoint == nil {
@ -554,7 +570,7 @@ func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error {
}
buf := make([]byte, path.EgHeaderLen+len(body))
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
header.SetDst(path.ControlMessage)
header.SetDst(config.ControlMessage)
header.SetTTL(200)
header.SetSrc(device.ID)
header.SetUsage(path.BoardcastPeer)

View File

@ -9,7 +9,9 @@ import (
"bytes"
"encoding/binary"
"errors"
"fmt"
"os"
"strconv"
"sync"
"sync/atomic"
"time"
@ -251,9 +253,9 @@ func (device *Device) RoutineReadFromTUN() {
dstMacAddr := tap.GetDstMacAddr(elem.packet[path.EgHeaderLen:])
// lookup peer
if tap.IsNotUnicast(dstMacAddr) {
dst_nodeID = path.Boardcast
dst_nodeID = config.Boardcast
} else if val, ok := device.l2fib.Load(dstMacAddr); !ok { //Lookup failed
dst_nodeID = path.Boardcast
dst_nodeID = config.Boardcast
} else {
dst_nodeID = val.(config.Vertex)
}
@ -263,17 +265,22 @@ func (device *Device) RoutineReadFromTUN() {
EgBody.SetTTL(200)
EgBody.SetUsage(path.NornalPacket)
if dst_nodeID != path.Boardcast {
var peer_out *Peer
if dst_nodeID != config.Boardcast {
var peer *Peer
next_id := *device.graph.NhTable[device.ID][dst_nodeID]
peer_out = device.peers.IDMap[next_id]
if peer_out == nil {
peer = device.peers.IDMap[next_id]
if peer == nil {
continue
}
if peer_out.isRunning.Get() {
peer_out.StagePacket(elem)
if device.LogLevel.LogNormal {
if device.LogLevel.LogNormal {
fmt.Println("Send Normal packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(elem.packet)))
}
}
if peer.isRunning.Get() {
peer.StagePacket(elem)
elem = nil
peer_out.SendStagedPackets()
peer.SendStagedPackets()
}
} else {
device.BoardcastPacket(make(map[config.Vertex]bool, 0), elem.packet, offset)

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -16,6 +16,7 @@ loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -1,5 +1,5 @@
interface:
itype: stdio
itype: udpsock
name: tap1
vppifaceid: 1
vppbridgeid: 0
@ -15,7 +15,8 @@ listenport: 3001
loglevel:
loglevel: normal
logtransit: true
logcontrol: true
logcontrol: false
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -8,14 +8,15 @@ interface:
recvaddr: 127.0.0.1:4002
sendaddr: 127.0.0.1:5002
l2headermode: kbdbg
nodeid: 1
nodename: Node01
nodeid: 2
nodename: Node02
privkey: OH8BsVUU2Rqzeu9B2J5GPG8PUmxWfX8uVvNFZKhVF3o=
listenport: 3002
loglevel:
loglevel: normal
logtransit: true
logcontrol: true
logcontrol: false
lognormal: true
dynamicroute:
sendpinginterval: 20
dupchecktimeout: 40

View File

@ -2,10 +2,12 @@ nodename: NodeSuper
privkeyv4: mL5IW0GuqbjgDeOJuPHBU2iJzBPNKhaNEXbIGwwYWWk=
privkeyv6: +EdOKIoBp/EvIusHDsvXhV1RJYbyN3Qr8nxlz35wl3I=
listenport: 3000
statepassword: passwd
loglevel:
loglevel: normal
logtransit: true
logcontrol: true
lognormal: true
repushconfiginterval: 30
graphrecalculatesetting:
jittertolerance: 5

View File

@ -203,7 +203,7 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
for _, peerconf := range tconfig.Peers {
sk_slice, _ = base64.StdEncoding.DecodeString(peerconf.PubKey)
copy(sk[:], sk_slice)
if peerconf.NodeID >= path.SuperNodeMessage {
if peerconf.NodeID >= config.SuperNodeMessage {
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
}
the_device.NewPeer(sk, peerconf.NodeID)
@ -228,7 +228,7 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
if err != nil {
return err
}
peer, err := the_device.NewPeer(sk, path.SuperNodeMessage)
peer, err := the_device.NewPeer(sk, config.SuperNodeMessage)
if err != nil {
return err
}
@ -243,7 +243,7 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
if err != nil {
return err
}
peer, err := the_device.NewPeer(sk, path.SuperNodeMessage)
peer, err := the_device.NewPeer(sk, config.SuperNodeMessage)
if err != nil {
return err
}
@ -251,6 +251,7 @@ func Edge(configPath string, useUAPI bool, printExample bool) (err error) {
peer.ConnURL = tconfig.DynamicRoute.SuperNode.ConnURLV6
peer.SetEndpointFromPacket(endpoint)
}
the_device.Event_Supernode_OK <- struct{}{}
}
logger.Verbosef("Device started")

View File

@ -152,5 +152,6 @@ func HttpServer(http_port int, apiprefix string) {
}
mux.HandleFunc(apiprefix+"/peerinfo", get_peerinfo)
mux.HandleFunc(apiprefix+"/nhtable", get_nhtable)
mux.HandleFunc(apiprefix+"/peerstate", get_info)
http.ListenAndServe(":"+strconv.Itoa(http_port), mux)
}

View File

@ -99,6 +99,7 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
http_PeerID2Map = make(map[config.Vertex]string)
http_PeerInfos = make(map[string]config.HTTP_Peerinfo)
http_HashSalt = []byte(config.RandomStr(32, "Salt generate failed"))
http_StatePWD = sconfig.StatePassword
super_chains := path.SUPER_Events{
Event_server_pong: make(chan path.PongMsg, 1<<5),
@ -108,8 +109,8 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
thetap, _ := tap.CreateDummyTAP()
http_graph = path.NewGraph(3, true, sconfig.GraphRecalculateSetting)
http_device4 = device.NewDevice(thetap, path.SuperNodeMessage, conn.NewCustomBind(true, false), logger4, http_graph, true, configPath, nil, &sconfig, &super_chains)
http_device6 = device.NewDevice(thetap, path.SuperNodeMessage, conn.NewCustomBind(false, true), logger6, http_graph, true, configPath, nil, &sconfig, &super_chains)
http_device4 = device.NewDevice(thetap, config.SuperNodeMessage, conn.NewCustomBind(true, false), logger4, http_graph, true, configPath, nil, &sconfig, &super_chains)
http_device6 = device.NewDevice(thetap, config.SuperNodeMessage, conn.NewCustomBind(false, true), logger6, http_graph, true, configPath, nil, &sconfig, &super_chains)
defer http_device4.Close()
defer http_device6.Close()
var sk [32]byte
@ -142,7 +143,7 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
fmt.Println("Error decode base64 ", err)
}
copy(pk[:], pk_slice)
if peerconf.NodeID >= path.SuperNodeMessage {
if peerconf.NodeID >= config.SuperNodeMessage {
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
}
http_PeerID2Map[peerconf.NodeID] = peerconf.PubKey
@ -280,9 +281,9 @@ func PushNhTable() {
}
buf := make([]byte, path.EgHeaderLen+len(body))
header, _ := path.NewEgHeader(buf[:path.EgHeaderLen])
header.SetDst(path.SuperNodeMessage)
header.SetDst(config.SuperNodeMessage)
header.SetPacketLength(uint16(len(body)))
header.SetSrc(path.SuperNodeMessage)
header.SetSrc(config.SuperNodeMessage)
header.SetTTL(0)
header.SetUsage(path.UpdateNhTable)
copy(buf[path.EgHeaderLen:], body)
@ -308,9 +309,9 @@ func PushUpdate() {
}
buf := make([]byte, path.EgHeaderLen+len(body))
header, _ := path.NewEgHeader(buf[:path.EgHeaderLen])
header.SetDst(path.SuperNodeMessage)
header.SetDst(config.SuperNodeMessage)
header.SetPacketLength(uint16(len(body)))
header.SetSrc(path.SuperNodeMessage)
header.SetSrc(config.SuperNodeMessage)
header.SetTTL(0)
header.SetUsage(path.UpdatePeer)
copy(buf[path.EgHeaderLen:], body)

View File

@ -27,7 +27,7 @@ type RegisterMsg struct {
}
func (c *RegisterMsg) ToString() string {
return "RegisterMsg Node_id:" + strconv.Itoa(int(c.Node_id))
return "RegisterMsg Node_id:" + c.Node_id.ToString()
}
func ParseRegisterMsg(bin []byte) (StructPlace RegisterMsg, err error) {
@ -77,7 +77,7 @@ type PingMsg struct {
}
func (c *PingMsg) ToString() string {
return "PingMsg SID:" + strconv.Itoa(int(c.Src_nodeID)) + " Time:" + c.Time.String() + " RequestID:" + strconv.Itoa(int(c.RequestID))
return "PingMsg SID:" + c.Src_nodeID.ToString() + " Time:" + c.Time.String() + " RequestID:" + strconv.Itoa(int(c.RequestID))
}
func ParsePingMsg(bin []byte) (StructPlace PingMsg, err error) {
@ -96,7 +96,7 @@ type PongMsg struct {
}
func (c *PongMsg) ToString() string {
return "PongMsg SID:" + strconv.Itoa(int(c.Src_nodeID)) + " DID:" + strconv.Itoa(int(c.Dst_nodeID)) + " Timediff:" + c.Timediff.String() + " RequestID:" + strconv.Itoa(int(c.RequestID))
return "PongMsg SID:" + c.Src_nodeID.ToString() + " DID:" + c.Dst_nodeID.ToString() + " Timediff:" + c.Timediff.String() + " RequestID:" + strconv.Itoa(int(c.RequestID))
}
func ParsePongMsg(bin []byte) (StructPlace PongMsg, err error) {
@ -132,7 +132,7 @@ type BoardcastPeerMsg struct {
}
func (c *BoardcastPeerMsg) ToString() string {
return "BoardcastPeerMsg Request_ID:" + strconv.Itoa(int(c.Request_ID)) + " NodeID:" + strconv.Itoa(int(c.NodeID)) + " ConnURL:" + c.ConnURL
return "BoardcastPeerMsg Request_ID:" + strconv.Itoa(int(c.Request_ID)) + " NodeID:" + c.NodeID.ToString() + " ConnURL:" + c.ConnURL
}
func ParseBoardcastPeerMsg(bin []byte) (StructPlace BoardcastPeerMsg, err error) {

View File

@ -12,14 +12,6 @@ import (
const Infinity = float64(99999)
const (
Boardcast config.Vertex = math.MaxUint32 - iota // Normal boardcast, boardcast with route table
ControlMessage config.Vertex = math.MaxUint32 - iota // p2p mode: boardcast to every know keer and prevent dup/ super mode: send to supernode
PingMessage config.Vertex = math.MaxUint32 - iota // boardsact to every know peer but don't transit
SuperNodeMessage config.Vertex = math.MaxUint32 - iota
Special_NodeID config.Vertex = SuperNodeMessage
)
func (g *IG) GetCurrentTime() time.Time {
return time.Now().Round(0)
}
@ -268,9 +260,11 @@ func (g *IG) GetEdges() (edges map[config.Vertex]map[config.Vertex]float64) {
for src, _ := range vert {
edges[src] = make(map[config.Vertex]float64, len(vert))
for dst, _ := range vert {
if src != dst {
edges[src][dst] = g.Weight(src, dst)
}
}
}
return
}

View File

@ -1,5 +1,7 @@
package tap
import "errors"
type DummyTap struct {
stopRead chan struct{}
events chan Event
@ -21,7 +23,7 @@ func CreateDummyTAP() (tapdev Device, err error) {
func (tap *DummyTap) Read([]byte, int) (int, error) {
_ = <-tap.stopRead
return 0, nil
return 0, errors.New("Device stopped")
} // read a packet from the device (without any additional headers)
func (tap *DummyTap) Write(packet []byte, size int) (int, error) {
return size, nil
@ -40,6 +42,8 @@ func (tap *DummyTap) Events() chan Event {
} // returns a constant channel of events related to the device
func (tap *DummyTap) Close() error {
tap.events <- EventDown
close(tap.events)
tap.stopRead <- struct{}{}
//close(tap.stopRead)
//close(tap.events)
return nil
} // stops the device and closes the event channel