diff --git a/protocols/bgp/server/fsm.go b/protocols/bgp/server/fsm.go index 1e614ab1a45315f7ba13df63a18531c5937a92e8..dd1253b2eba7629059d221a9d8d2587ef2c5e1b0 100644 --- a/protocols/bgp/server/fsm.go +++ b/protocols/bgp/server/fsm.go @@ -113,6 +113,21 @@ func newFSM2(peer *peer) *FSM { return f } +func (fsm *FSM) addressFamily(afi uint16, safi uint8) *fsmAddressFamily { + if safi != packet.UnicastSAFI { + return nil + } + + switch afi { + case packet.IPv4AFI: + return fsm.ipv4Unicast + case packet.IPv6AFI: + return fsm.ipv6Unicast + default: + return nil + } +} + func (fsm *FSM) start() { ctx, cancel := context.WithCancel(context.Background()) fsm.connectionCancelFunc = cancel diff --git a/protocols/bgp/server/fsm_open_sent.go b/protocols/bgp/server/fsm_open_sent.go index 5ac4e09aa72251641c3e6268badabf90ddcf7792..8955ad673c8ed36690ab4280067247ce89bc5411 100644 --- a/protocols/bgp/server/fsm_open_sent.go +++ b/protocols/bgp/server/fsm_open_sent.go @@ -183,20 +183,25 @@ func (s *openSentState) processAddPathCapability(addPathCap packet.AddPathCapabi return } + f := s.fsm.addressFamily(addPathCap.AFI, addPathCap.SAFI) + if f == nil { + return + } + switch addPathCap.SendReceive { case packet.AddPathReceive: - if !s.fsm.peer.addPathSend.BestOnly { + if !f.addPathSend.BestOnly { s.fsm.options.AddPathRX = true } case packet.AddPathSend: - if s.fsm.peer.addPathRecv { + if f.addPathRecv { s.fsm.options.AddPathRX = true } case packet.AddPathSendReceive: - if !s.fsm.peer.addPathSend.BestOnly { + if !f.addPathSend.BestOnly { s.fsm.options.AddPathRX = true } - if s.fsm.peer.addPathRecv { + if f.addPathRecv { s.fsm.options.AddPathRX = true } } diff --git a/protocols/bgp/server/server_test.go b/protocols/bgp/server/server_test.go index 896c3201b01799c3317a5f1e4e1ad1eed194f2bd..10c1266cf65e557e1df27c02808e30d4bd74f310 100644 --- a/protocols/bgp/server/server_test.go +++ b/protocols/bgp/server/server_test.go @@ -38,13 +38,13 @@ func TestBgpServerPeerSnapshot(t *testing.T) { KeepAlive: time.Second * 30, Passive: true, RouterID: s.RouterID(), - AddPathSend: routingtable.ClientOptions{ - MaxPaths: 10, - }, IPv4: &config.AddressFamilyConfig{ RIB: rib, ImportFilter: filter.NewDrainFilter(), ExportFilter: filter.NewAcceptAllFilter(), + AddPathSend: routingtable.ClientOptions{ + MaxPaths: 10, + }, }, } s.AddPeer(pc)