NewClient returns a Client instance (Client constructor)
(logger *slog.Logger, network, address string, typ RouteType, version uint8, software Software, mplsLabelRangeSize uint32)
| 1429 | |
| 1430 | // NewClient returns a Client instance (Client constructor) |
| 1431 | func NewClient(logger *slog.Logger, network, address string, typ RouteType, version uint8, software Software, mplsLabelRangeSize uint32) (*Client, error) { |
| 1432 | conn, err := net.Dial(network, address) |
| 1433 | if err != nil { |
| 1434 | return nil, err |
| 1435 | } |
| 1436 | outgoing := make(chan *Message) |
| 1437 | incoming := make(chan *Message, 64) |
| 1438 | if version < MinZapiVer { |
| 1439 | version = MinZapiVer |
| 1440 | } else if version > MaxZapiVer { |
| 1441 | version = MaxZapiVer |
| 1442 | } |
| 1443 | c := &Client{ |
| 1444 | outgoing: outgoing, |
| 1445 | incoming: incoming, |
| 1446 | redistDefault: typ, |
| 1447 | conn: conn, |
| 1448 | Version: version, |
| 1449 | Software: software, |
| 1450 | logger: logger, |
| 1451 | } |
| 1452 | |
| 1453 | go func() { |
| 1454 | for { |
| 1455 | m, more := <-outgoing |
| 1456 | if more { |
| 1457 | b, err := m.Serialize(software) |
| 1458 | if err != nil { |
| 1459 | logger.Warn(fmt.Sprintf("failed to serialize: %v", m), slog.String("Topic", "Zebra")) |
| 1460 | |
| 1461 | continue |
| 1462 | } |
| 1463 | |
| 1464 | _, err = conn.Write(b) |
| 1465 | if err != nil { |
| 1466 | logger.Error("failed to write", |
| 1467 | slog.String("Topic", "Zebra"), |
| 1468 | slog.String("Error", err.Error()), |
| 1469 | ) |
| 1470 | closeChannel(outgoing) |
| 1471 | return |
| 1472 | } |
| 1473 | } else { |
| 1474 | logger.Debug("finish outgoing loop", |
| 1475 | slog.String("Topic", "Zebra")) |
| 1476 | return |
| 1477 | } |
| 1478 | } |
| 1479 | }() |
| 1480 | |
| 1481 | // Send Hello/RouterIDAdd messages to negotiate the Zebra message version. |
| 1482 | c.SendHello() |
| 1483 | c.SendRouterIDAdd() |
| 1484 | |
| 1485 | if mplsLabelRangeSize > 0 && c.SupportMpls() { |
| 1486 | if err := c.sendLabelManagerConnect(true); err != nil { |
| 1487 | logger.Warn("failed to send label manager connect", |
| 1488 | slog.String("Topic", "Zebra"), |
no test coverage detected
searching dependent graphs…