//monitorBest monitors for route updates/changes form peer func (self *OfnetBgp) watch() { w := self.bgpServer.Watch(gobgp.WatchBestPath(), gobgp.WatchPeerState(true)) for { select { case ev := <-w.Event(): switch msg := ev.(type) { case *gobgp.WatchEventBestPath: for _, path := range msg.PathList { self.modRib(path) } case *gobgp.WatchEventPeerState: self.peerUpdate(msg) } case <-self.stopWatch: return } } }
func (s *Server) MonitorPeerState(arg *Arguments, stream GobgpApi_MonitorPeerStateServer) error { return func() error { w := s.bgpServer.Watch(server.WatchPeerState(false)) defer func() { w.Stop() }() for { select { case ev := <-w.Event(): switch msg := ev.(type) { case *server.WatchEventPeerState: if len(arg.Name) > 0 && arg.Name != msg.PeerAddress.String() { continue } if err := stream.Send(&Peer{ Conf: &PeerConf{ PeerAs: msg.PeerAS, LocalAs: msg.LocalAS, NeighborAddress: msg.PeerAddress.String(), Id: msg.PeerID.String(), }, Info: &PeerState{ PeerAs: msg.PeerAS, LocalAs: msg.LocalAS, NeighborAddress: msg.PeerAddress.String(), BgpState: msg.State.String(), AdminState: msg.AdminState.String(), }, Transport: &Transport{ LocalAddress: msg.LocalAddress.String(), LocalPort: uint32(msg.LocalPort), RemotePort: uint32(msg.PeerPort), }, }); err != nil { return err } } } } }() }