diff options
-rw-r--r-- | table/destination.go | 8 | ||||
-rw-r--r-- | table/destination_test.go | 4 | ||||
-rw-r--r-- | test/scenario_test/route_server_test.py | 1 |
3 files changed, 7 insertions, 6 deletions
diff --git a/table/destination.go b/table/destination.go index d192f53d..f695f6be 100644 --- a/table/destination.go +++ b/table/destination.go @@ -679,10 +679,10 @@ func compareByMED(path1, path2 *Path) *Path { isInternal := func() bool { return path1.GetAsPathLen() == 0 && path2.GetAsPathLen() == 0 }() isSameAS := func() bool { - leftmostAS := func(path *Path) uint32 { + firstAS := func(path *Path) uint32 { if aspath := path.GetAsPath(); aspath != nil { asPathParam := aspath.Value - for i := len(asPathParam) - 1; i >= 0; i-- { + for i := 0; i < len(asPathParam); i++ { asPath := asPathParam[i].(*bgp.As4PathParam) if asPath.Num == 0 { continue @@ -690,12 +690,12 @@ func compareByMED(path1, path2 *Path) *Path { if asPath.Type == bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SET || asPath.Type == bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SEQ { continue } - return asPath.AS[asPath.Num-1] + return asPath.AS[0] } } return 0 } - return leftmostAS(path1) == leftmostAS(path2) + return firstAS(path1) != 0 && firstAS(path1) == firstAS(path2) }() if SelectionOptions.AlwaysCompareMed || isInternal || isSameAS { diff --git a/table/destination_test.go b/table/destination_test.go index 690cfe6b..23458906 100644 --- a/table/destination_test.go +++ b/table/destination_test.go @@ -227,7 +227,7 @@ func TestMedTieBreaker(t *testing.T) { }() p1 := func() *Path { - aspath := bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{65001, 65002}), bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{65003, 65004})}) + aspath := bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{65001, 65002}), bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{65003, 65005})}) attrs := []bgp.PathAttributeInterface{aspath, bgp.NewPathAttributeMultiExitDisc(10)} return NewPath(nil, nlri, false, attrs, time.Now(), false) }() @@ -245,7 +245,7 @@ func TestMedTieBreaker(t *testing.T) { assert.Equal(t, compareByMED(p0, p2), (*Path)(nil)) p3 := func() *Path { - aspath := bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{65001, 65002}), bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SEQ, []uint32{65003, 65004})}) + aspath := bgp.NewPathAttributeAsPath([]bgp.AsPathParamInterface{bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_CONFED_SEQ, []uint32{65003, 65004}), bgp.NewAs4PathParam(bgp.BGP_ASPATH_ATTR_TYPE_SEQ, []uint32{65001, 65003})}) attrs := []bgp.PathAttributeInterface{aspath, bgp.NewPathAttributeMultiExitDisc(0)} return NewPath(nil, nlri, false, attrs, time.Now(), false) }() diff --git a/test/scenario_test/route_server_test.py b/test/scenario_test/route_server_test.py index afe350af..56446649 100644 --- a/test/scenario_test/route_server_test.py +++ b/test/scenario_test/route_server_test.py @@ -173,6 +173,7 @@ class GoBGPTestBase(unittest.TestCase): def test_09_check_rs_clients_rib(self): self.check_rs_client_rib() + @unittest.skip("med shouldn't work with different AS peers by default") def test_10_add_distant_relative(self): q1 = self.quaggas['q1'] q2 = self.quaggas['q2'] |