diff --git a/go/hardwareinventory/msg.pb.go b/go/hardwareinventory/msg.pb.go
new file mode 100644
index 00000000..e2984bde
--- /dev/null
+++ b/go/hardwareinventory/msg.pb.go
@@ -0,0 +1,619 @@
+// Copyright(c) 2025 Zededa, Inc.
+// SPDX-License-Identifier: Apache-2.0
+
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.31.0
+// protoc v4.23.4
+// source: hardwareinventory/msg.proto
+
+package hardwareinventory
+
+import (
+ protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+ protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+ reflect "reflect"
+ sync "sync"
+)
+
+const (
+ // Verify that this generated code is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+ // Verify that runtime/protoimpl is sufficiently up-to-date.
+ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type USBBusDevnum struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/usb.h#L451
+ Bus int64 `protobuf:"varint,1,opt,name=bus,proto3" json:"bus,omitempty"`
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/usb.h#L657
+ Devnum int64 `protobuf:"varint,2,opt,name=devnum,proto3" json:"devnum,omitempty"`
+}
+
+func (x *USBBusDevnum) Reset() {
+ *x = USBBusDevnum{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *USBBusDevnum) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*USBBusDevnum) ProtoMessage() {}
+
+func (x *USBBusDevnum) ProtoReflect() protoreflect.Message {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[0]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use USBBusDevnum.ProtoReflect.Descriptor instead.
+func (*USBBusDevnum) Descriptor() ([]byte, []int) {
+ return file_hardwareinventory_msg_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *USBBusDevnum) GetBus() int64 {
+ if x != nil {
+ return x.Bus
+ }
+ return 0
+}
+
+func (x *USBBusDevnum) GetDevnum() int64 {
+ if x != nil {
+ return x.Devnum
+ }
+ return 0
+}
+
+type USBDevice struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ PciParent *PCIAddress `protobuf:"bytes,1,opt,name=pci_parent,json=pciParent,proto3,oneof" json:"pci_parent,omitempty"`
+ UsbParent *USBBusDevnum `protobuf:"bytes,2,opt,name=usb_parent,json=usbParent,proto3,oneof" json:"usb_parent,omitempty"`
+ // these are uint16, protobuf only supports from uint32
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/usb.h#L984
+ VendorId uint32 `protobuf:"varint,3,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
+ ProductId uint32 `protobuf:"varint,4,opt,name=product_id,json=productId,proto3" json:"product_id,omitempty"`
+ BusDevnum *USBBusDevnum `protobuf:"bytes,5,opt,name=bus_devnum,json=busDevnum,proto3" json:"bus_devnum,omitempty"`
+}
+
+func (x *USBDevice) Reset() {
+ *x = USBDevice{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *USBDevice) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*USBDevice) ProtoMessage() {}
+
+func (x *USBDevice) ProtoReflect() protoreflect.Message {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[1]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use USBDevice.ProtoReflect.Descriptor instead.
+func (*USBDevice) Descriptor() ([]byte, []int) {
+ return file_hardwareinventory_msg_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *USBDevice) GetPciParent() *PCIAddress {
+ if x != nil {
+ return x.PciParent
+ }
+ return nil
+}
+
+func (x *USBDevice) GetUsbParent() *USBBusDevnum {
+ if x != nil {
+ return x.UsbParent
+ }
+ return nil
+}
+
+func (x *USBDevice) GetVendorId() uint32 {
+ if x != nil {
+ return x.VendorId
+ }
+ return 0
+}
+
+func (x *USBDevice) GetProductId() uint32 {
+ if x != nil {
+ return x.ProductId
+ }
+ return 0
+}
+
+func (x *USBDevice) GetBusDevnum() *USBBusDevnum {
+ if x != nil {
+ return x.BusDevnum
+ }
+ return nil
+}
+
+type PCIAddress struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ // https://github.com/lyonel/lshw/blob/master/src/core/pci.cc#L224
+ Bus uint32 `protobuf:"varint,1,opt,name=bus,proto3" json:"bus,omitempty"`
+ Device uint32 `protobuf:"varint,2,opt,name=device,proto3" json:"device,omitempty"`
+ Function uint32 `protobuf:"varint,3,opt,name=function,proto3" json:"function,omitempty"`
+}
+
+func (x *PCIAddress) Reset() {
+ *x = PCIAddress{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[2]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PCIAddress) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PCIAddress) ProtoMessage() {}
+
+func (x *PCIAddress) ProtoReflect() protoreflect.Message {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[2]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PCIAddress.ProtoReflect.Descriptor instead.
+func (*PCIAddress) Descriptor() ([]byte, []int) {
+ return file_hardwareinventory_msg_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *PCIAddress) GetBus() uint32 {
+ if x != nil {
+ return x.Bus
+ }
+ return 0
+}
+
+func (x *PCIAddress) GetDevice() uint32 {
+ if x != nil {
+ return x.Device
+ }
+ return 0
+}
+
+func (x *PCIAddress) GetFunction() uint32 {
+ if x != nil {
+ return x.Function
+ }
+ return 0
+}
+
+type PCIDevice struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ ParentPciDeviceAddress *string `protobuf:"bytes,1,opt,name=parent_pci_device_address,json=parentPciDeviceAddress,proto3,oneof" json:"parent_pci_device_address,omitempty"`
+ Driver string `protobuf:"bytes,2,opt,name=driver,proto3" json:"driver,omitempty"`
+ Address *PCIAddress `protobuf:"bytes,3,opt,name=address,proto3" json:"address,omitempty"`
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/pci.h#L347
+ VendorId uint32 `protobuf:"varint,4,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
+ DeviceId uint32 `protobuf:"varint,5,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
+ Revision uint32 `protobuf:"varint,6,opt,name=revision,proto3" json:"revision,omitempty"`
+ SubsystemId uint32 `protobuf:"varint,7,opt,name=subsystem_id,json=subsystemId,proto3" json:"subsystem_id,omitempty"`
+ ClassId uint64 `protobuf:"varint,8,opt,name=class_id,json=classId,proto3" json:"class_id,omitempty"`
+ SubclassId uint64 `protobuf:"varint,9,opt,name=subclass_id,json=subclassId,proto3" json:"subclass_id,omitempty"`
+ // IOMMU group names apparently are strings: https://elixir.bootlin.com/linux/v6.16.9/source/drivers/iommu/iommu.c#L1101
+ IommuGroup string `protobuf:"bytes,10,opt,name=iommu_group,json=iommuGroup,proto3" json:"iommu_group,omitempty"`
+}
+
+func (x *PCIDevice) Reset() {
+ *x = PCIDevice{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[3]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *PCIDevice) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PCIDevice) ProtoMessage() {}
+
+func (x *PCIDevice) ProtoReflect() protoreflect.Message {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[3]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use PCIDevice.ProtoReflect.Descriptor instead.
+func (*PCIDevice) Descriptor() ([]byte, []int) {
+ return file_hardwareinventory_msg_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *PCIDevice) GetParentPciDeviceAddress() string {
+ if x != nil && x.ParentPciDeviceAddress != nil {
+ return *x.ParentPciDeviceAddress
+ }
+ return ""
+}
+
+func (x *PCIDevice) GetDriver() string {
+ if x != nil {
+ return x.Driver
+ }
+ return ""
+}
+
+func (x *PCIDevice) GetAddress() *PCIAddress {
+ if x != nil {
+ return x.Address
+ }
+ return nil
+}
+
+func (x *PCIDevice) GetVendorId() uint32 {
+ if x != nil {
+ return x.VendorId
+ }
+ return 0
+}
+
+func (x *PCIDevice) GetDeviceId() uint32 {
+ if x != nil {
+ return x.DeviceId
+ }
+ return 0
+}
+
+func (x *PCIDevice) GetRevision() uint32 {
+ if x != nil {
+ return x.Revision
+ }
+ return 0
+}
+
+func (x *PCIDevice) GetSubsystemId() uint32 {
+ if x != nil {
+ return x.SubsystemId
+ }
+ return 0
+}
+
+func (x *PCIDevice) GetClassId() uint64 {
+ if x != nil {
+ return x.ClassId
+ }
+ return 0
+}
+
+func (x *PCIDevice) GetSubclassId() uint64 {
+ if x != nil {
+ return x.SubclassId
+ }
+ return 0
+}
+
+func (x *PCIDevice) GetIommuGroup() string {
+ if x != nil {
+ return x.IommuGroup
+ }
+ return ""
+}
+
+// this message is POSTed to /inventory/{serial}/{softserial}
+type InventoryMsg struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ EveVersion string `protobuf:"bytes,1,opt,name=eve_version,json=eveVersion,proto3" json:"eve_version,omitempty"`
+ PciDevices []*PCIDevice `protobuf:"bytes,2,rep,name=pci_devices,json=pciDevices,proto3" json:"pci_devices,omitempty"`
+ UsbDevices []*USBDevice `protobuf:"bytes,3,rep,name=usb_devices,json=usbDevices,proto3" json:"usb_devices,omitempty"`
+}
+
+func (x *InventoryMsg) Reset() {
+ *x = InventoryMsg{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[4]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *InventoryMsg) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InventoryMsg) ProtoMessage() {}
+
+func (x *InventoryMsg) ProtoReflect() protoreflect.Message {
+ mi := &file_hardwareinventory_msg_proto_msgTypes[4]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use InventoryMsg.ProtoReflect.Descriptor instead.
+func (*InventoryMsg) Descriptor() ([]byte, []int) {
+ return file_hardwareinventory_msg_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *InventoryMsg) GetEveVersion() string {
+ if x != nil {
+ return x.EveVersion
+ }
+ return ""
+}
+
+func (x *InventoryMsg) GetPciDevices() []*PCIDevice {
+ if x != nil {
+ return x.PciDevices
+ }
+ return nil
+}
+
+func (x *InventoryMsg) GetUsbDevices() []*USBDevice {
+ if x != nil {
+ return x.UsbDevices
+ }
+ return nil
+}
+
+var File_hardwareinventory_msg_proto protoreflect.FileDescriptor
+
+var file_hardwareinventory_msg_proto_rawDesc = []byte{
+ 0x0a, 0x1b, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74,
+ 0x6f, 0x72, 0x79, 0x2f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x6f,
+ 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x68, 0x61,
+ 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x22,
+ 0x38, 0x0a, 0x0c, 0x55, 0x53, 0x42, 0x42, 0x75, 0x73, 0x44, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x12,
+ 0x10, 0x0a, 0x03, 0x62, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x62, 0x75,
+ 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28,
+ 0x03, 0x52, 0x06, 0x64, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x22, 0xda, 0x02, 0x0a, 0x09, 0x55, 0x53,
+ 0x42, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x70, 0x63, 0x69, 0x5f, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x72,
+ 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50,
+ 0x43, 0x49, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x09, 0x70, 0x63, 0x69,
+ 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x52, 0x0a, 0x0a, 0x75, 0x73, 0x62,
+ 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x68,
+ 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79,
+ 0x2e, 0x55, 0x53, 0x42, 0x42, 0x75, 0x73, 0x44, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x48, 0x01, 0x52,
+ 0x09, 0x75, 0x73, 0x62, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a,
+ 0x09, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d,
+ 0x52, 0x08, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09,
+ 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x4d, 0x0a, 0x0a, 0x62, 0x75, 0x73,
+ 0x5f, 0x64, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e,
+ 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x68,
+ 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79,
+ 0x2e, 0x55, 0x53, 0x42, 0x42, 0x75, 0x73, 0x44, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x52, 0x09, 0x62,
+ 0x75, 0x73, 0x44, 0x65, 0x76, 0x6e, 0x75, 0x6d, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x63, 0x69,
+ 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x73, 0x62, 0x5f,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x52, 0x0a, 0x0a, 0x50, 0x43, 0x49, 0x41, 0x64, 0x64,
+ 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
+ 0x0d, 0x52, 0x03, 0x62, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a,
+ 0x0a, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d,
+ 0x52, 0x08, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9f, 0x03, 0x0a, 0x09, 0x50,
+ 0x43, 0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3e, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x5f, 0x70, 0x63, 0x69, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x16, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x63, 0x69, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x64,
+ 0x64, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76,
+ 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72,
+ 0x12, 0x46, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28,
+ 0x0b, 0x32, 0x2c, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65,
+ 0x76, 0x65, 0x2e, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e,
+ 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x43, 0x49, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52,
+ 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x65, 0x6e, 0x64,
+ 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x76, 0x65, 0x6e,
+ 0x64, 0x6f, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f,
+ 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
+ 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21,
+ 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x07,
+ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49,
+ 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20,
+ 0x01, 0x28, 0x04, 0x52, 0x07, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b,
+ 0x73, 0x75, 0x62, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28,
+ 0x04, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a,
+ 0x0b, 0x69, 0x6f, 0x6d, 0x6d, 0x75, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0a, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6f, 0x6d, 0x6d, 0x75, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x1c,
+ 0x0a, 0x1a, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x63, 0x69, 0x5f, 0x64, 0x65,
+ 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xcb, 0x01, 0x0a,
+ 0x0c, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x73, 0x67, 0x12, 0x1f, 0x0a,
+ 0x0b, 0x65, 0x76, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
+ 0x28, 0x09, 0x52, 0x0a, 0x65, 0x76, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4c,
+ 0x0a, 0x0b, 0x70, 0x63, 0x69, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20,
+ 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65,
+ 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76,
+ 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x43, 0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
+ 0x52, 0x0a, 0x70, 0x63, 0x69, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x0b,
+ 0x75, 0x73, 0x62, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+ 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65,
+ 0x76, 0x65, 0x2e, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e,
+ 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x55, 0x53, 0x42, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a,
+ 0x75, 0x73, 0x62, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x42, 0x53, 0x0a, 0x20, 0x6f, 0x72,
+ 0x67, 0x2e, 0x6c, 0x66, 0x65, 0x64, 0x67, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x72,
+ 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5a, 0x2f,
+ 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x66, 0x2d, 0x65, 0x64,
+ 0x67, 0x65, 0x2f, 0x65, 0x76, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x68, 0x61,
+ 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x62,
+ 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_hardwareinventory_msg_proto_rawDescOnce sync.Once
+ file_hardwareinventory_msg_proto_rawDescData = file_hardwareinventory_msg_proto_rawDesc
+)
+
+func file_hardwareinventory_msg_proto_rawDescGZIP() []byte {
+ file_hardwareinventory_msg_proto_rawDescOnce.Do(func() {
+ file_hardwareinventory_msg_proto_rawDescData = protoimpl.X.CompressGZIP(file_hardwareinventory_msg_proto_rawDescData)
+ })
+ return file_hardwareinventory_msg_proto_rawDescData
+}
+
+var file_hardwareinventory_msg_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
+var file_hardwareinventory_msg_proto_goTypes = []interface{}{
+ (*USBBusDevnum)(nil), // 0: org.lfedge.eve.hardwareinventory.USBBusDevnum
+ (*USBDevice)(nil), // 1: org.lfedge.eve.hardwareinventory.USBDevice
+ (*PCIAddress)(nil), // 2: org.lfedge.eve.hardwareinventory.PCIAddress
+ (*PCIDevice)(nil), // 3: org.lfedge.eve.hardwareinventory.PCIDevice
+ (*InventoryMsg)(nil), // 4: org.lfedge.eve.hardwareinventory.InventoryMsg
+}
+var file_hardwareinventory_msg_proto_depIdxs = []int32{
+ 2, // 0: org.lfedge.eve.hardwareinventory.USBDevice.pci_parent:type_name -> org.lfedge.eve.hardwareinventory.PCIAddress
+ 0, // 1: org.lfedge.eve.hardwareinventory.USBDevice.usb_parent:type_name -> org.lfedge.eve.hardwareinventory.USBBusDevnum
+ 0, // 2: org.lfedge.eve.hardwareinventory.USBDevice.bus_devnum:type_name -> org.lfedge.eve.hardwareinventory.USBBusDevnum
+ 2, // 3: org.lfedge.eve.hardwareinventory.PCIDevice.address:type_name -> org.lfedge.eve.hardwareinventory.PCIAddress
+ 3, // 4: org.lfedge.eve.hardwareinventory.InventoryMsg.pci_devices:type_name -> org.lfedge.eve.hardwareinventory.PCIDevice
+ 1, // 5: org.lfedge.eve.hardwareinventory.InventoryMsg.usb_devices:type_name -> org.lfedge.eve.hardwareinventory.USBDevice
+ 6, // [6:6] is the sub-list for method output_type
+ 6, // [6:6] is the sub-list for method input_type
+ 6, // [6:6] is the sub-list for extension type_name
+ 6, // [6:6] is the sub-list for extension extendee
+ 0, // [0:6] is the sub-list for field type_name
+}
+
+func init() { file_hardwareinventory_msg_proto_init() }
+func file_hardwareinventory_msg_proto_init() {
+ if File_hardwareinventory_msg_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_hardwareinventory_msg_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*USBBusDevnum); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_hardwareinventory_msg_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*USBDevice); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_hardwareinventory_msg_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PCIAddress); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_hardwareinventory_msg_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*PCIDevice); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_hardwareinventory_msg_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*InventoryMsg); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ }
+ file_hardwareinventory_msg_proto_msgTypes[1].OneofWrappers = []interface{}{}
+ file_hardwareinventory_msg_proto_msgTypes[3].OneofWrappers = []interface{}{}
+ type x struct{}
+ out := protoimpl.TypeBuilder{
+ File: protoimpl.DescBuilder{
+ GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+ RawDescriptor: file_hardwareinventory_msg_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 5,
+ NumExtensions: 0,
+ NumServices: 0,
+ },
+ GoTypes: file_hardwareinventory_msg_proto_goTypes,
+ DependencyIndexes: file_hardwareinventory_msg_proto_depIdxs,
+ MessageInfos: file_hardwareinventory_msg_proto_msgTypes,
+ }.Build()
+ File_hardwareinventory_msg_proto = out.File
+ file_hardwareinventory_msg_proto_rawDesc = nil
+ file_hardwareinventory_msg_proto_goTypes = nil
+ file_hardwareinventory_msg_proto_depIdxs = nil
+}
diff --git a/go/register/register.pb.validate.go b/go/register/register.pb.validate.go
deleted file mode 100644
index bb646da0..00000000
--- a/go/register/register.pb.validate.go
+++ /dev/null
@@ -1,183 +0,0 @@
-// Code generated by protoc-gen-validate. DO NOT EDIT.
-// source: register/register.proto
-
-package register
-
-import (
- "bytes"
- "errors"
- "fmt"
- "net"
- "net/mail"
- "net/url"
- "regexp"
- "sort"
- "strings"
- "time"
- "unicode/utf8"
-
- "google.golang.org/protobuf/types/known/anypb"
-)
-
-// ensure the imports are used
-var (
- _ = bytes.MinRead
- _ = errors.New("")
- _ = fmt.Print
- _ = utf8.UTFMax
- _ = (*regexp.Regexp)(nil)
- _ = (*strings.Reader)(nil)
- _ = net.IPv4len
- _ = time.Duration(0)
- _ = (*url.URL)(nil)
- _ = (*mail.Address)(nil)
- _ = anypb.Any{}
- _ = sort.Sort
-)
-
-// Validate checks the field values on ZRegisterMsg with the rules defined in
-// the proto definition for this message. If any rules are violated, the first
-// error encountered is returned, or nil if there are no violations.
-func (m *ZRegisterMsg) Validate() error {
- return m.validate(false)
-}
-
-// ValidateAll checks the field values on ZRegisterMsg with the rules defined
-// in the proto definition for this message. If any rules are violated, the
-// result is a list of violation errors wrapped in ZRegisterMsgMultiError, or
-// nil if none found.
-func (m *ZRegisterMsg) ValidateAll() error {
- return m.validate(true)
-}
-
-func (m *ZRegisterMsg) validate(all bool) error {
- if m == nil {
- return nil
- }
-
- var errors []error
-
- // no validation rules for OnBoardKey
-
- if l := len(m.GetPemCert()); l < 100 || l > 10240 {
- err := ZRegisterMsgValidationError{
- field: "PemCert",
- reason: "value length must be between 100 and 10240 bytes, inclusive",
- }
- if !all {
- return err
- }
- errors = append(errors, err)
- }
-
- if utf8.RuneCountInString(m.GetSerial()) > 256 {
- err := ZRegisterMsgValidationError{
- field: "Serial",
- reason: "value length must be at most 256 runes",
- }
- if !all {
- return err
- }
- errors = append(errors, err)
- }
-
- if utf8.RuneCountInString(m.GetSoftSerial()) > 256 {
- err := ZRegisterMsgValidationError{
- field: "SoftSerial",
- reason: "value length must be at most 256 runes",
- }
- if !all {
- return err
- }
- errors = append(errors, err)
- }
-
- if !_ZRegisterMsg_SoftSerial_Pattern.MatchString(m.GetSoftSerial()) {
- err := ZRegisterMsgValidationError{
- field: "SoftSerial",
- reason: "value does not match regex pattern \"^[a-zA-Z0-9_-]*$\"",
- }
- if !all {
- return err
- }
- errors = append(errors, err)
- }
-
- if len(errors) > 0 {
- return ZRegisterMsgMultiError(errors)
- }
-
- return nil
-}
-
-// ZRegisterMsgMultiError is an error wrapping multiple validation errors
-// returned by ZRegisterMsg.ValidateAll() if the designated constraints aren't met.
-type ZRegisterMsgMultiError []error
-
-// Error returns a concatenation of all the error messages it wraps.
-func (m ZRegisterMsgMultiError) Error() string {
- msgs := make([]string, 0, len(m))
- for _, err := range m {
- msgs = append(msgs, err.Error())
- }
- return strings.Join(msgs, "; ")
-}
-
-// AllErrors returns a list of validation violation errors.
-func (m ZRegisterMsgMultiError) AllErrors() []error { return m }
-
-// ZRegisterMsgValidationError is the validation error returned by
-// ZRegisterMsg.Validate if the designated constraints aren't met.
-type ZRegisterMsgValidationError struct {
- field string
- reason string
- cause error
- key bool
-}
-
-// Field function returns field value.
-func (e ZRegisterMsgValidationError) Field() string { return e.field }
-
-// Reason function returns reason value.
-func (e ZRegisterMsgValidationError) Reason() string { return e.reason }
-
-// Cause function returns cause value.
-func (e ZRegisterMsgValidationError) Cause() error { return e.cause }
-
-// Key function returns key value.
-func (e ZRegisterMsgValidationError) Key() bool { return e.key }
-
-// ErrorName returns error name.
-func (e ZRegisterMsgValidationError) ErrorName() string { return "ZRegisterMsgValidationError" }
-
-// Error satisfies the builtin error interface
-func (e ZRegisterMsgValidationError) Error() string {
- cause := ""
- if e.cause != nil {
- cause = fmt.Sprintf(" | caused by: %v", e.cause)
- }
-
- key := ""
- if e.key {
- key = "key for "
- }
-
- return fmt.Sprintf(
- "invalid %sZRegisterMsg.%s: %s%s",
- key,
- e.field,
- e.reason,
- cause)
-}
-
-var _ error = ZRegisterMsgValidationError{}
-
-var _ interface {
- Field() string
- Reason() string
- Key() bool
- Cause() error
- ErrorName() string
-} = ZRegisterMsgValidationError{}
-
-var _ZRegisterMsg_SoftSerial_Pattern = regexp.MustCompile("^[a-zA-Z0-9_-]*$")
diff --git a/images/devconfig.svg b/images/devconfig.svg
index 64d136e6..4cff910b 100644
--- a/images/devconfig.svg
+++ b/images/devconfig.svg
@@ -12,6 +12,30 @@
org.lfedge.eve.config
+
+cluster_c75e6f3a3956
+
+
+org.lfedge.eve.common
+
+
+
+
+cluster_087a8b768833
+
+
+netconfig.proto
+
+
+
+
+cluster_a1a638239bbb
+
+
+edgeview.proto
+
+
+
cluster_ed03ba9919d5
@@ -60,38 +84,6 @@
-
-cluster_c75e6f3a3956
-
-
-org.lfedge.eve.common
-
-
-
-
-cluster_087a8b768833
-
-
-netconfig.proto
-
-
-
-
-cluster_a1a638239bbb
-
-
-edgeview.proto
-
-
-
-
-cluster_f89bbdbe2429
-
-
-netinst.proto
-
-
-
cluster_0eca8c4caf24
@@ -124,6 +116,14 @@
+
+cluster_f89bbdbe2429
+
+
+netinst.proto
+
+
+
cluster_c4848830929a
diff --git a/proto/hardwareinventory/msg.proto b/proto/hardwareinventory/msg.proto
new file mode 100644
index 00000000..093d3c27
--- /dev/null
+++ b/proto/hardwareinventory/msg.proto
@@ -0,0 +1,57 @@
+// Copyright(c) 2025 Zededa, Inc.
+// SPDX-License-Identifier: Apache-2.0
+
+syntax = "proto3";
+
+package org.lfedge.eve.hardwareinventory;
+option go_package = "github.com/lf-edge/eve-api/go/hardwareinventory";
+option java_package = "org.lfedge.eve.hardwareinventory";
+
+message USBBusDevnum {
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/usb.h#L451
+ int64 bus = 1;
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/usb.h#L657
+ int64 devnum = 2;
+}
+
+message USBDevice {
+ optional PCIAddress pci_parent = 1;
+ optional USBBusDevnum usb_parent = 2;
+
+ // these are uint16, protobuf only supports from uint32
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/usb.h#L984
+ uint32 vendor_id = 3;
+ uint32 product_id = 4;
+
+ USBBusDevnum bus_devnum = 5;
+}
+
+message PCIAddress {
+ // https://github.com/lyonel/lshw/blob/master/src/core/pci.cc#L224
+ uint32 bus = 1;
+ uint32 device = 2;
+ uint32 function = 3;
+}
+
+message PCIDevice {
+ optional string parent_pci_device_address = 1;
+ string driver = 2;
+ PCIAddress address = 3;
+ // https://elixir.bootlin.com/linux/v6.16.9/source/include/linux/pci.h#L347
+ uint32 vendor_id = 4;
+ uint32 device_id = 5;
+ uint32 revision = 6;
+ uint32 subsystem_id = 7;
+ uint64 class_id = 8;
+ uint64 subclass_id = 9;
+ // IOMMU group names apparently are strings: https://elixir.bootlin.com/linux/v6.16.9/source/drivers/iommu/iommu.c#L1101
+ string iommu_group = 10;
+}
+
+// this message is POSTed to /inventory/{serial}/{softserial}
+message InventoryMsg {
+ string eve_version = 1;
+
+ repeated PCIDevice pci_devices = 2;
+ repeated USBDevice usb_devices = 3;
+}
diff --git a/python/hardwareinventory/msg_pb2.py b/python/hardwareinventory/msg_pb2.py
new file mode 100644
index 00000000..1685fa2a
--- /dev/null
+++ b/python/hardwareinventory/msg_pb2.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: hardwareinventory/msg.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf.internal import builder as _builder
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bhardwareinventory/msg.proto\x12 org.lfedge.eve.hardwareinventory\"+\n\x0cUSBBusDevnum\x12\x0b\n\x03\x62us\x18\x01 \x01(\x03\x12\x0e\n\x06\x64\x65vnum\x18\x02 \x01(\x03\"\xa4\x02\n\tUSBDevice\x12\x45\n\npci_parent\x18\x01 \x01(\x0b\x32,.org.lfedge.eve.hardwareinventory.PCIAddressH\x00\x88\x01\x01\x12G\n\nusb_parent\x18\x02 \x01(\x0b\x32..org.lfedge.eve.hardwareinventory.USBBusDevnumH\x01\x88\x01\x01\x12\x11\n\tvendor_id\x18\x03 \x01(\r\x12\x12\n\nproduct_id\x18\x04 \x01(\r\x12\x42\n\nbus_devnum\x18\x05 \x01(\x0b\x32..org.lfedge.eve.hardwareinventory.USBBusDevnumB\r\n\x0b_pci_parentB\r\n\x0b_usb_parent\";\n\nPCIAddress\x12\x0b\n\x03\x62us\x18\x01 \x01(\r\x12\x0e\n\x06\x64\x65vice\x18\x02 \x01(\r\x12\x10\n\x08\x66unction\x18\x03 \x01(\r\"\xaa\x02\n\tPCIDevice\x12&\n\x19parent_pci_device_address\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06\x64river\x18\x02 \x01(\t\x12=\n\x07\x61\x64\x64ress\x18\x03 \x01(\x0b\x32,.org.lfedge.eve.hardwareinventory.PCIAddress\x12\x11\n\tvendor_id\x18\x04 \x01(\r\x12\x11\n\tdevice_id\x18\x05 \x01(\r\x12\x10\n\x08revision\x18\x06 \x01(\r\x12\x14\n\x0csubsystem_id\x18\x07 \x01(\r\x12\x10\n\x08\x63lass_id\x18\x08 \x01(\x04\x12\x13\n\x0bsubclass_id\x18\t \x01(\x04\x12\x13\n\x0biommu_group\x18\n \x01(\tB\x1c\n\x1a_parent_pci_device_address\"\xa7\x01\n\x0cInventoryMsg\x12\x13\n\x0b\x65ve_version\x18\x01 \x01(\t\x12@\n\x0bpci_devices\x18\x02 \x03(\x0b\x32+.org.lfedge.eve.hardwareinventory.PCIDevice\x12@\n\x0busb_devices\x18\x03 \x03(\x0b\x32+.org.lfedge.eve.hardwareinventory.USBDeviceBS\n org.lfedge.eve.hardwareinventoryZ/github.com/lf-edge/eve-api/go/hardwareinventoryb\x06proto3')
+
+_globals = globals()
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'hardwareinventory.msg_pb2', _globals)
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+ DESCRIPTOR._options = None
+ DESCRIPTOR._serialized_options = b'\n org.lfedge.eve.hardwareinventoryZ/github.com/lf-edge/eve-api/go/hardwareinventory'
+ _globals['_USBBUSDEVNUM']._serialized_start=65
+ _globals['_USBBUSDEVNUM']._serialized_end=108
+ _globals['_USBDEVICE']._serialized_start=111
+ _globals['_USBDEVICE']._serialized_end=403
+ _globals['_PCIADDRESS']._serialized_start=405
+ _globals['_PCIADDRESS']._serialized_end=464
+ _globals['_PCIDEVICE']._serialized_start=467
+ _globals['_PCIDEVICE']._serialized_end=765
+ _globals['_INVENTORYMSG']._serialized_start=768
+ _globals['_INVENTORYMSG']._serialized_end=935
+# @@protoc_insertion_point(module_scope)