10 "git.fd.io/govpp.git/api"
18 // Connect dials remote proxy server on given address and
19 // returns new client if successful.
20 func Connect(addr string) (*Client, error) {
21 client, err := rpc.DialHTTP("tcp", addr)
23 return nil, fmt.Errorf("connection error:%v", err)
32 // NewStatsClient returns new StatsClient which implements api.StatsProvider.
33 func (c *Client) NewStatsClient() (*StatsClient, error) {
34 stats := &StatsClient{
40 // NewBinapiClient returns new BinapiClient which implements api.Channel.
41 func (c *Client) NewBinapiClient() (*BinapiClient, error) {
42 binapi := &BinapiClient{
48 type StatsClient struct {
52 func (s *StatsClient) GetSystemStats(sysStats *api.SystemStats) error {
53 // we need to start with a clean, zeroed item before decoding
54 // 'cause if the new values are 'zero' for the type, they will be ignored
55 // by the decoder. (i.e the old values will be left unchanged).
56 req := StatsRequest{StatsType: "system"}
57 resp := StatsResponse{SysStats: new(api.SystemStats)}
58 if err := s.rpc.Call("StatsRPC.GetStats", req, &resp); err != nil {
61 *sysStats = *resp.SysStats
65 func (s *StatsClient) GetNodeStats(nodeStats *api.NodeStats) error {
66 req := StatsRequest{StatsType: "node"}
67 resp := StatsResponse{NodeStats: new(api.NodeStats)}
68 if err := s.rpc.Call("StatsRPC.GetStats", req, &resp); err != nil {
71 *nodeStats = *resp.NodeStats
75 func (s *StatsClient) GetInterfaceStats(ifaceStats *api.InterfaceStats) error {
76 req := StatsRequest{StatsType: "interface"}
77 resp := StatsResponse{IfaceStats: new(api.InterfaceStats)}
78 if err := s.rpc.Call("StatsRPC.GetStats", req, &resp); err != nil {
81 *ifaceStats = *resp.IfaceStats
85 func (s *StatsClient) GetErrorStats(errStats *api.ErrorStats) error {
86 req := StatsRequest{StatsType: "error"}
87 resp := StatsResponse{ErrStats: new(api.ErrorStats)}
88 if err := s.rpc.Call("StatsRPC.GetStats", req, &resp); err != nil {
91 *errStats = *resp.ErrStats
95 func (s *StatsClient) GetBufferStats(bufStats *api.BufferStats) error {
96 req := StatsRequest{StatsType: "buffer"}
97 resp := StatsResponse{BufStats: new(api.BufferStats)}
98 if err := s.rpc.Call("StatsRPC.GetStats", req, &resp); err != nil {
101 *bufStats = *resp.BufStats
105 type BinapiClient struct {
109 func (b *BinapiClient) SendRequest(msg api.Message) api.RequestCtx {
114 log.Printf("SendRequest: %T %+v", msg, msg)
118 type requestCtx struct {
123 func (r *requestCtx) ReceiveReply(msg api.Message) error {
124 req := BinapiRequest{
128 resp := BinapiResponse{}
130 err := r.rpc.Call("BinapiRPC.Invoke", req, &resp)
132 return fmt.Errorf("RPC call failed: %v", err)
135 // we set the value of msg to the value from response
136 reflect.ValueOf(msg).Elem().Set(reflect.ValueOf(resp.Msg).Elem())
141 func (b *BinapiClient) SendMultiRequest(msg api.Message) api.MultiRequestCtx {
142 req := &multiRequestCtx{
146 log.Printf("SendMultiRequest: %T %+v", msg, msg)
150 type multiRequestCtx struct {
155 replies []api.Message
158 func (r *multiRequestCtx) ReceiveReply(msg api.Message) (stop bool, err error) {
159 // we call Invoke only on first ReceiveReply
161 req := BinapiRequest{
166 resp := BinapiResponse{}
168 err := r.rpc.Call("BinapiRPC.Invoke", req, &resp)
170 return false, fmt.Errorf("RPC call failed: %v", err)
173 r.replies = resp.Msgs
176 if r.index >= len(r.replies) {
180 // we set the value of msg to the value from response
181 reflect.ValueOf(msg).Elem().Set(reflect.ValueOf(r.replies[r.index]).Elem())
187 func (b *BinapiClient) SubscribeNotification(notifChan chan api.Message, event api.Message) (api.SubscriptionCtx, error) {
188 panic("implement me")
191 func (b *BinapiClient) SetReplyTimeout(timeout time.Duration) {
192 req := BinapiTimeoutRequest{Timeout: timeout}
193 resp := BinapiTimeoutResponse{}
194 if err := b.rpc.Call("BinapiRPC.SetTimeout", req, &resp); err != nil {
199 func (b *BinapiClient) CheckCompatiblity(msgs ...api.Message) error {
200 for _, msg := range msgs {
201 req := BinapiCompatibilityRequest{
202 MsgName: msg.GetMessageName(),
203 Crc: msg.GetCrcString(),
205 resp := BinapiCompatibilityResponse{}
206 if err := b.rpc.Call("BinapiRPC.Compatibility", req, &resp); err != nil {
213 func (b *BinapiClient) Close() {