diff options
Diffstat (limited to 'table')
-rw-r--r-- | table/destination.go | 23 | ||||
-rw-r--r-- | table/destination_test.go | 18 |
2 files changed, 41 insertions, 0 deletions
diff --git a/table/destination.go b/table/destination.go index adf1c0cd..a37d2114 100644 --- a/table/destination.go +++ b/table/destination.go @@ -558,6 +558,29 @@ func getMultiBestPath(id string, pathList []*Path) []*Path { return list } +func (u *Update) GetWithdrawnPath() []*Path { + if len(u.KnownPathList) == len(u.OldKnownPathList) { + return nil + } + + l := make([]*Path, 0, len(u.OldKnownPathList)) + + for _, p := range u.OldKnownPathList { + y := func() bool { + for _, old := range u.KnownPathList { + if p == old { + return true + } + } + return false + }() + if !y { + l = append(l, p.Clone(true)) + } + } + return l +} + func (u *Update) GetChanges(id string, as uint32, peerDown bool) (*Path, *Path, []*Path) { best, old := func(id string) (*Path, *Path) { old := getBestPath(id, as, u.OldKnownPathList) diff --git a/table/destination_test.go b/table/destination_test.go index 0934057a..b5a42007 100644 --- a/table/destination_test.go +++ b/table/destination_test.go @@ -421,3 +421,21 @@ func TestIdMap(t *testing.T) { _, err := d.localIdMap.FindandSetZeroBit() assert.NotNil(t, err) } + +func TestGetWithdrawnPath(t *testing.T) { + attrs := []bgp.PathAttributeInterface{ + bgp.NewPathAttributeOrigin(0), + } + p1 := NewPath(nil, bgp.NewIPAddrPrefix(24, "13.2.3.0"), false, attrs, time.Now(), false) + p2 := NewPath(nil, bgp.NewIPAddrPrefix(24, "13.2.4.0"), false, attrs, time.Now(), false) + p3 := NewPath(nil, bgp.NewIPAddrPrefix(24, "13.2.5.0"), false, attrs, time.Now(), false) + + u := &Update{ + KnownPathList: []*Path{p2}, + OldKnownPathList: []*Path{p1, p2, p3}, + } + + l := u.GetWithdrawnPath() + assert.Equal(t, len(l), 2) + assert.Equal(t, l[0].GetNlri(), p1.GetNlri()) +} |