RequestMessage MessageType = iota
// ReplyMessage represents a VPP reply message
ReplyMessage
+ // EventMessage represents a VPP notification event message
+ EventMessage
// OtherMessage represents other VPP message (e.g. counters)
OtherMessage
)
-// Message is an interface that is implemented by all VPP Binary API messages generated by the binapi_generator.
+// Message is an interface that is implemented by all VPP Binary API messages generated by the binapigenerator.
type Message interface {
// GetMessageName returns the original VPP name of the message, as defined in the VPP API.
GetMessageName() string
// Channel is the main communication interface with govpp core. It contains two Go channels, one for sending the requests
// to VPP and one for receiving the replies from it. The user can access the Go channels directly, or use the helper
-// methods provided inside of this package.
+// methods provided inside of this package. Do not use the same channel from multiple goroutines concurrently,
+// otherwise the responses could mix! Use multiple channels instead.
type Channel struct {
ReqChan chan *VppRequest // channel for sending the requests to VPP, closing this channel releases all resources in the ChannelProvider
ReplyChan chan *VppReply // channel where VPP replies are delivered to
return false, err
}
if vppReply.MessageID != expMsgID {
- err = fmt.Errorf("invalid message ID %d, expected %d", vppReply.MessageID, expMsgID)
+ err = fmt.Errorf("received invalid message ID, expected %d (%s), but got %d (check if multiple goroutines are not sharing single GoVPP channel)",
+ expMsgID, msg.GetMessageName(), vppReply.MessageID)
return false, err
}
// decode the message
err = ch.MsgDecoder.DecodeMsg(vppReply.Data, msg)
case <-time.After(ch.replyTimeout):
- err = fmt.Errorf("no reply received within the timeout period %ds", ch.replyTimeout/time.Second)
+ err = fmt.Errorf("no reply received within the timeout period %s", ch.replyTimeout)
}
return
}