(opt ...ServerOption)
| 165 | } |
| 166 | |
| 167 | func NewBgpServer(opt ...ServerOption) *BgpServer { |
| 168 | opts := options{ |
| 169 | timingHook: nopTimingHook{}, |
| 170 | } |
| 171 | for _, o := range opt { |
| 172 | o(&opts) |
| 173 | } |
| 174 | logger := opts.logger |
| 175 | lvl := opts.logLevelVar |
| 176 | if logger == nil { |
| 177 | logger = slog.New(slog.NewJSONHandler(io.Discard, nil)) |
| 178 | lvl = nil |
| 179 | } |
| 180 | roaTable := table.NewROATable(logger) |
| 181 | shared := newSharedData() |
| 182 | |
| 183 | s := &BgpServer{ |
| 184 | shared: shared, |
| 185 | neighborMap: make(map[netip.Addr]*peer), |
| 186 | peerGroupMap: make(map[string]*peerGroup), |
| 187 | policy: table.NewRoutingPolicy(logger), |
| 188 | mgmtCh: make(chan *mgmtOp, 1), |
| 189 | closeCh: make(chan struct{}), |
| 190 | watcherMap: make(map[watchEventType][]*watcher), |
| 191 | uuidMap: make(map[string]uuid.UUID), |
| 192 | roaManager: newROAManager(roaTable, logger), |
| 193 | roaTable: roaTable, |
| 194 | logger: logger, |
| 195 | logLevelVar: lvl, |
| 196 | timingHook: opts.timingHook, |
| 197 | shutdownWG: &sync.WaitGroup{}, |
| 198 | } |
| 199 | s.bmpManager = newBmpClientManager(s) |
| 200 | s.mrtManager = newMrtManager(s) |
| 201 | s.bfdServer = NewBfdServer(s, logger) |
| 202 | if len(opts.grpcAddress) != 0 { |
| 203 | grpc.EnableTracing = false |
| 204 | s.apiServer = newAPIserver(s, shared, grpc.NewServer(opts.grpcOption...), opts.grpcAddress) |
| 205 | go func() { |
| 206 | if err := s.apiServer.serve(); err != nil { |
| 207 | logger.Error("failed to listen grpc port", slog.String("Error", err.Error())) |
| 208 | } |
| 209 | }() |
| 210 | } |
| 211 | return s |
| 212 | } |
| 213 | |
| 214 | func (s *BgpServer) Stop() { |
| 215 | if err := s.StopBgp(context.Background(), &api.StopBgpRequest{}); err != nil { |
searching dependent graphs…