Set metric on egress. Increment metric on ingress.
This commit is contained in:
parent
1ff65e140a
commit
f4f178c130
@ -653,6 +653,31 @@ func (n *network) acceptCtrlConn(l tunnel.Listener, recv chan *Message) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getRouteMetric calculates router metric and returns it
|
||||||
|
// Route metric is calculated based on link status and route hopd count
|
||||||
|
func (n *network) getRouteMetric(router string, gateway string) int64 {
|
||||||
|
// set the route metric
|
||||||
|
n.RLock()
|
||||||
|
defer n.RUnlock()
|
||||||
|
|
||||||
|
if link, ok := n.peerLinks[gateway]; ok {
|
||||||
|
// maka sure delay is non-zero
|
||||||
|
delay := link.Delay()
|
||||||
|
if delay == 0 {
|
||||||
|
delay = 1
|
||||||
|
}
|
||||||
|
// get the route hop count
|
||||||
|
hops := n.getHopCount(router)
|
||||||
|
// make sure length is non-zero
|
||||||
|
length := link.Length()
|
||||||
|
if length == 0 {
|
||||||
|
length = 10e10
|
||||||
|
}
|
||||||
|
return (delay * length * int64(hops)) / 10e9
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
// getHopCount queries network graph and returns hop count for given router
|
// getHopCount queries network graph and returns hop count for given router
|
||||||
// - Routes for local services have hop count 1
|
// - Routes for local services have hop count 1
|
||||||
// - Routes with ID of adjacent nodes have hop count 2
|
// - Routes with ID of adjacent nodes have hop count 2
|
||||||
@ -737,25 +762,8 @@ func (n *network) processCtrlChan(listener tunnel.Listener) {
|
|||||||
Link: event.Route.Link,
|
Link: event.Route.Link,
|
||||||
Metric: event.Route.Metric,
|
Metric: event.Route.Metric,
|
||||||
}
|
}
|
||||||
// set the route metric
|
// calculate route metric and add to the advertised metric
|
||||||
n.RLock()
|
route.Metric += n.getRouteMetric(event.Route.Router, event.Route.Gateway)
|
||||||
if link, ok := n.peerLinks[event.Route.Gateway]; ok {
|
|
||||||
// maka sure delay is non-zero
|
|
||||||
delay := link.Delay()
|
|
||||||
if delay == 0 {
|
|
||||||
delay = 1
|
|
||||||
}
|
|
||||||
// get the route hop count
|
|
||||||
hops := n.getHopCount(event.Route.Router)
|
|
||||||
// make sure length is non-zero
|
|
||||||
length := link.Length()
|
|
||||||
if length == 0 {
|
|
||||||
length = 10e10
|
|
||||||
}
|
|
||||||
metric := (delay * length * int64(hops)) / 10e9
|
|
||||||
route.Metric += metric
|
|
||||||
}
|
|
||||||
n.RUnlock()
|
|
||||||
// create router event
|
// create router event
|
||||||
e := &router.Event{
|
e := &router.Event{
|
||||||
Type: router.EventType(event.Type),
|
Type: router.EventType(event.Type),
|
||||||
@ -825,9 +833,9 @@ func (n *network) advertise(advertChan <-chan *router.Advert) {
|
|||||||
hasher.Write([]byte(event.Route.Address + n.node.id))
|
hasher.Write([]byte(event.Route.Address + n.node.id))
|
||||||
address = fmt.Sprintf("%d", hasher.Sum64())
|
address = fmt.Sprintf("%d", hasher.Sum64())
|
||||||
}
|
}
|
||||||
|
// calculate route metric to advertise
|
||||||
|
metric := n.getRouteMetric(event.Route.Router, event.Route.Gateway)
|
||||||
// NOTE: we override Gateway, Link and Address here
|
// NOTE: we override Gateway, Link and Address here
|
||||||
// TODO: should we avoid overriding gateway?
|
|
||||||
route := &pbRtr.Route{
|
route := &pbRtr.Route{
|
||||||
Service: event.Route.Service,
|
Service: event.Route.Service,
|
||||||
Address: address,
|
Address: address,
|
||||||
@ -835,7 +843,7 @@ func (n *network) advertise(advertChan <-chan *router.Advert) {
|
|||||||
Network: event.Route.Network,
|
Network: event.Route.Network,
|
||||||
Router: event.Route.Router,
|
Router: event.Route.Router,
|
||||||
Link: DefaultLink,
|
Link: DefaultLink,
|
||||||
Metric: int64(event.Route.Metric),
|
Metric: metric,
|
||||||
}
|
}
|
||||||
e := &pbRtr.Event{
|
e := &pbRtr.Event{
|
||||||
Type: pbRtr.EventType(event.Type),
|
Type: pbRtr.EventType(event.Type),
|
||||||
|
Loading…
Reference in New Issue
Block a user