// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.11
// 	protoc        v4.25.8
// source: voltha_protos/ietf_interfaces.proto

package ietf

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

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 Interface_LinkUpDownTrapEnableType int32

const (
	Interface_TRAP_DISABLED Interface_LinkUpDownTrapEnableType = 0
	Interface_TRAP_ENABLED  Interface_LinkUpDownTrapEnableType = 1
)

// Enum value maps for Interface_LinkUpDownTrapEnableType.
var (
	Interface_LinkUpDownTrapEnableType_name = map[int32]string{
		0: "TRAP_DISABLED",
		1: "TRAP_ENABLED",
	}
	Interface_LinkUpDownTrapEnableType_value = map[string]int32{
		"TRAP_DISABLED": 0,
		"TRAP_ENABLED":  1,
	}
)

func (x Interface_LinkUpDownTrapEnableType) Enum() *Interface_LinkUpDownTrapEnableType {
	p := new(Interface_LinkUpDownTrapEnableType)
	*p = x
	return p
}

func (x Interface_LinkUpDownTrapEnableType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Interface_LinkUpDownTrapEnableType) Descriptor() protoreflect.EnumDescriptor {
	return file_voltha_protos_ietf_interfaces_proto_enumTypes[0].Descriptor()
}

func (Interface_LinkUpDownTrapEnableType) Type() protoreflect.EnumType {
	return &file_voltha_protos_ietf_interfaces_proto_enumTypes[0]
}

func (x Interface_LinkUpDownTrapEnableType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Interface_LinkUpDownTrapEnableType.Descriptor instead.
func (Interface_LinkUpDownTrapEnableType) EnumDescriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{1, 0}
}

type InterfaceState_AdminStatusType int32

const (
	InterfaceState_ADMIN_DOWN    InterfaceState_AdminStatusType = 0
	InterfaceState_ADMIN_TESTING InterfaceState_AdminStatusType = 1
	InterfaceState_ADMIN_UP      InterfaceState_AdminStatusType = 2
)

// Enum value maps for InterfaceState_AdminStatusType.
var (
	InterfaceState_AdminStatusType_name = map[int32]string{
		0: "ADMIN_DOWN",
		1: "ADMIN_TESTING",
		2: "ADMIN_UP",
	}
	InterfaceState_AdminStatusType_value = map[string]int32{
		"ADMIN_DOWN":    0,
		"ADMIN_TESTING": 1,
		"ADMIN_UP":      2,
	}
)

func (x InterfaceState_AdminStatusType) Enum() *InterfaceState_AdminStatusType {
	p := new(InterfaceState_AdminStatusType)
	*p = x
	return p
}

func (x InterfaceState_AdminStatusType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (InterfaceState_AdminStatusType) Descriptor() protoreflect.EnumDescriptor {
	return file_voltha_protos_ietf_interfaces_proto_enumTypes[1].Descriptor()
}

func (InterfaceState_AdminStatusType) Type() protoreflect.EnumType {
	return &file_voltha_protos_ietf_interfaces_proto_enumTypes[1]
}

func (x InterfaceState_AdminStatusType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use InterfaceState_AdminStatusType.Descriptor instead.
func (InterfaceState_AdminStatusType) EnumDescriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{3, 0}
}

type InterfaceState_OperStatusType int32

const (
	InterfaceState_DORMANT          InterfaceState_OperStatusType = 0
	InterfaceState_LOWER_LAYER_DOWN InterfaceState_OperStatusType = 1
	InterfaceState_UNKNOWN          InterfaceState_OperStatusType = 2
	InterfaceState_TESTING          InterfaceState_OperStatusType = 3
	InterfaceState_UP               InterfaceState_OperStatusType = 4
	InterfaceState_DOWN             InterfaceState_OperStatusType = 5
	InterfaceState_NOT_PRESENT      InterfaceState_OperStatusType = 6
)

// Enum value maps for InterfaceState_OperStatusType.
var (
	InterfaceState_OperStatusType_name = map[int32]string{
		0: "DORMANT",
		1: "LOWER_LAYER_DOWN",
		2: "UNKNOWN",
		3: "TESTING",
		4: "UP",
		5: "DOWN",
		6: "NOT_PRESENT",
	}
	InterfaceState_OperStatusType_value = map[string]int32{
		"DORMANT":          0,
		"LOWER_LAYER_DOWN": 1,
		"UNKNOWN":          2,
		"TESTING":          3,
		"UP":               4,
		"DOWN":             5,
		"NOT_PRESENT":      6,
	}
)

func (x InterfaceState_OperStatusType) Enum() *InterfaceState_OperStatusType {
	p := new(InterfaceState_OperStatusType)
	*p = x
	return p
}

func (x InterfaceState_OperStatusType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (InterfaceState_OperStatusType) Descriptor() protoreflect.EnumDescriptor {
	return file_voltha_protos_ietf_interfaces_proto_enumTypes[2].Descriptor()
}

func (InterfaceState_OperStatusType) Type() protoreflect.EnumType {
	return &file_voltha_protos_ietf_interfaces_proto_enumTypes[2]
}

func (x InterfaceState_OperStatusType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use InterfaceState_OperStatusType.Descriptor instead.
func (InterfaceState_OperStatusType) EnumDescriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{3, 1}
}

type Interfaces struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	AllInterfaces []*Interface           `protobuf:"bytes,1,rep,name=all_interfaces,json=allInterfaces,proto3" json:"all_interfaces,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Interfaces) Reset() {
	*x = Interfaces{}
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Interfaces) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Interfaces) ProtoMessage() {}

func (x *Interfaces) ProtoReflect() protoreflect.Message {
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Interfaces.ProtoReflect.Descriptor instead.
func (*Interfaces) Descriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{0}
}

func (x *Interfaces) GetAllInterfaces() []*Interface {
	if x != nil {
		return x.AllInterfaces
	}
	return nil
}

type Interface struct {
	state                protoimpl.MessageState             `protogen:"open.v1"`
	Name                 string                             `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Description          string                             `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	Type                 string                             `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
	Enabled              bool                               `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"`
	LinkUpDownTrapEnable Interface_LinkUpDownTrapEnableType `protobuf:"varint,5,opt,name=link_up_down_trap_enable,json=linkUpDownTrapEnable,proto3,enum=ietf.Interface_LinkUpDownTrapEnableType" json:"link_up_down_trap_enable,omitempty"`
	unknownFields        protoimpl.UnknownFields
	sizeCache            protoimpl.SizeCache
}

func (x *Interface) Reset() {
	*x = Interface{}
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Interface) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Interface) ProtoMessage() {}

func (x *Interface) ProtoReflect() protoreflect.Message {
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[1]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Interface.ProtoReflect.Descriptor instead.
func (*Interface) Descriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{1}
}

func (x *Interface) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Interface) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

func (x *Interface) GetType() string {
	if x != nil {
		return x.Type
	}
	return ""
}

func (x *Interface) GetEnabled() bool {
	if x != nil {
		return x.Enabled
	}
	return false
}

func (x *Interface) GetLinkUpDownTrapEnable() Interface_LinkUpDownTrapEnableType {
	if x != nil {
		return x.LinkUpDownTrapEnable
	}
	return Interface_TRAP_DISABLED
}

type InterfacesState struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	AllInterfacs  []*InterfaceState      `protobuf:"bytes,1,rep,name=all_interfacs,json=allInterfacs,proto3" json:"all_interfacs,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *InterfacesState) Reset() {
	*x = InterfacesState{}
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *InterfacesState) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*InterfacesState) ProtoMessage() {}

func (x *InterfacesState) ProtoReflect() protoreflect.Message {
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[2]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use InterfacesState.ProtoReflect.Descriptor instead.
func (*InterfacesState) Descriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{2}
}

func (x *InterfacesState) GetAllInterfacs() []*InterfaceState {
	if x != nil {
		return x.AllInterfacs
	}
	return nil
}

type InterfaceState struct {
	state         protoimpl.MessageState         `protogen:"open.v1"`
	Name          string                         `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Type          string                         `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"`
	AdminStatus   InterfaceState_AdminStatusType `protobuf:"varint,3,opt,name=admin_status,json=adminStatus,proto3,enum=ietf.InterfaceState_AdminStatusType" json:"admin_status,omitempty"`
	OperStatus    InterfaceState_OperStatusType  `protobuf:"varint,4,opt,name=oper_status,json=operStatus,proto3,enum=ietf.InterfaceState_OperStatusType" json:"oper_status,omitempty"`
	LastChange    string                         `protobuf:"bytes,5,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
	IfIndex       int32                          `protobuf:"varint,6,opt,name=if_index,json=ifIndex,proto3" json:"if_index,omitempty"`
	PhysAddress   string                         `protobuf:"bytes,7,opt,name=phys_address,json=physAddress,proto3" json:"phys_address,omitempty"`
	HigherLayerIf []string                       `protobuf:"bytes,8,rep,name=higher_layer_if,json=higherLayerIf,proto3" json:"higher_layer_if,omitempty"`
	LowerLayerIf  []string                       `protobuf:"bytes,9,rep,name=lower_layer_if,json=lowerLayerIf,proto3" json:"lower_layer_if,omitempty"`
	Speed         uint64                         `protobuf:"varint,10,opt,name=speed,proto3" json:"speed,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *InterfaceState) Reset() {
	*x = InterfaceState{}
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *InterfaceState) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*InterfaceState) ProtoMessage() {}

func (x *InterfaceState) ProtoReflect() protoreflect.Message {
	mi := &file_voltha_protos_ietf_interfaces_proto_msgTypes[3]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use InterfaceState.ProtoReflect.Descriptor instead.
func (*InterfaceState) Descriptor() ([]byte, []int) {
	return file_voltha_protos_ietf_interfaces_proto_rawDescGZIP(), []int{3}
}

func (x *InterfaceState) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *InterfaceState) GetType() string {
	if x != nil {
		return x.Type
	}
	return ""
}

func (x *InterfaceState) GetAdminStatus() InterfaceState_AdminStatusType {
	if x != nil {
		return x.AdminStatus
	}
	return InterfaceState_ADMIN_DOWN
}

func (x *InterfaceState) GetOperStatus() InterfaceState_OperStatusType {
	if x != nil {
		return x.OperStatus
	}
	return InterfaceState_DORMANT
}

func (x *InterfaceState) GetLastChange() string {
	if x != nil {
		return x.LastChange
	}
	return ""
}

func (x *InterfaceState) GetIfIndex() int32 {
	if x != nil {
		return x.IfIndex
	}
	return 0
}

func (x *InterfaceState) GetPhysAddress() string {
	if x != nil {
		return x.PhysAddress
	}
	return ""
}

func (x *InterfaceState) GetHigherLayerIf() []string {
	if x != nil {
		return x.HigherLayerIf
	}
	return nil
}

func (x *InterfaceState) GetLowerLayerIf() []string {
	if x != nil {
		return x.LowerLayerIf
	}
	return nil
}

func (x *InterfaceState) GetSpeed() uint64 {
	if x != nil {
		return x.Speed
	}
	return 0
}

var File_voltha_protos_ietf_interfaces_proto protoreflect.FileDescriptor

const file_voltha_protos_ietf_interfaces_proto_rawDesc = "" +
	"\n" +
	"#voltha_protos/ietf_interfaces.proto\x12\x04ietf\"D\n" +
	"\n" +
	"Interfaces\x126\n" +
	"\x0eall_interfaces\x18\x01 \x03(\v2\x0f.ietf.InterfaceR\rallInterfaces\"\x92\x02\n" +
	"\tInterface\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x12 \n" +
	"\vdescription\x18\x02 \x01(\tR\vdescription\x12\x12\n" +
	"\x04type\x18\x03 \x01(\tR\x04type\x12\x18\n" +
	"\aenabled\x18\x04 \x01(\bR\aenabled\x12`\n" +
	"\x18link_up_down_trap_enable\x18\x05 \x01(\x0e2(.ietf.Interface.LinkUpDownTrapEnableTypeR\x14linkUpDownTrapEnable\"?\n" +
	"\x18LinkUpDownTrapEnableType\x12\x11\n" +
	"\rTRAP_DISABLED\x10\x00\x12\x10\n" +
	"\fTRAP_ENABLED\x10\x01\"L\n" +
	"\x0fInterfacesState\x129\n" +
	"\rall_interfacs\x18\x01 \x03(\v2\x14.ietf.InterfaceStateR\fallInterfacs\"\xc0\x04\n" +
	"\x0eInterfaceState\x12\x12\n" +
	"\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" +
	"\x04type\x18\x02 \x01(\tR\x04type\x12G\n" +
	"\fadmin_status\x18\x03 \x01(\x0e2$.ietf.InterfaceState.AdminStatusTypeR\vadminStatus\x12D\n" +
	"\voper_status\x18\x04 \x01(\x0e2#.ietf.InterfaceState.OperStatusTypeR\n" +
	"operStatus\x12\x1f\n" +
	"\vlast_change\x18\x05 \x01(\tR\n" +
	"lastChange\x12\x19\n" +
	"\bif_index\x18\x06 \x01(\x05R\aifIndex\x12!\n" +
	"\fphys_address\x18\a \x01(\tR\vphysAddress\x12&\n" +
	"\x0fhigher_layer_if\x18\b \x03(\tR\rhigherLayerIf\x12$\n" +
	"\x0elower_layer_if\x18\t \x03(\tR\flowerLayerIf\x12\x14\n" +
	"\x05speed\x18\n" +
	" \x01(\x04R\x05speed\"B\n" +
	"\x0fAdminStatusType\x12\x0e\n" +
	"\n" +
	"ADMIN_DOWN\x10\x00\x12\x11\n" +
	"\rADMIN_TESTING\x10\x01\x12\f\n" +
	"\bADMIN_UP\x10\x02\"p\n" +
	"\x0eOperStatusType\x12\v\n" +
	"\aDORMANT\x10\x00\x12\x14\n" +
	"\x10LOWER_LAYER_DOWN\x10\x01\x12\v\n" +
	"\aUNKNOWN\x10\x02\x12\v\n" +
	"\aTESTING\x10\x03\x12\x06\n" +
	"\x02UP\x10\x04\x12\b\n" +
	"\x04DOWN\x10\x05\x12\x0f\n" +
	"\vNOT_PRESENT\x10\x06BH\n" +
	"\x18org.opencord.voltha.ietfZ,github.com/opencord/voltha-protos/v5/go/ietfb\x06proto3"

var (
	file_voltha_protos_ietf_interfaces_proto_rawDescOnce sync.Once
	file_voltha_protos_ietf_interfaces_proto_rawDescData []byte
)

func file_voltha_protos_ietf_interfaces_proto_rawDescGZIP() []byte {
	file_voltha_protos_ietf_interfaces_proto_rawDescOnce.Do(func() {
		file_voltha_protos_ietf_interfaces_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_voltha_protos_ietf_interfaces_proto_rawDesc), len(file_voltha_protos_ietf_interfaces_proto_rawDesc)))
	})
	return file_voltha_protos_ietf_interfaces_proto_rawDescData
}

var file_voltha_protos_ietf_interfaces_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_voltha_protos_ietf_interfaces_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_voltha_protos_ietf_interfaces_proto_goTypes = []any{
	(Interface_LinkUpDownTrapEnableType)(0), // 0: ietf.Interface.LinkUpDownTrapEnableType
	(InterfaceState_AdminStatusType)(0),     // 1: ietf.InterfaceState.AdminStatusType
	(InterfaceState_OperStatusType)(0),      // 2: ietf.InterfaceState.OperStatusType
	(*Interfaces)(nil),                      // 3: ietf.Interfaces
	(*Interface)(nil),                       // 4: ietf.Interface
	(*InterfacesState)(nil),                 // 5: ietf.InterfacesState
	(*InterfaceState)(nil),                  // 6: ietf.InterfaceState
}
var file_voltha_protos_ietf_interfaces_proto_depIdxs = []int32{
	4, // 0: ietf.Interfaces.all_interfaces:type_name -> ietf.Interface
	0, // 1: ietf.Interface.link_up_down_trap_enable:type_name -> ietf.Interface.LinkUpDownTrapEnableType
	6, // 2: ietf.InterfacesState.all_interfacs:type_name -> ietf.InterfaceState
	1, // 3: ietf.InterfaceState.admin_status:type_name -> ietf.InterfaceState.AdminStatusType
	2, // 4: ietf.InterfaceState.oper_status:type_name -> ietf.InterfaceState.OperStatusType
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_voltha_protos_ietf_interfaces_proto_init() }
func file_voltha_protos_ietf_interfaces_proto_init() {
	if File_voltha_protos_ietf_interfaces_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_voltha_protos_ietf_interfaces_proto_rawDesc), len(file_voltha_protos_ietf_interfaces_proto_rawDesc)),
			NumEnums:      3,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_voltha_protos_ietf_interfaces_proto_goTypes,
		DependencyIndexes: file_voltha_protos_ietf_interfaces_proto_depIdxs,
		EnumInfos:         file_voltha_protos_ietf_interfaces_proto_enumTypes,
		MessageInfos:      file_voltha_protos_ietf_interfaces_proto_msgTypes,
	}.Build()
	File_voltha_protos_ietf_interfaces_proto = out.File
	file_voltha_protos_ietf_interfaces_proto_goTypes = nil
	file_voltha_protos_ietf_interfaces_proto_depIdxs = nil
}
