summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorOndrej Fabry <ofabry@cisco.com>2020-06-25 11:55:58 +0200
committerOndrej Fabry <ofabry@cisco.com>2020-06-25 11:55:58 +0200
commitdf67791c6ffc96331f75aec7d3addfe2efca7739 (patch)
tree8da8dbda17146df62064737a86f5b46aec049a4d /examples
parentceed73403bdb61387d04be8b47183e9c4a970749 (diff)
Introduce Stream - experimental API for low-level access to VPP API
Change-Id: I2698e11b76ff55d9730b47d4fee990be93349516 Signed-off-by: Ondrej Fabry <ofabry@cisco.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/binapi/gen.go2
-rw-r--r--examples/binapi/mactime/mactime.ba.go684
-rw-r--r--examples/binapi/mactime/mactime_rpc.ba.go74
-rw-r--r--examples/perf-bench/perf-bench.go56
-rw-r--r--examples/simple-client/simple_client.go49
5 files changed, 860 insertions, 5 deletions
diff --git a/examples/binapi/gen.go b/examples/binapi/gen.go
index 7849d8d..46399f4 100644
--- a/examples/binapi/gen.go
+++ b/examples/binapi/gen.go
@@ -2,4 +2,4 @@ package binapi
// Generate Go code from the VPP APIs located in the /usr/share/vpp/api directory.
-//go:generate binapi-generator --import-types=false af_packet interface interface_types ip memclnt vpe sr acl memif ip_types fib_types
+//go:generate binapi-generator --import-types=false mactime af_packet interface interface_types ip memclnt vpe sr acl memif ip_types fib_types
diff --git a/examples/binapi/mactime/mactime.ba.go b/examples/binapi/mactime/mactime.ba.go
new file mode 100644
index 0000000..38a206e
--- /dev/null
+++ b/examples/binapi/mactime/mactime.ba.go
@@ -0,0 +1,684 @@
+// Code generated by GoVPP's binapi-generator. DO NOT EDIT.
+// versions:
+// binapi-generator: v0.4.0-dev
+// VPP: 20.05-release
+// source: /usr/share/vpp/api/plugins/mactime.api.json
+
+/*
+Package mactime contains generated code for VPP API file mactime.api (2.0.0).
+
+It consists of:
+ 2 aliases
+ 6 enums
+ 7 messages
+ 2 types
+*/
+package mactime
+
+import (
+ "bytes"
+ "context"
+ "encoding/binary"
+ "io"
+ "math"
+ "strconv"
+
+ api "git.fd.io/govpp.git/api"
+ codec "git.fd.io/govpp.git/codec"
+ struc "github.com/lunixbochs/struc"
+
+ interface_types "git.fd.io/govpp.git/examples/binapi/interface_types"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the GoVPP api package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// GoVPP api package needs to be updated.
+const _ = api.GoVppAPIPackageIsVersion2 // please upgrade the GoVPP api package
+
+const (
+ // ModuleName is the name of this module.
+ ModuleName = "mactime"
+ // APIVersion is the API version of this module.
+ APIVersion = "2.0.0"
+ // VersionCrc is the CRC of this module.
+ VersionCrc = 0x9283d3e
+)
+
+type IfStatusFlags = interface_types.IfStatusFlags
+
+type IfType = interface_types.IfType
+
+type LinkDuplex = interface_types.LinkDuplex
+
+type MtuProto = interface_types.MtuProto
+
+type RxMode = interface_types.RxMode
+
+type SubIfFlags = interface_types.SubIfFlags
+
+type InterfaceIndex = interface_types.InterfaceIndex
+
+// MacAddress represents VPP binary API alias 'mac_address'.
+type MacAddress [6]uint8
+
+// MactimeTimeRange represents VPP binary API type 'mactime_time_range'.
+type MactimeTimeRange struct {
+ Start float64 `binapi:"f64,name=start" json:"start,omitempty"`
+ End float64 `binapi:"f64,name=end" json:"end,omitempty"`
+}
+
+func (*MactimeTimeRange) GetTypeName() string { return "mactime_time_range" }
+
+// TimeRange represents VPP binary API type 'time_range'.
+type TimeRange struct {
+ Start float64 `binapi:"f64,name=start" json:"start,omitempty"`
+ End float64 `binapi:"f64,name=end" json:"end,omitempty"`
+}
+
+func (*TimeRange) GetTypeName() string { return "time_range" }
+
+// MactimeAddDelRange represents VPP binary API message 'mactime_add_del_range'.
+type MactimeAddDelRange struct {
+ IsAdd bool `binapi:"bool,name=is_add" json:"is_add,omitempty"`
+ Drop bool `binapi:"bool,name=drop" json:"drop,omitempty"`
+ Allow bool `binapi:"bool,name=allow" json:"allow,omitempty"`
+ AllowQuota uint8 `binapi:"u8,name=allow_quota" json:"allow_quota,omitempty"`
+ NoUDP10001 bool `binapi:"bool,name=no_udp_10001" json:"no_udp_10001,omitempty"`
+ DataQuota uint64 `binapi:"u64,name=data_quota" json:"data_quota,omitempty"`
+ MacAddress MacAddress `binapi:"mac_address,name=mac_address" json:"mac_address,omitempty"`
+ DeviceName string `binapi:"string[64],name=device_name" json:"device_name,omitempty" struc:"[64]byte"`
+ Count uint32 `binapi:"u32,name=count" json:"count,omitempty" struc:"sizeof=Ranges"`
+ Ranges []TimeRange `binapi:"time_range[count],name=ranges" json:"ranges,omitempty"`
+}
+
+func (m *MactimeAddDelRange) Reset() { *m = MactimeAddDelRange{} }
+func (*MactimeAddDelRange) GetMessageName() string { return "mactime_add_del_range" }
+func (*MactimeAddDelRange) GetCrcString() string { return "101858ef" }
+func (*MactimeAddDelRange) GetMessageType() api.MessageType { return api.RequestMessage }
+
+func (m *MactimeAddDelRange) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.IsAdd
+ size += 1
+ // field[1] m.Drop
+ size += 1
+ // field[1] m.Allow
+ size += 1
+ // field[1] m.AllowQuota
+ size += 1
+ // field[1] m.NoUDP10001
+ size += 1
+ // field[1] m.DataQuota
+ size += 8
+ // field[1] m.MacAddress
+ size += 6
+ // field[1] m.DeviceName
+ size += 64
+ // field[1] m.Count
+ size += 4
+ // field[1] m.Ranges
+ for j1 := 0; j1 < len(m.Ranges); j1++ {
+ var s1 TimeRange
+ _ = s1
+ if j1 < len(m.Ranges) {
+ s1 = m.Ranges[j1]
+ }
+ // field[2] s1.Start
+ size += 8
+ // field[2] s1.End
+ size += 8
+ }
+ return size
+}
+func (m *MactimeAddDelRange) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.IsAdd
+ if m.IsAdd {
+ buf[pos] = 1
+ }
+ pos += 1
+ // field[1] m.Drop
+ if m.Drop {
+ buf[pos] = 1
+ }
+ pos += 1
+ // field[1] m.Allow
+ if m.Allow {
+ buf[pos] = 1
+ }
+ pos += 1
+ // field[1] m.AllowQuota
+ buf[pos] = uint8(m.AllowQuota)
+ pos += 1
+ // field[1] m.NoUDP10001
+ if m.NoUDP10001 {
+ buf[pos] = 1
+ }
+ pos += 1
+ // field[1] m.DataQuota
+ o.PutUint64(buf[pos:pos+8], uint64(m.DataQuota))
+ pos += 8
+ // field[1] m.MacAddress
+ for i := 0; i < 6; i++ {
+ var x uint8
+ if i < len(m.MacAddress) {
+ x = uint8(m.MacAddress[i])
+ }
+ buf[pos] = uint8(x)
+ pos += 1
+ }
+ // field[1] m.DeviceName
+ copy(buf[pos:pos+64], m.DeviceName)
+ pos += 64
+ // field[1] m.Count
+ o.PutUint32(buf[pos:pos+4], uint32(len(m.Ranges)))
+ pos += 4
+ // field[1] m.Ranges
+ for j1 := 0; j1 < len(m.Ranges); j1++ {
+ var v1 TimeRange
+ if j1 < len(m.Ranges) {
+ v1 = m.Ranges[j1]
+ }
+ // field[2] v1.Start
+ o.PutUint64(buf[pos:pos+8], math.Float64bits(float64(v1.Start)))
+ pos += 8
+ // field[2] v1.End
+ o.PutUint64(buf[pos:pos+8], math.Float64bits(float64(v1.End)))
+ pos += 8
+ }
+ return buf, nil
+}
+func (m *MactimeAddDelRange) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.IsAdd
+ m.IsAdd = tmp[pos] != 0
+ pos += 1
+ // field[1] m.Drop
+ m.Drop = tmp[pos] != 0
+ pos += 1
+ // field[1] m.Allow
+ m.Allow = tmp[pos] != 0
+ pos += 1
+ // field[1] m.AllowQuota
+ m.AllowQuota = uint8(tmp[pos])
+ pos += 1
+ // field[1] m.NoUDP10001
+ m.NoUDP10001 = tmp[pos] != 0
+ pos += 1
+ // field[1] m.DataQuota
+ m.DataQuota = uint64(o.Uint64(tmp[pos : pos+8]))
+ pos += 8
+ // field[1] m.MacAddress
+ for i := 0; i < len(m.MacAddress); i++ {
+ m.MacAddress[i] = uint8(tmp[pos])
+ pos += 1
+ }
+ // field[1] m.DeviceName
+ {
+ nul := bytes.Index(tmp[pos:pos+64], []byte{0x00})
+ m.DeviceName = codec.DecodeString(tmp[pos : pos+nul])
+ pos += 64
+ }
+ // field[1] m.Count
+ m.Count = uint32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ // field[1] m.Ranges
+ m.Ranges = make([]TimeRange, int(m.Count))
+ for j1 := 0; j1 < int(m.Count); j1++ {
+ // field[2] m.Ranges[j1].Start
+ m.Ranges[j1].Start = float64(math.Float64frombits(o.Uint64(tmp[pos : pos+8])))
+ pos += 8
+ // field[2] m.Ranges[j1].End
+ m.Ranges[j1].End = float64(math.Float64frombits(o.Uint64(tmp[pos : pos+8])))
+ pos += 8
+ }
+ return nil
+}
+
+// MactimeAddDelRangeReply represents VPP binary API message 'mactime_add_del_range_reply'.
+type MactimeAddDelRangeReply struct {
+ Retval int32 `binapi:"i32,name=retval" json:"retval,omitempty"`
+}
+
+func (m *MactimeAddDelRangeReply) Reset() { *m = MactimeAddDelRangeReply{} }
+func (*MactimeAddDelRangeReply) GetMessageName() string { return "mactime_add_del_range_reply" }
+func (*MactimeAddDelRangeReply) GetCrcString() string { return "e8d4e804" }
+func (*MactimeAddDelRangeReply) GetMessageType() api.MessageType { return api.ReplyMessage }
+
+func (m *MactimeAddDelRangeReply) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.Retval
+ size += 4
+ return size
+}
+func (m *MactimeAddDelRangeReply) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.Retval
+ o.PutUint32(buf[pos:pos+4], uint32(m.Retval))
+ pos += 4
+ return buf, nil
+}
+func (m *MactimeAddDelRangeReply) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.Retval
+ m.Retval = int32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ return nil
+}
+
+// MactimeDetails represents VPP binary API message 'mactime_details'.
+type MactimeDetails struct {
+ PoolIndex uint32 `binapi:"u32,name=pool_index" json:"pool_index,omitempty"`
+ MacAddress MacAddress `binapi:"mac_address,name=mac_address" json:"mac_address,omitempty"`
+ DataQuota uint64 `binapi:"u64,name=data_quota" json:"data_quota,omitempty"`
+ DataUsedInRange uint64 `binapi:"u64,name=data_used_in_range" json:"data_used_in_range,omitempty"`
+ Flags uint32 `binapi:"u32,name=flags" json:"flags,omitempty"`
+ DeviceName string `binapi:"string[64],name=device_name" json:"device_name,omitempty" struc:"[64]byte"`
+ Nranges uint32 `binapi:"u32,name=nranges" json:"nranges,omitempty" struc:"sizeof=Ranges"`
+ Ranges []MactimeTimeRange `binapi:"mactime_time_range[nranges],name=ranges" json:"ranges,omitempty"`
+}
+
+func (m *MactimeDetails) Reset() { *m = MactimeDetails{} }
+func (*MactimeDetails) GetMessageName() string { return "mactime_details" }
+func (*MactimeDetails) GetCrcString() string { return "44921c06" }
+func (*MactimeDetails) GetMessageType() api.MessageType { return api.ReplyMessage }
+
+func (m *MactimeDetails) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.PoolIndex
+ size += 4
+ // field[1] m.MacAddress
+ size += 6
+ // field[1] m.DataQuota
+ size += 8
+ // field[1] m.DataUsedInRange
+ size += 8
+ // field[1] m.Flags
+ size += 4
+ // field[1] m.DeviceName
+ size += 64
+ // field[1] m.Nranges
+ size += 4
+ // field[1] m.Ranges
+ for j1 := 0; j1 < len(m.Ranges); j1++ {
+ var s1 MactimeTimeRange
+ _ = s1
+ if j1 < len(m.Ranges) {
+ s1 = m.Ranges[j1]
+ }
+ // field[2] s1.Start
+ size += 8
+ // field[2] s1.End
+ size += 8
+ }
+ return size
+}
+func (m *MactimeDetails) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.PoolIndex
+ o.PutUint32(buf[pos:pos+4], uint32(m.PoolIndex))
+ pos += 4
+ // field[1] m.MacAddress
+ for i := 0; i < 6; i++ {
+ var x uint8
+ if i < len(m.MacAddress) {
+ x = uint8(m.MacAddress[i])
+ }
+ buf[pos] = uint8(x)
+ pos += 1
+ }
+ // field[1] m.DataQuota
+ o.PutUint64(buf[pos:pos+8], uint64(m.DataQuota))
+ pos += 8
+ // field[1] m.DataUsedInRange
+ o.PutUint64(buf[pos:pos+8], uint64(m.DataUsedInRange))
+ pos += 8
+ // field[1] m.Flags
+ o.PutUint32(buf[pos:pos+4], uint32(m.Flags))
+ pos += 4
+ // field[1] m.DeviceName
+ copy(buf[pos:pos+64], m.DeviceName)
+ pos += 64
+ // field[1] m.Nranges
+ o.PutUint32(buf[pos:pos+4], uint32(len(m.Ranges)))
+ pos += 4
+ // field[1] m.Ranges
+ for j1 := 0; j1 < len(m.Ranges); j1++ {
+ var v1 MactimeTimeRange
+ if j1 < len(m.Ranges) {
+ v1 = m.Ranges[j1]
+ }
+ // field[2] v1.Start
+ o.PutUint64(buf[pos:pos+8], math.Float64bits(float64(v1.Start)))
+ pos += 8
+ // field[2] v1.End
+ o.PutUint64(buf[pos:pos+8], math.Float64bits(float64(v1.End)))
+ pos += 8
+ }
+ return buf, nil
+}
+func (m *MactimeDetails) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.PoolIndex
+ m.PoolIndex = uint32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ // field[1] m.MacAddress
+ for i := 0; i < len(m.MacAddress); i++ {
+ m.MacAddress[i] = uint8(tmp[pos])
+ pos += 1
+ }
+ // field[1] m.DataQuota
+ m.DataQuota = uint64(o.Uint64(tmp[pos : pos+8]))
+ pos += 8
+ // field[1] m.DataUsedInRange
+ m.DataUsedInRange = uint64(o.Uint64(tmp[pos : pos+8]))
+ pos += 8
+ // field[1] m.Flags
+ m.Flags = uint32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ // field[1] m.DeviceName
+ {
+ nul := bytes.Index(tmp[pos:pos+64], []byte{0x00})
+ m.DeviceName = codec.DecodeString(tmp[pos : pos+nul])
+ pos += 64
+ }
+ // field[1] m.Nranges
+ m.Nranges = uint32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ // field[1] m.Ranges
+ m.Ranges = make([]MactimeTimeRange, int(m.Nranges))
+ for j1 := 0; j1 < int(m.Nranges); j1++ {
+ // field[2] m.Ranges[j1].Start
+ m.Ranges[j1].Start = float64(math.Float64frombits(o.Uint64(tmp[pos : pos+8])))
+ pos += 8
+ // field[2] m.Ranges[j1].End
+ m.Ranges[j1].End = float64(math.Float64frombits(o.Uint64(tmp[pos : pos+8])))
+ pos += 8
+ }
+ return nil
+}
+
+// MactimeDump represents VPP binary API message 'mactime_dump'.
+type MactimeDump struct {
+ MyTableEpoch uint32 `binapi:"u32,name=my_table_epoch" json:"my_table_epoch,omitempty"`
+}
+
+func (m *MactimeDump) Reset() { *m = MactimeDump{} }
+func (*MactimeDump) GetMessageName() string { return "mactime_dump" }
+func (*MactimeDump) GetCrcString() string { return "8f454e23" }
+func (*MactimeDump) GetMessageType() api.MessageType { return api.RequestMessage }
+
+func (m *MactimeDump) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.MyTableEpoch
+ size += 4
+ return size
+}
+func (m *MactimeDump) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.MyTableEpoch
+ o.PutUint32(buf[pos:pos+4], uint32(m.MyTableEpoch))
+ pos += 4
+ return buf, nil
+}
+func (m *MactimeDump) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.MyTableEpoch
+ m.MyTableEpoch = uint32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ return nil
+}
+
+// MactimeDumpReply represents VPP binary API message 'mactime_dump_reply'.
+type MactimeDumpReply struct {
+ Retval int32 `binapi:"i32,name=retval" json:"retval,omitempty"`
+ TableEpoch uint32 `binapi:"u32,name=table_epoch" json:"table_epoch,omitempty"`
+}
+
+func (m *MactimeDumpReply) Reset() { *m = MactimeDumpReply{} }
+func (*MactimeDumpReply) GetMessageName() string { return "mactime_dump_reply" }
+func (*MactimeDumpReply) GetCrcString() string { return "49bcc753" }
+func (*MactimeDumpReply) GetMessageType() api.MessageType { return api.ReplyMessage }
+
+func (m *MactimeDumpReply) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.Retval
+ size += 4
+ // field[1] m.TableEpoch
+ size += 4
+ return size
+}
+func (m *MactimeDumpReply) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.Retval
+ o.PutUint32(buf[pos:pos+4], uint32(m.Retval))
+ pos += 4
+ // field[1] m.TableEpoch
+ o.PutUint32(buf[pos:pos+4], uint32(m.TableEpoch))
+ pos += 4
+ return buf, nil
+}
+func (m *MactimeDumpReply) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.Retval
+ m.Retval = int32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ // field[1] m.TableEpoch
+ m.TableEpoch = uint32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ return nil
+}
+
+// MactimeEnableDisable represents VPP binary API message 'mactime_enable_disable'.
+type MactimeEnableDisable struct {
+ EnableDisable bool `binapi:"bool,name=enable_disable" json:"enable_disable,omitempty"`
+ SwIfIndex InterfaceIndex `binapi:"interface_index,name=sw_if_index" json:"sw_if_index,omitempty"`
+}
+
+func (m *MactimeEnableDisable) Reset() { *m = MactimeEnableDisable{} }
+func (*MactimeEnableDisable) GetMessageName() string { return "mactime_enable_disable" }
+func (*MactimeEnableDisable) GetCrcString() string { return "3865946c" }
+func (*MactimeEnableDisable) GetMessageType() api.MessageType { return api.RequestMessage }
+
+func (m *MactimeEnableDisable) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.EnableDisable
+ size += 1
+ // field[1] m.SwIfIndex
+ size += 4
+ return size
+}
+func (m *MactimeEnableDisable) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.EnableDisable
+ if m.EnableDisable {
+ buf[pos] = 1
+ }
+ pos += 1
+ // field[1] m.SwIfIndex
+ o.PutUint32(buf[pos:pos+4], uint32(m.SwIfIndex))
+ pos += 4
+ return buf, nil
+}
+func (m *MactimeEnableDisable) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.EnableDisable
+ m.EnableDisable = tmp[pos] != 0
+ pos += 1
+ // field[1] m.SwIfIndex
+ m.SwIfIndex = InterfaceIndex(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ return nil
+}
+
+// MactimeEnableDisableReply represents VPP binary API message 'mactime_enable_disable_reply'.
+type MactimeEnableDisableReply struct {
+ Retval int32 `binapi:"i32,name=retval" json:"retval,omitempty"`
+}
+
+func (m *MactimeEnableDisableReply) Reset() { *m = MactimeEnableDisableReply{} }
+func (*MactimeEnableDisableReply) GetMessageName() string { return "mactime_enable_disable_reply" }
+func (*MactimeEnableDisableReply) GetCrcString() string { return "e8d4e804" }
+func (*MactimeEnableDisableReply) GetMessageType() api.MessageType { return api.ReplyMessage }
+
+func (m *MactimeEnableDisableReply) Size() int {
+ if m == nil {
+ return 0
+ }
+ var size int
+ // field[1] m.Retval
+ size += 4
+ return size
+}
+func (m *MactimeEnableDisableReply) Marshal(b []byte) ([]byte, error) {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ var buf []byte
+ if b == nil {
+ buf = make([]byte, m.Size())
+ } else {
+ buf = b
+ }
+ // field[1] m.Retval
+ o.PutUint32(buf[pos:pos+4], uint32(m.Retval))
+ pos += 4
+ return buf, nil
+}
+func (m *MactimeEnableDisableReply) Unmarshal(tmp []byte) error {
+ o := binary.BigEndian
+ _ = o
+ pos := 0
+ _ = pos
+ // field[1] m.Retval
+ m.Retval = int32(o.Uint32(tmp[pos : pos+4]))
+ pos += 4
+ return nil
+}
+
+func init() { file_mactime_binapi_init() }
+func file_mactime_binapi_init() {
+ api.RegisterMessage((*MactimeAddDelRange)(nil), "mactime.MactimeAddDelRange")
+ api.RegisterMessage((*MactimeAddDelRangeReply)(nil), "mactime.MactimeAddDelRangeReply")
+ api.RegisterMessage((*MactimeDetails)(nil), "mactime.MactimeDetails")
+ api.RegisterMessage((*MactimeDump)(nil), "mactime.MactimeDump")
+ api.RegisterMessage((*MactimeDumpReply)(nil), "mactime.MactimeDumpReply")
+ api.RegisterMessage((*MactimeEnableDisable)(nil), "mactime.MactimeEnableDisable")
+ api.RegisterMessage((*MactimeEnableDisableReply)(nil), "mactime.MactimeEnableDisableReply")
+}
+
+// Messages returns list of all messages in this module.
+func AllMessages() []api.Message {
+ return []api.Message{
+ (*MactimeAddDelRange)(nil),
+ (*MactimeAddDelRangeReply)(nil),
+ (*MactimeDetails)(nil),
+ (*MactimeDump)(nil),
+ (*MactimeDumpReply)(nil),
+ (*MactimeEnableDisable)(nil),
+ (*MactimeEnableDisableReply)(nil),
+ }
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = api.RegisterMessage
+var _ = codec.DecodeString
+var _ = bytes.NewBuffer
+var _ = context.Background
+var _ = io.Copy
+var _ = strconv.Itoa
+var _ = struc.Pack
+var _ = binary.BigEndian
+var _ = math.Float32bits
diff --git a/examples/binapi/mactime/mactime_rpc.ba.go b/examples/binapi/mactime/mactime_rpc.ba.go
new file mode 100644
index 0000000..c35b708
--- /dev/null
+++ b/examples/binapi/mactime/mactime_rpc.ba.go
@@ -0,0 +1,74 @@
+// Code generated by GoVPP's binapi-generator. DO NOT EDIT.
+
+package mactime
+
+import (
+ "context"
+ "io"
+
+ api "git.fd.io/govpp.git/api"
+)
+
+// RPCService represents RPC service API for mactime module.
+type RPCService interface {
+ DumpMactime(ctx context.Context, in *MactimeDump) (RPCService_DumpMactimeClient, error)
+ MactimeAddDelRange(ctx context.Context, in *MactimeAddDelRange) (*MactimeAddDelRangeReply, error)
+ MactimeEnableDisable(ctx context.Context, in *MactimeEnableDisable) (*MactimeEnableDisableReply, error)
+}
+
+type serviceClient struct {
+ ch api.Channel
+}
+
+func NewServiceClient(ch api.Channel) RPCService {
+ return &serviceClient{ch}
+}
+
+func (c *serviceClient) DumpMactime(ctx context.Context, in *MactimeDump) (RPCService_DumpMactimeClient, error) {
+ stream := c.ch.SendMultiRequest(in)
+ x := &serviceClient_DumpMactimeClient{stream}
+ return x, nil
+}
+
+type RPCService_DumpMactimeClient interface {
+ Recv() (*MactimeDetails, error)
+}
+
+type serviceClient_DumpMactimeClient struct {
+ api.MultiRequestCtx
+}
+
+func (c *serviceClient_DumpMactimeClient) Recv() (*MactimeDetails, error) {
+ m := new(MactimeDetails)
+ stop, err := c.MultiRequestCtx.ReceiveReply(m)
+ if err != nil {
+ return nil, err
+ }
+ if stop {
+ return nil, io.EOF
+ }
+ return m, nil
+}
+
+func (c *serviceClient) MactimeAddDelRange(ctx context.Context, in *MactimeAddDelRange) (*MactimeAddDelRangeReply, error) {
+ out := new(MactimeAddDelRangeReply)
+ err := c.ch.SendRequest(in).ReceiveReply(out)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *serviceClient) MactimeEnableDisable(ctx context.Context, in *MactimeEnableDisable) (*MactimeEnableDisableReply, error) {
+ out := new(MactimeEnableDisableReply)
+ err := c.ch.SendRequest(in).ReceiveReply(out)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = api.RegisterMessage
+var _ = context.Background
+var _ = io.Copy
diff --git a/examples/perf-bench/perf-bench.go b/examples/perf-bench/perf-bench.go
index 81d183c..a7ec146 100644
--- a/examples/perf-bench/perf-bench.go
+++ b/examples/perf-bench/perf-bench.go
@@ -17,6 +17,7 @@
package main
import (
+ "context"
"flag"
"fmt"
"log"
@@ -98,9 +99,11 @@ func main() {
if sync {
// run synchronous test
syncTest(ch, cnt)
+ //syncTest2(conn, cnt)
} else {
// run asynchronous test
asyncTest(ch, cnt)
+ //asyncTest2(conn, cnt)
}
elapsed := time.Since(start)
@@ -123,6 +126,27 @@ func syncTest(ch api.Channel, cnt int) {
}
}
+func syncTest2(conn api.Connection, cnt int) {
+ fmt.Printf("Running synchronous perf test with %d requests...\n", cnt)
+
+ stream, err := conn.NewStream(context.Background())
+ if err != nil {
+ log.Fatalln("Error NewStream:", err)
+ }
+ for i := 0; i < cnt; i++ {
+ if err := stream.SendMsg(&vpe.ControlPing{}); err != nil {
+ log.Fatalln("Error SendMsg:", err)
+ }
+ if msg, err := stream.RecvMsg(); err != nil {
+ log.Fatalln("Error RecvMsg:", err)
+ } else if _, ok := msg.(*vpe.ControlPingReply); ok {
+ // ok
+ } else {
+ log.Fatalf("unexpected reply: %v", msg.GetMessageName())
+ }
+ }
+}
+
func asyncTest(ch api.Channel, cnt int) {
fmt.Printf("Running asynchronous perf test with %d requests...\n", cnt)
@@ -143,3 +167,35 @@ func asyncTest(ch api.Channel, cnt int) {
}
}
}
+
+func asyncTest2(conn api.Connection, cnt int) {
+ fmt.Printf("Running asynchronous perf test with %d requests...\n", cnt)
+
+ ctxChan := make(chan api.Stream, cnt)
+
+ go func() {
+ for i := 0; i < cnt; i++ {
+ stream, err := conn.NewStream(context.Background())
+ if err != nil {
+ log.Fatalln("Error NewStream:", err)
+ }
+ if err := stream.SendMsg(&vpe.ControlPing{}); err != nil {
+ log.Fatalln("Error SendMsg:", err)
+ }
+ ctxChan <- stream
+ }
+ close(ctxChan)
+ fmt.Printf("Sending asynchronous requests finished\n")
+ }()
+
+ for ctx := range ctxChan {
+ if msg, err := ctx.RecvMsg(); err != nil {
+ log.Fatalln("Error RecvMsg:", err)
+ } else if _, ok := msg.(*vpe.ControlPingReply); ok {
+ // ok
+ } else {
+ log.Fatalf("unexpected reply: %v", msg.GetMessageName())
+ }
+ ctx.Close()
+ }
+}
diff --git a/examples/simple-client/simple_client.go b/examples/simple-client/simple_client.go
index 096c222..803b2e1 100644
--- a/examples/simple-client/simple_client.go
+++ b/examples/simple-client/simple_client.go
@@ -17,11 +17,11 @@
package main
import (
+ "context"
"flag"
"fmt"
"log"
"os"
- "strings"
"git.fd.io/govpp.git"
"git.fd.io/govpp.git/adapter/socketclient"
@@ -31,6 +31,7 @@ import (
"git.fd.io/govpp.git/examples/binapi/interfaces"
"git.fd.io/govpp.git/examples/binapi/ip"
"git.fd.io/govpp.git/examples/binapi/ip_types"
+ "git.fd.io/govpp.git/examples/binapi/mactime"
"git.fd.io/govpp.git/examples/binapi/vpe"
)
@@ -82,6 +83,8 @@ func main() {
ipAddressDump(ch, idx)
interfaceNotifications(ch, idx)
+ mactimeDump(conn)
+
if len(Errors) > 0 {
fmt.Printf("finished with %d errors\n", len(Errors))
os.Exit(1)
@@ -110,7 +113,7 @@ func vppVersion(ch api.Channel) {
}
fmt.Printf("reply: %+v\n", reply)
- fmt.Printf("VPP version: %q\n", cleanString(reply.Version))
+ fmt.Printf("VPP version: %q\n", reply.Version)
fmt.Println("OK")
fmt.Println()
}
@@ -282,6 +285,44 @@ func interfaceNotifications(ch api.Channel, index interfaces.InterfaceIndex) {
fmt.Println()
}
-func cleanString(str string) string {
- return strings.Split(str, "\x00")[0]
+func mactimeDump(conn api.Connection) {
+ fmt.Println("Sending mactime dump")
+
+ ctx := context.Background()
+
+ stream, err := conn.NewStream(ctx)
+ if err != nil {
+ panic(err)
+ }
+ defer stream.Close()
+
+ if err := stream.SendMsg(&mactime.MactimeDump{}); err != nil {
+ logError(err, "sending mactime dump")
+ return
+ }
+
+Loop:
+ for {
+ msg, err := stream.RecvMsg()
+ if err != nil {
+ logError(err, "dumping mactime")
+ return
+ }
+
+ switch msg.(type) {
+ case *mactime.MactimeDetails:
+ fmt.Printf(" - MactimeDetails: %+v\n", msg)
+
+ case *mactime.MactimeDumpReply:
+ fmt.Printf(" - MactimeDumpReply: %+v\n", msg)
+ break Loop
+
+ default:
+ logError(err, "unexpected message")
+ return
+ }
+ }
+
+ fmt.Println("OK")
+ fmt.Println()
}