summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-06-30 17:32:38 +0900
committerISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-07-01 11:56:31 +0900
commit834df87c82f75b787c432d9194b4c82bff78e9d6 (patch)
treeac838ec242048aa2162311b5b5602a681bdc1f28
parente7cefb51f9cfd0012384239ee736375841af7a76 (diff)
table: check paths' equivalence deeper
if we add same path multiple times by the following gobgp cli commands, $ gobgp global rib add 10.0.0.0/24 $ gobgp global rib add 10.0.0.0/24 $ gobgp global rib add 10.0.0.0/24 current implementation sends multiple update messages to peers even through the content of the path is same. This is due to the shallow equivalence checking. This patch checks paths' equivalence deeper by adding Equal() method to Path. Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
-rw-r--r--table/destination.go2
-rw-r--r--table/path.go17
-rw-r--r--table/table_manager.go2
3 files changed, 19 insertions, 2 deletions
diff --git a/table/destination.go b/table/destination.go
index dc6e073f..704cc865 100644
--- a/table/destination.go
+++ b/table/destination.go
@@ -92,7 +92,7 @@ func (dd *Destination) ToApiStruct() *api.Destination {
idx := func() int {
for i, p := range dd.knownPathList {
- if p == dd.GetBestPath() {
+ if dd.GetBestPath().Equal(p) {
return i
}
}
diff --git a/table/path.go b/table/path.go
index 0b8f732a..1fd15308 100644
--- a/table/path.go
+++ b/table/path.go
@@ -16,6 +16,8 @@
package table
import (
+ "bytes"
+ "encoding/json"
"fmt"
log "github.com/Sirupsen/logrus"
"github.com/osrg/gobgp/api"
@@ -456,3 +458,18 @@ func (path *Path) SetMed(med int64, doReplace bool) error {
}
return nil
}
+
+func (lhs *Path) Equal(rhs *Path) bool {
+ if rhs == nil {
+ return false
+ } else if lhs == rhs {
+ return true
+ }
+ f := func(p *Path) []byte {
+ s := p.ToApiStruct()
+ s.Age = 0
+ buf, _ := json.Marshal(s)
+ return buf
+ }
+ return bytes.Equal(f(lhs), f(rhs))
+}
diff --git a/table/table_manager.go b/table/table_manager.go
index f94eab9e..4a692d23 100644
--- a/table/table_manager.go
+++ b/table/table_manager.go
@@ -151,7 +151,7 @@ func (manager *TableManager) calculate(destinationList []*Destination) ([]*Path,
destination.setBestPathReason(reason)
currentBestPath := destination.GetBestPath()
- if newBestPath != nil && currentBestPath == newBestPath {
+ if newBestPath != nil && newBestPath.Equal(currentBestPath) {
// best path is not changed
log.WithFields(log.Fields{
"Topic": "table",