mirror of
https://github.com/KusakabeShi/EtherGuard-VPN.git
synced 2024-11-22 07:13:09 +01:00
L2FIB Timeout
This commit is contained in:
parent
06b7ea1edb
commit
b99b0254ea
@ -76,7 +76,8 @@ Usage of ./etherguard-go:
|
|||||||
2. `nodeid`: NodeID. Must be unique in the whole Etherguard network.
|
2. `nodeid`: NodeID. Must be unique in the whole Etherguard network.
|
||||||
3. `nodename`: Node Name.
|
3. `nodename`: Node Name.
|
||||||
4. `defaultttl`: Default TTL(etherguard layer. not affect ethernet layer)
|
4. `defaultttl`: Default TTL(etherguard layer. not affect ethernet layer)
|
||||||
4. `privkey`: Private key. Same spec as wireguard.
|
5. `l2fibtimeout`: The timeout(in seconds) of the MacAddr-> NodeID lookup table
|
||||||
|
5. `privkey`: Private key. Same spec as wireguard.
|
||||||
5. `listenport`: UDP lesten port
|
5. `listenport`: UDP lesten port
|
||||||
6. `loglevel`: Log Level
|
6. `loglevel`: Log Level
|
||||||
1. `loglevel`: `debug`,`error`,`slient` for wirefuard logger.
|
1. `loglevel`: `debug`,`error`,`slient` for wirefuard logger.
|
||||||
|
@ -83,7 +83,8 @@ Usage of ./etherguard-go-vpp:
|
|||||||
2. `nodeid`: 節點ID。節點之間辨識身分用的,同一網路內節點ID不能重複
|
2. `nodeid`: 節點ID。節點之間辨識身分用的,同一網路內節點ID不能重複
|
||||||
3. `nodename`: 節點名稱
|
3. `nodename`: 節點名稱
|
||||||
4. `defaultttl`: 預設ttl(etherguard層使用,和乙太層不共通)
|
4. `defaultttl`: 預設ttl(etherguard層使用,和乙太層不共通)
|
||||||
4. `privkey`: 私鑰,和wireguard規格一樣
|
5. `l2fibtimeout`: MacAddr-> NodeID 查找表的 timeout(秒)
|
||||||
|
5. `privkey`: 私鑰,和wireguard規格一樣
|
||||||
5. `listenport`: 監聽的udp埠
|
5. `listenport`: 監聽的udp埠
|
||||||
6. `loglevel`: 紀錄log
|
6. `loglevel`: 紀錄log
|
||||||
1. `loglevel`: wireguard原本的log紀錄器的loglevel。
|
1. `loglevel`: wireguard原本的log紀錄器的loglevel。
|
||||||
|
@ -21,6 +21,7 @@ type EdgeConfig struct {
|
|||||||
NodeID Vertex
|
NodeID Vertex
|
||||||
NodeName string
|
NodeName string
|
||||||
DefaultTTL uint8
|
DefaultTTL uint8
|
||||||
|
L2FIBTimeout float64
|
||||||
PrivKey string
|
PrivKey string
|
||||||
ListenPort int
|
ListenPort int
|
||||||
LogLevel LoggerInfo
|
LogLevel LoggerInfo
|
||||||
|
@ -96,6 +96,7 @@ type Device struct {
|
|||||||
DefaultTTL uint8
|
DefaultTTL uint8
|
||||||
graph *path.IG
|
graph *path.IG
|
||||||
l2fib sync.Map
|
l2fib sync.Map
|
||||||
|
fibTimeout float64
|
||||||
LogLevel config.LoggerInfo
|
LogLevel config.LoggerInfo
|
||||||
DRoute config.DynamicRouteInfo
|
DRoute config.DynamicRouteInfo
|
||||||
DupData fixed_time_cache.Cache
|
DupData fixed_time_cache.Cache
|
||||||
@ -123,6 +124,11 @@ type Device struct {
|
|||||||
log *Logger
|
log *Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IdAndTime struct {
|
||||||
|
ID config.Vertex
|
||||||
|
Time time.Time
|
||||||
|
}
|
||||||
|
|
||||||
// deviceState represents the state of a Device.
|
// deviceState represents the state of a Device.
|
||||||
// There are three states: down, up, closed.
|
// There are three states: down, up, closed.
|
||||||
// Transitions:
|
// Transitions:
|
||||||
@ -357,12 +363,14 @@ func NewDevice(tapDevice tap.Device, id config.Vertex, bind conn.Bind, logger *L
|
|||||||
device.LogLevel = econfig.LogLevel
|
device.LogLevel = econfig.LogLevel
|
||||||
device.ResetConnInterval = device.EdgeConfig.ResetConnInterval
|
device.ResetConnInterval = device.EdgeConfig.ResetConnInterval
|
||||||
device.DefaultTTL = econfig.DefaultTTL
|
device.DefaultTTL = econfig.DefaultTTL
|
||||||
|
device.fibTimeout = econfig.L2FIBTimeout
|
||||||
go device.RoutineSetEndpoint()
|
go device.RoutineSetEndpoint()
|
||||||
go device.RoutineRegister()
|
go device.RoutineRegister()
|
||||||
go device.RoutineSendPing()
|
go device.RoutineSendPing()
|
||||||
go device.RoutineRecalculateNhTable()
|
go device.RoutineRecalculateNhTable()
|
||||||
go device.RoutineSpreadAllMyNeighbor()
|
go device.RoutineSpreadAllMyNeighbor()
|
||||||
go device.RoutineResetConn()
|
go device.RoutineResetConn()
|
||||||
|
go device.RoutineClearL2FIB()
|
||||||
}
|
}
|
||||||
// create queues
|
// create queues
|
||||||
|
|
||||||
|
@ -553,20 +553,34 @@ func (peer *Peer) RoutineSequentialReceiver() {
|
|||||||
if should_receive { // Write message to tap device
|
if should_receive { // Write message to tap device
|
||||||
if packet_type == path.NormalPacket {
|
if packet_type == path.NormalPacket {
|
||||||
if len(elem.packet) <= path.EgHeaderLen+12 {
|
if len(elem.packet) <= path.EgHeaderLen+12 {
|
||||||
device.log.Errorf("Invalid normal packet from peer %v", peer.ID.ToString())
|
device.log.Errorf("Invalid normal packet: Ethernet packet too small from peer %v", peer.ID.ToString())
|
||||||
goto skip
|
goto skip
|
||||||
}
|
}
|
||||||
if device.LogLevel.LogNormal {
|
if device.LogLevel.LogNormal {
|
||||||
fmt.Println("Normal: Reveived Normal packet From:" + peer.GetEndpointDstStr() + " SrcID:" + src_nodeID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(elem.packet)))
|
packet_len := len(elem.packet) - path.EgHeaderLen
|
||||||
|
fmt.Println("Normal: Reveived Normal packet From:" + peer.GetEndpointDstStr() + " SrcID:" + src_nodeID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(packet_len))
|
||||||
packet := gopacket.NewPacket(elem.packet[path.EgHeaderLen:], layers.LayerTypeEthernet, gopacket.Default)
|
packet := gopacket.NewPacket(elem.packet[path.EgHeaderLen:], layers.LayerTypeEthernet, gopacket.Default)
|
||||||
fmt.Println(packet.Dump())
|
fmt.Println(packet.Dump())
|
||||||
}
|
}
|
||||||
src_macaddr := tap.GetSrcMacAddr(elem.packet[path.EgHeaderLen:])
|
src_macaddr := tap.GetSrcMacAddr(elem.packet[path.EgHeaderLen:])
|
||||||
if !tap.IsNotUnicast(src_macaddr) {
|
if !tap.IsNotUnicast(src_macaddr) {
|
||||||
actual, loaded := device.l2fib.LoadOrStore(src_macaddr, src_nodeID)
|
val, ok := device.l2fib.Load(src_macaddr)
|
||||||
if loaded {
|
if ok {
|
||||||
if actual.(config.Vertex) != src_nodeID {
|
idtime := val.(*IdAndTime)
|
||||||
device.l2fib.Store(src_macaddr, src_nodeID) // Write to l2fib table
|
if idtime.ID != src_nodeID {
|
||||||
|
idtime.ID = src_nodeID
|
||||||
|
if device.LogLevel.LogNormal {
|
||||||
|
fmt.Printf("Normal: L2FIB [%v -> %v] updated.\n", src_macaddr.String(), src_nodeID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idtime.Time = time.Now()
|
||||||
|
} else {
|
||||||
|
device.l2fib.Store(src_macaddr, &IdAndTime{
|
||||||
|
ID: src_nodeID,
|
||||||
|
Time: time.Now(),
|
||||||
|
}) // Write to l2fib table
|
||||||
|
if device.LogLevel.LogNormal {
|
||||||
|
fmt.Printf("Normal: L2FIB [%v -> %v] added.\n", src_macaddr.String(), src_nodeID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
"github.com/KusakabeSi/EtherGuardVPN/config"
|
"github.com/KusakabeSi/EtherGuardVPN/config"
|
||||||
orderedmap "github.com/KusakabeSi/EtherGuardVPN/orderdmap"
|
orderedmap "github.com/KusakabeSi/EtherGuardVPN/orderdmap"
|
||||||
"github.com/KusakabeSi/EtherGuardVPN/path"
|
"github.com/KusakabeSi/EtherGuardVPN/path"
|
||||||
|
"github.com/KusakabeSi/EtherGuardVPN/tap"
|
||||||
"github.com/google/gopacket"
|
"github.com/google/gopacket"
|
||||||
"github.com/google/gopacket/layers"
|
"github.com/google/gopacket/layers"
|
||||||
)
|
)
|
||||||
@ -27,11 +28,19 @@ func (device *Device) SendPacket(peer *Peer, usage path.Usage, packet []byte, of
|
|||||||
} else if peer.endpoint == nil {
|
} else if peer.endpoint == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if usage == path.NormalPacket && len(packet)-path.EgHeaderLen <= 12 {
|
||||||
|
if device.LogLevel.LogNormal {
|
||||||
|
fmt.Println("Normal: Invalid packet: Ethernet packet too small")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if device.LogLevel.LogNormal {
|
if device.LogLevel.LogNormal {
|
||||||
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
|
EgHeader, _ := path.NewEgHeader(packet[:path.EgHeaderLen])
|
||||||
if usage == path.NormalPacket {
|
if usage == path.NormalPacket && EgHeader.GetSrc() == device.ID {
|
||||||
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)))
|
packet_len := len(packet) - path.EgHeaderLen
|
||||||
|
fmt.Println("Normal: Send Normal packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(packet_len))
|
||||||
packet := gopacket.NewPacket(packet[path.EgHeaderLen:], layers.LayerTypeEthernet, gopacket.Default)
|
packet := gopacket.NewPacket(packet[path.EgHeaderLen:], layers.LayerTypeEthernet, gopacket.Default)
|
||||||
fmt.Println(packet.Dump())
|
fmt.Println(packet.Dump())
|
||||||
}
|
}
|
||||||
@ -214,7 +223,37 @@ func (device *Device) sprint_received(msg_type path.Usage, body []byte) string {
|
|||||||
}
|
}
|
||||||
return "BoardcastPeerMsg: Parse failed"
|
return "BoardcastPeerMsg: Parse failed"
|
||||||
default:
|
default:
|
||||||
return "UnknowMsg: Not a valid msg_type"
|
return "UnknownMsg: Not a valid msg_type"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (device *Device) GeneratePingPacket(src_nodeID config.Vertex, request_reply int) ([]byte, path.Usage, error) {
|
||||||
|
body, err := path.GetByte(&path.PingMsg{
|
||||||
|
Src_nodeID: src_nodeID,
|
||||||
|
Time: device.graph.GetCurrentTime(),
|
||||||
|
RequestReply: request_reply,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, path.PingPacket, err
|
||||||
|
}
|
||||||
|
buf := make([]byte, path.EgHeaderLen+len(body))
|
||||||
|
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
|
||||||
|
if err != nil {
|
||||||
|
return nil, path.PingPacket, err
|
||||||
|
}
|
||||||
|
header.SetDst(config.ControlMessage)
|
||||||
|
header.SetTTL(0)
|
||||||
|
header.SetSrc(device.ID)
|
||||||
|
header.SetPacketLength(uint16(len(body)))
|
||||||
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
|
return buf, path.PingPacket, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (device *Device) SendPing(peer *Peer, times int, replies int, interval float64) {
|
||||||
|
for i := 0; i < times; i++ {
|
||||||
|
packet, usage, _ := device.GeneratePingPacket(device.ID, replies)
|
||||||
|
device.SendPacket(peer, usage, packet, MessageTransportOffsetContent)
|
||||||
|
time.Sleep(path.S2TD(interval))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,7 +287,7 @@ func (device *Device) server_process_RegisterMsg(peer *Peer, content path.Regist
|
|||||||
Node_id: peer.ID,
|
Node_id: peer.ID,
|
||||||
Action: path.Shutdown,
|
Action: path.Shutdown,
|
||||||
ErrorCode: 400,
|
ErrorCode: 400,
|
||||||
ErrorMsg: "Your version is not match with our version: " + device.Version,
|
ErrorMsg: fmt.Sprintf("Your version: \"%v\" is not compatible with our version: \"%v\"", content.Version, device.Version),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if UpdateErrorMsg.Action != path.NoAction {
|
if UpdateErrorMsg.Action != path.NoAction {
|
||||||
@ -312,14 +351,6 @@ func (device *Device) process_ping(peer *Peer, content path.PingMsg) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) SendPing(peer *Peer, times int, replies int, interval float64) {
|
|
||||||
for i := 0; i < times; i++ {
|
|
||||||
packet, usage, _ := device.GeneratePingPacket(device.ID, replies)
|
|
||||||
device.SendPacket(peer, usage, packet, MessageTransportOffsetContent)
|
|
||||||
time.Sleep(path.S2TD(interval))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (device *Device) process_pong(peer *Peer, content path.PongMsg) error {
|
func (device *Device) process_pong(peer *Peer, content path.PongMsg) error {
|
||||||
if device.DRoute.P2P.UseP2P {
|
if device.DRoute.P2P.UseP2P {
|
||||||
if time.Now().After(device.graph.NhTableExpire) {
|
if time.Now().After(device.graph.NhTableExpire) {
|
||||||
@ -531,6 +562,78 @@ func (device *Device) process_UpdateErrorMsg(peer *Peer, content path.UpdateErro
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error { //Send all my peers to all my peers
|
||||||
|
if device.DRoute.P2P.UseP2P {
|
||||||
|
device.peers.RLock()
|
||||||
|
for pubkey, peer := range device.peers.keyMap {
|
||||||
|
if peer.ID >= config.Special_NodeID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if peer.endpoint == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
peer.handshake.mutex.RLock()
|
||||||
|
response := path.BoardcastPeerMsg{
|
||||||
|
Request_ID: content.Request_ID,
|
||||||
|
NodeID: peer.ID,
|
||||||
|
PubKey: pubkey,
|
||||||
|
ConnURL: peer.endpoint.DstToString(),
|
||||||
|
}
|
||||||
|
peer.handshake.mutex.RUnlock()
|
||||||
|
body, err := path.GetByte(response)
|
||||||
|
if err != nil {
|
||||||
|
device.log.Errorf("Error at receivesendproc.go line221: ", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
buf := make([]byte, path.EgHeaderLen+len(body))
|
||||||
|
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
|
||||||
|
header.SetDst(config.ControlMessage)
|
||||||
|
header.SetTTL(device.DefaultTTL)
|
||||||
|
header.SetSrc(device.ID)
|
||||||
|
header.SetPacketLength(uint16(len(body)))
|
||||||
|
copy(buf[path.EgHeaderLen:], body)
|
||||||
|
device.SpreadPacket(make(map[config.Vertex]bool), path.BroadcastPeer, buf, MessageTransportOffsetContent)
|
||||||
|
}
|
||||||
|
device.peers.RUnlock()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (device *Device) process_BoardcastPeerMsg(peer *Peer, content path.BoardcastPeerMsg) error {
|
||||||
|
if device.DRoute.P2P.UseP2P {
|
||||||
|
var pk NoisePublicKey
|
||||||
|
if content.Request_ID == uint32(device.ID) {
|
||||||
|
peer.AskedForNeighbor = true
|
||||||
|
}
|
||||||
|
if bytes.Equal(content.PubKey[:], device.staticIdentity.publicKey[:]) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
copy(pk[:], content.PubKey[:])
|
||||||
|
thepeer := device.LookupPeer(pk)
|
||||||
|
if thepeer == nil { //not exist in local
|
||||||
|
if device.LogLevel.LogControl {
|
||||||
|
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
|
||||||
|
device.graph.UpdateLentancy(device.ID, content.NodeID, path.S2TD(path.Infinity), true, false)
|
||||||
|
}
|
||||||
|
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.NewPeer(pk, content.NodeID, false)
|
||||||
|
}
|
||||||
|
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.PeerAliveTimeout)).Before(time.Now()) {
|
||||||
|
//Peer died, try to switch to this new endpoint
|
||||||
|
thepeer.Lock()
|
||||||
|
thepeer.endpoint_trylist.Set(content.ConnURL, time.Time{}) //another gorouting will process it
|
||||||
|
thepeer.Unlock()
|
||||||
|
device.event_tryendpoint <- struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (device *Device) RoutineSetEndpoint() {
|
func (device *Device) RoutineSetEndpoint() {
|
||||||
if !(device.DRoute.P2P.UseP2P || device.DRoute.SuperNode.UseSuperNode) {
|
if !(device.DRoute.P2P.UseP2P || device.DRoute.SuperNode.UseSuperNode) {
|
||||||
return
|
return
|
||||||
@ -700,96 +803,23 @@ func (device *Device) RoutineResetConn() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (device *Device) GeneratePingPacket(src_nodeID config.Vertex, request_reply int) ([]byte, path.Usage, error) {
|
func (device *Device) RoutineClearL2FIB() {
|
||||||
body, err := path.GetByte(&path.PingMsg{
|
if device.fibTimeout <= 0.01 {
|
||||||
Src_nodeID: src_nodeID,
|
return
|
||||||
Time: device.graph.GetCurrentTime(),
|
}
|
||||||
RequestReply: request_reply,
|
timeout := path.S2TD(device.fibTimeout)
|
||||||
|
for {
|
||||||
|
device.l2fib.Range(func(k interface{}, v interface{}) bool {
|
||||||
|
val := v.(*IdAndTime)
|
||||||
|
if time.Now().After(val.Time.Add(timeout)) {
|
||||||
|
mac := k.(tap.MacAddress)
|
||||||
|
device.l2fib.Delete(k)
|
||||||
|
if device.LogLevel.LogNormal {
|
||||||
|
fmt.Printf("Normal: L2FIB [%v -> %v] deleted.\n", mac.String(), val.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
})
|
})
|
||||||
if err != nil {
|
time.Sleep(timeout)
|
||||||
return nil, path.PingPacket, err
|
|
||||||
}
|
}
|
||||||
buf := make([]byte, path.EgHeaderLen+len(body))
|
|
||||||
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
|
|
||||||
if err != nil {
|
|
||||||
return nil, path.PingPacket, err
|
|
||||||
}
|
|
||||||
header.SetDst(config.ControlMessage)
|
|
||||||
header.SetTTL(0)
|
|
||||||
header.SetSrc(device.ID)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
|
||||||
return buf, path.PingPacket, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (device *Device) process_RequestPeerMsg(content path.QueryPeerMsg) error { //Send all my peers to all my peers
|
|
||||||
if device.DRoute.P2P.UseP2P {
|
|
||||||
device.peers.RLock()
|
|
||||||
for pubkey, peer := range device.peers.keyMap {
|
|
||||||
if peer.ID >= config.Special_NodeID {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if peer.endpoint == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
peer.handshake.mutex.RLock()
|
|
||||||
response := path.BoardcastPeerMsg{
|
|
||||||
Request_ID: content.Request_ID,
|
|
||||||
NodeID: peer.ID,
|
|
||||||
PubKey: pubkey,
|
|
||||||
ConnURL: peer.endpoint.DstToString(),
|
|
||||||
}
|
|
||||||
peer.handshake.mutex.RUnlock()
|
|
||||||
body, err := path.GetByte(response)
|
|
||||||
if err != nil {
|
|
||||||
device.log.Errorf("Error at receivesendproc.go line221: ", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
buf := make([]byte, path.EgHeaderLen+len(body))
|
|
||||||
header, _ := path.NewEgHeader(buf[0:path.EgHeaderLen])
|
|
||||||
header.SetDst(config.ControlMessage)
|
|
||||||
header.SetTTL(device.DefaultTTL)
|
|
||||||
header.SetSrc(device.ID)
|
|
||||||
header.SetPacketLength(uint16(len(body)))
|
|
||||||
copy(buf[path.EgHeaderLen:], body)
|
|
||||||
device.SpreadPacket(make(map[config.Vertex]bool), path.BroadcastPeer, buf, MessageTransportOffsetContent)
|
|
||||||
}
|
|
||||||
device.peers.RUnlock()
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (device *Device) process_BoardcastPeerMsg(peer *Peer, content path.BoardcastPeerMsg) error {
|
|
||||||
if device.DRoute.P2P.UseP2P {
|
|
||||||
var pk NoisePublicKey
|
|
||||||
if content.Request_ID == uint32(device.ID) {
|
|
||||||
peer.AskedForNeighbor = true
|
|
||||||
}
|
|
||||||
if bytes.Equal(content.PubKey[:], device.staticIdentity.publicKey[:]) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
copy(pk[:], content.PubKey[:])
|
|
||||||
thepeer := device.LookupPeer(pk)
|
|
||||||
if thepeer == nil { //not exist in local
|
|
||||||
if device.LogLevel.LogControl {
|
|
||||||
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
|
|
||||||
device.graph.UpdateLentancy(device.ID, content.NodeID, path.S2TD(path.Infinity), true, false)
|
|
||||||
}
|
|
||||||
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.NewPeer(pk, content.NodeID, false)
|
|
||||||
}
|
|
||||||
if thepeer.LastPingReceived.Add(path.S2TD(device.DRoute.PeerAliveTimeout)).Before(time.Now()) {
|
|
||||||
//Peer died, try to switch to this new endpoint
|
|
||||||
thepeer.Lock()
|
|
||||||
thepeer.endpoint_trylist.Set(content.ConnURL, time.Time{}) //another gorouting will process it
|
|
||||||
thepeer.Unlock()
|
|
||||||
device.event_tryendpoint <- struct{}{}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
@ -260,13 +260,20 @@ func (device *Device) RoutineReadFromTUN() {
|
|||||||
} else if val, ok := device.l2fib.Load(dstMacAddr); !ok { //Lookup failed
|
} else if val, ok := device.l2fib.Load(dstMacAddr); !ok { //Lookup failed
|
||||||
dst_nodeID = config.Broadcast
|
dst_nodeID = config.Broadcast
|
||||||
} else {
|
} else {
|
||||||
dst_nodeID = val.(config.Vertex)
|
dst_nodeID = val.(*IdAndTime).ID
|
||||||
}
|
}
|
||||||
|
packet_len := len(elem.packet) - path.EgHeaderLen
|
||||||
EgBody.SetSrc(device.ID)
|
EgBody.SetSrc(device.ID)
|
||||||
EgBody.SetDst(dst_nodeID)
|
EgBody.SetDst(dst_nodeID)
|
||||||
EgBody.SetPacketLength(uint16(len(elem.packet) - path.EgHeaderLen))
|
EgBody.SetPacketLength(uint16(packet_len))
|
||||||
EgBody.SetTTL(device.DefaultTTL)
|
EgBody.SetTTL(device.DefaultTTL)
|
||||||
elem.Type = path.NormalPacket
|
elem.Type = path.NormalPacket
|
||||||
|
if packet_len <= 12 {
|
||||||
|
if device.LogLevel.LogNormal {
|
||||||
|
fmt.Println("Normal: Invalid packet: Ethernet packet too small." + " Len:" + strconv.Itoa(packet_len))
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if dst_nodeID != config.Broadcast {
|
if dst_nodeID != config.Broadcast {
|
||||||
var peer *Peer
|
var peer *Peer
|
||||||
@ -279,7 +286,7 @@ func (device *Device) RoutineReadFromTUN() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if device.LogLevel.LogNormal {
|
if device.LogLevel.LogNormal {
|
||||||
fmt.Println("Normal: Send Normal packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(elem.packet)))
|
fmt.Println("Normal: Send packet To:" + peer.GetEndpointDstStr() + " SrcID:" + device.ID.ToString() + " DstID:" + dst_nodeID.ToString() + " Len:" + strconv.Itoa(len(elem.packet)))
|
||||||
packet := gopacket.NewPacket(elem.packet[path.EgHeaderLen:], layers.LayerTypeEthernet, gopacket.Default)
|
packet := gopacket.NewPacket(elem.packet[path.EgHeaderLen:], layers.LayerTypeEthernet, gopacket.Default)
|
||||||
fmt.Println(packet.Dump())
|
fmt.Println(packet.Dump())
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 1
|
nodeid: 1
|
||||||
nodename: Node01
|
nodename: Node01
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: aABzjKhWdkFfQ29ZuijtMp1h1TNJe66SDCwvfmvQznw=
|
privkey: aABzjKhWdkFfQ29ZuijtMp1h1TNJe66SDCwvfmvQznw=
|
||||||
listenport: 3001
|
listenport: 3001
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 2
|
nodeid: 2
|
||||||
nodename: Node02
|
nodename: Node02
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: UNZMzPX5fG/8yGC8edVj/ksF9N6ARRqdq7fqE/PD7ls=
|
privkey: UNZMzPX5fG/8yGC8edVj/ksF9N6ARRqdq7fqE/PD7ls=
|
||||||
listenport: 3002
|
listenport: 3002
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 3
|
nodeid: 3
|
||||||
nodename: Node03
|
nodename: Node03
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: gJy35nbsd8FuuxyWHjsefN+U+oM7RkuIB1EanNLSVHg=
|
privkey: gJy35nbsd8FuuxyWHjsefN+U+oM7RkuIB1EanNLSVHg=
|
||||||
listenport: 3003
|
listenport: 3003
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 4
|
nodeid: 4
|
||||||
nodename: Node04
|
nodename: Node04
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: wAdLgCk0SHiO11/aUf9944focD1BUCH5b6Pe+cRHHXQ=
|
privkey: wAdLgCk0SHiO11/aUf9944focD1BUCH5b6Pe+cRHHXQ=
|
||||||
listenport: 3004
|
listenport: 3004
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 5
|
nodeid: 5
|
||||||
nodename: Node05
|
nodename: Node05
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: gLmzeCbmN/hjiE+ehNXL9IxuG9hhWIYv2s16/DOW6FE=
|
privkey: gLmzeCbmN/hjiE+ehNXL9IxuG9hhWIYv2s16/DOW6FE=
|
||||||
listenport: 3005
|
listenport: 3005
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 6
|
nodeid: 6
|
||||||
nodename: Node06
|
nodename: Node06
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: IIX5F6oWZUS2dlhxWFJ7TxdJtDCr5jzeuhxUB6YM7Us=
|
privkey: IIX5F6oWZUS2dlhxWFJ7TxdJtDCr5jzeuhxUB6YM7Us=
|
||||||
listenport: 3006
|
listenport: 3006
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,10 +11,11 @@ interface:
|
|||||||
nodeid: 1
|
nodeid: 1
|
||||||
nodename: Node01
|
nodename: Node01
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: aABzjKhWdkFfQ29ZuijtMp1h1TNJe66SDCwvfmvQznw=
|
privkey: aABzjKhWdkFfQ29ZuijtMp1h1TNJe66SDCwvfmvQznw=
|
||||||
listenport: 3001
|
listenport: 3001
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: error
|
||||||
logtransit: true
|
logtransit: true
|
||||||
logcontrol: true
|
logcontrol: true
|
||||||
lognormal: true
|
lognormal: true
|
||||||
|
@ -11,10 +11,11 @@ interface:
|
|||||||
nodeid: 2
|
nodeid: 2
|
||||||
nodename: Node02
|
nodename: Node02
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: UNZMzPX5fG/8yGC8edVj/ksF9N6ARRqdq7fqE/PD7ls=
|
privkey: UNZMzPX5fG/8yGC8edVj/ksF9N6ARRqdq7fqE/PD7ls=
|
||||||
listenport: 3002
|
listenport: 3002
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: error
|
||||||
logtransit: true
|
logtransit: true
|
||||||
logcontrol: true
|
logcontrol: true
|
||||||
lognormal: true
|
lognormal: true
|
||||||
|
@ -11,10 +11,11 @@ interface:
|
|||||||
nodeid: 3
|
nodeid: 3
|
||||||
nodename: Node03
|
nodename: Node03
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: gJy35nbsd8FuuxyWHjsefN+U+oM7RkuIB1EanNLSVHg=
|
privkey: gJy35nbsd8FuuxyWHjsefN+U+oM7RkuIB1EanNLSVHg=
|
||||||
listenport: 3003
|
listenport: 3003
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: error
|
||||||
logtransit: true
|
logtransit: true
|
||||||
logcontrol: true
|
logcontrol: true
|
||||||
lognormal: true
|
lognormal: true
|
||||||
|
@ -11,10 +11,11 @@ interface:
|
|||||||
nodeid: 4
|
nodeid: 4
|
||||||
nodename: Node04
|
nodename: Node04
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: wAdLgCk0SHiO11/aUf9944focD1BUCH5b6Pe+cRHHXQ=
|
privkey: wAdLgCk0SHiO11/aUf9944focD1BUCH5b6Pe+cRHHXQ=
|
||||||
listenport: 3004
|
listenport: 3004
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: error
|
||||||
logtransit: true
|
logtransit: true
|
||||||
logcontrol: true
|
logcontrol: true
|
||||||
lognormal: true
|
lognormal: true
|
||||||
|
@ -11,10 +11,11 @@ interface:
|
|||||||
nodeid: 5
|
nodeid: 5
|
||||||
nodename: Node05
|
nodename: Node05
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: gLmzeCbmN/hjiE+ehNXL9IxuG9hhWIYv2s16/DOW6FE=
|
privkey: gLmzeCbmN/hjiE+ehNXL9IxuG9hhWIYv2s16/DOW6FE=
|
||||||
listenport: 3005
|
listenport: 3005
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: error
|
||||||
logtransit: true
|
logtransit: true
|
||||||
logcontrol: true
|
logcontrol: true
|
||||||
lognormal: true
|
lognormal: true
|
||||||
|
@ -11,10 +11,11 @@ interface:
|
|||||||
nodeid: 6
|
nodeid: 6
|
||||||
nodename: Node06
|
nodename: Node06
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: IIX5F6oWZUS2dlhxWFJ7TxdJtDCr5jzeuhxUB6YM7Us=
|
privkey: IIX5F6oWZUS2dlhxWFJ7TxdJtDCr5jzeuhxUB6YM7Us=
|
||||||
listenport: 3006
|
listenport: 3006
|
||||||
loglevel:
|
loglevel:
|
||||||
loglevel: normal
|
loglevel: error
|
||||||
logtransit: true
|
logtransit: true
|
||||||
logcontrol: true
|
logcontrol: true
|
||||||
lognormal: true
|
lognormal: true
|
||||||
|
@ -290,6 +290,7 @@ Parameter:
|
|||||||
1. nodeid: Node ID
|
1. nodeid: Node ID
|
||||||
1. pubkey: Public Key
|
1. pubkey: Public Key
|
||||||
1. pskey: Pre shared Key
|
1. pskey: Pre shared Key
|
||||||
|
1. nexthoptable: If the `graphrecalculatesetting` of your super node is in static mode, you need to provide a new `NextHopTable` in json format in this parameter.
|
||||||
|
|
||||||
Return value:
|
Return value:
|
||||||
1. http code != 200: Error reason
|
1. http code != 200: Error reason
|
||||||
|
@ -296,6 +296,7 @@ curl -X POST "http://127.0.0.1:3000/api/peer/add?Password=passwd_addpeer" \
|
|||||||
1. nodeid: Node ID
|
1. nodeid: Node ID
|
||||||
1. pubkey: Public Key
|
1. pubkey: Public Key
|
||||||
1. pskey: Preshared Key
|
1. pskey: Preshared Key
|
||||||
|
1. nexthoptable: 如果你的super node的`graphrecalculatesetting`是static mode,那麼你需要在這提供一張新的`NextHopTable`,json格式
|
||||||
|
|
||||||
返回值:
|
返回值:
|
||||||
1. http code != 200: 出錯原因
|
1. http code != 200: 出錯原因
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 1
|
nodeid: 1
|
||||||
nodename: Node01
|
nodename: Node01
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: 6GyDagZKhbm5WNqMiRHhkf43RlbMJ34IieTlIuvfJ1M=
|
privkey: 6GyDagZKhbm5WNqMiRHhkf43RlbMJ34IieTlIuvfJ1M=
|
||||||
listenport: 3001
|
listenport: 3001
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -11,6 +11,7 @@ interface:
|
|||||||
nodeid: 2
|
nodeid: 2
|
||||||
nodename: Node02
|
nodename: Node02
|
||||||
defaultttl: 200
|
defaultttl: 200
|
||||||
|
l2fibtimeout: 3600
|
||||||
privkey: OH8BsVUU2Rqzeu9B2J5GPG8PUmxWfX8uVvNFZKhVF3o=
|
privkey: OH8BsVUU2Rqzeu9B2J5GPG8PUmxWfX8uVvNFZKhVF3o=
|
||||||
listenport: 3002
|
listenport: 3002
|
||||||
loglevel:
|
loglevel:
|
||||||
|
@ -45,7 +45,7 @@ func printExampleEdgeConf() {
|
|||||||
PrivKey: "6GyDagZKhbm5WNqMiRHhkf43RlbMJ34IieTlIuvfJ1M=",
|
PrivKey: "6GyDagZKhbm5WNqMiRHhkf43RlbMJ34IieTlIuvfJ1M=",
|
||||||
ListenPort: 3001,
|
ListenPort: 3001,
|
||||||
LogLevel: config.LoggerInfo{
|
LogLevel: config.LoggerInfo{
|
||||||
LogLevel: "normal",
|
LogLevel: "error",
|
||||||
LogTransit: true,
|
LogTransit: true,
|
||||||
LogControl: true,
|
LogControl: true,
|
||||||
LogNormal: true,
|
LogNormal: true,
|
||||||
|
@ -8,12 +8,17 @@ package tap
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Event int
|
type Event int
|
||||||
type MacAddress [6]uint8
|
type MacAddress [6]byte
|
||||||
|
|
||||||
|
func (mac *MacAddress) String() string {
|
||||||
|
return net.HardwareAddr((*mac)[:]).String()
|
||||||
|
}
|
||||||
|
|
||||||
func GetDstMacAddr(packet []byte) (dstMacAddr MacAddress) {
|
func GetDstMacAddr(packet []byte) (dstMacAddr MacAddress) {
|
||||||
copy(dstMacAddr[:], packet[0:6])
|
copy(dstMacAddr[:], packet[0:6])
|
||||||
|
Loading…
Reference in New Issue
Block a user