diff --git a/protocols/bgp/server/bmp_router_test.go b/protocols/bgp/server/bmp_router_test.go index aa17d74e4a7ba954f5ae4ae0bdc20522dc492418..3ced25bfcff69e299b7bc56d43d9a18315937eee 100644 --- a/protocols/bgp/server/bmp_router_test.go +++ b/protocols/bgp/server/bmp_router_test.go @@ -330,12 +330,14 @@ func TestProcessPeerUpNotification(t *testing.T) { safi: 1, adjRIBIn: adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false), importFilter: filter.NewAcceptAllFilter(), + addPathTX: routingtable.ClientOptions{BestOnly: true}, }, ipv6Unicast: &fsmAddressFamily{ afi: 2, safi: 1, adjRIBIn: adjRIBIn.New(filter.NewAcceptAllFilter(), &routingtable.ContributingASNs{}, 169090600, 0, false), importFilter: filter.NewAcceptAllFilter(), + addPathTX: routingtable.ClientOptions{BestOnly: true}, }, }, }, diff --git a/protocols/bgp/server/fsm_address_family.go b/protocols/bgp/server/fsm_address_family.go index 04234c3d604ad8a214b9de73f15c4254c26de290..f59d41030ac94e46fd96176f568040e54483e3d3 100644 --- a/protocols/bgp/server/fsm_address_family.go +++ b/protocols/bgp/server/fsm_address_family.go @@ -45,6 +45,9 @@ func newFSMAddressFamily(afi uint16, safi uint8, family *peerAddressFamily, fsm rib: family.rib, importFilter: family.importFilter, exportFilter: family.exportFilter, + addPathTX: routingtable.ClientOptions{ + BestOnly: true, + }, } } diff --git a/protocols/bgp/server/fsm_open_sent_test.go b/protocols/bgp/server/fsm_open_sent_test.go index 5b699bb1e62eaa13546c83410bd29e28cd2d64ba..31b33dc7e64301ce28a1a5fc6d698b2cbd1302ef 100644 --- a/protocols/bgp/server/fsm_open_sent_test.go +++ b/protocols/bgp/server/fsm_open_sent_test.go @@ -1,6 +1,7 @@ package server import ( + "github.com/bio-routing/bio-rd/routingtable" "net" "testing" @@ -211,3 +212,82 @@ func TestProcessMultiProtocolCapability(t *testing.T) { }) } } + +func TestProcessAddPathCapabilityTX(t *testing.T) { + tests := []struct { + name string + peer *peer + caps []packet.AddPathCapability + expected routingtable.ClientOptions + }{ + { + name: "Add-Path enabled and cap received", + peer: &peer{ + ipv4: &peerAddressFamily{ + addPathSend: routingtable.ClientOptions{MaxPaths: 3}, + }, + }, + caps: []packet.AddPathCapability{ + { + AFI: packet.IPv4AFI, + SAFI: packet.UnicastSAFI, + SendReceive: packet.AddPathReceive, + }, + }, + expected: routingtable.ClientOptions{MaxPaths: 3}, + }, + { + name: "Add-Path enabled and cap not received", + peer: &peer{ + ipv4: &peerAddressFamily{ + addPathSend: routingtable.ClientOptions{MaxPaths: 3}, + }, + }, + caps: []packet.AddPathCapability{}, + expected: routingtable.ClientOptions{BestOnly: true}, + }, + { + name: "Add-Path disabled and cap received", + peer: &peer{ + ipv4: &peerAddressFamily{ + addPathSend: routingtable.ClientOptions{BestOnly: true}, + }, + }, + caps: []packet.AddPathCapability{ + { + AFI: packet.IPv4AFI, + SAFI: packet.UnicastSAFI, + SendReceive: packet.AddPathReceive, + }, + }, + expected: routingtable.ClientOptions{BestOnly: true}, + }, + { + name: "Add-Path disabled and cap not received", + peer: &peer{ + ipv4: &peerAddressFamily{ + addPathSend: routingtable.ClientOptions{BestOnly: true}, + }, + }, + caps: []packet.AddPathCapability{}, + expected: routingtable.ClientOptions{BestOnly: true}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + fsm := newFSM(test.peer) + fsm.con = &btesting.MockConn{} + + s := &openSentState{ + fsm: fsm, + } + + for _, cap := range test.caps { + s.processAddPathCapability(cap) + } + + assert.Equal(t, test.expected, fsm.ipv4Unicast.addPathTX) + }) + } +}