
module voltha {





    namespace "urn:opencord:params:xml:ns:voltha:voltha";
    prefix voltha;

    organization "CORD";
    contact
        " Any name";

    description
        "";

    revision "2016-11-15" {
        description "Initial revision.";
        reference "reference";
    }


    grouping DeviceGroup {
        description
            "";
        leaf id {
            type  string; 
            description
                "";
        }

        list logical_devices {
            key "id";
            uses  LogicalDevice;

            description
                "";
        }

        list devices {
            key "id";
            uses  Device;

            description
                "";
        }



    }

    grouping DeviceGroups {
        description
            "";
        list items {
            key "id";
            uses  DeviceGroup;

            description
                "";
        }



    }

        typedef AlarmFilterRuleKey {
            type enumeration {
                enum id {
                    description "";
                }
                enum type {
                    description "";
                }
                enum severity {
                    description "";
                }
                enum resource_id {
                    description "";
                }
                enum category {
                    description "";
                }
                enum device_id {
                    description "";
                }
            }
            description
                "";
        }

    grouping AlarmFilterRule {
        description
            "";
        leaf key {
            type  AlarmFilterRuleKey;

            description
                "";
        }

        leaf value {
            type  string; 
            description
                "";
        }



    }

    grouping AlarmFilter {
        description
            "";
        leaf id {
            type  string; 
            description
                "";
        }

        list rules {
            key "key";
            uses  AlarmFilterRule;

            description
                "";
        }



    }

    grouping AlarmFilters {
        description
            "";
        list filters {
            key "id";
            uses  AlarmFilter;

            description
                "";
        }



    }

    container VolthaInstance {
        description
            "Top-level (root) node for a Voltha Instance";
        leaf instance_id {
            type  string; 
            description
                "";
        }

        leaf version {
            type  string; 
            description
                "";
        }

        leaf log_level {
            type  LogLevel;

            description
                "";
        }

        container health {
            uses  HealthStatus;

            description
                "";
        }

        list adapters {
            key "id";
            uses  Adapter;

            description
                "";
        }

        list logical_devices {
            key "id";
            uses  LogicalDevice;

            description
                "";
        }

        list devices {
            key "id";
            uses  Device;

            description
                "";
        }

        list device_types {
            key "id";
            uses  DeviceType;

            description
                "";
        }

        list device_groups {
            key "id";
            uses  DeviceGroup;

            description
                "";
        }

        list alarm_filters {
            key "id";
            uses  AlarmFilter;

            description
                "";
        }



    }

    container VolthaInstances {
        description
            "";
        list items {
            key "items";
            leaf items {
                type  string; 
                description
                    "";
            }
            description
                "";
        }



    }

    container Voltha {
        description
            "Voltha representing the entire Voltha cluster";
        leaf version {
            type  string; 
            description
                "";
        }

        leaf log_level {
            type  LogLevel;

            description
                "";
        }

        list instances {
            key "instance_id";
            uses  VolthaInstance_grouping; 
            description
                "";
        }

        list adapters {
            key "id";
            uses  Adapter;

            description
                "";
        }

        list logical_devices {
            key "id";
            uses  LogicalDevice;

            description
                "";
        }

        list devices {
            key "id";
            uses  Device;

            description
                "";
        }

        list device_groups {
            key "id";
            uses  DeviceGroup;

            description
                "";
        }



    }

    grouping VolthaInstance_grouping {
        description
            "Top-level (root) node for a Voltha Instance";
        leaf instance_id {
            type  string; 
            description
                "";
        }

        leaf version {
            type  string; 
            description
                "";
        }

        leaf log_level {
            type  LogLevel;

            description
                "";
        }

        container health {
            uses  HealthStatus;

            description
                "";
        }

        list adapters {
            key "id";
            uses  Adapter;

            description
                "";
        }

        list logical_devices {
            key "id";
            uses  LogicalDevice;

            description
                "";
        }

        list devices {
            key "id";
            uses  Device;

            description
                "";
        }

        list device_types {
            key "id";
            uses  DeviceType;

            description
                "";
        }

        list device_groups {
            key "id";
            uses  DeviceGroup;

            description
                "";
        }

        list alarm_filters {
            key "id";
            uses  AlarmFilter;

            description
                "";
        }



    }

    grouping VolthaInstances_grouping {
        description
            "";
        list items {
            key "items";
            leaf items {
                type  string; 
                description
                    "";
            }
            description
                "";
        }



    }

    grouping Voltha_grouping {
        description
            "Voltha representing the entire Voltha cluster";
        leaf version {
            type  string; 
            description
                "";
        }

        leaf log_level {
            type  LogLevel;

            description
                "";
        }

        list instances {
            key "instance_id";
            uses  VolthaInstance_grouping; 
            description
                "";
        }

        list adapters {
            key "id";
            uses  Adapter;

            description
                "";
        }

        list logical_devices {
            key "id";
            uses  LogicalDevice;

            description
                "";
        }

        list devices {
            key "id";
            uses  Device;

            description
                "";
        }

        list device_groups {
            key "id";
            uses  DeviceGroup;

            description
                "";
        }



    }

    grouping AdapterConfig {
        description
            "";
        leaf log_level {
            type  LogLevel;

            description
                "Common adapter config attributes here";
        }

        container additional_config {
            uses  Any;

            description
                "Custom (vendor-specific) configuration attributes";
        }



    }

    grouping Adapter {
        description
            "Adapter (software plugin)";
        leaf id {
            type  string;
            description
                "Unique name of adapter, matching the python packate name under
 voltha adapters.";
        }

        leaf vendor {
            type  string;
            description
                "";
        }

        leaf version {
            type  string;
            description
                "";
        }

        container config {
            uses  AdapterConfig;

            description
                "Adapter configuration";
        }

        container additional_description {
            uses  Any;

            description
                "Custom descriptors and custom configuration";
        }

        list logical_device_ids {
            key "logical_device_ids";
            leaf logical_device_ids {
                type  string;
                description
                    "Logical devices  owned ";
            }
            description
                "Logical devices  owned ";
        }



    }

    grouping Adapters {
        description
            "";
        list items {
            key "id";
            uses  Adapter;

            description
                "";
        }



    }

    grouping Any {
        description
            "`Any` contains an arbitrary serialized protocol buffer message along with a
 URL that describes the type of the serialized message.

 Protobuf library provides support to pack unpack Any values in the form
 of utility functions or additional generated methods of the Any type.

 Example 1: Pack and unpack a message in C++.

     Foo foo = ...;
     Any any;
     any.PackFrom(foo);
     ...
     if (any.UnpackTo(&amp;foo))
       ...


 Example 2: Pack and unpack a message in Java.

     Foo foo = ...;
     Any any = Any.pack(foo);
     ...
     if (any.is(Foo.class))
       foo = any.unpack(Foo.class);


  Example 3: Pack and unpack a message in Python.

     foo = Foo(...)
     any = Any()
     any.Pack(foo)
     ...
     if any.Is(Foo.DESCRIPTOR):
       any.Unpack(foo)
       ...

 The pack methods provided by protobuf library will by default use
 'type.googleapis.com full.type.name' as the type URL and the unpack
 methods only use the fully qualified type name after the last ' '
 in the type URL, for example  foo.bar.com x y.z  will yield type
 name  y.z .


 JSON
 ====
 The JSON representation of an `Any` value uses the regular
 representation of the deserialized, embedded message, with an
 additional field `@type` which contains the type URL. Example:

     package google.profile;
     message Person
       string first_name = 1;
       string last_name = 2;



        @type :  type.googleapis.com google.profile.Person ,
        firstName :  string ,
        lastName :  string


 If the embedded message type is well-known and has a custom JSON
 representation, that representation will be embedded adding a field
 `value` which holds the custom JSON in addition to the `@type`
 field. Example (for message  google.protobuf.Duration   ):


        @type :  type.googleapis.com google.protobuf.Duration ,
        value :  1.212s
      ";
        leaf type_url {
            type  string;
            description
                "A URL resource name whose content describes the type of the
 serialized protocol buffer message.

 For URLs which use the scheme `http`, `https`, or no scheme, the
 following restrictions and interpretations apply:

   If no scheme is provided, `https` is assumed.
   The last segment of the URL's path must represent the fully
   qualified name of the type (as in `path google.protobuf.Duration`).
   The name should be in a canonical form (e.g., leading  .  is
   not accepted).
   An HTTP GET on the URL must yield a  google.protobuf.Type
   value in binary format, or produce an error.
   Applications are allowed to cache lookup results based on the
   URL, or have them precompiled into a binary to avoid any
   lookup. Therefore, binary compatibility needs to be preserved
   on changes to types. (Use versioned type names to manage
   breaking changes.)

 Schemes other than `http`, `https` (or the empty scheme) might be
 used with implementation specific semantics.";
        }

        leaf value {
            type  binary;
            description
                "Must be a valid serialized protocol buffer of the above specified type.";
        }



    }

    typedef LogLevel {
        type enumeration {
            enum DEBUG {
                description "";
            }
            enum INFO {
                description "";
            }
            enum WARNING {
                description "";
            }
            enum ERROR {
                description "";
            }
            enum CRITICAL {
                description "";
            }
        }
        description
            "Logging verbosity level";
    }
    typedef AdminState {
        type enumeration {
            enum UNKNOWN {
                description "";
            }
            enum PREPROVISIONED {
                description "";
            }
            enum ENABLED {
                description "";
            }
            enum DISABLED {
                description "";
            }
        }
        description
            "Administrative State";
    }
    typedef OperStatus {
        type enumeration {
            enum UNKNOWN {
                description "";
            }
            enum DISCOVERED {
                description "";
            }
            enum ACTIVATING {
                description "";
            }
            enum TESTING {
                description "";
            }
            enum ACTIVE {
                description "";
            }
            enum FAILED {
                description "";
            }
        }
        description
            "Operational Status";
    }
    typedef ConnectStatus {
        type enumeration {
            enum UNKNOWN {
                description "";
            }
            enum UNREACHABLE {
                description "";
            }
            enum REACHABLE {
                description "";
            }
        }
        description
            "Connectivity Status";
    }

    grouping ID {
        description
            "Convey a resource identifier";
        leaf id {
            type  string;
            description
                "";
        }



    }

    typedef PortType {
        type enumeration {
            enum UNKNOWN {
                description "";
            }
            enum ETHERNET_NNI {
                description "";
            }
            enum ETHERNET_UNI {
                description "";
            }
            enum PON_OLT {
                description "";
            }
            enum PON_ONU {
                description "";
            }
        }
        description
            "";
    }

    grouping DeviceType {
        description
            "A Device Type";
        leaf id {
            type  string;
            description
                "Unique name for the device type";
        }

        leaf adapter {
            type  string;
            description
                "Name of the adapter that handles device type";
        }

        leaf accepts_bulk_flow_update {
            type  boolean;
            description
                "Capabilitities";
        }

        leaf accepts_add_remove_flow_updates {
            type  boolean;
            description
                "";
        }



    }

    grouping DeviceTypes {
        description
            "A plurality of device types";
        list items {
            key "id";
            uses  DeviceType;

            description
                "";
        }



    }

    grouping PmConfig {
        description
            "";
        leaf name {
            type  string;
            description
                "";
        }

        leaf type {
            type  PmType;
            description
                "";
        }

        leaf enabled {
            type  boolean;
            description
                "Whether or not this metric makes it to Kafka";
        }

        leaf sample_freq {
            type  uint32;
            description
                "Sample rate in 10ths of a second";
        }



        typedef PmType {
            type enumeration {
                enum COUNTER {
                    description "";
                }
                enum GUAGE {
                    description "";
                }
                enum STATE {
                    description "";
                }
            }
            description
                "";
        }

    }

    grouping PmGroupConfig {
        description
            "";
        leaf group_name {
            type  string;
            description
                "";
        }

        leaf group_freq {
            type  uint32;
            description
                "Frequency applicable to the grop";
        }

        leaf enabled {
            type  boolean;
            description
                "Enable disable group level only";
        }

        list metrics {
            key "name";
            uses  PmConfig;

            description
                "";
        }



    }

    grouping PmConfigs {
        description
            "";
        leaf id {
            type  string;
            description
                "To work around a chameleon POST bug";
        }

        leaf default_freq {
            type  uint32;
            description
                "Default sample rate";
        }

        leaf grouped {
            type  boolean;
            description
                "Forces group names and group semantics";
        }

        leaf freq_override {
            type  boolean;
            description
                "Allows Pm to set an individual sample frequency";
        }

        list groups {
            key "group_name";
            uses  PmGroupConfig;

            description
                "The groups if grouped is true";
        }

        list metrics {
            key "name";
            uses  PmConfig;

            description
                "The metrics themselves if grouped is false.";
        }



    }

    grouping PeerPort {
        description
            "";
        leaf device_id {
            type  string;
            description
                "";
        }

        leaf port_no {
            type  uint32;
            description
                "";
        }



    }

    grouping Port {
        description
            "";
        leaf port_no {
            type  uint32;
            description
                "Device-unique port number";
        }

        leaf label {
            type  string;
            description
                "Arbitrary port label";
        }

        leaf type {
            type  PortType;
            description
                "Type of port";
        }

        leaf admin_state {
            type  AdminState;

            description
                "";
        }

        leaf oper_status {
            type  OperStatus;

            description
                "";
        }

        leaf device_id {
            type  string;
            description
                "Unique .id of device that owns this port";
        }

        list peers {
            key "device_id";
            uses  PeerPort;
            description
                "";
        }



    }

    grouping Ports {
        description
            "";
        list items {
            key "port_no";
            uses  Port;

            description
                "";
        }



    }

    grouping ProxyAddress {
        description
            "";
        leaf device_id {
            type  string;
            description
                "Which device to use as proxy to this device";
        }

        leaf channel_id {
            type  uint32;
            description
                "Sub-address within proxy";
        }

        leaf onu_id {
            type  uint32;
            description
                "onu identifier; optional";
        }

        leaf onu_session_id {
            type  uint32;
            description
                "session identifier for the ONU; optional";
        }



    }

    grouping Device {
        description
            "A Physical Device instance";
        leaf id {
            type  string;
            description
                "Voltha's device identifier";
        }

        leaf type {
            type  string;
            description
                "Device type, refers to one of the registered device types";
        }

        leaf root {
            type  boolean;
            description
                "Is this device a root device. Each logical switch has one root
 device that is associated with the logical flow switch.";
        }

        leaf parent_id {
            type  string;
            description
                "Parent device id, in the device tree (for a root device, the parent_id
 is the logical_device.id)";
        }

        leaf parent_port_no {
            type  uint32;
            description
                "";
        }

        leaf vendor {
            type  string;
            description
                "Vendor, version, serial number, etc.";
        }

        leaf model {
            type  string;
            description
                "";
        }

        leaf hardware_version {
            type  string;
            description
                "";
        }

        leaf firmware_version {
            type  string;
            description
                "";
        }

        leaf software_version {
            type  string;
            description
                "";
        }

        leaf serial_number {
            type  string;
            description
                "";
        }

        leaf adapter {
            type  string;
            description
                "Addapter that takes care of device";
        }

        leaf vlan {
            type  uint32;
            description
                "Device contact on vlan (if 0, no vlan)";
        }

        container proxy_address {
            uses  ProxyAddress;
            description
                "";
        }

        leaf admin_state {
            type  AdminState;

            description
                "";
        }

        leaf oper_status {
            type  OperStatus;

            description
                "";
        }

        leaf reason {
            type  string;
            description
                "Used in FAILED state";
        }

        leaf connect_status {
            type  ConnectStatus;

            description
                "";
        }

        container custom {
            uses  Any;

            description
                "Device type specific attributes
TODO additional common attribute here";
        }

        list ports {
            key "port_no";
            uses  Port;

            description
                "";
        }

        container flows {
            uses  Flows;

            description
                "";
        }

        container flow_groups {
            uses  FlowGroups;

            description
                "";
        }

        container pm_configs {
            uses  PmConfigs;

            description
                "PmConfigs will eventually converted to a child node of the
 device to falicitata callbacks and to simplify manipulation.";
        }



        choice choice_0 {
            case mac_address {
                leaf mac_address {
                    type  string;
                    description
                        "Device contact MAC address (format:  xx:xx:xx:xx:xx:xx )";
                }
            }
            case ipv4_address {
                leaf ipv4_address {
                    type  string;
                    description
                        "Device contact IPv4 address (format:  a.b.c.d  or can use hostname too)";
                }
            }
            case ipv6_address {
                leaf ipv6_address {
                    type  string;
                    description
                        "Device contact IPv6 address using the canonical string form
 ( xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx )";
                }
            }
            case host_and_port {
                leaf host_and_port {
                    type  string;
                    description
                        "";
                }
            }
        }


    }

    grouping Devices {
        description
            "";
        list items {
            key "id";
            uses  Device;

            description
                "";
        }



    }


    grouping Empty {
        description
            "A generic empty message that you can re-use to avoid defining duplicated
 empty messages in your APIs. A typical example is to use it as the request
 or the response type of an API method. For instance:

     service Foo
       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);


 The JSON representation for `Empty` is empty JSON object `  `.";


    }


    grouping HealthStatus {
        description
            "Encode health status of a Voltha instance";
        leaf state {
            type  HealthState;
            description
                "Current state of health of this Voltha instance";
        }



        typedef HealthState {
            type enumeration {
                enum HEALTHY {
                    description "";
                }
                enum OVERLOADED {
                    description "";
                }
                enum DYING {
                    description "";
                }
            }
            description
                "Health states";
        }

    }

    grouping LogicalPort {
        description
            "";
        leaf id {
            type  string;
            description
                "";
        }

        container ofp_port {
            uses  ofp_port;

            description
                "";
        }

        leaf device_id {
            type  string;
            description
                "";
        }

        leaf device_port_no {
            type  uint32;
            description
                "";
        }

        leaf root_port {
            type  boolean;
            description
                "";
        }



    }

    grouping LogicalPorts {
        description
            "";
        list items {
            key "id";
            uses  LogicalPort;

            description
                "";
        }



    }

    grouping LogicalDevice {
        description
            "";
        leaf id {
            type  string;
            description
                "unique id of logical device";
        }

        leaf datapath_id {
            type  uint64;
            description
                "unique datapath id for the logical device (used by the SDN controller)";
        }

        container desc {
            uses  ofp_desc;

            description
                "device description";
        }

        container switch_features {
            uses  ofp_switch_features;

            description
                "device features";
        }

        leaf root_device_id {
            type  string;
            description
                "name of the root device anchoring logical device";
        }

        list ports {
            key "id";
            uses  LogicalPort;

            description
                "logical device ports";
        }

        container flows {
            uses  Flows;

            description
                "flows configured on the logical device";
        }

        container flow_groups {
            uses  FlowGroups;

            description
                "flow groups configured on the logical device";
        }



    }

    grouping LogicalDevices {
        description
            "";
        list items {
            key "id";
            uses  LogicalDevice;

            description
                "";
        }



    }


    typedef Access {
        type enumeration {
            enum CONFIG {
                description "";
            }
            enum READ_ONLY {
                description "";
            }
            enum REAL_TIME {
                description "";
            }
        }
        description
            "";
    }

    container ChildNode {
        description
            "";
        leaf key {
            type  string;
            description
                "";
        }



    }

    typedef ofp_port_no {
        type enumeration {
            enum OFPP_INVALID {
                description "";
            }
            enum OFPP_MAX {
                description "";
            }
            enum OFPP_IN_PORT {
                description "";
            }
            enum OFPP_TABLE {
                description "";
            }
            enum OFPP_NORMAL {
                description "";
            }
            enum OFPP_FLOOD {
                description "";
            }
            enum OFPP_ALL {
                description "";
            }
            enum OFPP_CONTROLLER {
                description "";
            }
            enum OFPP_LOCAL {
                description "";
            }
            enum OFPP_ANY {
                description "";
            }
        }
        description
            "Port numbering. Ports are numbered starting from 1.Version number:
 OpenFlow versions released: 0x01 = 1.0 ; 0x02 = 1.1 ; 0x03 = 1.2
     0x04 = 1.3
The most significant bit in the version field is reserved and must
 be set to zero.
#define OFP_VERSION   0x04
#define PIPELINE_TABLES 64
#define OFP_MAX_TABLE_NAME_LEN 32
#define OFP_MAX_PORT_NAME_LEN  16
Official IANA registered port for OpenFlow.#define OFP_TCP_PORT  6653
#define OFP_SSL_PORT  6653
#define OFP_ETH_ALEN 6             Bytes in an Ethernet address.   ";
    }
    typedef ofp_type {
        type enumeration {
            enum OFPT_HELLO {
                description "";
            }
            enum OFPT_ERROR {
                description "";
            }
            enum OFPT_ECHO_REQUEST {
                description "";
            }
            enum OFPT_ECHO_REPLY {
                description "";
            }
            enum OFPT_EXPERIMENTER {
                description "";
            }
            enum OFPT_FEATURES_REQUEST {
                description "";
            }
            enum OFPT_FEATURES_REPLY {
                description "";
            }
            enum OFPT_GET_CONFIG_REQUEST {
                description "";
            }
            enum OFPT_GET_CONFIG_REPLY {
                description "";
            }
            enum OFPT_SET_CONFIG {
                description "";
            }
            enum OFPT_PACKET_IN {
                description "";
            }
            enum OFPT_FLOW_REMOVED {
                description "";
            }
            enum OFPT_PORT_STATUS {
                description "";
            }
            enum OFPT_PACKET_OUT {
                description "";
            }
            enum OFPT_FLOW_MOD {
                description "";
            }
            enum OFPT_GROUP_MOD {
                description "";
            }
            enum OFPT_PORT_MOD {
                description "";
            }
            enum OFPT_TABLE_MOD {
                description "";
            }
            enum OFPT_MULTIPART_REQUEST {
                description "";
            }
            enum OFPT_MULTIPART_REPLY {
                description "";
            }
            enum OFPT_BARRIER_REQUEST {
                description "";
            }
            enum OFPT_BARRIER_REPLY {
                description "";
            }
            enum OFPT_QUEUE_GET_CONFIG_REQUEST {
                description "";
            }
            enum OFPT_QUEUE_GET_CONFIG_REPLY {
                description "";
            }
            enum OFPT_ROLE_REQUEST {
                description "";
            }
            enum OFPT_ROLE_REPLY {
                description "";
            }
            enum OFPT_GET_ASYNC_REQUEST {
                description "";
            }
            enum OFPT_GET_ASYNC_REPLY {
                description "";
            }
            enum OFPT_SET_ASYNC {
                description "";
            }
            enum OFPT_METER_MOD {
                description "";
            }
        }
        description
            "";
    }
    typedef ofp_hello_elem_type {
        type enumeration {
            enum OFPHET_INVALID {
                description "";
            }
            enum OFPHET_VERSIONBITMAP {
                description "";
            }
        }
        description
            "Hello elements types.";
    }
    typedef ofp_config_flags {
        type enumeration {
            enum OFPC_FRAG_NORMAL {
                description "";
            }
            enum OFPC_FRAG_DROP {
                description "";
            }
            enum OFPC_FRAG_REASM {
                description "";
            }
            enum OFPC_FRAG_MASK {
                description "";
            }
        }
        description
            "#define OFP_DEFAULT_MISS_SEND_LEN   128";
    }
    typedef ofp_table_config {
        type enumeration {
            enum OFPTC_INVALID {
                description "";
            }
            enum OFPTC_DEPRECATED_MASK {
                description "";
            }
        }
        description
            "Flags to configure the table. Reserved for future use.";
    }
    typedef ofp_table {
        type enumeration {
            enum OFPTT_INVALID {
                description "";
            }
            enum OFPTT_MAX {
                description "";
            }
            enum OFPTT_ALL {
                description "";
            }
        }
        description
            "Table numbering. Tables can use any number up to OFPT_MAX.";
    }
    typedef ofp_capabilities {
        type enumeration {
            enum OFPC_INVALID {
                description "";
            }
            enum OFPC_FLOW_STATS {
                description "";
            }
            enum OFPC_TABLE_STATS {
                description "";
            }
            enum OFPC_PORT_STATS {
                description "";
            }
            enum OFPC_GROUP_STATS {
                description "";
            }
            enum OFPC_IP_REASM {
                description "";
            }
            enum OFPC_QUEUE_STATS {
                description "";
            }
            enum OFPC_PORT_BLOCKED {
                description "";
            }
        }
        description
            "Capabilities supported by the datapath.";
    }
    typedef ofp_port_config {
        type enumeration {
            enum OFPPC_INVALID {
                description "";
            }
            enum OFPPC_PORT_DOWN {
                description "";
            }
            enum OFPPC_NO_RECV {
                description "";
            }
            enum OFPPC_NO_FWD {
                description "";
            }
            enum OFPPC_NO_PACKET_IN {
                description "";
            }
        }
        description
            "Flags to indicate behavior of the physical port.  These flags are
 used in ofp_port to describe the current configuration.  They are
 used in the ofp_port_mod message to configure the port's behavior.";
    }
    typedef ofp_port_state {
        type enumeration {
            enum OFPPS_INVALID {
                description "";
            }
            enum OFPPS_LINK_DOWN {
                description "";
            }
            enum OFPPS_BLOCKED {
                description "";
            }
            enum OFPPS_LIVE {
                description "";
            }
        }
        description
            "Current state of the physical port.  These are not configurable from
 the controller.";
    }
    typedef ofp_port_features {
        type enumeration {
            enum OFPPF_INVALID {
                description "";
            }
            enum OFPPF_10MB_HD {
                description "";
            }
            enum OFPPF_10MB_FD {
                description "";
            }
            enum OFPPF_100MB_HD {
                description "";
            }
            enum OFPPF_100MB_FD {
                description "";
            }
            enum OFPPF_1GB_HD {
                description "";
            }
            enum OFPPF_1GB_FD {
                description "";
            }
            enum OFPPF_10GB_FD {
                description "";
            }
            enum OFPPF_40GB_FD {
                description "";
            }
            enum OFPPF_100GB_FD {
                description "";
            }
            enum OFPPF_1TB_FD {
                description "";
            }
            enum OFPPF_OTHER {
                description "";
            }
            enum OFPPF_COPPER {
                description "";
            }
            enum OFPPF_FIBER {
                description "";
            }
            enum OFPPF_AUTONEG {
                description "";
            }
            enum OFPPF_PAUSE {
                description "";
            }
            enum OFPPF_PAUSE_ASYM {
                description "";
            }
        }
        description
            "Features of ports available in a datapath.";
    }
    typedef ofp_port_reason {
        type enumeration {
            enum OFPPR_ADD {
                description "";
            }
            enum OFPPR_DELETE {
                description "";
            }
            enum OFPPR_MODIFY {
                description "";
            }
        }
        description
            "What changed about the physical port";
    }
    typedef ofp_match_type {
        type enumeration {
            enum OFPMT_STANDARD {
                description "";
            }
            enum OFPMT_OXM {
                description "";
            }
        }
        description
            "The match type indicates the match structure (set of fields that compose the
 match) in use. The match type is placed in the type field at the beginning
 of all match structures. The  OpenFlow Extensible Match  type corresponds
 to OXM TLV format described below and must be supported by all OpenFlow
 switches. Extensions that define other match types may be published on the
 ONF wiki. Support for extensions is optional.
## -------------------------- #### OpenFlow Extensible Match. #### -------------------------- ##";
    }
    typedef ofp_oxm_class {
        type enumeration {
            enum OFPXMC_NXM_0 {
                description "";
            }
            enum OFPXMC_NXM_1 {
                description "";
            }
            enum OFPXMC_OPENFLOW_BASIC {
                description "";
            }
            enum OFPXMC_EXPERIMENTER {
                description "";
            }
        }
        description
            "OXM Class IDs.
 The high order bit differentiate reserved classes from member classes.
 Classes 0x0000 to 0x7FFF are member classes, allocated by ONF.
 Classes 0x8000 to 0xFFFE are reserved classes, reserved for standardisation.
Components of a OXM TLV header.
 Those macros are not valid for the experimenter class, macros for the
 experimenter class will depend on the experimenter header used.#define OXM_HEADER__(CLASS, FIELD, HASMASK, LENGTH)
    (((CLASS)    16) | ((FIELD)    9) | ((HASMASK)    8) | (LENGTH))
#define OXM_HEADER(CLASS, FIELD, LENGTH)
    OXM_HEADER__(CLASS, FIELD, 0, LENGTH)
#define OXM_HEADER_W(CLASS, FIELD, LENGTH)
    OXM_HEADER__(CLASS, FIELD, 1, (LENGTH)   2)
#define OXM_CLASS(HEADER) ((HEADER)    16)
#define OXM_FIELD(HEADER) (((HEADER)    9) &amp; 0x7f)
#define OXM_TYPE(HEADER) (((HEADER)    9) &amp; 0x7fffff)
#define OXM_HASMASK(HEADER) (((HEADER)    8) &amp; 1)
#define OXM_LENGTH(HEADER) ((HEADER) &amp; 0xff)

#define OXM_MAKE_WILD_HEADER(HEADER)
    OXM_HEADER_W(OXM_CLASS(HEADER), OXM_FIELD(HEADER), OXM_LENGTH(HEADER))";
    }
    typedef oxm_ofb_field_types {
        type enumeration {
            enum OFPXMT_OFB_IN_PORT {
                description "";
            }
            enum OFPXMT_OFB_IN_PHY_PORT {
                description "";
            }
            enum OFPXMT_OFB_METADATA {
                description "";
            }
            enum OFPXMT_OFB_ETH_DST {
                description "";
            }
            enum OFPXMT_OFB_ETH_SRC {
                description "";
            }
            enum OFPXMT_OFB_ETH_TYPE {
                description "";
            }
            enum OFPXMT_OFB_VLAN_VID {
                description "";
            }
            enum OFPXMT_OFB_VLAN_PCP {
                description "";
            }
            enum OFPXMT_OFB_IP_DSCP {
                description "";
            }
            enum OFPXMT_OFB_IP_ECN {
                description "";
            }
            enum OFPXMT_OFB_IP_PROTO {
                description "";
            }
            enum OFPXMT_OFB_IPV4_SRC {
                description "";
            }
            enum OFPXMT_OFB_IPV4_DST {
                description "";
            }
            enum OFPXMT_OFB_TCP_SRC {
                description "";
            }
            enum OFPXMT_OFB_TCP_DST {
                description "";
            }
            enum OFPXMT_OFB_UDP_SRC {
                description "";
            }
            enum OFPXMT_OFB_UDP_DST {
                description "";
            }
            enum OFPXMT_OFB_SCTP_SRC {
                description "";
            }
            enum OFPXMT_OFB_SCTP_DST {
                description "";
            }
            enum OFPXMT_OFB_ICMPV4_TYPE {
                description "";
            }
            enum OFPXMT_OFB_ICMPV4_CODE {
                description "";
            }
            enum OFPXMT_OFB_ARP_OP {
                description "";
            }
            enum OFPXMT_OFB_ARP_SPA {
                description "";
            }
            enum OFPXMT_OFB_ARP_TPA {
                description "";
            }
            enum OFPXMT_OFB_ARP_SHA {
                description "";
            }
            enum OFPXMT_OFB_ARP_THA {
                description "";
            }
            enum OFPXMT_OFB_IPV6_SRC {
                description "";
            }
            enum OFPXMT_OFB_IPV6_DST {
                description "";
            }
            enum OFPXMT_OFB_IPV6_FLABEL {
                description "";
            }
            enum OFPXMT_OFB_ICMPV6_TYPE {
                description "";
            }
            enum OFPXMT_OFB_ICMPV6_CODE {
                description "";
            }
            enum OFPXMT_OFB_IPV6_ND_TARGET {
                description "";
            }
            enum OFPXMT_OFB_IPV6_ND_SLL {
                description "";
            }
            enum OFPXMT_OFB_IPV6_ND_TLL {
                description "";
            }
            enum OFPXMT_OFB_MPLS_LABEL {
                description "";
            }
            enum OFPXMT_OFB_MPLS_TC {
                description "";
            }
            enum OFPXMT_OFB_MPLS_BOS {
                description "";
            }
            enum OFPXMT_OFB_PBB_ISID {
                description "";
            }
            enum OFPXMT_OFB_TUNNEL_ID {
                description "";
            }
            enum OFPXMT_OFB_IPV6_EXTHDR {
                description "";
            }
        }
        description
            "OXM Flow field types for OpenFlow basic class.";
    }
    typedef ofp_vlan_id {
        type enumeration {
            enum OFPVID_NONE {
                description "";
            }
            enum OFPVID_PRESENT {
                description "";
            }
        }
        description
            "The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
 special conditions.";
    }
    typedef ofp_ipv6exthdr_flags {
        type enumeration {
            enum OFPIEH_INVALID {
                description "";
            }
            enum OFPIEH_NONEXT {
                description "";
            }
            enum OFPIEH_ESP {
                description "";
            }
            enum OFPIEH_AUTH {
                description "";
            }
            enum OFPIEH_DEST {
                description "";
            }
            enum OFPIEH_FRAG {
                description "";
            }
            enum OFPIEH_ROUTER {
                description "";
            }
            enum OFPIEH_HOP {
                description "";
            }
            enum OFPIEH_UNREP {
                description "";
            }
            enum OFPIEH_UNSEQ {
                description "";
            }
        }
        description
            "Bit definitions for IPv6 Extension Header pseudo-field.#define OFP_VLAN_NONE      OFPVID_NONE";
    }
    typedef ofp_action_type {
        type enumeration {
            enum OFPAT_OUTPUT {
                description "";
            }
            enum OFPAT_COPY_TTL_OUT {
                description "";
            }
            enum OFPAT_COPY_TTL_IN {
                description "";
            }
            enum OFPAT_SET_MPLS_TTL {
                description "";
            }
            enum OFPAT_DEC_MPLS_TTL {
                description "";
            }
            enum OFPAT_PUSH_VLAN {
                description "";
            }
            enum OFPAT_POP_VLAN {
                description "";
            }
            enum OFPAT_PUSH_MPLS {
                description "";
            }
            enum OFPAT_POP_MPLS {
                description "";
            }
            enum OFPAT_SET_QUEUE {
                description "";
            }
            enum OFPAT_GROUP {
                description "";
            }
            enum OFPAT_SET_NW_TTL {
                description "";
            }
            enum OFPAT_DEC_NW_TTL {
                description "";
            }
            enum OFPAT_SET_FIELD {
                description "";
            }
            enum OFPAT_PUSH_PBB {
                description "";
            }
            enum OFPAT_POP_PBB {
                description "";
            }
            enum OFPAT_EXPERIMENTER {
                description "";
            }
        }
        description
            "## ----------------- #### OpenFlow Actions. #### ----------------- ##";
    }
    typedef ofp_controller_max_len {
        type enumeration {
            enum OFPCML_INVALID {
                description "";
            }
            enum OFPCML_MAX {
                description "";
            }
            enum OFPCML_NO_BUFFER {
                description "";
            }
        }
        description
            "";
    }
    typedef ofp_instruction_type {
        type enumeration {
            enum OFPIT_INVALID {
                description "";
            }
            enum OFPIT_GOTO_TABLE {
                description "";
            }
            enum OFPIT_WRITE_METADATA {
                description "";
            }
            enum OFPIT_WRITE_ACTIONS {
                description "";
            }
            enum OFPIT_APPLY_ACTIONS {
                description "";
            }
            enum OFPIT_CLEAR_ACTIONS {
                description "";
            }
            enum OFPIT_METER {
                description "";
            }
            enum OFPIT_EXPERIMENTER {
                description "";
            }
        }
        description
            "## ---------------------- #### OpenFlow Instructions. #### ---------------------- ##";
    }
    typedef ofp_flow_mod_command {
        type enumeration {
            enum OFPFC_ADD {
                description "";
            }
            enum OFPFC_MODIFY {
                description "";
            }
            enum OFPFC_MODIFY_STRICT {
                description "";
            }
            enum OFPFC_DELETE {
                description "";
            }
            enum OFPFC_DELETE_STRICT {
                description "";
            }
        }
        description
            "## --------------------------- #### OpenFlow Flow Modification. #### --------------------------- ##";
    }
    typedef ofp_flow_mod_flags {
        type enumeration {
            enum OFPFF_INVALID {
                description "";
            }
            enum OFPFF_SEND_FLOW_REM {
                description "";
            }
            enum OFPFF_CHECK_OVERLAP {
                description "";
            }
            enum OFPFF_RESET_COUNTS {
                description "";
            }
            enum OFPFF_NO_PKT_COUNTS {
                description "";
            }
            enum OFPFF_NO_BYT_COUNTS {
                description "";
            }
        }
        description
            "Value used in  idle_timeout  and  hard_timeout  to indicate that the entry
 is permanent.#define OFP_FLOW_PERMANENT 0
By default, choose a priority in the middle.#define OFP_DEFAULT_PRIORITY 0x8000";
    }
    typedef ofp_group {
        type enumeration {
            enum OFPG_INVALID {
                description "";
            }
            enum OFPG_MAX {
                description "";
            }
            enum OFPG_ALL {
                description "";
            }
            enum OFPG_ANY {
                description "";
            }
        }
        description
            "Group numbering. Groups can use any number up to OFPG_MAX.";
    }
    typedef ofp_group_mod_command {
        type enumeration {
            enum OFPGC_ADD {
                description "";
            }
            enum OFPGC_MODIFY {
                description "";
            }
            enum OFPGC_DELETE {
                description "";
            }
        }
        description
            "Group commands";
    }
    typedef ofp_group_type {
        type enumeration {
            enum OFPGT_ALL {
                description "";
            }
            enum OFPGT_SELECT {
                description "";
            }
            enum OFPGT_INDIRECT {
                description "";
            }
            enum OFPGT_FF {
                description "";
            }
        }
        description
            "Group types.  Values in the range  128; 255  are reserved for experimental
 use.";
    }
    typedef ofp_packet_in_reason {
        type enumeration {
            enum OFPR_NO_MATCH {
                description "";
            }
            enum OFPR_ACTION {
                description "";
            }
            enum OFPR_INVALID_TTL {
                description "";
            }
        }
        description
            "Why is this packet being sent to the controller?";
    }
    typedef ofp_flow_removed_reason {
        type enumeration {
            enum OFPRR_IDLE_TIMEOUT {
                description "";
            }
            enum OFPRR_HARD_TIMEOUT {
                description "";
            }
            enum OFPRR_DELETE {
                description "";
            }
            enum OFPRR_GROUP_DELETE {
                description "";
            }
            enum OFPRR_METER_DELETE {
                description "";
            }
        }
        description
            "Why was this flow removed?";
    }
    typedef ofp_meter {
        type enumeration {
            enum OFPM_ZERO {
                description "";
            }
            enum OFPM_MAX {
                description "";
            }
            enum OFPM_SLOWPATH {
                description "";
            }
            enum OFPM_CONTROLLER {
                description "";
            }
            enum OFPM_ALL {
                description "";
            }
        }
        description
            "Meter numbering. Flow meters can use any number up to OFPM_MAX.";
    }
    typedef ofp_meter_band_type {
        type enumeration {
            enum OFPMBT_INVALID {
                description "";
            }
            enum OFPMBT_DROP {
                description "";
            }
            enum OFPMBT_DSCP_REMARK {
                description "";
            }
            enum OFPMBT_EXPERIMENTER {
                description "";
            }
        }
        description
            "Meter band types";
    }
    typedef ofp_meter_mod_command {
        type enumeration {
            enum OFPMC_ADD {
                description "";
            }
            enum OFPMC_MODIFY {
                description "";
            }
            enum OFPMC_DELETE {
                description "";
            }
        }
        description
            "Meter commands";
    }
    typedef ofp_meter_flags {
        type enumeration {
            enum OFPMF_INVALID {
                description "";
            }
            enum OFPMF_KBPS {
                description "";
            }
            enum OFPMF_PKTPS {
                description "";
            }
            enum OFPMF_BURST {
                description "";
            }
            enum OFPMF_STATS {
                description "";
            }
        }
        description
            "Meter configuration flags";
    }
    typedef ofp_error_type {
        type enumeration {
            enum OFPET_HELLO_FAILED {
                description "";
            }
            enum OFPET_BAD_REQUEST {
                description "";
            }
            enum OFPET_BAD_ACTION {
                description "";
            }
            enum OFPET_BAD_INSTRUCTION {
                description "";
            }
            enum OFPET_BAD_MATCH {
                description "";
            }
            enum OFPET_FLOW_MOD_FAILED {
                description "";
            }
            enum OFPET_GROUP_MOD_FAILED {
                description "";
            }
            enum OFPET_PORT_MOD_FAILED {
                description "";
            }
            enum OFPET_TABLE_MOD_FAILED {
                description "";
            }
            enum OFPET_QUEUE_OP_FAILED {
                description "";
            }
            enum OFPET_SWITCH_CONFIG_FAILED {
                description "";
            }
            enum OFPET_ROLE_REQUEST_FAILED {
                description "";
            }
            enum OFPET_METER_MOD_FAILED {
                description "";
            }
            enum OFPET_TABLE_FEATURES_FAILED {
                description "";
            }
            enum OFPET_EXPERIMENTER {
                description "";
            }
        }
        description
            "Values for 'type' in ofp_error_message.  These values are immutable: they
 will not change in future versions of the protocol (although new values may
 be added).";
    }
    typedef ofp_hello_failed_code {
        type enumeration {
            enum OFPHFC_INCOMPATIBLE {
                description "";
            }
            enum OFPHFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
 ASCII text string that may give failure details.";
    }
    typedef ofp_bad_request_code {
        type enumeration {
            enum OFPBRC_BAD_VERSION {
                description "";
            }
            enum OFPBRC_BAD_TYPE {
                description "";
            }
            enum OFPBRC_BAD_MULTIPART {
                description "";
            }
            enum OFPBRC_BAD_EXPERIMENTER {
                description "";
            }
            enum OFPBRC_BAD_EXP_TYPE {
                description "";
            }
            enum OFPBRC_EPERM {
                description "";
            }
            enum OFPBRC_BAD_LEN {
                description "";
            }
            enum OFPBRC_BUFFER_EMPTY {
                description "";
            }
            enum OFPBRC_BUFFER_UNKNOWN {
                description "";
            }
            enum OFPBRC_BAD_TABLE_ID {
                description "";
            }
            enum OFPBRC_IS_SLAVE {
                description "";
            }
            enum OFPBRC_BAD_PORT {
                description "";
            }
            enum OFPBRC_BAD_PACKET {
                description "";
            }
            enum OFPBRC_MULTIPART_BUFFER_OVERFLOW {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
 the first 64 bytes of the failed request.";
    }
    typedef ofp_bad_action_code {
        type enumeration {
            enum OFPBAC_BAD_TYPE {
                description "";
            }
            enum OFPBAC_BAD_LEN {
                description "";
            }
            enum OFPBAC_BAD_EXPERIMENTER {
                description "";
            }
            enum OFPBAC_BAD_EXP_TYPE {
                description "";
            }
            enum OFPBAC_BAD_OUT_PORT {
                description "";
            }
            enum OFPBAC_BAD_ARGUMENT {
                description "";
            }
            enum OFPBAC_EPERM {
                description "";
            }
            enum OFPBAC_TOO_MANY {
                description "";
            }
            enum OFPBAC_BAD_QUEUE {
                description "";
            }
            enum OFPBAC_BAD_OUT_GROUP {
                description "";
            }
            enum OFPBAC_MATCH_INCONSISTENT {
                description "";
            }
            enum OFPBAC_UNSUPPORTED_ORDER {
                description "";
            }
            enum OFPBAC_BAD_TAG {
                description "";
            }
            enum OFPBAC_BAD_SET_TYPE {
                description "";
            }
            enum OFPBAC_BAD_SET_LEN {
                description "";
            }
            enum OFPBAC_BAD_SET_ARGUMENT {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
 the first 64 bytes of the failed request.";
    }
    typedef ofp_bad_instruction_code {
        type enumeration {
            enum OFPBIC_UNKNOWN_INST {
                description "";
            }
            enum OFPBIC_UNSUP_INST {
                description "";
            }
            enum OFPBIC_BAD_TABLE_ID {
                description "";
            }
            enum OFPBIC_UNSUP_METADATA {
                description "";
            }
            enum OFPBIC_UNSUP_METADATA_MASK {
                description "";
            }
            enum OFPBIC_BAD_EXPERIMENTER {
                description "";
            }
            enum OFPBIC_BAD_EXP_TYPE {
                description "";
            }
            enum OFPBIC_BAD_LEN {
                description "";
            }
            enum OFPBIC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at
 least the first 64 bytes of the failed request.";
    }
    typedef ofp_bad_match_code {
        type enumeration {
            enum OFPBMC_BAD_TYPE {
                description "";
            }
            enum OFPBMC_BAD_LEN {
                description "";
            }
            enum OFPBMC_BAD_TAG {
                description "";
            }
            enum OFPBMC_BAD_DL_ADDR_MASK {
                description "";
            }
            enum OFPBMC_BAD_NW_ADDR_MASK {
                description "";
            }
            enum OFPBMC_BAD_WILDCARDS {
                description "";
            }
            enum OFPBMC_BAD_FIELD {
                description "";
            }
            enum OFPBMC_BAD_VALUE {
                description "";
            }
            enum OFPBMC_BAD_MASK {
                description "";
            }
            enum OFPBMC_BAD_PREREQ {
                description "";
            }
            enum OFPBMC_DUP_FIELD {
                description "";
            }
            enum OFPBMC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
 the first 64 bytes of the failed request.";
    }
    typedef ofp_flow_mod_failed_code {
        type enumeration {
            enum OFPFMFC_UNKNOWN {
                description "";
            }
            enum OFPFMFC_TABLE_FULL {
                description "";
            }
            enum OFPFMFC_BAD_TABLE_ID {
                description "";
            }
            enum OFPFMFC_OVERLAP {
                description "";
            }
            enum OFPFMFC_EPERM {
                description "";
            }
            enum OFPFMFC_BAD_TIMEOUT {
                description "";
            }
            enum OFPFMFC_BAD_COMMAND {
                description "";
            }
            enum OFPFMFC_BAD_FLAGS {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_group_mod_failed_code {
        type enumeration {
            enum OFPGMFC_GROUP_EXISTS {
                description "";
            }
            enum OFPGMFC_INVALID_GROUP {
                description "";
            }
            enum OFPGMFC_WEIGHT_UNSUPPORTED {
                description "";
            }
            enum OFPGMFC_OUT_OF_GROUPS {
                description "";
            }
            enum OFPGMFC_OUT_OF_BUCKETS {
                description "";
            }
            enum OFPGMFC_CHAINING_UNSUPPORTED {
                description "";
            }
            enum OFPGMFC_WATCH_UNSUPPORTED {
                description "";
            }
            enum OFPGMFC_LOOP {
                description "";
            }
            enum OFPGMFC_UNKNOWN_GROUP {
                description "";
            }
            enum OFPGMFC_CHAINED_GROUP {
                description "";
            }
            enum OFPGMFC_BAD_TYPE {
                description "";
            }
            enum OFPGMFC_BAD_COMMAND {
                description "";
            }
            enum OFPGMFC_BAD_BUCKET {
                description "";
            }
            enum OFPGMFC_BAD_WATCH {
                description "";
            }
            enum OFPGMFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_port_mod_failed_code {
        type enumeration {
            enum OFPPMFC_BAD_PORT {
                description "";
            }
            enum OFPPMFC_BAD_HW_ADDR {
                description "";
            }
            enum OFPPMFC_BAD_CONFIG {
                description "";
            }
            enum OFPPMFC_BAD_ADVERTISE {
                description "";
            }
            enum OFPPMFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_table_mod_failed_code {
        type enumeration {
            enum OFPTMFC_BAD_TABLE {
                description "";
            }
            enum OFPTMFC_BAD_CONFIG {
                description "";
            }
            enum OFPTMFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_queue_op_failed_code {
        type enumeration {
            enum OFPQOFC_BAD_PORT {
                description "";
            }
            enum OFPQOFC_BAD_QUEUE {
                description "";
            }
            enum OFPQOFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
 at least the first 64 bytes of the failed request";
    }
    typedef ofp_switch_config_failed_code {
        type enumeration {
            enum OFPSCFC_BAD_FLAGS {
                description "";
            }
            enum OFPSCFC_BAD_LEN {
                description "";
            }
            enum OFPSCFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_role_request_failed_code {
        type enumeration {
            enum OFPRRFC_STALE {
                description "";
            }
            enum OFPRRFC_UNSUP {
                description "";
            }
            enum OFPRRFC_BAD_ROLE {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_ROLE_REQUEST_FAILED. 'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_meter_mod_failed_code {
        type enumeration {
            enum OFPMMFC_UNKNOWN {
                description "";
            }
            enum OFPMMFC_METER_EXISTS {
                description "";
            }
            enum OFPMMFC_INVALID_METER {
                description "";
            }
            enum OFPMMFC_UNKNOWN_METER {
                description "";
            }
            enum OFPMMFC_BAD_COMMAND {
                description "";
            }
            enum OFPMMFC_BAD_FLAGS {
                description "";
            }
            enum OFPMMFC_BAD_RATE {
                description "";
            }
            enum OFPMMFC_BAD_BURST {
                description "";
            }
            enum OFPMMFC_BAD_BAND {
                description "";
            }
            enum OFPMMFC_BAD_BAND_VALUE {
                description "";
            }
            enum OFPMMFC_OUT_OF_METERS {
                description "";
            }
            enum OFPMMFC_OUT_OF_BANDS {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_METER_MOD_FAILED.  'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_table_features_failed_code {
        type enumeration {
            enum OFPTFFC_BAD_TABLE {
                description "";
            }
            enum OFPTFFC_BAD_METADATA {
                description "";
            }
            enum OFPTFFC_BAD_TYPE {
                description "";
            }
            enum OFPTFFC_BAD_LEN {
                description "";
            }
            enum OFPTFFC_BAD_ARGUMENT {
                description "";
            }
            enum OFPTFFC_EPERM {
                description "";
            }
        }
        description
            "ofp_error_msg 'code' values for OFPET_TABLE_FEATURES_FAILED. 'data' contains
 at least the first 64 bytes of the failed request.";
    }
    typedef ofp_multipart_type {
        type enumeration {
            enum OFPMP_DESC {
                description "";
            }
            enum OFPMP_FLOW {
                description "";
            }
            enum OFPMP_AGGREGATE {
                description "";
            }
            enum OFPMP_TABLE {
                description "";
            }
            enum OFPMP_PORT_STATS {
                description "";
            }
            enum OFPMP_QUEUE {
                description "";
            }
            enum OFPMP_GROUP {
                description "";
            }
            enum OFPMP_GROUP_DESC {
                description "";
            }
            enum OFPMP_GROUP_FEATURES {
                description "";
            }
            enum OFPMP_METER {
                description "";
            }
            enum OFPMP_METER_CONFIG {
                description "";
            }
            enum OFPMP_METER_FEATURES {
                description "";
            }
            enum OFPMP_TABLE_FEATURES {
                description "";
            }
            enum OFPMP_PORT_DESC {
                description "";
            }
            enum OFPMP_EXPERIMENTER {
                description "";
            }
        }
        description
            "";
    }
    typedef ofp_multipart_request_flags {
        type enumeration {
            enum OFPMPF_REQ_INVALID {
                description "";
            }
            enum OFPMPF_REQ_MORE {
                description "";
            }
        }
        description
            "Backward compatibility with 1.3.1 - avoid breaking the API.#define ofp_multipart_types ofp_multipart_type";
    }
    typedef ofp_multipart_reply_flags {
        type enumeration {
            enum OFPMPF_REPLY_INVALID {
                description "";
            }
            enum OFPMPF_REPLY_MORE {
                description "";
            }
        }
        description
            "";
    }
    typedef ofp_table_feature_prop_type {
        type enumeration {
            enum OFPTFPT_INSTRUCTIONS {
                description "";
            }
            enum OFPTFPT_INSTRUCTIONS_MISS {
                description "";
            }
            enum OFPTFPT_NEXT_TABLES {
                description "";
            }
            enum OFPTFPT_NEXT_TABLES_MISS {
                description "";
            }
            enum OFPTFPT_WRITE_ACTIONS {
                description "";
            }
            enum OFPTFPT_WRITE_ACTIONS_MISS {
                description "";
            }
            enum OFPTFPT_APPLY_ACTIONS {
                description "";
            }
            enum OFPTFPT_APPLY_ACTIONS_MISS {
                description "";
            }
            enum OFPTFPT_MATCH {
                description "";
            }
            enum OFPTFPT_WILDCARDS {
                description "";
            }
            enum OFPTFPT_WRITE_SETFIELD {
                description "";
            }
            enum OFPTFPT_WRITE_SETFIELD_MISS {
                description "";
            }
            enum OFPTFPT_APPLY_SETFIELD {
                description "";
            }
            enum OFPTFPT_APPLY_SETFIELD_MISS {
                description "";
            }
            enum OFPTFPT_EXPERIMENTER {
                description "";
            }
            enum OFPTFPT_EXPERIMENTER_MISS {
                description "";
            }
        }
        description
            "Table Feature property types.
 Low order bit cleared indicates a property for a regular Flow Entry.
 Low order bit set indicates a property for the Table-Miss Flow Entry.";
    }
    typedef ofp_group_capabilities {
        type enumeration {
            enum OFPGFC_INVALID {
                description "";
            }
            enum OFPGFC_SELECT_WEIGHT {
                description "";
            }
            enum OFPGFC_SELECT_LIVENESS {
                description "";
            }
            enum OFPGFC_CHAINING {
                description "";
            }
            enum OFPGFC_CHAINING_CHECKS {
                description "";
            }
        }
        description
            "Group configuration flagsBackward compatibility with 1.3.1 - avoid breaking the API.#define ofp_group_desc_stats ofp_group_desc";
    }
    typedef ofp_queue_properties {
        type enumeration {
            enum OFPQT_INVALID {
                description "";
            }
            enum OFPQT_MIN_RATE {
                description "";
            }
            enum OFPQT_MAX_RATE {
                description "";
            }
            enum OFPQT_EXPERIMENTER {
                description "";
            }
        }
        description
            "All ones is used to indicate all queues in a port (for stats retrieval).#define OFPQ_ALL      0xffffffff
Min rate   1000 means not configured.#define OFPQ_MIN_RATE_UNCFG      0xffff
Max rate   1000 means not configured.#define OFPQ_MAX_RATE_UNCFG      0xffff";
    }
    typedef ofp_controller_role {
        type enumeration {
            enum OFPCR_ROLE_NOCHANGE {
                description "";
            }
            enum OFPCR_ROLE_EQUAL {
                description "";
            }
            enum OFPCR_ROLE_MASTER {
                description "";
            }
            enum OFPCR_ROLE_SLAVE {
                description "";
            }
        }
        description
            "Controller roles.Configures the  role  of the sending controller.  The default role is:

    - Equal (OFPCR_ROLE_EQUAL), which allows the controller access to all
      OpenFlow features. All controllers have equal responsibility.

 The other possible roles are a related pair:

    - Master (OFPCR_ROLE_MASTER) is equivalent to Equal, except that there
      may be at most one Master controller at a time: when a controller
      configures itself as Master, any existing Master is demoted to the
      Slave role.

    - Slave (OFPCR_ROLE_SLAVE) allows the controller read-only access to
      OpenFlow features.  In particular attempts to modify the flow table
      will be rejected with an OFPBRC_EPERM error.

      Slave controllers do not receive OFPT_PACKET_IN or OFPT_FLOW_REMOVED
      messages, but they do receive OFPT_PORT_STATUS messages.";
    }

    container ofp_header {
        description
            "Header on all OpenFlow packets.";
        leaf version {
            type  uint32;
            description
                "OFP_VERSION.";
        }

        leaf type {
            type  ofp_type;

            description
                "One of the OFPT_ constants.";
        }

        leaf xid {
            type  uint32;
            description
                "Transaction id associated with this packet.
Replies use the same id as was in the request
to facilitate pairing.";
        }



    }

    grouping ofp_hello_elem_header {
        description
            "Common header for all Hello Elements";
        leaf type {
            type  ofp_hello_elem_type;

            description
                "One of OFPHET_ .";
        }



        choice choice_0 {
            case versionbitmap {
                container versionbitmap {
                    uses  ofp_hello_elem_versionbitmap;

                    description
                        "";
                }
            }
        }


    }

    grouping ofp_hello_elem_versionbitmap {
        description
            "Version bitmap Hello Element";
        list bitmaps {
            key "bitmaps";
            leaf bitmaps {
                type  uint32;
                description
                    "List of bitmaps - supported versions";
            }
            description
                "List of bitmaps - supported versions";
        }



    }

    container ofp_hello {
        description
            "OFPT_HELLO.  This message includes zero or more hello elements having
 variable size. Unknown elements types must be ignored skipped, to allow
 for future extensions.ofp_header header;";
        list elements {
            key "type";
            uses  ofp_hello_elem_header;

            description
                "Hello element list0 or more";
        }



    }

    container ofp_switch_config {
        description
            "Switch configuration.";
        leaf flags {
            type  uint32;
            description
                "ofp_header header;
Bitmap of OFPC_  flags.";
        }

        leaf miss_send_len {
            type  uint32;
            description
                "Max bytes of packet that datapath
should send to the controller. See
ofp_controller_max_len for valid values.";
        }



    }

    container ofp_table_mod {
        description
            "Configure Modify behavior of a flow table";
        leaf table_id {
            type  uint32;
            description
                "ofp_header header;
ID of the table, OFPTT_ALL indicates all tables";
        }

        leaf config {
            type  uint32;
            description
                "Bitmap of OFPTC_  flags";
        }



    }

    grouping ofp_port {
        description
            "Description of a port";
        leaf port_no {
            type  uint32;
            description
                "";
        }

        list hw_addr {
            key "hw_addr";
            leaf hw_addr {
                type  uint32;
                description
                    " OFP_ETH_ALEN ;";
            }
            description
                " OFP_ETH_ALEN ;";
        }

        leaf name {
            type  string;
            description
                "Null-terminated";
        }

        leaf config {
            type  uint32;
            description
                "Bitmap of OFPPC_  flags.";
        }

        leaf state {
            type  uint32;
            description
                "Bitmap of OFPPS_  flags.";
        }

        leaf curr {
            type  uint32;
            description
                "Bitmaps of OFPPF_  that describe features.  All bits zeroed if
 unsupported or unavailable.Current features.";
        }

        leaf advertised {
            type  uint32;
            description
                "Features being advertised by the port.";
        }

        leaf supported {
            type  uint32;
            description
                "Features supported by the port.";
        }

        leaf peer {
            type  uint32;
            description
                "Features advertised by peer.";
        }

        leaf curr_speed {
            type  uint32;
            description
                "Current port bitrate in kbps.";
        }

        leaf max_speed {
            type  uint32;
            description
                "Max port bitrate in kbps";
        }



    }

    grouping ofp_switch_features {
        description
            "Switch features.";
        leaf datapath_id {
            type  uint64;
            description
                "ofp_header header;
Datapath unique ID.  The lower 48-bits are for
a MAC address, while the upper 16-bits are
implementer-defined.";
        }

        leaf n_buffers {
            type  uint32;
            description
                "Max packets buffered at once.";
        }

        leaf n_tables {
            type  uint32;
            description
                "Number of tables supported by datapath.";
        }

        leaf auxiliary_id {
            type  uint32;
            description
                "Identify auxiliary connections";
        }

        leaf capabilities {
            type  uint32;
            description
                "Features.Bitmap of support  ofp_capabilities .";
        }



    }

    grouping ofp_port_status {
        description
            "A physical port has changed in the datapath";
        leaf reason {
            type  ofp_port_reason;

            description
                "ofp_header header;
One of OFPPR_ .";
        }

        container desc {
            uses  ofp_port;

            description
                "";
        }



    }

    container ofp_port_mod {
        description
            "Modify behavior of the physical port";
        leaf port_no {
            type  uint32;
            description
                "ofp_header header;";
        }

        list hw_addr {
            key "hw_addr";
            leaf hw_addr {
                type  uint32;
                description
                    " OFP_ETH_ALEN ;";
            }
            description
                " OFP_ETH_ALEN ;";
        }

        leaf config {
            type  uint32;
            description
                "The hardware address is not
configurable.  This is used to
sanity-check the request, so it must
be the same as returned in an
ofp_port struct.Bitmap of OFPPC_  flags.";
        }

        leaf mask {
            type  uint32;
            description
                "Bitmap of OFPPC_  flags to be changed.";
        }

        leaf advertise {
            type  uint32;
            description
                "Bitmap of OFPPF_ .  Zero all bits to prevent
any action taking place.";
        }



    }

    grouping ofp_match {
        description
            "Fields to match against flows";
        leaf type {
            type  ofp_match_type;

            description
                "One of OFPMT_ ";
        }

        list oxm_fields {
            key "oxm_class";
            uses  ofp_oxm_field;

            description
                "0 or more";
        }



    }

    grouping ofp_oxm_field {
        description
            "OXM Flow match fields";
        leaf oxm_class {
            type  ofp_oxm_class;

            description
                "";
        }



        choice choice_0 {
            case ofb_field {
                container ofb_field {
                    uses  ofp_oxm_ofb_field;

                    description
                        "2 and 3 reserved for NXM_0 and NXM-1 OXM classes";
                }
            }
            case experimenter_field {
                container experimenter_field {
                    uses  ofp_oxm_experimenter_field;

                    description
                        "";
                }
            }
        }


    }

    grouping ofp_oxm_ofb_field {
        description
            "OXM OpenFlow Basic Match Field";
        leaf type {
            type  oxm_ofb_field_types;

            description
                "";
        }

        leaf has_mask {
            type  boolean;
            description
                "";
        }



        choice choice_0 {
            case port {
                leaf port {
                    type  uint32;
                    description
                        "#define OXM_OF_IN_PORT    OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PORT, 4)
Used for OFPXMT_OFB_IN_PORTOpenFlow port on which the packet was received.
 May be a physical port, a logical port, or the reserved port OFPP_LOCAL

 Prereqs: None.

 Format: 32-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case physical_port {
                leaf physical_port {
                    type  uint32;
                    description
                        "#define OXM_OF_IN_PHY_PORT OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PHY_PORT, 4)
Used for OFPXMT_OF_IN_PHY_PORTPhysical port on which the packet was received.

 Consider a packet received on a tunnel interface defined over a link
 aggregation group (LAG) with two physical port members.  If the tunnel
 interface is the logical port bound to OpenFlow.  In this case,
 OFPXMT_OF_IN_PORT is the tunnel's port number and OFPXMT_OF_IN_PHY_PORT is
 the physical port number of the LAG on which the tunnel is configured.

 When a packet is received directly on a physical port and not processed by a
 logical port, OFPXMT_OF_IN_PORT and OFPXMT_OF_IN_PHY_PORT have the same
 value.

 This field is usually not available in a regular match and only available
 in ofp_packet_in messages when it's different from OXM_OF_IN_PORT.

 Prereqs: OXM_OF_IN_PORT must be present.

 Format: 32-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case table_metadata {
                leaf table_metadata {
                    type  uint64;
                    description
                        "#define OXM_OF_METADATA   OXM_HEADER  (0x8000, OFPXMT_OFB_METADATA, 8)
#define OXM_OF_METADATA_W OXM_HEADER_W(0x8000, OFPXMT_OFB_METADATA, 8)
Used for OFPXMT_OFB_METADATATable metadata.

 Prereqs: None.

 Format: 64-bit integer in network byte order.

 Masking: Arbitrary masks.";
                }
            }
            case eth_dst {
                leaf eth_dst {
                    type  binary;
                    description
                        "#define OXM_OF_ETH_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_DST, 6)
#define OXM_OF_ETH_DST_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ETH_DST, 6)
#define OXM_OF_ETH_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_SRC, 6)
#define OXM_OF_ETH_SRC_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ETH_SRC, 6)
Used for OFPXMT_OFB_ETH_DST (exactly 6 bytes)Source or destination address in Ethernet header.

 Prereqs: None.

 Format: 48-bit Ethernet MAC address.

 Masking: Arbitrary masks.";
                }
            }
            case eth_src {
                leaf eth_src {
                    type  binary;
                    description
                        "Used for OFPXMT_OFB_ETH_SRC (exactly 6 bytes)";
                }
            }
            case eth_type {
                leaf eth_type {
                    type  uint32;
                    description
                        "#define OXM_OF_ETH_TYPE   OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_TYPE,2)
Used for OFPXMT_OFB_ETH_TYPEPacket's Ethernet type.

 Prereqs: None.

 Format: 16-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case vlan_vid {
                leaf vlan_vid {
                    type  uint32;
                    description
                        "#define OXM_OF_VLAN_VID   OXM_HEADER  (0x8000, OFPXMT_OFB_VLAN_VID, 2)
#define OXM_OF_VLAN_VID_W OXM_HEADER_W(0x8000, OFPXMT_OFB_VLAN_VID, 2)
Used for OFPXMT_OFB_VLAN_VID802.1Q VID.

 For a packet with an 802.1Q header, this is the VLAN-ID (VID) from the
 outermost tag, with the CFI bit forced to 1. For a packet with no 802.1Q
 header, this has value OFPVID_NONE.

 Prereqs: None.

 Format: 16-bit integer in network byte order with bit 13 indicating
 presence of VLAN header and 3 most-significant bits forced to 0.
 Only the lower 13 bits have meaning.

 Masking: Arbitrary masks.

 This field can be used in various ways:

   - If it is not constrained at all, the nx_match matches packets without
     an 802.1Q header or with an 802.1Q header that has any VID value.

   - Testing for an exact match with 0x0 matches only packets without
     an 802.1Q header.

   - Testing for an exact match with a VID value with CFI=1 matches packets
     that have an 802.1Q header with a specified VID.

   - Testing for an exact match with a nonzero VID value with CFI=0 does
     not make sense.  The switch may reject this combination.

   - Testing with nxm_value=0, nxm_mask=0x0fff matches packets with no 802.1Q
     header or with an 802.1Q header with a VID of 0.

   - Testing with nxm_value=0x1000, nxm_mask=0x1000 matches packets with
     an 802.1Q header that has any VID value.";
                }
            }
            case vlan_pcp {
                leaf vlan_pcp {
                    type  uint32;
                    description
                        "#define OXM_OF_VLAN_PCP   OXM_HEADER  (0x8000, OFPXMT_OFB_VLAN_PCP, 1)
Used for OFPXMT_OFB_VLAN_PCP802.1Q PCP.

 For a packet with an 802.1Q header, this is the VLAN-PCP from the
 outermost tag.  For a packet with no 802.1Q header, this has value
 0.

 Prereqs: OXM_OF_VLAN_VID must be different from OFPVID_NONE.

 Format: 8-bit integer with 5 most-significant bits forced to 0.
 Only the lower 3 bits have meaning.

 Masking: Not maskable.";
                }
            }
            case ip_dscp {
                leaf ip_dscp {
                    type  uint32;
                    description
                        "#define OXM_OF_IP_DSCP     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_DSCP, 1)
Used for OFPXMT_OFB_IP_DSCPThe Diff Serv Code Point (DSCP) bits of the IP header.
 Part of the IPv4 ToS field or the IPv6 Traffic Class field.

 Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.

 Format: 8-bit integer with 2 most-significant bits forced to 0.
 Only the lower 6 bits have meaning.

 Masking: Not maskable.";
                }
            }
            case ip_ecn {
                leaf ip_ecn {
                    type  uint32;
                    description
                        "#define OXM_OF_IP_ECN     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_ECN, 1)
Used for OFPXMT_OFB_IP_ECNThe ECN bits of the IP header.
 Part of the IPv4 ToS field or the IPv6 Traffic Class field.

 Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.

 Format: 8-bit integer with 6 most-significant bits forced to 0.
 Only the lower 2 bits have meaning.

 Masking: Not maskable.";
                }
            }
            case ip_proto {
                leaf ip_proto {
                    type  uint32;
                    description
                        "#define OXM_OF_IP_PROTO   OXM_HEADER  (0x8000, OFPXMT_OFB_IP_PROTO, 1)
Used for OFPXMT_OFB_IP_PROTOThe  protocol  byte in the IP header.

 Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.

 Format: 8-bit integer.

 Masking: Not maskable.";
                }
            }
            case ipv4_src {
                leaf ipv4_src {
                    type  uint32;
                    description
                        "#define OXM_OF_IPV4_SRC     OXM_HEADER  (0x8000, OFPXMT_OFB_IPV4_SRC, 4)
#define OXM_OF_IPV4_SRC_W   OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV4_SRC, 4)
#define OXM_OF_IPV4_DST     OXM_HEADER  (0x8000, OFPXMT_OFB_IPV4_DST, 4)
#define OXM_OF_IPV4_DST_W   OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV4_DST, 4)
Used for OFPXMT_OFB_IPV4_SRCThe source or destination address in the IP header.

 Prereqs: OXM_OF_ETH_TYPE must match 0x0800 exactly.

 Format: 32-bit integer in network byte order.

 Masking: Arbitrary masks.";
                }
            }
            case ipv4_dst {
                leaf ipv4_dst {
                    type  uint32;
                    description
                        "Used for OFPXMT_OFB_IPV4_DST";
                }
            }
            case tcp_src {
                leaf tcp_src {
                    type  uint32;
                    description
                        "#define OXM_OF_TCP_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_TCP_SRC, 2)
#define OXM_OF_TCP_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_TCP_DST, 2)
Used for OFPXMT_OFB_TCP_SRCThe source or destination port in the TCP header.

 Prereqs:
   OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
   OXM_OF_IP_PROTO must match 6 exactly.

 Format: 16-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case tcp_dst {
                leaf tcp_dst {
                    type  uint32;
                    description
                        "Used for OFPXMT_OFB_TCP_DST";
                }
            }
            case udp_src {
                leaf udp_src {
                    type  uint32;
                    description
                        "#define OXM_OF_UDP_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_UDP_SRC, 2)
#define OXM_OF_UDP_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_UDP_DST, 2)
Used for OFPXMT_OFB_UDP_SRCThe source or destination port in the UDP header.

 Prereqs:
   OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd.
   OXM_OF_IP_PROTO must match 17 exactly.

 Format: 16-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case udp_dst {
                leaf udp_dst {
                    type  uint32;
                    description
                        "Used for OFPXMT_OFB_UDP_DST";
                }
            }
            case sctp_src {
                leaf sctp_src {
                    type  uint32;
                    description
                        "#define OXM_OF_SCTP_SRC   OXM_HEADER  (0x8000, OFPXMT_OFB_SCTP_SRC, 2)
#define OXM_OF_SCTP_DST   OXM_HEADER  (0x8000, OFPXMT_OFB_SCTP_DST, 2)
Used for OFPXMT_OFB_SCTP_SRCThe source or destination port in the SCTP header.

 Prereqs:
   OXM_OF_ETH_TYPE must match either 0x0800 or 0x86dd.
   OXM_OF_IP_PROTO must match 132 exactly.

 Format: 16-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case sctp_dst {
                leaf sctp_dst {
                    type  uint32;
                    description
                        "Used for OFPXMT_OFB_SCTP_DST";
                }
            }
            case icmpv4_type {
                leaf icmpv4_type {
                    type  uint32;
                    description
                        "#define OXM_OF_ICMPV4_TYPE  OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV4_TYPE, 1)
#define OXM_OF_ICMPV4_CODE  OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV4_CODE, 1)
Used for OFPXMT_OFB_ICMPV4_TYPEThe type or code in the ICMP header.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x0800 exactly.
   OXM_OF_IP_PROTO must match 1 exactly.

 Format: 8-bit integer.

 Masking: Not maskable.";
                }
            }
            case icmpv4_code {
                leaf icmpv4_code {
                    type  uint32;
                    description
                        "Used for OFPXMT_OFB_ICMPV4_CODE";
                }
            }
            case arp_op {
                leaf arp_op {
                    type  uint32;
                    description
                        "#define OXM_OF_ARP_OP     OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_OP, 2)
Used for OFPXMT_OFB_ARP_OPARP opcode.

 For an Ethernet+IP ARP packet, the opcode in the ARP header.  Always 0
 otherwise.

 Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.

 Format: 16-bit integer in network byte order.

 Masking: Not maskable.";
                }
            }
            case arp_spa {
                leaf arp_spa {
                    type  uint32;
                    description
                        "#define OXM_OF_ARP_SPA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_SPA, 4)
#define OXM_OF_ARP_SPA_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ARP_SPA, 4)
#define OXM_OF_ARP_TPA    OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_TPA, 4)
#define OXM_OF_ARP_TPA_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_ARP_TPA, 4)
For OFPXMT_OFB_ARP_SPAFor an Ethernet+IP ARP packet, the source or target protocol address
 in the ARP header.  Always 0 otherwise.

 Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.

 Format: 32-bit integer in network byte order.

 Masking: Arbitrary masks.";
                }
            }
            case arp_tpa {
                leaf arp_tpa {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_ARP_TPA";
                }
            }
            case arp_sha {
                leaf arp_sha {
                    type  binary;
                    description
                        "#define OXM_OF_ARP_SHA    OXM_HEADER   (0x8000, OFPXMT_OFB_ARP_SHA, 6)
#define OXM_OF_ARP_SHA_W  OXM_HEADER_W (0x8000, OFPXMT_OFB_ARP_SHA, 6)
#define OXM_OF_ARP_THA    OXM_HEADER   (0x8000, OFPXMT_OFB_ARP_THA, 6)
#define OXM_OF_ARP_THA_W  OXM_HEADER_W (0x8000, OFPXMT_OFB_ARP_THA, 6)
For OFPXMT_OFB_ARP_SHA (6 bytes)For an Ethernet+IP ARP packet, the source or target hardware address
 in the ARP header.  Always 0 otherwise.

 Prereqs: OXM_OF_ETH_TYPE must match 0x0806 exactly.

 Format: 48-bit Ethernet MAC address.

 Masking: Not maskable.";
                }
            }
            case arp_tha {
                leaf arp_tha {
                    type  binary;
                    description
                        "For OFPXMT_OFB_ARP_THA (6 bytes)";
                }
            }
            case ipv6_src {
                leaf ipv6_src {
                    type  binary;
                    description
                        "#define OXM_OF_IPV6_SRC    OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_SRC, 16)
#define OXM_OF_IPV6_SRC_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_SRC, 16)
#define OXM_OF_IPV6_DST    OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_DST, 16)
#define OXM_OF_IPV6_DST_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_DST, 16)
For OFPXMT_OFB_IPV6_SRCThe source or destination address in the IPv6 header.

 Prereqs: OXM_OF_ETH_TYPE must match 0x86dd exactly.

 Format: 128-bit IPv6 address.

 Masking: Arbitrary masks.";
                }
            }
            case ipv6_dst {
                leaf ipv6_dst {
                    type  binary;
                    description
                        "For OFPXMT_OFB_IPV6_DST";
                }
            }
            case ipv6_flabel {
                leaf ipv6_flabel {
                    type  uint32;
                    description
                        "#define OXM_OF_IPV6_FLABEL   OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_FLABEL, 4)
#define OXM_OF_IPV6_FLABEL_W OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_FLABEL, 4)
For OFPXMT_OFB_IPV6_FLABELThe IPv6 Flow Label

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x86dd exactly

 Format: 32-bit integer with 12 most-significant bits forced to 0.
 Only the lower 20 bits have meaning.

 Masking: Arbitrary masks.";
                }
            }
            case icmpv6_type {
                leaf icmpv6_type {
                    type  uint32;
                    description
                        "#define OXM_OF_ICMPV6_TYPE OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV6_TYPE, 1)
#define OXM_OF_ICMPV6_CODE OXM_HEADER  (0x8000, OFPXMT_OFB_ICMPV6_CODE, 1)
For OFPXMT_OFB_ICMPV6_TYPEThe type or code in the ICMPv6 header.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x86dd exactly.
   OXM_OF_IP_PROTO must match 58 exactly.

 Format: 8-bit integer.

 Masking: Not maskable.";
                }
            }
            case icmpv6_code {
                leaf icmpv6_code {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_ICMPV6_CODE";
                }
            }
            case ipv6_nd_target {
                leaf ipv6_nd_target {
                    type  binary;
                    description
                        "#define OXM_OF_IPV6_ND_TARGET OXM_HEADER
    (0x8000, OFPXMT_OFB_IPV6_ND_TARGET, 16)
For OFPXMT_OFB_IPV6_ND_TARGETThe target address in an IPv6 Neighbor Discovery message.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x86dd exactly.
   OXM_OF_IP_PROTO must match 58 exactly.
   OXM_OF_ICMPV6_TYPE must be either 135 or 136.

 Format: 128-bit IPv6 address.

 Masking: Not maskable.";
                }
            }
            case ipv6_nd_ssl {
                leaf ipv6_nd_ssl {
                    type  binary;
                    description
                        "#define OXM_OF_IPV6_ND_SLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_SLL, 6)
For OFPXMT_OFB_IPV6_ND_SLLThe source link-layer address option in an IPv6 Neighbor Discovery
 message.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x86dd exactly.
   OXM_OF_IP_PROTO must match 58 exactly.
   OXM_OF_ICMPV6_TYPE must be exactly 135.

 Format: 48-bit Ethernet MAC address.

 Masking: Not maskable.";
                }
            }
            case ipv6_nd_tll {
                leaf ipv6_nd_tll {
                    type  binary;
                    description
                        "#define OXM_OF_IPV6_ND_TLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_TLL, 6)
For OFPXMT_OFB_IPV6_ND_TLLThe target link-layer address option in an IPv6 Neighbor Discovery
 message.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x86dd exactly.
   OXM_OF_IP_PROTO must match 58 exactly.
   OXM_OF_ICMPV6_TYPE must be exactly 136.

 Format: 48-bit Ethernet MAC address.

 Masking: Not maskable.";
                }
            }
            case mpls_label {
                leaf mpls_label {
                    type  uint32;
                    description
                        "#define OXM_OF_MPLS_LABEL  OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_LABEL, 4)
For OFPXMT_OFB_MPLS_LABELThe LABEL in the first MPLS shim header.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.

 Format: 32-bit integer in network byte order with 12 most-significant
 bits forced to 0. Only the lower 20 bits have meaning.

 Masking: Not maskable.";
                }
            }
            case mpls_tc {
                leaf mpls_tc {
                    type  uint32;
                    description
                        "#define OXM_OF_MPLS_TC     OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_TC, 1)
For OFPXMT_OFB_MPLS_TCThe TC in the first MPLS shim header.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.

 Format: 8-bit integer with 5 most-significant bits forced to 0.
 Only the lower 3 bits have meaning.

 Masking: Not maskable.";
                }
            }
            case mpls_bos {
                leaf mpls_bos {
                    type  uint32;
                    description
                        "#define OXM_OF_MPLS_BOS     OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_BOS, 1)
For OFPXMT_OFB_MPLS_BOSThe BoS bit in the first MPLS shim header.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x8847 or 0x8848 exactly.

 Format: 8-bit integer with 7 most-significant bits forced to 0.
 Only the lowest bit have a meaning.

 Masking: Not maskable.";
                }
            }
            case pbb_isid {
                leaf pbb_isid {
                    type  uint32;
                    description
                        "#define OXM_OF_PBB_ISID   OXM_HEADER  (0x8000, OFPXMT_OFB_PBB_ISID, 3)
#define OXM_OF_PBB_ISID_W OXM_HEADER_W(0x8000, OFPXMT_OFB_PBB_ISID, 3)
For OFPXMT_OFB_PBB_ISIDIEEE 802.1ah I-SID.

 For a packet with a PBB header, this is the I-SID from the
 outermost service tag.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x88E7 exactly.

 Format: 24-bit integer in network byte order.

 Masking: Arbitrary masks.";
                }
            }
            case tunnel_id {
                leaf tunnel_id {
                    type  uint64;
                    description
                        "#define OXM_OF_TUNNEL_ID    OXM_HEADER  (0x8000, OFPXMT_OFB_TUNNEL_ID, 8)
#define OXM_OF_TUNNEL_ID_W  OXM_HEADER_W(0x8000, OFPXMT_OFB_TUNNEL_ID, 8)
For OFPXMT_OFB_TUNNEL_IDLogical Port Metadata.

 Metadata associated with a logical port.
 If the logical port performs encapsulation and decapsulation, this
 is the demultiplexing field from the encapsulation header.
 For example, for a packet received via GRE tunnel including a (32-bit) key,
 the key is stored in the low 32-bits and the high bits are zeroed.
 For a MPLS logical port, the low 20 bits represent the MPLS Label.
 For a VxLAN logical port, the low 24 bits represent the VNI.
 If the packet is not received through a logical port, the value is 0.

 Prereqs: None.

 Format: 64-bit integer in network byte order.

 Masking: Arbitrary masks.";
                }
            }
            case ipv6_exthdr {
                leaf ipv6_exthdr {
                    type  uint32;
                    description
                        "#define OXM_OF_IPV6_EXTHDR   OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_EXTHDR, 2)
#define OXM_OF_IPV6_EXTHDR_W OXM_HEADER_W(0x8000, OFPXMT_OFB_IPV6_EXTHDR, 2)
For OFPXMT_OFB_IPV6_EXTHDRThe IPv6 Extension Header pseudo-field.

 Prereqs:
   OXM_OF_ETH_TYPE must match 0x86dd exactly

 Format: 16-bit integer with 7 most-significant bits forced to 0.
 Only the lower 9 bits have meaning.

 Masking: Maskable.";
                }
            }
        }
        choice choice_1 {
            case table_metadata_mask {
                leaf table_metadata_mask {
                    type  uint64;
                    description
                        "For OFPXMT_OFB_METADATA";
                }
            }
            case eth_dst_mask {
                leaf eth_dst_mask {
                    type  binary;
                    description
                        "For OFPXMT_OFB_ETH_DST (exactly 6 bytes)";
                }
            }
            case eth_src_mask {
                leaf eth_src_mask {
                    type  binary;
                    description
                        "For OFPXMT_OFB_ETH_SRC (exactly 6 bytes)";
                }
            }
            case vlan_vid_mask {
                leaf vlan_vid_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_VLAN_VID";
                }
            }
            case ipv4_src_mask {
                leaf ipv4_src_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_IPV4_SRC";
                }
            }
            case ipv4_dst_mask {
                leaf ipv4_dst_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_IPV4_DST";
                }
            }
            case arp_spa_mask {
                leaf arp_spa_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_ARP_SPA";
                }
            }
            case arp_tpa_mask {
                leaf arp_tpa_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_ARP_TPA";
                }
            }
            case ipv6_src_mask {
                leaf ipv6_src_mask {
                    type  binary;
                    description
                        "For OFPXMT_OFB_IPV6_SRC";
                }
            }
            case ipv6_dst_mask {
                leaf ipv6_dst_mask {
                    type  binary;
                    description
                        "For OFPXMT_OFB_IPV6_DST";
                }
            }
            case ipv6_flabel_mask {
                leaf ipv6_flabel_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_IPV6_FLABEL";
                }
            }
            case pbb_isid_mask {
                leaf pbb_isid_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_PBB_ISID";
                }
            }
            case tunnel_id_mask {
                leaf tunnel_id_mask {
                    type  uint64;
                    description
                        "For OFPXMT_OFB_TUNNEL_ID";
                }
            }
            case ipv6_exthdr_mask {
                leaf ipv6_exthdr_mask {
                    type  uint32;
                    description
                        "For OFPXMT_OFB_IPV6_EXTHDR";
                }
            }
        }


    }

    grouping ofp_oxm_experimenter_field {
        description
            "Header for OXM experimenter match fields.
 The experimenter class should not use OXM_HEADER() macros for defining
 fields due to this extra header.";
        leaf oxm_header {
            type  uint32;
            description
                "oxm_class = OFPXMC_EXPERIMENTER";
        }

        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the same
form as in struct ofp_experimenter_header.";
        }



    }

    grouping ofp_action {
        description
            "Action header that is common to all actions.  The length includes the
 header and any padding used to make the action 64-bit aligned.
 NB: The length of an action  must  always be a multiple of eight.";
        leaf type {
            type  ofp_action_type;

            description
                "One of OFPAT_ .";
        }



        choice choice_0 {
            case output {
                container output {
                    uses  ofp_action_output;

                    description
                        "";
                }
            }
            case mpls_ttl {
                container mpls_ttl {
                    uses  ofp_action_mpls_ttl;

                    description
                        "";
                }
            }
            case push {
                container push {
                    uses  ofp_action_push;

                    description
                        "";
                }
            }
            case pop_mpls {
                container pop_mpls {
                    uses  ofp_action_pop_mpls;

                    description
                        "";
                }
            }
            case group {
                container group {
                    uses  ofp_action_group;

                    description
                        "";
                }
            }
            case nw_ttl {
                container nw_ttl {
                    uses  ofp_action_nw_ttl;

                    description
                        "";
                }
            }
            case set_field {
                container set_field {
                    uses  ofp_action_set_field;
f
                    description
                        "";
                }
            }
            case experimenter {
                container experimenter {
                    uses  ofp_action_experimenter;

                    description
                        "";
                }
            }
        }


    }

    grouping ofp_action_output {
        description
            "Action structure for OFPAT_OUTPUT, which sends packets out 'port'.
 When the 'port' is the OFPP_CONTROLLER, 'max_len' indicates the max
 number of bytes to send.  A 'max_len' of zero means no bytes of the
 packet should be sent. A 'max_len' of OFPCML_NO_BUFFER means that
 the packet is not buffered and the complete packet is to be sent to
 the controller.";
        leaf port {
            type  uint32;
            description
                "Output port.";
        }

        leaf max_len {
            type  uint32;
            description
                "Max length to send to controller.";
        }



    }

    grouping ofp_action_mpls_ttl {
        description
            "Action structure for OFPAT_SET_MPLS_TTL.";
        leaf mpls_ttl {
            type  uint32;
            description
                "MPLS TTL";
        }



    }

    grouping ofp_action_push {
        description
            "Action structure for OFPAT_PUSH_VLAN MPLS PBB.";
        leaf ethertype {
            type  uint32;
            description
                "Ethertype";
        }



    }

    grouping ofp_action_pop_mpls {
        description
            "Action structure for OFPAT_POP_MPLS.";
        leaf ethertype {
            type  uint32;
            description
                "Ethertype";
        }



    }

    grouping ofp_action_group {
        description
            "Action structure for OFPAT_GROUP.";
        leaf group_id {
            type  uint32;
            description
                "Group identifier.";
        }



    }

    grouping ofp_action_nw_ttl {
        description
            "Action structure for OFPAT_SET_NW_TTL.";
        leaf nw_ttl {
            type  uint32;
            description
                "IP TTL";
        }



    }

    grouping ofp_action_set_field {
        description
            "Action structure for OFPAT_SET_FIELD.";
        container field {
            uses  ofp_oxm_field;

            description
                "";
        }



    }

    grouping ofp_action_experimenter {
        description
            "Action header for OFPAT_EXPERIMENTER.
 The rest of the body is experimenter-defined.";
        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the same
form as in struct
ofp_experimenter_header.";
        }

        leaf data {
            type  binary;
            description
                "";
        }



    }

    grouping ofp_instruction {
        description
            "Instruction header that is common to all instructions.  The length includes
 the header and any padding used to make the instruction 64-bit aligned.
 NB: The length of an instruction  must  always be a multiple of eight.";
        leaf type {
            type  uint32;
            description
                "Instruction type";
        }



        choice choice_0 {
            case goto_table {
                container goto_table {
                    uses  ofp_instruction_goto_table;

                    description
                        "";
                }
            }
            case write_metadata {
                container write_metadata {
                    uses  ofp_instruction_write_metadata;

                    description
                        "";
                }
            }
            case actions {
                container actions {
                    uses  ofp_instruction_actions;

                    description
                        "";
                }
            }
            case meter {
                container meter {
                    uses  ofp_instruction_meter;

                    description
                        "";
                }
            }
            case experimenter {
                container experimenter {
                    uses  ofp_instruction_experimenter;

                    description
                        "";
                }
            }
        }


    }

    grouping ofp_instruction_goto_table {
        description
            "Instruction structure for OFPIT_GOTO_TABLE";
        leaf table_id {
            type  uint32;
            description
                "Set next table in the lookup pipeline";
        }



    }

    grouping ofp_instruction_write_metadata {
        description
            "Instruction structure for OFPIT_WRITE_METADATA";
        leaf metadata {
            type  uint64;
            description
                "Metadata value to write";
        }

        leaf metadata_mask {
            type  uint64;
            description
                "Metadata write bitmask";
        }



    }

    grouping ofp_instruction_actions {
        description
            "Instruction structure for OFPIT_WRITE APPLY CLEAR_ACTIONS";
        list actions {
            key "type";
            uses  ofp_action;

            description
                "0 or more actions associated
with OFPIT_WRITE_ACTIONS and
OFPIT_APPLY_ACTIONS";
        }



    }

    grouping ofp_instruction_meter {
        description
            "Instruction structure for OFPIT_METER";
        leaf meter_id {
            type  uint32;
            description
                "Meter instance.";
        }



    }

    grouping ofp_instruction_experimenter {
        description
            "Instruction structure for experimental instructions";
        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the same form
as in struct ofp_experimenter_header.";
        }

        leaf data {
            type  binary;
            description
                "Experimenter-defined arbitrary additional data.";
        }



    }

    grouping ofp_flow_mod {
        description
            "Flow setup and teardown (controller -  datapath).";
        leaf cookie {
            type  uint64;
            description
                "ofp_header header;
Opaque controller-issued identifier.";
        }

        leaf cookie_mask {
            type  uint64;
            description
                "Mask used to restrict the cookie bits
that must match when the command is
OFPFC_MODIFY  or OFPFC_DELETE . A value
of 0 indicates no restriction.";
        }

        leaf table_id {
            type  uint32;
            description
                "ID of the table to put the flow in.
For OFPFC_DELETE_  commands, OFPTT_ALL
can also be used to delete matching
flows from all tables.";
        }

        leaf command {
            type  ofp_flow_mod_command;

            description
                "One of OFPFC_ .";
        }

        leaf idle_timeout {
            type  uint32;
            description
                "Idle time before discarding (seconds).";
        }

        leaf hard_timeout {
            type  uint32;
            description
                "Max time before discarding (seconds).";
        }

        leaf priority {
            type  uint32;
            description
                "Priority level of flow entry.";
        }

        leaf buffer_id {
            type  uint32;
            description
                "Buffered packet to apply to, or
OFP_NO_BUFFER.
Not meaningful for OFPFC_DELETE .";
        }

        leaf out_port {
            type  uint32;
            description
                "For OFPFC_DELETE  commands, require
matching entries to include this as an
output port.  A value of OFPP_ANY
indicates no restriction.";
        }

        leaf out_group {
            type  uint32;
            description
                "For OFPFC_DELETE  commands, require
matching entries to include this as an
output group.  A value of OFPG_ANY
indicates no restriction.";
        }

        leaf flags {
            type  uint32;
            description
                "Bitmap of OFPFF_  flags.";
        }

        container match {
            uses  ofp_match;

            description
                "Fields to match. Variable size.";
        }

        list instructions {
            key "type";
            uses  ofp_instruction;

            description
                "0 or more.";
        }



    }

    grouping ofp_bucket {
        description
            "Bucket for use in groups.";
        leaf weight {
            type  uint32;
            description
                "Relative weight of bucket.  Only
defined for select groups.";
        }

        leaf watch_port {
            type  uint32;
            description
                "Port whose state affects whether this
bucket is live.  Only required for fast
failover groups.";
        }

        leaf watch_group {
            type  uint32;
            description
                "Group whose state affects whether this
bucket is live.  Only required for fast
failover groups.";
        }

        list actions {
            key "type";
            uses  ofp_action;

            description
                "";
        }



    }

    grouping ofp_group_mod {
        description
            "Group setup and teardown (controller -  datapath).";
        leaf command {
            type  ofp_group_mod_command;

            description
                "ofp_header header;
One of OFPGC_ .";
        }

        leaf type {
            type  ofp_group_type;

            description
                "One of OFPGT_ .";
        }

        leaf group_id {
            type  uint32;
            description
                "Group identifier.";
        }

        list buckets {
            key "weight";
            uses  ofp_bucket;

            description
                "";
        }



    }

    grouping ofp_packet_out {
        description
            "Send packet (controller -  datapath).Special buffer-id to indicate 'no buffer'#define OFP_NO_BUFFER 0xffffffff";
        leaf buffer_id {
            type  uint32;
            description
                "ofp_header header;
ID assigned by datapath (OFP_NO_BUFFER
if none).";
        }

        leaf in_port {
            type  uint32;
            description
                "Packet's input port or OFPP_CONTROLLER.";
        }

        list actions {
            key "type";
            uses  ofp_action;

            description
                "Action list - 0 or more.";
        }

        leaf data {
            type  binary;
            description
                "The variable size action list is optionally followed by packet data.
 This data is only present and meaningful if buffer_id == -1.Packet data.";
        }



    }

    grouping ofp_packet_in {
        description
            "Packet received on port (datapath -  controller).";
        leaf buffer_id {
            type  uint32;
            description
                "ofp_header header;
ID assigned by datapath.";
        }

        leaf reason {
            type  ofp_packet_in_reason;

            description
                "Reason packet is being sent";
        }

        leaf table_id {
            type  uint32;
            description
                "ID of the table that was looked up";
        }

        leaf cookie {
            type  uint64;
            description
                "Cookie of the flow entry that was looked up.";
        }

        container match {
            uses  ofp_match;

            description
                "Packet metadata. Variable size.";
        }

        leaf data {
            type  binary;
            description
                "Ethernet frame";
        }



    }

    container ofp_flow_removed {
        description
            "Flow removed (datapath -  controller).";
        leaf cookie {
            type  uint64;
            description
                "ofp_header header;
Opaque controller-issued identifier.";
        }

        leaf priority {
            type  uint32;
            description
                "Priority level of flow entry.";
        }

        leaf reason {
            type  ofp_flow_removed_reason;

            description
                "One of OFPRR_ .";
        }

        leaf table_id {
            type  uint32;
            description
                "ID of the table";
        }

        leaf duration_sec {
            type  uint32;
            description
                "Time flow was alive in seconds.";
        }

        leaf duration_nsec {
            type  uint32;
            description
                "Time flow was alive in nanoseconds beyond
duration_sec.";
        }

        leaf idle_timeout {
            type  uint32;
            description
                "Idle timeout from original flow mod.";
        }

        leaf hard_timeout {
            type  uint32;
            description
                "Hard timeout from original flow mod.";
        }

        leaf packet_count {
            type  uint64;
            description
                "";
        }

        leaf byte_count {
            type  uint64;
            description
                "";
        }

        container match {
            uses  ofp_match;

            description
                "Description of fields. Variable size.";
        }



    }

    grouping ofp_meter_band_header {
        description
            "Common header for all meter bands";
        leaf type {
            type  ofp_meter_band_type;

            description
                "One of OFPMBT_ .";
        }

        leaf len {
            type  uint32;
            description
                "Length in bytes of this band.";
        }

        leaf rate {
            type  uint32;
            description
                "Rate for this band.";
        }

        leaf burst_size {
            type  uint32;
            description
                "Size of bursts.";
        }



    }

    container ofp_meter_band_drop {
        description
            "OFPMBT_DROP band - drop packets";
        leaf type {
            type  uint32;
            description
                "OFPMBT_DROP.";
        }

        leaf len {
            type  uint32;
            description
                "Length in bytes of this band.";
        }

        leaf rate {
            type  uint32;
            description
                "Rate for dropping packets.";
        }

        leaf burst_size {
            type  uint32;
            description
                "Size of bursts.";
        }



    }

    container ofp_meter_band_dscp_remark {
        description
            "OFPMBT_DSCP_REMARK band - Remark DSCP in the IP header";
        leaf type {
            type  uint32;
            description
                "OFPMBT_DSCP_REMARK.";
        }

        leaf len {
            type  uint32;
            description
                "Length in bytes of this band.";
        }

        leaf rate {
            type  uint32;
            description
                "Rate for remarking packets.";
        }

        leaf burst_size {
            type  uint32;
            description
                "Size of bursts.";
        }

        leaf prec_level {
            type  uint32;
            description
                "Number of drop precedence level to add.";
        }



    }

    container ofp_meter_band_experimenter {
        description
            "OFPMBT_EXPERIMENTER band - Experimenter type.
 The rest of the band is experimenter-defined.";
        leaf type {
            type  ofp_meter_band_type;

            description
                "One of OFPMBT_ .";
        }

        leaf len {
            type  uint32;
            description
                "Length in bytes of this band.";
        }

        leaf rate {
            type  uint32;
            description
                "Rate for this band.";
        }

        leaf burst_size {
            type  uint32;
            description
                "Size of bursts.";
        }

        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the
same form as in struct
ofp_experimenter_header.";
        }



    }

    container ofp_meter_mod {
        description
            "Meter configuration. OFPT_METER_MOD.";
        leaf command {
            type  ofp_meter_mod_command;

            description
                "ofp_header   header = 1;
One of OFPMC_ .";
        }

        leaf flags {
            type  uint32;
            description
                "Bitmap of OFPMF_  flags.";
        }

        leaf meter_id {
            type  uint32;
            description
                "Meter instance.";
        }

        list bands {
            key "type";
            uses  ofp_meter_band_header;

            description
                "The band list length is
inferred from the length field
in the header.";
        }



    }

    container ofp_error_msg {
        description
            "OFPT_ERROR: Error message (datapath -  controller).";
        leaf type {
            type  uint32;
            description
                "ofp_header header;";
        }

        leaf code {
            type  uint32;
            description
                "";
        }

        leaf data {
            type  binary;
            description
                "Variable-length data.  Interpreted based
on the type and code.  No padding.";
        }



    }

    container ofp_error_experimenter_msg {
        description
            "OFPET_EXPERIMENTER: Error message (datapath -  controller).ofp_header header;";
        leaf type {
            type  uint32;
            description
                "OFPET_EXPERIMENTER.";
        }

        leaf exp_type {
            type  uint32;
            description
                "Experimenter defined.";
        }

        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the same form
as in struct ofp_experimenter_header.";
        }

        leaf data {
            type  binary;
            description
                "Variable-length data.  Interpreted based
on the type and code.  No padding.";
        }



    }

    container ofp_multipart_request {
        description
            "";
        leaf type {
            type  ofp_multipart_type;

            description
                "ofp_header header;
One of the OFPMP_  constants.";
        }

        leaf flags {
            type  uint32;
            description
                "OFPMPF_REQ_  flags.";
        }

        leaf body {
            type  binary;
            description
                "Body of the request. 0 or more bytes.";
        }



    }

    container ofp_multipart_reply {
        description
            "";
        leaf type {
            type  ofp_multipart_type;

            description
                "ofp_header header;
One of the OFPMP_  constants.";
        }

        leaf flags {
            type  uint32;
            description
                "OFPMPF_REPLY_  flags.";
        }

        leaf body {
            type  binary;
            description
                "Body of the reply. 0 or more bytes.";
        }



    }

    grouping ofp_desc {
        description
            "Body of reply to OFPMP_DESC request.  Each entry is a NULL-terminated
 ASCII string.#define DESC_STR_LEN   256
#define SERIAL_NUM_LEN 32";
        leaf mfr_desc {
            type  string;
            description
                "Manufacturer description.";
        }

        leaf hw_desc {
            type  string;
            description
                "Hardware description.";
        }

        leaf sw_desc {
            type  string;
            description
                "Software description.";
        }

        leaf serial_num {
            type  string;
            description
                "Serial number.";
        }

        leaf dp_desc {
            type  string;
            description
                "Human readable description of datapath.";
        }



    }

    container ofp_flow_stats_request {
        description
            "Body for ofp_multipart_request of type OFPMP_FLOW.";
        leaf table_id {
            type  uint32;
            description
                "ID of table to read (from ofp_table_stats),
OFPTT_ALL for all tables.";
        }

        leaf out_port {
            type  uint32;
            description
                "Require matching entries to include this
as an output port.  A value of OFPP_ANY
indicates no restriction.";
        }

        leaf out_group {
            type  uint32;
            description
                "Require matching entries to include this
as an output group.  A value of OFPG_ANY
indicates no restriction.";
        }

        leaf cookie {
            type  uint64;
            description
                "Require matching entries to contain this
cookie value";
        }

        leaf cookie_mask {
            type  uint64;
            description
                "Mask used to restrict the cookie bits that
must match. A value of 0 indicates
no restriction.";
        }

        container match {
            uses  ofp_match;

            description
                "Fields to match. Variable size.";
        }



    }

    grouping ofp_flow_stats {
        description
            "Body of reply to OFPMP_FLOW request.";
        leaf id {
            type  uint64;
            description
                "Unique ID of flow within device.";
        }

        leaf table_id {
            type  uint32;
            description
                "ID of table flow came from.";
        }

        leaf duration_sec {
            type  uint32;
            description
                "Time flow has been alive in seconds.";
        }

        leaf duration_nsec {
            type  uint32;
            description
                "Time flow has been alive in nanoseconds
beyond duration_sec.";
        }

        leaf priority {
            type  uint32;
            description
                "Priority of the entry.";
        }

        leaf idle_timeout {
            type  uint32;
            description
                "Number of seconds idle before expiration.";
        }

        leaf hard_timeout {
            type  uint32;
            description
                "Number of seconds before expiration.";
        }

        leaf flags {
            type  uint32;
            description
                "Bitmap of OFPFF_  flags.";
        }

        leaf cookie {
            type  uint64;
            description
                "Opaque controller-issued identifier.";
        }

        leaf packet_count {
            type  uint64;
            description
                "Number of packets in flow.";
        }

        leaf byte_count {
            type  uint64;
            description
                "Number of bytes in flow.";
        }

        container match {
            uses  ofp_match;

            description
                "Description of fields. Variable size.";
        }

        list instructions {
            key "type";
            uses  ofp_instruction;

            description
                "Instruction set
(0 or more)";
        }



    }

    container ofp_aggregate_stats_request {
        description
            "Body for ofp_multipart_request of type OFPMP_AGGREGATE.";
        leaf table_id {
            type  uint32;
            description
                "ID of table to read (from ofp_table_stats)
OFPTT_ALL for all tables.";
        }

        leaf out_port {
            type  uint32;
            description
                "Require matching entries to include this
as an output port.  A value of OFPP_ANY
indicates no restriction.";
        }

        leaf out_group {
            type  uint32;
            description
                "Require matching entries to include this
as an output group.  A value of OFPG_ANY
indicates no restriction.";
        }

        leaf cookie {
            type  uint64;
            description
                "Require matching entries to contain this
cookie value";
        }

        leaf cookie_mask {
            type  uint64;
            description
                "Mask used to restrict the cookie bits that
must match. A value of 0 indicates
no restriction.";
        }

        container match {
            uses  ofp_match;

            description
                "Fields to match. Variable size.";
        }



    }

    container ofp_aggregate_stats_reply {
        description
            "Body of reply to OFPMP_AGGREGATE request.";
        leaf packet_count {
            type  uint64;
            description
                "Number of packets in flows.";
        }

        leaf byte_count {
            type  uint64;
            description
                "Number of bytes in flows.";
        }

        leaf flow_count {
            type  uint32;
            description
                "Number of flows.";
        }



    }

    grouping ofp_table_feature_property {
        description
            "Common header for all Table Feature Properties";
        leaf type {
            type  ofp_table_feature_prop_type;

            description
                "One of OFPTFPT_ .";
        }



        choice choice_0 {
            case instructions {
                container instructions {
                    uses  ofp_table_feature_prop_instructions;

                    description
                        "";
                }
            }
            case next_tables {
                container next_tables {
                    uses  ofp_table_feature_prop_next_tables;

                    description
                        "";
                }
            }
            case actions {
                container actions {
                    uses  ofp_table_feature_prop_actions;

                    description
                        "";
                }
            }
            case oxm {
                container oxm {
                    uses  ofp_table_feature_prop_oxm;

                    description
                        "";
                }
            }
            case experimenter {
                container experimenter {
                    uses  ofp_table_feature_prop_experimenter;

                    description
                        "";
                }
            }
        }


    }

    grouping ofp_table_feature_prop_instructions {
        description
            "Instructions property";
        list instructions {
            key "type";
            uses  ofp_instruction;

            description
                "One of OFPTFPT_INSTRUCTIONS,
OFPTFPT_INSTRUCTIONS_MISS.List of instructions";
        }



    }

    grouping ofp_table_feature_prop_next_tables {
        description
            "Next Tables property";
        list next_table_ids {
            key "next_table_ids";
            leaf next_table_ids {
                type  uint32;
                description
                    "One of OFPTFPT_NEXT_TABLES,
OFPTFPT_NEXT_TABLES_MISS.List of table ids.";
            }
            description
                "One of OFPTFPT_NEXT_TABLES,
OFPTFPT_NEXT_TABLES_MISS.List of table ids.";
        }



    }

    grouping ofp_table_feature_prop_actions {
        description
            "Actions property";
        list actions {
            key "type";
            uses  ofp_action;

            description
                "One of OFPTFPT_WRITE_ACTIONS,
OFPTFPT_WRITE_ACTIONS_MISS,
OFPTFPT_APPLY_ACTIONS,
OFPTFPT_APPLY_ACTIONS_MISS.List of actions";
        }



    }

    grouping ofp_table_feature_prop_oxm {
        description
            "Match, Wildcard or Set-Field propertyOne of OFPTFPT_MATCH,
OFPTFPT_WILDCARDS,
OFPTFPT_WRITE_SETFIELD,
OFPTFPT_WRITE_SETFIELD_MISS,
OFPTFPT_APPLY_SETFIELD,
OFPTFPT_APPLY_SETFIELD_MISS.";
        list oxm_ids {
            key "oxm_ids";
            leaf oxm_ids {
                type  uint32;
                description
                    "TODO is this a uint32???Array of OXM headers";
            }
            description
                "TODO is this a uint32???Array of OXM headers";
        }



    }

    grouping ofp_table_feature_prop_experimenter {
        description
            "Experimenter table feature property";
        leaf experimenter {
            type  uint32;
            description
                "One of OFPTFPT_EXPERIMENTER,
OFPTFPT_EXPERIMENTER_MISS.Experimenter ID which takes the same
form as in struct
ofp_experimenter_header.";
        }

        leaf exp_type {
            type  uint32;
            description
                "Experimenter defined.";
        }

        list experimenter_data {
            key "experimenter_data";
            leaf experimenter_data {
                type  uint32;
                description
                    "";
            }
            description
                "";
        }



    }

    container ofp_table_features {
        description
            "Body for ofp_multipart_request of type OFPMP_TABLE_FEATURES.
 Body of reply to OFPMP_TABLE_FEATURES request.";
        leaf table_id {
            type  uint32;
            description
                "Identifier of table.  Lower numbered tables
are consulted first.";
        }

        leaf name {
            type  string;
            description
                "";
        }

        leaf metadata_match {
            type  uint64;
            description
                "Bits of metadata table can match.";
        }

        leaf metadata_write {
            type  uint64;
            description
                "Bits of metadata table can write.";
        }

        leaf config {
            type  uint32;
            description
                "Bitmap of OFPTC_  values";
        }

        leaf max_entries {
            type  uint32;
            description
                "Max number of entries supported.";
        }

        list properties {
            key "type";
            uses  ofp_table_feature_property;

            description
                "Table Feature Property list";
        }



    }

    container ofp_table_stats {
        description
            "Body of reply to OFPMP_TABLE request.";
        leaf table_id {
            type  uint32;
            description
                "Identifier of table.  Lower numbered tables
are consulted first.";
        }

        leaf active_count {
            type  uint32;
            description
                "Number of active entries.";
        }

        leaf lookup_count {
            type  uint64;
            description
                "Number of packets looked up in table.";
        }

        leaf matched_count {
            type  uint64;
            description
                "Number of packets that hit table.";
        }



    }

    container ofp_port_stats_request {
        description
            "Body for ofp_multipart_request of type OFPMP_PORT.";
        leaf port_no {
            type  uint32;
            description
                "OFPMP_PORT message must request statistics
 either for a single port (specified in
 port_no) or for all ports (if port_no ==
 OFPP_ANY).";
        }



    }

    container ofp_port_stats {
        description
            "Body of reply to OFPMP_PORT request. If a counter is unsupported, set
 the field to all ones.";
        leaf port_no {
            type  uint32;
            description
                "";
        }

        leaf rx_packets {
            type  uint64;
            description
                "Number of received packets.";
        }

        leaf tx_packets {
            type  uint64;
            description
                "Number of transmitted packets.";
        }

        leaf rx_bytes {
            type  uint64;
            description
                "Number of received bytes.";
        }

        leaf tx_bytes {
            type  uint64;
            description
                "Number of transmitted bytes.";
        }

        leaf rx_dropped {
            type  uint64;
            description
                "Number of packets dropped by RX.";
        }

        leaf tx_dropped {
            type  uint64;
            description
                "Number of packets dropped by TX.";
        }

        leaf rx_errors {
            type  uint64;
            description
                "Number of receive errors.  This is a super-set
of more specific receive errors and should be
greater than or equal to the sum of all
rx_ _err values.";
        }

        leaf tx_errors {
            type  uint64;
            description
                "Number of transmit errors.  This is a super-set
of more specific transmit errors and should be
greater than or equal to the sum of all
tx_ _err values (none currently defined.)";
        }

        leaf rx_frame_err {
            type  uint64;
            description
                "Number of frame alignment errors.";
        }

        leaf rx_over_err {
            type  uint64;
            description
                "Number of packets with RX overrun.";
        }

        leaf rx_crc_err {
            type  uint64;
            description
                "Number of CRC errors.";
        }

        leaf collisions {
            type  uint64;
            description
                "Number of collisions.";
        }

        leaf duration_sec {
            type  uint32;
            description
                "Time port has been alive in seconds.";
        }

        leaf duration_nsec {
            type  uint32;
            description
                "Time port has been alive in nanoseconds
beyond duration_sec.";
        }



    }

    container ofp_group_stats_request {
        description
            "Body of OFPMP_GROUP request.";
        leaf group_id {
            type  uint32;
            description
                "All groups if OFPG_ALL.";
        }



    }

    grouping ofp_bucket_counter {
        description
            "Used in group stats replies.";
        leaf packet_count {
            type  uint64;
            description
                "Number of packets processed by bucket.";
        }

        leaf byte_count {
            type  uint64;
            description
                "Number of bytes processed by bucket.";
        }



    }

    grouping ofp_group_stats {
        description
            "Body of reply to OFPMP_GROUP request.";
        leaf group_id {
            type  uint32;
            description
                "Group identifier.";
        }

        leaf ref_count {
            type  uint32;
            description
                "Number of flows or groups that directly
forward to this group.";
        }

        leaf packet_count {
            type  uint64;
            description
                "Number of packets processed by group.";
        }

        leaf byte_count {
            type  uint64;
            description
                "Number of bytes processed by group.";
        }

        leaf duration_sec {
            type  uint32;
            description
                "Time group has been alive in seconds.";
        }

        leaf duration_nsec {
            type  uint32;
            description
                "Time group has been alive in nanoseconds
beyond duration_sec.";
        }

        list bucket_stats {
            key "packet_count";
            uses  ofp_bucket_counter;

            description
                "One counter set per
bucket.";
        }



    }

    grouping ofp_group_desc {
        description
            "Body of reply to OFPMP_GROUP_DESC request.";
        leaf type {
            type  ofp_group_type;

            description
                "One of OFPGT_ .";
        }

        leaf group_id {
            type  uint32;
            description
                "Group identifier.";
        }

        list buckets {
            key "weight";
            uses  ofp_bucket;

            description
                "List of buckets - 0 or more.";
        }



    }

    grouping ofp_group_entry {
        description
            "";
        leaf type {
            type  ofp_group_type;

            description
                "One of OFPGT_ .";
        }

        leaf group_id {
            type  uint32;
            description
                "Group identifier.";
        }

        list buckets {
            key "weight";
            uses  ofp_bucket;

            description
                "List of buckets - 0 or more.";
        }

        container stats {
            uses  ofp_group_stats;

            description
                "";
        }



    }

    container ofp_group_features {
        description
            "Body of reply to OFPMP_GROUP_FEATURES request. Group features.";
        leaf types {
            type  uint32;
            description
                "Bitmap of (1    OFPGT_ ) values supported.";
        }

        leaf capabilities {
            type  uint32;
            description
                "Bitmap of OFPGFC_  capability supported.";
        }

        list max_groups {
            key "max_groups";
            leaf max_groups {
                type  uint32;
                description
                    "Maximum number of groups for each type.";
            }
            description
                "Maximum number of groups for each type.";
        }

        list actions {
            key "actions";
            leaf actions {
                type  uint32;
                description
                    "Bitmaps of (1    OFPAT_ ) values
supported.";
            }
            description
                "Bitmaps of (1    OFPAT_ ) values
supported.";
        }



    }

    container ofp_meter_multipart_request {
        description
            "Body of OFPMP_METER and OFPMP_METER_CONFIG requests.";
        leaf meter_id {
            type  uint32;
            description
                "Meter instance, or OFPM_ALL.";
        }



    }

    grouping ofp_meter_band_stats {
        description
            "Statistics for each meter band";
        leaf packet_band_count {
            type  uint64;
            description
                "Number of packets in band.";
        }

        leaf byte_band_count {
            type  uint64;
            description
                "Number of bytes in band.";
        }



    }

    container ofp_meter_stats {
        description
            "Body of reply to OFPMP_METER request. Meter statistics.";
        leaf meter_id {
            type  uint32;
            description
                "Meter instance.";
        }

        leaf flow_count {
            type  uint32;
            description
                "Number of flows bound to meter.";
        }

        leaf packet_in_count {
            type  uint64;
            description
                "Number of packets in input.";
        }

        leaf byte_in_count {
            type  uint64;
            description
                "Number of bytes in input.";
        }

        leaf duration_sec {
            type  uint32;
            description
                "Time meter has been alive in seconds.";
        }

        leaf duration_nsec {
            type  uint32;
            description
                "Time meter has been alive in nanoseconds
beyond duration_sec.";
        }

        list band_stats {
            key "packet_band_count";
            uses  ofp_meter_band_stats;

            description
                "The band_stats length is
inferred from the length field.";
        }



    }

    container ofp_meter_config {
        description
            "Body of reply to OFPMP_METER_CONFIG request. Meter configuration.";
        leaf flags {
            type  uint32;
            description
                "All OFPMF_  that apply.";
        }

        leaf meter_id {
            type  uint32;
            description
                "Meter instance.";
        }

        list bands {
            key "type";
            uses  ofp_meter_band_header;

            description
                "The bands length is
inferred from the length field.";
        }



    }

    container ofp_meter_features {
        description
            "Body of reply to OFPMP_METER_FEATURES request. Meter features.";
        leaf max_meter {
            type  uint32;
            description
                "Maximum number of meters.";
        }

        leaf band_types {
            type  uint32;
            description
                "Bitmaps of (1    OFPMBT_ ) values supported.";
        }

        leaf capabilities {
            type  uint32;
            description
                "Bitmaps of  ofp_meter_flags .";
        }

        leaf max_bands {
            type  uint32;
            description
                "Maximum bands per meters";
        }

        leaf max_color {
            type  uint32;
            description
                "Maximum color value";
        }



    }

    container ofp_experimenter_multipart_header {
        description
            "Body for ofp_multipart_request reply of type OFPMP_EXPERIMENTER.";
        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the same form
as in struct ofp_experimenter_header.";
        }

        leaf exp_type {
            type  uint32;
            description
                "Experimenter defined.";
        }

        leaf data {
            type  binary;
            description
                "Experimenter-defined arbitrary additional data.";
        }



    }

    container ofp_experimenter_header {
        description
            "Experimenter extension.";
        leaf experimenter {
            type  uint32;
            description
                "ofp_header header;     Type OFPT_EXPERIMENTER.
Experimenter ID:
 - MSB 0: low-order bytes are IEEE OUI.
 - MSB != 0: defined by ONF.";
        }

        leaf exp_type {
            type  uint32;
            description
                "Experimenter defined.";
        }

        leaf data {
            type  binary;
            description
                "Experimenter-defined arbitrary additional data.";
        }



    }

    grouping ofp_queue_prop_header {
        description
            "Common description for a queue.";
        leaf property {
            type  uint32;
            description
                "One of OFPQT_.";
        }

        leaf len {
            type  uint32;
            description
                "Length of property, including this header.";
        }



    }

    container ofp_queue_prop_min_rate {
        description
            "Min-Rate queue property description.";
        container prop_header {
            uses  ofp_queue_prop_header;

            description
                "prop: OFPQT_MIN, len: 16.";
        }

        leaf rate {
            type  uint32;
            description
                "In 1 10 of a percent = 0; 1000 -  disabled.";
        }



    }

    container ofp_queue_prop_max_rate {
        description
            "Max-Rate queue property description.";
        container prop_header {
            uses  ofp_queue_prop_header;

            description
                "prop: OFPQT_MAX, len: 16.";
        }

        leaf rate {
            type  uint32;
            description
                "In 1 10 of a percent = 0; 1000 -  disabled.";
        }



    }

    container ofp_queue_prop_experimenter {
        description
            "Experimenter queue property description.";
        container prop_header {
            uses  ofp_queue_prop_header;

            description
                "prop: OFPQT_EXPERIMENTER";
        }

        leaf experimenter {
            type  uint32;
            description
                "Experimenter ID which takes the same
form as in struct
ofp_experimenter_header.";
        }

        leaf data {
            type  binary;
            description
                "Experimenter defined data.";
        }



    }

    grouping ofp_packet_queue {
        description
            "Full description for a queue.";
        leaf queue_id {
            type  uint32;
            description
                "id for the specific queue.";
        }

        leaf port {
            type  uint32;
            description
                "Port this queue is attached to.";
        }

        list properties {
            key "property";
            uses  ofp_queue_prop_header;

            description
                "List of properties.";
        }



    }

    container ofp_queue_get_config_request {
        description
            "Query for port queue configuration.";
        leaf port {
            type  uint32;
            description
                "ofp_header header;
Port to be queried. Should refer
to a valid physical port (i.e.  = OFPP_MAX),
or OFPP_ANY to request all configured
queues.";
        }



    }

    container ofp_queue_get_config_reply {
        description
            "Queue configuration for a given port.";
        leaf port {
            type  uint32;
            description
                "ofp_header header;";
        }

        list queues {
            key "queue_id";
            uses  ofp_packet_queue;

            description
                "List of configured queues.";
        }



    }

    container ofp_action_set_queue {
        description
            "OFPAT_SET_QUEUE action struct: send packets to given queue on port.";
        leaf type {
            type  uint32;
            description
                "OFPAT_SET_QUEUE.";
        }

        leaf queue_id {
            type  uint32;
            description
                "Queue id for the packets.";
        }



    }

    container ofp_queue_stats_request {
        description
            "";
        leaf port_no {
            type  uint32;
            description
                "All ports if OFPP_ANY.";
        }

        leaf queue_id {
            type  uint32;
            description
                "All queues if OFPQ_ALL.";
        }



    }

    container ofp_queue_stats {
        description
            "";
        leaf port_no {
            type  uint32;
            description
                "";
        }

        leaf queue_id {
            type  uint32;
            description
                "Queue i.d";
        }

        leaf tx_bytes {
            type  uint64;
            description
                "Number of transmitted bytes.";
        }

        leaf tx_packets {
            type  uint64;
            description
                "Number of transmitted packets.";
        }

        leaf tx_errors {
            type  uint64;
            description
                "Number of packets dropped due to overrun.";
        }

        leaf duration_sec {
            type  uint32;
            description
                "Time queue has been alive in seconds.";
        }

        leaf duration_nsec {
            type  uint32;
            description
                "Time queue has been alive in nanoseconds
beyond duration_sec.";
        }



    }

    container ofp_role_request {
        description
            "Role request and reply message.";
        leaf role {
            type  ofp_controller_role;

            description
                "ofp_header header;           Type OFPT_ROLE_REQUEST OFPT_ROLE_REPLY.
One of OFPCR_ROLE_ .";
        }

        leaf generation_id {
            type  uint64;
            description
                "Master Election Generation Id";
        }



    }

    container ofp_async_config {
        description
            "Asynchronous message configuration.";
        list packet_in_mask {
            key "packet_in_mask";
            leaf packet_in_mask {
                type  uint32;
                description
                    "ofp_header header;       OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC.
Bitmasks of OFPR_  values.";
            }
            description
                "ofp_header header;       OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC.
Bitmasks of OFPR_  values.";
        }

        list port_status_mask {
            key "port_status_mask";
            leaf port_status_mask {
                type  uint32;
                description
                    "Bitmasks of OFPPR_  values.";
            }
            description
                "Bitmasks of OFPPR_  values.";
        }

        list flow_removed_mask {
            key "flow_removed_mask";
            leaf flow_removed_mask {
                type  uint32;
                description
                    "Bitmasks of OFPRR_  values.";
            }
            description
                "Bitmasks of OFPRR_  values.";
        }



    }

    grouping FlowTableUpdate {
        description
            "ADDITIONAL VOLTHA SPECIFIC MESSAGE TYPES, AIDING RPC CALLS";
        leaf id {
            type  string;
            description
                "Device.id or LogicalDevice.id";
        }

        container flow_mod {
            uses  ofp_flow_mod;

            description
                "";
        }



    }

    grouping FlowGroupTableUpdate {
        description
            "";
        leaf id {
            type  string;
            description
                "Device.id or LogicalDevice.id";
        }

        container group_mod {
            uses  ofp_group_mod;

            description
                "";
        }



    }

    grouping Flows {
        description
            "";
        list items {
            key "id";
            uses  ofp_flow_stats;

            description
                "";
        }



    }

    grouping FlowGroups {
        description
            "";
        list items {
            key "type";
            uses  ofp_group_entry;

            description
                "";
        }



    }

    grouping PacketIn {
        description
            "";
        leaf id {
            type  string;
            description
                "LogicalDevice.id";
        }

        container packet_in {
            uses  ofp_packet_in;

            description
                "";
        }



    }

    grouping PacketOut {
        description
            "";
        leaf id {
            type  string;
            description
                "LogicalDevice.id";
        }

        container packet_out {
            uses  ofp_packet_out;

            description
                "";
        }



    }

    grouping ChangeEvent {
        description
            "";
        leaf id {
            type  string;
            description
                "LogicalDevice.id";
        }



        choice choice_0 {
            case port_status {
                container port_status {
                    uses  ofp_port_status;

                    description
                        "";
                }
            }
        }


    }


    /*  Health related services" */
    rpc HealthService-GetHealthStatus {
        description
            "Return current health status of a Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  HealthStatus;

        }
    }

    /*  Cluster-wide Voltha APIs

 These APIs are potentially dispatched to the leader of the Voltha cluster,
 to a specific Voltha instance which owns the given device or logical device." */
    rpc VolthaGlobalService-GetVoltha {
        description
            "Get high level information on the Voltha cluster";
        input {
            uses  Empty;

        }
        output {
            uses  Voltha_grouping; 
        }
    }

    rpc VolthaGlobalService-ListVolthaInstances {
        description
            "List all Voltha cluster instances";
        input {
            uses  Empty;

        }
        output {
            uses  VolthaInstances_grouping; 
        }
    }

    rpc VolthaGlobalService-GetVolthaInstance {
        description
            "Get details on a Voltha cluster instance";
        input {
            uses  ID;

        }
        output {
            uses  VolthaInstance_grouping; 
        }
    }

    rpc VolthaGlobalService-ListLogicalDevices {
        description
            "List all logical devices managed by the Voltha cluster";
        input {
            uses  Empty;

        }
        output {
            uses  LogicalDevices;

        }
    }

    rpc VolthaGlobalService-GetLogicalDevice {
        description
            "Get additional information on a given logical device";
        input {
            uses  ID;

        }
        output {
            uses  LogicalDevice;

        }
    }

    rpc VolthaGlobalService-ListLogicalDevicePorts {
        description
            "List ports of a logical device";
        input {
            uses  ID;

        }
        output {
            uses  LogicalPorts;

        }
    }

    rpc VolthaGlobalService-ListLogicalDeviceFlows {
        description
            "List all flows of a logical device";
        input {
            uses  ID;

        }
        output {
            uses  Flows;

        }
    }

    rpc VolthaGlobalService-UpdateLogicalDeviceFlowTable {
        description
            "Update flow table for logical device";
        input {
            uses  FlowTableUpdate;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-ListLogicalDeviceFlowGroups {
        description
            "List all flow groups of a logical device";
        input {
            uses  ID;

        }
        output {
            uses  FlowGroups;

        }
    }

    rpc VolthaGlobalService-UpdateLogicalDeviceFlowGroupTable {
        description
            "Update group table for device";
        input {
            uses  FlowGroupTableUpdate;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-ListDevices {
        description
            "List all physical devices controlled by the Voltha cluster";
        input {
            uses  Empty;

        }
        output {
            uses  Devices;

        }
    }

    rpc VolthaGlobalService-GetDevice {
        description
            "Get more information on a given physical device";
        input {
            uses  ID;

        }
        output {
            uses  Device;

        }
    }

    rpc VolthaGlobalService-CreateDevice {
        description
            "Pre-provision a new physical device";
        input {
            uses  Device;

        }
        output {
            uses  Device;

        }
    }

    rpc VolthaGlobalService-EnableDevice {
        description
            "Enable a device.  If the device was in pre-provisioned state then it
 will tansition to ENABLED state.  If it was is DISABLED state then it
 will tansition to ENABLED state as well.";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-DisableDevice {
        description
            "Disable a device";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-RebootDevice {
        description
            "Reboot a device";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-DeleteDevice {
        description
            "Delete a device";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-ListDevicePorts {
        description
            "List ports of a device";
        input {
            uses  ID;

        }
        output {
            uses  Ports;

        }
    }

    rpc VolthaGlobalService-ListDevicePmConfigs {
        description
            "List pm config of a device";
        input {
            uses  ID;

        }
        output {
            uses  PmConfigs;

        }
    }

    rpc VolthaGlobalService-UpdateDevicePmConfigs {
        description
            "Update the pm config of a device";
        input {
            uses  PmConfigs;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-ListDeviceFlows {
        description
            "List all flows of a device";
        input {
            uses  ID;

        }
        output {
            uses  Flows;

        }
    }

    rpc VolthaGlobalService-ListDeviceFlowGroups {
        description
            "List all flow groups of a device";
        input {
            uses  ID;

        }
        output {
            uses  FlowGroups;

        }
    }

    rpc VolthaGlobalService-ListDeviceTypes {
        description
            "List device types known to Voltha";
        input {
            uses  Empty;

        }
        output {
            uses  DeviceTypes;

        }
    }

    rpc VolthaGlobalService-GetDeviceType {
        description
            "Get additional information on a device type";
        input {
            uses  ID;

        }
        output {
            uses  DeviceType;

        }
    }

    rpc VolthaGlobalService-ListDeviceGroups {
        description
            "List all device sharding groups";
        input {
            uses  Empty;

        }
        output {
            uses  DeviceGroups;

        }
    }

    rpc VolthaGlobalService-GetDeviceGroup {
        description
            "Get additional information on a device group";
        input {
            uses  ID;

        }
        output {
            uses  DeviceGroup;

        }
    }

    rpc VolthaGlobalService-CreateAlarmFilter {
        description
            "";
        input {
            uses  AlarmFilter;

        }
        output {
            uses  AlarmFilter;

        }
    }

    rpc VolthaGlobalService-GetAlarmFilter {
        description
            "";
        input {
            uses  ID;

        }
        output {
            uses  AlarmFilter;

        }
    }

    rpc VolthaGlobalService-UpdateAlarmFilter {
        description
            "";
        input {
            uses  AlarmFilter;

        }
        output {
            uses  AlarmFilter;

        }
    }

    rpc VolthaGlobalService-DeleteAlarmFilter {
        description
            "";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaGlobalService-ListAlarmFilters {
        description
            "";
        input {
            uses  Empty;

        }
        output {
            uses  AlarmFilters;

        }
    }


    /*  Per-instance APIs

 These APIs are always served locally by the Voltha instance on which the
 call is made." */
    rpc VolthaLocalService-GetVolthaInstance {
        description
            "Get information on this Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  VolthaInstance_grouping; 
        }
    }

    rpc VolthaLocalService-GetHealth {
        description
            "Get the health state of the Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  HealthStatus;

        }
    }

    rpc VolthaLocalService-ListAdapters {
        description
            "List all active adapters (plugins) in this Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  Adapters;

        }
    }

    rpc VolthaLocalService-ListLogicalDevices {
        description
            "List all logical devices managed by this Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  LogicalDevices;

        }
    }

    rpc VolthaLocalService-GetLogicalDevice {
        description
            "Get additional information on given logical device";
        input {
            uses  ID;

        }
        output {
            uses  LogicalDevice;

        }
    }

    rpc VolthaLocalService-ListLogicalDevicePorts {
        description
            "List ports of a logical device";
        input {
            uses  ID;

        }
        output {
            uses  LogicalPorts;

        }
    }

    rpc VolthaLocalService-ListLogicalDeviceFlows {
        description
            "List all flows of a logical device";
        input {
            uses  ID;

        }
        output {
            uses  Flows;

        }
    }

    rpc VolthaLocalService-UpdateLogicalDeviceFlowTable {
        description
            "Update flow table for logical device";
        input {
            uses  FlowTableUpdate;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-ListLogicalDeviceFlowGroups {
        description
            "List all flow groups of a logical device";
        input {
            uses  ID;

        }
        output {
            uses  FlowGroups;

        }
    }

    rpc VolthaLocalService-UpdateLogicalDeviceFlowGroupTable {
        description
            "Update group table for logical device";
        input {
            uses  FlowGroupTableUpdate;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-ListDevices {
        description
            "List all physical devices managed by this Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  Devices;

        }
    }

    rpc VolthaLocalService-GetDevice {
        description
            "Get additional information on this device";
        input {
            uses  ID;

        }
        output {
            uses  Device;

        }
    }

    rpc VolthaLocalService-CreateDevice {
        description
            "Pre-provision a new physical device";
        input {
            uses  Device;

        }
        output {
            uses  Device;

        }
    }

    rpc VolthaLocalService-EnableDevice {
        description
            "Enable a device.  If the device was in pre-provisioned state then it
 will tansition to ENABLED state.  If it was is DISABLED state then it
 will tansition to ENABLED state as well.";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-DisableDevice {
        description
            "Disable a device";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-RebootDevice {
        description
            "Reboot a device";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-DeleteDevice {
        description
            "Delete a device";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-ListDevicePorts {
        description
            "List ports of a device";
        input {
            uses  ID;

        }
        output {
            uses  Ports;

        }
    }

    rpc VolthaLocalService-ListDevicePmConfigs {
        description
            "List pm config of a device";
        input {
            uses  ID;

        }
        output {
            uses  PmConfigs;

        }
    }

    rpc VolthaLocalService-UpdateDevicePmConfigs {
        description
            "Update the pm config of a device";
        input {
            uses  PmConfigs;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-ListDeviceFlows {
        description
            "List all flows of a device";
        input {
            uses  ID;

        }
        output {
            uses  Flows;

        }
    }

    rpc VolthaLocalService-ListDeviceFlowGroups {
        description
            "List all flow groups of a device";
        input {
            uses  ID;

        }
        output {
            uses  FlowGroups;

        }
    }

    rpc VolthaLocalService-ListDeviceTypes {
        description
            "List device types know to Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  DeviceTypes;

        }
    }

    rpc VolthaLocalService-GetDeviceType {
        description
            "Get additional information on given device type";
        input {
            uses  ID;

        }
        output {
            uses  DeviceType;

        }
    }

    rpc VolthaLocalService-ListDeviceGroups {
        description
            "List device sharding groups managed by this Voltha instance";
        input {
            uses  Empty;

        }
        output {
            uses  DeviceGroups;

        }
    }

    rpc VolthaLocalService-GetDeviceGroup {
        description
            "Get more information on given device shard";
        input {
            uses  ID;

        }
        output {
            uses  DeviceGroup;

        }
    }

    rpc VolthaLocalService-StreamPacketsOut {
        description
            "Stream control packets to the dataplane
This does not have an HTTP representation";
        input {
            uses  PacketOut;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-ReceivePacketsIn {
        description
            "Receive control packet stream
This does not have an HTTP representation";
        input {
            uses  Empty;

        }
        output {
            uses  PacketIn;

        }
    }

    rpc VolthaLocalService-ReceiveChangeEvents {
        description
            "This does not have an HTTP representation";
        input {
            uses  Empty;

        }
        output {
            uses  ChangeEvent;

        }
    }

    rpc VolthaLocalService-CreateAlarmFilter {
        description
            "";
        input {
            uses  AlarmFilter;

        }
        output {
            uses  AlarmFilter;

        }
    }

    rpc VolthaLocalService-GetAlarmFilter {
        description
            "";
        input {
            uses  ID;

        }
        output {
            uses  AlarmFilter;

        }
    }

    rpc VolthaLocalService-UpdateAlarmFilter {
        description
            "";
        input {
            uses  AlarmFilter;

        }
        output {
            uses  AlarmFilter;

        }
    }

    rpc VolthaLocalService-DeleteAlarmFilter {
        description
            "";
        input {
            uses  ID;

        }
        output {
            uses  Empty;

        }
    }

    rpc VolthaLocalService-ListAlarmFilters {
        description
            "";
        input {
            uses  Empty;

        }
        output {
            uses  AlarmFilters;

        }
    }


}
