Netopeer NETCONF server integration

Amendments:

- Removed local copy of golang package. Added instructions to download it.
- Removed cached files which are created when transapi is built.
- Added netopeer as a build-able Makefile component.
  Updated documentation.

Change-Id: I532e813b81a0531648c5a6bcb048208700cf57a4
diff --git a/netopeer/voltha-transapi/voltha.yang b/netopeer/voltha-transapi/voltha.yang
new file mode 100644
index 0000000..3b15ebf
--- /dev/null
+++ b/netopeer/voltha-transapi/voltha.yang
@@ -0,0 +1,7504 @@
+
+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(&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) & 0x7f)
+#define OXM_TYPE(HEADER) (((HEADER)    9) & 0x7fffff)
+#define OXM_HASMASK(HEADER) (((HEADER)    8) & 1)
+#define OXM_LENGTH(HEADER) ((HEADER) & 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;
+
+        }
+    }
+
+
+}