summaryrefslogtreecommitdiffhomepage
path: root/table/destination.go
diff options
context:
space:
mode:
authorISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-06-23 11:13:40 +0900
committerISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2015-06-23 11:13:40 +0900
commit4867124319c179d2a573d465a5dff2845176fb99 (patch)
tree395c5f3b782156112c900752a5b6b4c5b964be5b /table/destination.go
parent706ccc9d71b3bd7b0555bf657dc80268b79222df (diff)
table: add Equal() method to compare PeerInfo
this patch fixes the wrong behavior shown below $ gobgp global rib add 10.0.0.0/24 $ gobgp global rib del 10.0.0.0/24 $ gobgp global rib Network Next Hop AS_PATH Age Attrs *> 10.0.0.0/24 0.0.0.0 65000 00:05:48 [{Origin: IGP}] since we used to compare path's source by PeerInfo's pointer, locally originated routes is considered as a different route even if they have same prefix. this patch introduce Equal() method to compare PeerInfo's content and fix this wrong behavior. Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
Diffstat (limited to 'table/destination.go')
-rw-r--r--table/destination.go35
1 files changed, 25 insertions, 10 deletions
diff --git a/table/destination.go b/table/destination.go
index a58ffbf1..5805209f 100644
--- a/table/destination.go
+++ b/table/destination.go
@@ -48,6 +48,21 @@ type PeerInfo struct {
Address net.IP
}
+func (lhs *PeerInfo) Equal(rhs *PeerInfo) bool {
+ if lhs == rhs {
+ return true
+ }
+
+ if rhs == nil {
+ return false
+ }
+
+ if (lhs.AS == rhs.AS) && lhs.ID.Equal(rhs.ID) && lhs.LocalID.Equal(rhs.LocalID) && lhs.Address.Equal(rhs.Address) {
+ return true
+ }
+ return false
+}
+
type Destination interface {
Calculate(localAsn uint32) (Path, string, error)
getRouteFamily() bgp.RouteFamily
@@ -183,7 +198,7 @@ func (dd *DestinationDefault) removeOldPathsFromSource(source *PeerInfo) []Path
tempKnownPathList := make([]Path, 0)
for _, path := range dd.knownPathList {
- if path.GetSource() == source {
+ if path.GetSource().Equal(source) {
removePaths = append(removePaths, path)
} else {
tempKnownPathList = append(tempKnownPathList, path)
@@ -302,7 +317,7 @@ func (dest *DestinationDefault) removeWithdrawals() {
for _, path := range dest.knownPathList {
// We have a match if the source are same.
// TODO add GetSource to Path interface
- if path.GetSource() == withdraw.GetSource() {
+ if path.GetSource().Equal(withdraw.GetSource()) {
isFound = true
matches[path.String()] = path
wMatches[withdraw.String()] = withdraw
@@ -401,7 +416,7 @@ func (dest *DestinationDefault) removeOldPaths() {
// version num. as newPaths are implicit withdrawal of old
// paths and when doing RouteRefresh (not EnhancedRouteRefresh)
// we get same paths again.
- if newPath.GetSource() == path.GetSource() {
+ if newPath.GetSource().Equal(path.GetSource()) {
oldPaths = append(oldPaths, path)
break
}
@@ -590,14 +605,14 @@ func compareByLocalPref(path1, path2 Path) Path {
func compareByLocalOrigin(path1, path2 Path) Path {
- // """Select locally originating path as best path.
- // Locally originating routes are network routes, redistributed routes,
- // or aggregated routes.
- // Returns None if given paths have same source.
- // """
- // # If both paths are from same sources we cannot compare them here.
+ // Select locally originating path as best path.
+ // Locally originating routes are network routes, redistributed routes,
+ // or aggregated routes.
+ // Returns None if given paths have same source.
+ //
+ // If both paths are from same sources we cannot compare them here.
log.Debugf("enter compareByLocalOrigin")
- if path1.GetSource() == path2.GetSource() {
+ if path1.GetSource().Equal(path2.GetSource()) {
return nil
}