aboutsummaryrefslogtreecommitdiffstats
path: root/api/doc.go
diff options
context:
space:
mode:
authorRastislav Szabo <raszabo@cisco.com>2017-05-04 11:09:03 +0200
committerRastislav Szabo <raszabo@cisco.com>2017-05-04 11:12:35 +0200
commita101d966133a70b8a76526be25070436d14fcf9f (patch)
tree75e2dbf20de615e58252b780b2ba5baae8fdcf82 /api/doc.go
parenta968ead74525125dff9ae90b1c9a9102e4327900 (diff)
initial commit
Signed-off-by: Rastislav Szabo <raszabo@cisco.com>
Diffstat (limited to 'api/doc.go')
-rw-r--r--api/doc.go94
1 files changed, 94 insertions, 0 deletions
diff --git a/api/doc.go b/api/doc.go
new file mode 100644
index 0000000..e1abffe
--- /dev/null
+++ b/api/doc.go
@@ -0,0 +1,94 @@
+// Package api provides API for communication with govpp core using Go channels,
+// without the need of importing the govpp core package itself.
+//
+// The API offers two ways of communication with govpp core: using Go channels, or using convenient function
+// wrappers over the Go channels. The latter should be sufficient for most of the use cases.
+//
+// The entry point to the API is the Channel structure, that can be obtained from the existing connection using
+// the NewAPIChannel or NewAPIChannelBuffered functions:
+//
+// conn, err := govpp.Connect()
+// if err != nil {
+// // handle error!
+// }
+// defer conn.Disconnect()
+//
+// ch, err := conn.NewAPIChannel()
+// if err != nil {
+// // handle error!
+// }
+// defer ch.Close()
+//
+//
+// Simple Request-Reply API
+//
+// The simple version of the API is based on blocking SendRequest / ReceiveReply calls, where a single request
+// message is sent to VPP and a single reply message is filled in when the reply comes from VPP:
+//
+// req := &acl.ACLPluginGetVersion{}
+// reply := &acl.ACLPluginGetVersionReply{}
+//
+// err := ch.SendRequest(req).ReceiveReply(reply)
+// // process the reply
+//
+// Note that if the reply message type that comes from VPP does not match with provided one, you'll get an error.
+//
+//
+// Multipart Reply API
+//
+// If multiple messages are expected as a reply to a request, SendMultiRequest API must be used:
+//
+// req := &interfaces.SwInterfaceDump{}
+// reqCtx := ch.SendMultiRequest(req)
+//
+// for {
+// reply := &interfaces.SwInterfaceDetails{}
+// stop, err := reqCtx.ReceiveReply(reply)
+// if stop {
+// break // break out of the loop
+// }
+// // process the reply
+// }
+//
+// Note that if the last reply has been already consumed, stop boolean return value is set to true.
+// Do not use the message itself if stop is true - it won't be filled with actual data.
+//
+//
+// Go Channels API
+//
+// The blocking API introduced above may be not sufficient for some management applications that strongly
+// rely on usage of Go channels. In this case, the API allows to access the underlying Go channels directly, e.g.
+// the following replacement of the SendRequest / ReceiveReply API:
+//
+// req := &acl.ACLPluginGetVersion{}
+// // send the request to the request go channel
+// ch.ReqChan <- &api.VppRequest{Message: req}
+//
+// // receive a reply from the reply go channel
+// vppReply := <-ch.ReplyChan
+//
+// // decode the message
+// reply := &acl.ACLPluginGetVersionReply{}
+// err := ch.MsgDecoder.DecodeMsg(vppReply.Data, reply)
+//
+// // process the reply
+//
+//
+// Notifications API
+//
+// to subscribe for receiving of the specified notification messages via provided Go channel, use the
+// SubscribeNotification API:
+//
+// // subscribe for specific notification message
+// notifChan := make(chan api.Message, 100)
+// subs, _ := ch.SubscribeNotification(notifChan, interfaces.NewSwInterfaceSetFlags)
+//
+// // receive one notification
+// notif := (<-notifChan).(*interfaces.SwInterfaceSetFlags)
+//
+// ch.UnsubscribeNotification(subs)
+//
+// Note that the caller is responsible for creating the Go channel with preferred buffer size. If the channel's
+// buffer is full, the notifications will not be delivered into it.
+//
+package api