MCPcopy
hub / github.com/osrg/gobgp / newZebraClient

Function newZebraClient

pkg/server/zclient.go:568–639  ·  view source on GitHub ↗
(s *BgpServer, url string, protos []string, version uint8, nhtEnable bool, nhtDelay uint8, mplsLabelRangeSize uint32, software zebra.Software)

Source from the content-addressed store, hash-verified

566}
567
568func 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),

Callers 1

EnableZebraMethod · 0.85

Calls 9

SendInterfaceAddMethod · 0.95
SendRedistributeMethod · 0.95
loopMethod · 0.95
SupportMplsMethod · 0.95
SendGetLabelChunkMethod · 0.95
NewClientFunction · 0.92
RouteTypeFromStringFunction · 0.92
StringMethod · 0.65
InfoMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…