README
¶
GoVPP Mux
The govppmux
is a Core Agent Plugin which allows other plugins to access VPP
independently on each other by means of connection multiplexing.
Any plugin (core or external) that interacts with VPP can ask govppmux
to get its own, potentially customized, communication channel to running VPP instance.
Behind the scenes, all channels share the same connection created during the plugin
initialization using govpp core.
API
Connection
By default, GoVPP connects to that instance of VPP which uses the default shared memory segment prefix.
This is because it is assumed that there is only a single VPP running in a sand-boxed environment
together with the agent (e.g. through containerization). In case VPP runs with customized SHM prefix,
or there are several VPP instances running, GoVPP needs to know the prefix in order to connect to the
correct VPP instance - the prefix has to be put in the govppmux configuration file (govpp.conf) with
key shm-prefix
and value matching VPP shared memory prefix.
Multiplexing
NewAPIChannel
returns a new API channel for communication with VPP via govpp core.
It uses default buffer sizes for the request and reply Go channels (by default both are 100 messages long).
If it is expected that the VPP may get overloaded at peak loads, for example if the user plugin
sends configuration requests in bulks, then it is recommended to use NewAPIChannelBuffered
and increase the buffer size for requests appropriately. Similarly, NewAPIChannelBuffered
allows
to configure the size of the buffer for responses. This is also useful since the buffer for responses
is also used to carry VPP notifications and statistics which may temporarily rapidly grow in size
and frequency. By increasing the reply channel size, the probability of dropping messages from VPP
decreases at the cost of increased memory footprint.
Example
The following example shows how to dump VPP interfaces using a multi-response request:
// Create a new VPP channel with the default configuration.
plugin.vppCh, err = govppmux.NewAPIChannel()
if err != nil {
// Handle error condition...
}
// Close VPP channel.
defer safeclose.Close(plugin.vppCh)
req := &interfaces.SwInterfaceDump{}
reqCtx := plugin.vppCh.SendMultiRequest(req)
for {
msg := &interfaces.SwInterfaceDetails{}
stop, err := reqCtx.ReceiveReply(msg)
if err != nil {
// Handle error condition...
}
// Break out of the loop in case there are no more messages.
if stop {
break
}
log.Info("Found interface with sw_if_index=", msg.SwIfIndex)
// Process the message...
}
Configuration
The plugin allows to configure parameters of vpp health-check probe. The items that can be configured are:
- health check probe interval - time between health check probes
- health check reply timeout - if the reply doesn't arrive until timeout elapses probe is considered failed
- health check threshold - number of consequent failed health checks until an error is reported
- reply timeout - if the reply from channel doesn't arrive until timeout elapses, the request fails
- shm-prefix - used for connection to a VPP instance which is not using default shared memory prefix
Example govpp.conf:
health-check-probe-interval: 1000000000
health-check-reply-timeout: 100000000
health-check-threshold: 1
reply-timeout: 1000000000
shm-prefix: vpp1
Documentation
¶
Overview ¶
Package govppmux implements the GoVPPMux plugin that allows multiple plugins to share a single connection to VPP.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewVppAdapter ¶ added in v1.4.0
func NewVppAdapter(shmPrefix string) adapter.VppAdapter
NewVppAdapter returns real vpp api adapter, used for building with vppapiclient library.
Types ¶
type API ¶ added in v1.0.4
type API interface { // NewAPIChannel returns a new API channel for communication with VPP via govpp core. // It uses default buffer sizes for the request and reply Go channels. // // Example of binary API call from some plugin using GOVPP: // ch, _ := govpp_mux.NewAPIChannel() // ch.SendRequest(req).ReceiveReply NewAPIChannel() (*api.Channel, error) // NewAPIChannelBuffered returns a new API channel for communication with VPP via govpp core. // It allows to specify custom buffer sizes for the request and reply Go channels. // // Example of binary API call from some plugin using GOVPP: // ch, _ := govpp_mux.NewAPIChannelBuffered(100, 100) // ch.SendRequest(req).ReceiveReply NewAPIChannelBuffered(reqChanBufSize, replyChanBufSize int) (*api.Channel, error) }
API for other plugins to get connectivity to VPP.
type Config ¶ added in v1.0.5
type Config struct { HealthCheckProbeInterval time.Duration `json:"health-check-probe-interval"` HealthCheckReplyTimeout time.Duration `json:"health-check-reply-timeout"` HealthCheckThreshold int `json:"health-check-threshold"` ReplyTimeout time.Duration `json:"reply-timeout"` // The prefix prepended to the name used for shared memory (SHM) segments. If not set, // shared memory segments are created directly in the SHM directory /dev/shm. ShmPrefix string `json:"shm-prefix"` }
Config groups the configurable parameter of GoVpp.
type Deps ¶ added in v1.0.2
type Deps struct {
local.PluginInfraDeps // inject
}
Deps groups injected dependencies of plugin so that they do not mix with other plugin fields.
type GOVPPPlugin ¶
type GOVPPPlugin struct { Deps // Inject. // contains filtered or unexported fields }
GOVPPPlugin implements the govppmux plugin interface.
func FromExistingAdapter ¶
func FromExistingAdapter(vppAdapter adapter.VppAdapter) *GOVPPPlugin
FromExistingAdapter is used mainly for testing purposes.
func (*GOVPPPlugin) Close ¶
func (plugin *GOVPPPlugin) Close() error
Close cleans up the resources allocated by the govppmux plugin.
func (*GOVPPPlugin) Init ¶
func (plugin *GOVPPPlugin) Init() error
Init is the entry point called by Agent Core. A single binary-API connection to VPP is established.
func (*GOVPPPlugin) NewAPIChannel ¶
func (plugin *GOVPPPlugin) NewAPIChannel() (*api.Channel, error)
NewAPIChannel returns a new API channel for communication with VPP via govpp core. It uses default buffer sizes for the request and reply Go channels.
Example of binary API call from some plugin using GOVPP:
ch, _ := govpp_mux.NewAPIChannel() ch.SendRequest(req).ReceiveReply
func (*GOVPPPlugin) NewAPIChannelBuffered ¶
func (plugin *GOVPPPlugin) NewAPIChannelBuffered(reqChanBufSize, replyChanBufSize int) (*api.Channel, error)
NewAPIChannelBuffered returns a new API channel for communication with VPP via govpp core. It allows to specify custom buffer sizes for the request and reply Go channels.
Example of binary API call from some plugin using GOVPP:
ch, _ := govpp_mux.NewAPIChannelBuffered(100, 100) ch.SendRequest(req).ReceiveReply