5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-22 21:10:29 +00:00

Use full node ID for CKR routes instead of truncated node IDs from the address/subnet

This commit is contained in:
Neil Alexander 2018-11-07 10:04:31 +00:00
parent 39dab53ac7
commit fbfae473d4
No known key found for this signature in database
GPG Key ID: A02A2019A2BB0944

View File

@ -125,20 +125,21 @@ func (r *router) sendPacket(bs []byte) {
panic("Tried to send a packet shorter than a header...") panic("Tried to send a packet shorter than a header...")
} }
var sourceAddr address var sourceAddr address
var dest address var destAddr address
var snet subnet var destSnet subnet
var destNodeID *NodeID
var addrlen int var addrlen int
if bs[0]&0xf0 == 0x60 { if bs[0]&0xf0 == 0x60 {
// IPv6 address // IPv6 address
addrlen = 16 addrlen = 16
copy(sourceAddr[:addrlen], bs[8:]) copy(sourceAddr[:addrlen], bs[8:])
copy(dest[:addrlen], bs[24:]) copy(destAddr[:addrlen], bs[24:])
copy(snet[:addrlen/2], bs[24:]) copy(destSnet[:addrlen/2], bs[24:])
} else if bs[0]&0xf0 == 0x40 { } else if bs[0]&0xf0 == 0x40 {
// IPv4 address // IPv4 address
addrlen = 4 addrlen = 4
copy(sourceAddr[:addrlen], bs[12:]) copy(sourceAddr[:addrlen], bs[12:])
copy(dest[:addrlen], bs[16:]) copy(destAddr[:addrlen], bs[16:])
} else { } else {
// Unknown address length // Unknown address length
return return
@ -146,12 +147,13 @@ func (r *router) sendPacket(bs []byte) {
if !r.cryptokey.isValidSource(sourceAddr, addrlen) { if !r.cryptokey.isValidSource(sourceAddr, addrlen) {
return return
} }
if !dest.isValid() && !snet.isValid() { if !destAddr.isValid() && !destSnet.isValid() {
if key, err := r.cryptokey.getPublicKeyForAddress(dest, addrlen); err == nil { if key, err := r.cryptokey.getPublicKeyForAddress(destAddr, addrlen); err == nil {
addr := *address_addrForNodeID(getNodeID(&key)) destNodeID = getNodeID(&key)
copy(dest[:], addr[:]) addr := *address_addrForNodeID(destNodeID)
copy(snet[:], addr[:]) copy(destAddr[:], addr[:])
if !dest.isValid() && !snet.isValid() { copy(destSnet[:], addr[:])
if !destAddr.isValid() && !destSnet.isValid() {
return return
} }
} else { } else {
@ -160,11 +162,26 @@ func (r *router) sendPacket(bs []byte) {
} }
doSearch := func(packet []byte) { doSearch := func(packet []byte) {
var nodeID, mask *NodeID var nodeID, mask *NodeID
if dest.isValid() { switch {
nodeID, mask = dest.getNodeIDandMask() case destNodeID != nil:
// We already know the full node ID, probably because it's from a CKR
// route in which the public key is known ahead of time
nodeID = destNodeID
var m NodeID
for i := range m {
m[i] = 0xFF
} }
if snet.isValid() { mask = &m
nodeID, mask = snet.getNodeIDandMask() case destAddr.isValid():
// We don't know the full node ID - try and use the address to generate
// a truncated node ID
nodeID, mask = destAddr.getNodeIDandMask()
case destSnet.isValid():
// We don't know the full node ID - try and use the subnet to generate
// a truncated node ID
nodeID, mask = destSnet.getNodeIDandMask()
default:
return
} }
sinfo, isIn := r.core.searches.searches[*nodeID] sinfo, isIn := r.core.searches.searches[*nodeID]
if !isIn { if !isIn {
@ -177,11 +194,11 @@ func (r *router) sendPacket(bs []byte) {
} }
var sinfo *sessionInfo var sinfo *sessionInfo
var isIn bool var isIn bool
if dest.isValid() { if destAddr.isValid() {
sinfo, isIn = r.core.sessions.getByTheirAddr(&dest) sinfo, isIn = r.core.sessions.getByTheirAddr(&destAddr)
} }
if snet.isValid() { if destSnet.isValid() {
sinfo, isIn = r.core.sessions.getByTheirSubnet(&snet) sinfo, isIn = r.core.sessions.getByTheirSubnet(&destSnet)
} }
switch { switch {
case !isIn || !sinfo.init: case !isIn || !sinfo.init: