(s *BgpServer, url string, protos []string, version uint8, nhtEnable bool, nhtDelay uint8, mplsLabelRangeSize uint32, software zebra.Software)
| 566 | } |
| 567 | |
| 568 | func newZebraClient(s *BgpServer, url string, protos []string, version uint8, nhtEnable bool, nhtDelay uint8, mplsLabelRangeSize uint32, software zebra.Software) (*zebraClient, error) { |
| 569 | l := strings.SplitN(url, ":", 2) |
| 570 | if len(l) != 2 { |
| 571 | return nil, fmt.Errorf("unsupported url: %s", url) |
| 572 | } |
| 573 | var cli *zebra.Client |
| 574 | var err error |
| 575 | var usingVersion uint8 |
| 576 | var zapivers [zebra.MaxZapiVer - zebra.MinZapiVer + 1]uint8 |
| 577 | zapivers[0] = version |
| 578 | for elem, ver := 1, zebra.MinZapiVer; elem < len(zapivers) && ver <= zebra.MaxZapiVer; elem++ { |
| 579 | if version == ver && ver < zebra.MaxZapiVer { |
| 580 | ver++ |
| 581 | } |
| 582 | zapivers[elem] = ver |
| 583 | ver++ |
| 584 | } |
| 585 | for elem, ver := range zapivers { |
| 586 | cli, err = zebra.NewClient(s.logger, l[0], l[1], zebra.RouteBGP, ver, software, mplsLabelRangeSize) |
| 587 | if cli != nil && err == nil { |
| 588 | usingVersion = ver |
| 589 | break |
| 590 | } |
| 591 | // Retry with another Zebra message version |
| 592 | s.logger.Warn("cannot connect to Zebra with message version", |
| 593 | slog.String("Topic", "Zebra"), |
| 594 | slog.Int("Version", int(ver))) |
| 595 | if elem < len(zapivers)-1 { |
| 596 | s.logger.Warn("going to retry another version", |
| 597 | slog.String("Topic", "Zebra"), |
| 598 | slog.Int("Version", int(zapivers[elem+1]))) |
| 599 | } |
| 600 | } |
| 601 | if cli == nil || err != nil { |
| 602 | return nil, err |
| 603 | } |
| 604 | s.logger.Info("success to connect to Zebra", |
| 605 | slog.String("Topic", "Zebra"), |
| 606 | slog.Int("Version", int(usingVersion)), |
| 607 | ) |
| 608 | |
| 609 | // Note: HELLO/ROUTER_ID_ADD messages are automatically sent to negotiate |
| 610 | // the Zebra message version in zebra.NewClient(). |
| 611 | // cli.SendHello() |
| 612 | // cli.SendRouterIDAdd() |
| 613 | cli.SendInterfaceAdd() |
| 614 | for _, typ := range protos { |
| 615 | t, err := zebra.RouteTypeFromString(typ, version, software) |
| 616 | if err != nil { |
| 617 | return nil, err |
| 618 | } |
| 619 | cli.SendRedistribute(t, zebra.DefaultVrf) |
| 620 | } |
| 621 | w := &zebraClient{ |
| 622 | client: cli, |
| 623 | server: s, |
| 624 | nexthopCache: make(nexthopStateCache), |
| 625 | pathVrfMap: make(map[*table.Path]uint32), |
no test coverage detected
searching dependent graphs…