| 2590 | } |
| 2591 | |
| 2592 | func (s *BgpServer) StartBgp(ctx context.Context, r *api.StartBgpRequest) error { |
| 2593 | if r == nil || r.Global == nil { |
| 2594 | return fmt.Errorf("nil request") |
| 2595 | } |
| 2596 | return s.mgmtOperation(func() error { |
| 2597 | g := r.Global |
| 2598 | routerAddr, err := netip.ParseAddr(g.RouterId) |
| 2599 | if err != nil { |
| 2600 | return fmt.Errorf("invalid router-id format: %s", g.RouterId) |
| 2601 | } |
| 2602 | if !routerAddr.Is4() { |
| 2603 | return fmt.Errorf("router-id must be an IPv4 address: %s", g.RouterId) |
| 2604 | } |
| 2605 | |
| 2606 | c := newGlobalFromAPIStruct(g) |
| 2607 | if err := oc.SetDefaultGlobalConfigValues(c); err != nil { |
| 2608 | return err |
| 2609 | } |
| 2610 | |
| 2611 | if c.Config.Port > 0 { |
| 2612 | acceptCh := make(chan net.Conn, 32) |
| 2613 | for _, addr := range c.Config.LocalAddressList { |
| 2614 | l, err := netutils.NewTCPListener(s.logger, addr.String(), uint32(c.Config.Port), g.BindToDevice, acceptCh) |
| 2615 | if err != nil { |
| 2616 | return err |
| 2617 | } |
| 2618 | s.listeners = append(s.listeners, l) |
| 2619 | } |
| 2620 | s.acceptCh = acceptCh |
| 2621 | } |
| 2622 | |
| 2623 | rfs, _ := oc.AfiSafis(c.AfiSafis).ToRfList() |
| 2624 | s.globalRib = table.NewTableManager(s.logger, rfs) |
| 2625 | s.rsRib = table.NewTableManager(s.logger, rfs) |
| 2626 | |
| 2627 | if err := s.policy.Initialize(); err != nil { |
| 2628 | return err |
| 2629 | } |
| 2630 | s.bgpConfig.Global = *c |
| 2631 | // update route selection options |
| 2632 | table.SelectionOptions = c.RouteSelectionOptions.Config |
| 2633 | table.UseMultiplePaths = c.UseMultiplePaths.Config |
| 2634 | if s.bfdServer != nil { |
| 2635 | s.bfdServer.listenInterface = g.BindToDevice |
| 2636 | if err := s.bfdServer.Start(ctx, oc.BfdConfig{Port: BfdServerPort}); err != nil { |
| 2637 | return err |
| 2638 | } |
| 2639 | } |
| 2640 | return nil |
| 2641 | }, false) |
| 2642 | } |
| 2643 | |
| 2644 | func (s *BgpServer) ListVrf(ctx context.Context, r *api.ListVrfRequest, fn func(*api.Vrf)) error { |
| 2645 | if r == nil { |