Check for local links and empty gateways
This commit is contained in:
parent
776284b187
commit
b67be88952
@ -304,6 +304,7 @@ func (n *network) acceptNetConn(l tunnel.Listener, recv chan *message) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// updatePeerLinks updates link for a given peer
|
||||||
func (n *network) updatePeerLinks(peerAddr string, linkId string) error {
|
func (n *network) updatePeerLinks(peerAddr string, linkId string) error {
|
||||||
n.Lock()
|
n.Lock()
|
||||||
defer n.Unlock()
|
defer n.Unlock()
|
||||||
@ -367,6 +368,7 @@ func (n *network) processNetChan(listener tunnel.Listener) {
|
|||||||
lastSeen: now,
|
lastSeen: now,
|
||||||
}
|
}
|
||||||
// update peer links
|
// update peer links
|
||||||
|
log.Debugf("Network updating peer link %s for peer: %s", m.session.Link(), pbNetConnect.Node.Address)
|
||||||
if err := n.updatePeerLinks(pbNetConnect.Node.Address, m.session.Link()); err != nil {
|
if err := n.updatePeerLinks(pbNetConnect.Node.Address, m.session.Link()); err != nil {
|
||||||
log.Debugf("Network failed updating peer links: %s", err)
|
log.Debugf("Network failed updating peer links: %s", err)
|
||||||
}
|
}
|
||||||
@ -409,6 +411,7 @@ func (n *network) processNetChan(listener tunnel.Listener) {
|
|||||||
lastSeen: now,
|
lastSeen: now,
|
||||||
}
|
}
|
||||||
// update peer links
|
// update peer links
|
||||||
|
log.Debugf("Network updating peer link %s for peer: %s", m.session.Link(), pbNetPeer.Node.Address)
|
||||||
if err := n.updatePeerLinks(pbNetPeer.Node.Address, m.session.Link()); err != nil {
|
if err := n.updatePeerLinks(pbNetPeer.Node.Address, m.session.Link()); err != nil {
|
||||||
log.Debugf("Network failed updating peer links: %s", err)
|
log.Debugf("Network failed updating peer links: %s", err)
|
||||||
}
|
}
|
||||||
@ -691,11 +694,22 @@ func (n *network) getHopCount(rtr string) int {
|
|||||||
|
|
||||||
// getRouteMetric calculates router metric and returns it
|
// getRouteMetric calculates router metric and returns it
|
||||||
// Route metric is calculated based on link status and route hopd count
|
// Route metric is calculated based on link status and route hopd count
|
||||||
func (n *network) getRouteMetric(router string, gateway string) int64 {
|
func (n *network) getRouteMetric(router string, gateway string, link string) int64 {
|
||||||
// set the route metric
|
// set the route metric
|
||||||
n.RLock()
|
n.RLock()
|
||||||
defer n.RUnlock()
|
defer n.RUnlock()
|
||||||
|
|
||||||
|
if link == "local" && gateway == "" {
|
||||||
|
log.Debugf("Network link: %s, gateway: blank", link, gateway)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if link == "local" && gateway != "" {
|
||||||
|
log.Debugf("Network link: %s, gateway: %s", link, gateway)
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Network looking up %s link to gateway: %s", link, gateway)
|
||||||
if link, ok := n.peerLinks[gateway]; ok {
|
if link, ok := n.peerLinks[gateway]; ok {
|
||||||
// maka sure delay is non-zero
|
// maka sure delay is non-zero
|
||||||
delay := link.Delay()
|
delay := link.Delay()
|
||||||
@ -711,6 +725,7 @@ func (n *network) getRouteMetric(router string, gateway string) int64 {
|
|||||||
}
|
}
|
||||||
return (delay * length * int64(hops)) / 10e9
|
return (delay * length * int64(hops)) / 10e9
|
||||||
}
|
}
|
||||||
|
log.Debugf("Network failed to find a link to gateway: %s", gateway)
|
||||||
return math.MaxInt64
|
return math.MaxInt64
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -768,8 +783,9 @@ func (n *network) processCtrlChan(listener tunnel.Listener) {
|
|||||||
}
|
}
|
||||||
// calculate route metric and add to the advertised metric
|
// calculate route metric and add to the advertised metric
|
||||||
// we need to make sure we do not overflow math.MaxInt64
|
// we need to make sure we do not overflow math.MaxInt64
|
||||||
if metric := n.getRouteMetric(event.Route.Router, event.Route.Gateway); metric != math.MaxInt64 {
|
log.Debugf("Network metric for router %s and gateway %s", event.Route.Router, event.Route.Gateway)
|
||||||
route.Metric += n.getRouteMetric(event.Route.Router, event.Route.Gateway)
|
if metric := n.getRouteMetric(event.Route.Router, event.Route.Gateway, event.Route.Link); metric != math.MaxInt64 {
|
||||||
|
route.Metric += metric
|
||||||
} else {
|
} else {
|
||||||
route.Metric = metric
|
route.Metric = metric
|
||||||
}
|
}
|
||||||
@ -843,7 +859,7 @@ func (n *network) advertise(advertChan <-chan *router.Advert) {
|
|||||||
address = fmt.Sprintf("%d", hasher.Sum64())
|
address = fmt.Sprintf("%d", hasher.Sum64())
|
||||||
}
|
}
|
||||||
// calculate route metric to advertise
|
// calculate route metric to advertise
|
||||||
metric := n.getRouteMetric(event.Route.Router, event.Route.Gateway)
|
metric := n.getRouteMetric(event.Route.Router, event.Route.Gateway, DefaultLink)
|
||||||
// NOTE: we override Gateway, Link and Address here
|
// NOTE: we override Gateway, Link and Address here
|
||||||
route := &pbRtr.Route{
|
route := &pbRtr.Route{
|
||||||
Service: event.Route.Service,
|
Service: event.Route.Service,
|
||||||
|
Loading…
Reference in New Issue
Block a user