begin solving major routing issue, add comments about situation
This commit is contained in:
parent
d7d5c44ced
commit
708819d981
1 changed files with 60 additions and 9 deletions
|
|
@ -10,8 +10,17 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type LuxRouteType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
LuxRouteHostToNode = 0
|
||||||
|
LuxRouteNodeToNode = 1
|
||||||
|
)
|
||||||
|
|
||||||
type LuxRoute struct {
|
type LuxRoute struct {
|
||||||
Key crypto.LuxKey
|
Type LuxRouteType
|
||||||
|
Target proto.LuxID
|
||||||
|
Source proto.LuxID
|
||||||
Destination *net.UDPAddr
|
Destination *net.UDPAddr
|
||||||
Associated *LuxChannel
|
Associated *LuxChannel
|
||||||
Nonces LuxNonceList
|
Nonces LuxNonceList
|
||||||
|
|
@ -19,6 +28,34 @@ type LuxRoute struct {
|
||||||
|
|
||||||
// !!!!!
|
// !!!!!
|
||||||
// TODO: map key can be destination ID, while Key (+ ID) in route struct would be SOURCE
|
// TODO: map key can be destination ID, while Key (+ ID) in route struct would be SOURCE
|
||||||
|
/*
|
||||||
|
Routing Map Table
|
||||||
|
key TargetID <-> value Route (SourceID, SourceKey, Transport..)
|
||||||
|
|
||||||
|
|
||||||
|
Host routing:
|
||||||
|
node 1111 <-> source 0001 host A
|
||||||
|
node 1112 <-> source 0001 host A
|
||||||
|
node 1113 <-> source 0001 host A
|
||||||
|
node 1114 <-> source 0001 host A
|
||||||
|
|
||||||
|
Node routing:
|
||||||
|
host 0001 <-> source 1111 node A
|
||||||
|
host 0002 <-> source 1111 node A
|
||||||
|
host 0003 <-> source 1111 node A
|
||||||
|
host 0004 <-> source 1111 node A
|
||||||
|
node 1112 <-> source 1111 node A
|
||||||
|
Node and host:
|
||||||
|
Receives and decrypts with host key, which is TargetID (as well as LuxPacket Target)
|
||||||
|
Sends to host with host key, which is TargetID
|
||||||
|
Node 1111 and node 1112:
|
||||||
|
Node 1111 receives and decrypts with node 1112 key, which is TargetID
|
||||||
|
Node 1111 sends to node 1112 with node 1112 key, which is TargetID
|
||||||
|
|
||||||
|
But host uses host key when communicating to node, so target ID in host routing table cannot
|
||||||
|
be used. To overcome this, a "direction" field must be introduced to routing entry, that
|
||||||
|
decides whether use target or source ID-key.
|
||||||
|
*/
|
||||||
type LuxRouter struct {
|
type LuxRouter struct {
|
||||||
thisKey crypto.LuxKey
|
thisKey crypto.LuxKey
|
||||||
keyStore crypto.LuxKeyStore
|
keyStore crypto.LuxKeyStore
|
||||||
|
|
@ -47,6 +84,17 @@ func (r *LuxRouter) GetThisKey() crypto.LuxKey {
|
||||||
return r.thisKey
|
return r.thisKey
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func channelTypeToRouteType(chType LuxChannelType) LuxRouteType {
|
||||||
|
switch chType {
|
||||||
|
case LuxChannelInterior:
|
||||||
|
return LuxRouteNodeToNode
|
||||||
|
case LuxChannelExterior:
|
||||||
|
return LuxRouteHostToNode
|
||||||
|
default:
|
||||||
|
log.Panicf("can't translate chType %d to lux route type", chType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *LuxRouter) addOutboundChannel(ch LuxChannel) *LuxChannel {
|
func (r *LuxRouter) addOutboundChannel(ch LuxChannel) *LuxChannel {
|
||||||
r.channelLock.Lock()
|
r.channelLock.Lock()
|
||||||
|
|
||||||
|
|
@ -83,7 +131,9 @@ func (r *LuxRouter) CreateOutboundRoute(id proto.LuxID, chType LuxChannelType, u
|
||||||
}
|
}
|
||||||
|
|
||||||
r.routes[key.Id] = &LuxRoute{
|
r.routes[key.Id] = &LuxRoute{
|
||||||
Key: key,
|
Type: channelTypeToRouteType(chType),
|
||||||
|
Target: id,
|
||||||
|
Source: r.thisKey.Id,
|
||||||
Destination: channel.Address,
|
Destination: channel.Address,
|
||||||
Associated: r.addOutboundChannel(channel),
|
Associated: r.addOutboundChannel(channel),
|
||||||
Nonces: NewLuxNonceList(),
|
Nonces: NewLuxNonceList(),
|
||||||
|
|
@ -98,7 +148,7 @@ func (r *LuxRouter) CreateInboundChannel(chType LuxChannelType, udpAddr string)
|
||||||
}
|
}
|
||||||
|
|
||||||
r.routes[r.thisKey.Id] = &LuxRoute{
|
r.routes[r.thisKey.Id] = &LuxRoute{
|
||||||
Key: r.thisKey,
|
Source: r.thisKey.Id,
|
||||||
Destination: channel.Address,
|
Destination: channel.Address,
|
||||||
Associated: r.addInboundChannel(channel),
|
Associated: r.addInboundChannel(channel),
|
||||||
Nonces: NewLuxNonceList(),
|
Nonces: NewLuxNonceList(),
|
||||||
|
|
@ -192,12 +242,12 @@ func (r *LuxRouter) GetRoute(udpAddr *net.UDPAddr) (*LuxRoute, bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LuxRouter) DeleteRoute(route *LuxRoute) {
|
func (r *LuxRouter) DeleteRoute(route *LuxRoute) {
|
||||||
if _, ok := r.routes[route.Key.Id]; !ok {
|
if _, ok := r.routes[route.Target]; !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
r.CloseChannel(route.Associated, false)
|
r.CloseChannel(route.Associated, false)
|
||||||
delete(r.routes, route.Key.Id)
|
delete(r.routes, route.Target)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *LuxRouter) Recv() (LuxPacket, error) {
|
func (r *LuxRouter) Recv() (LuxPacket, error) {
|
||||||
|
|
@ -213,7 +263,8 @@ func (r *LuxRouter) Recv() (LuxPacket, error) {
|
||||||
|
|
||||||
// first we look key from routes
|
// first we look key from routes
|
||||||
if route, ok := r.GetRoute(dgram.Target); ok {
|
if route, ok := r.GetRoute(dgram.Target); ok {
|
||||||
packet, err = DecryptLuxPacket(dgram, route.Key)
|
key, _ := r.keyStore.Get(route.Target)
|
||||||
|
packet, err = DecryptLuxPacket(dgram, key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// do we really fail here?
|
// do we really fail here?
|
||||||
log.Debugf("DecryptLuxPacket err %v for route %v", err, route)
|
log.Debugf("DecryptLuxPacket err %v for route %v", err, route)
|
||||||
|
|
@ -221,10 +272,10 @@ func (r *LuxRouter) Recv() (LuxPacket, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if LuxID matches
|
// check if LuxID matches
|
||||||
if !bytes.Equal(packet.Target.UUID[:], route.Key.Id.UUID[:]) {
|
if !bytes.Equal(packet.Target.UUID[:], route.Target.UUID[:]) {
|
||||||
// not matches.. we discard route and throw away packet
|
// not matches.. we discard route and throw away packet
|
||||||
log.Infof("packet from %s received at route %v mismatches associated target UUID %s",
|
log.Infof("packet from %s received at route %v mismatches associated target UUID %s",
|
||||||
dgram.Target.String(), route, route.Key.Id.String())
|
dgram.Target.String(), route, route.Target.String())
|
||||||
|
|
||||||
r.DeleteRoute(route)
|
r.DeleteRoute(route)
|
||||||
return packet, errors.New("bogus packet from established route")
|
return packet, errors.New("bogus packet from established route")
|
||||||
|
|
@ -252,7 +303,7 @@ func (r *LuxRouter) Recv() (LuxPacket, error) {
|
||||||
var ok bool
|
var ok bool
|
||||||
var route *LuxRoute
|
var route *LuxRoute
|
||||||
if route, ok = r.routes[packet.Target]; ok {
|
if route, ok = r.routes[packet.Target]; ok {
|
||||||
log.Debugf("updating route %s: %s -> %s", route.Key.Id.String,
|
log.Debugf("updating route %s: %s -> %s", route.Target.String,
|
||||||
route.Destination.String(), dgram.Target.String())
|
route.Destination.String(), dgram.Target.String())
|
||||||
|
|
||||||
route.Destination = dgram.Target
|
route.Destination = dgram.Target
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue