X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=core%2Frequest_handler.go;h=e272c6f8ec17531c6c7b9312a5236663b4074577;hb=280b1c6c83b676ef4e592f4ecf60cb5b54b6a753;hp=dc90747c353f62e7f8d451b55eeead17a7dd76f3;hpb=df05a70f90a1486a86a4156b1b0d68c94f2098b4;p=govpp.git diff --git a/core/request_handler.go b/core/request_handler.go index dc90747..e272c6f 100644 --- a/core/request_handler.go +++ b/core/request_handler.go @@ -17,12 +17,17 @@ package core import ( "errors" "fmt" + "reflect" "sync/atomic" "time" logger "github.com/sirupsen/logrus" + + "git.fd.io/govpp.git/api" ) +var ReplyChannelTimeout = time.Millisecond * 100 + var ( ErrNotConnected = errors.New("not connected to VPP, ignoring the request") ErrProbeTimeout = errors.New("probe reply not received within timeout period") @@ -88,11 +93,10 @@ func (c *Connection) processRequest(ch *Channel, req *vppRequest) error { "context": context, "is_multi": req.multi, "msg_id": msgID, - "msg_name": req.msg.GetMessageName(), "msg_size": len(data), "seq_num": req.seqNum, "msg_crc": req.msg.GetCrcString(), - }).Debug(" -> Sending a message to VPP.") + }).Debugf("--> govpp SEND: %s %+v", req.msg.GetMessageName(), req.msg) } // send the request to VPP @@ -109,7 +113,7 @@ func (c *Connection) processRequest(ch *Channel, req *vppRequest) error { if req.multi { // send a control ping to determine end of the multipart response - pingData, _ := c.codec.EncodeMsg(msgControlPing, c.pingReqID) + pingData, _ := c.codec.EncodeMsg(c.msgControlPing, c.pingReqID) log.WithFields(logger.Fields{ "channel": ch.id, @@ -117,7 +121,7 @@ func (c *Connection) processRequest(ch *Channel, req *vppRequest) error { "msg_id": c.pingReqID, "msg_size": len(pingData), "seq_num": req.seqNum, - }).Debug(" -> Sending a control ping to VPP.") + }).Debug(" -> sending control ping") if err := c.vppClient.SendMsg(context, pingData); err != nil { log.WithFields(logger.Fields{ @@ -155,17 +159,25 @@ func (c *Connection) msgCallback(msgID uint16, data []byte) { } chanID, isMulti, seqNum := unpackRequestContext(context) + if log.Level == logger.DebugLevel { // for performance reasons - logrus does some processing even if debugs are disabled + msg = reflect.New(reflect.TypeOf(msg).Elem()).Interface().(api.Message) + + // decode the message + if err = c.codec.DecodeMsg(data, msg); err != nil { + err = fmt.Errorf("decoding message failed: %w", err) + return + } + log.WithFields(logger.Fields{ "context": context, "msg_id": msgID, - "msg_name": msg.GetMessageName(), "msg_size": len(data), "channel": chanID, "is_multi": isMulti, "seq_num": seqNum, "msg_crc": msg.GetCrcString(), - }).Debug(" <- Received a message from VPP.") + }).Debugf("<-- govpp RECEIVE: %s %+v", msg.GetMessageName(), msg) } if context == 0 || c.isNotificationMessage(msgID) { @@ -210,8 +222,8 @@ func (c *Connection) msgCallback(msgID uint16, data []byte) { func sendReply(ch *Channel, reply *vppReply) { select { case ch.replyChan <- reply: - // reply sent successfully - case <-time.After(time.Millisecond * 100): + // reply sent successfully + case <-time.After(ReplyChannelTimeout): // receiver still not ready log.WithFields(logger.Fields{ "channel": ch,