diff options
author | Ondrej Fabry <ofabry@cisco.com> | 2020-06-25 11:55:58 +0200 |
---|---|---|
committer | Ondrej Fabry <ofabry@cisco.com> | 2020-06-25 11:55:58 +0200 |
commit | df67791c6ffc96331f75aec7d3addfe2efca7739 (patch) | |
tree | 8da8dbda17146df62064737a86f5b46aec049a4d /examples | |
parent | ceed73403bdb61387d04be8b47183e9c4a970749 (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.go | 2 | ||||
-rw-r--r-- | examples/binapi/mactime/mactime.ba.go | 684 | ||||
-rw-r--r-- | examples/binapi/mactime/mactime_rpc.ba.go | 74 | ||||
-rw-r--r-- | examples/perf-bench/perf-bench.go | 56 | ||||
-rw-r--r-- | examples/simple-client/simple_client.go | 49 |
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() } |