This commit consists of:
1) Yang annotations to the protobuf definitions.  These annotations, when
   added to the relevant proto files in Voltha,  allow us to convert
   the voltha proto schemas into Yang schemas without the need to change the
   model definitions.
2) Update to the Yang parser to handle the above annotations
3) Some initial work on the netconf GET RPCs (work in progress)
4) Cleanup

Change-Id: I5e4f4217850f0beb1c41aca1b2530a41e4f8a809
diff --git a/experiments/netconf/proto2yang/adapter.proto b/experiments/netconf/proto2yang/adapter.proto
deleted file mode 100644
index 2e16f96..0000000
--- a/experiments/netconf/proto2yang/adapter.proto
+++ /dev/null
@@ -1,41 +0,0 @@
-syntax = "proto3";
-
-package voltha;
-
-import "google/protobuf/any.proto";
-import "common.proto";
-import "meta.proto";
-
-
-message AdapterConfig {
-
-    // Common adapter config attributes here
-    LogLevel log_level = 1;
-
-    // Custom (vendor-specific) configuration attributes
-    google.protobuf.Any additional_config = 64;
-
-}
-
-// Adapter (software plugin)
-message Adapter {
-
-    // Unique name of adapter, matching the python packate name under
-    // voltha/adapters.
-    string id = 1 [(access) = READ_ONLY];
-    string vendor = 2 [(access) = READ_ONLY];
-    string version = 3 [(access) = READ_ONLY];
-
-    // Adapter configuration
-    AdapterConfig config = 16;
-
-    // Custom descriptors and custom configuration
-    google.protobuf.Any additional_description = 64 [(access) = READ_ONLY];
-
-    repeated string logical_device_ids = 4;  // Logical devices "owned"
-
-}
-
-message Adapters {
-    repeated Adapter items = 1;
-}
diff --git a/experiments/netconf/proto2yang/adapter_tibit.proto b/experiments/netconf/proto2yang/adapter_tibit.proto
deleted file mode 100644
index ac9f1ec..0000000
--- a/experiments/netconf/proto2yang/adapter_tibit.proto
+++ /dev/null
@@ -1,24 +0,0 @@
-syntax = "proto3";
-
-package vendor.x2;
-
-// Vendor specific adapter descriptor data
-message AdapterDescription {
-    string foo = 1;
-    uint32 arg1 = 2;
-    uint32 arg2 = 3;
-    uint32 arg3 = 4;
-    uint32 arg4 = 5;
-    uint32 arg5 = 6;
-    uint32 arg6 = 7;
-}
-
-// Vendor specific adapter configuration data
-message AdapterConfig {
-    uint64 conf1 = 1;
-    uint64 conf2 = 2;
-    uint64 conf3 = 3;
-    uint64 conf4 = 4;
-    uint64 conf5 = 5;
-    repeated string things = 6;
-}
diff --git a/experiments/netconf/proto2yang/book.proto b/experiments/netconf/proto2yang/book.proto
new file mode 100644
index 0000000..687a7c8
--- /dev/null
+++ b/experiments/netconf/proto2yang/book.proto
@@ -0,0 +1,64 @@
+// See README.txt for information and build instructions.
+
+syntax = "proto3";
+
+package tutorial;
+
+import "google/api/annotations.proto";
+
+import public "yang_options.proto";
+
+option java_package = "com.example.tutorial";
+option java_outer_classname = "AddressBookProtos";
+option csharp_namespace = "Google.Protobuf.Examples.AddressBook";
+
+message House {
+    option (voltha.yang_child_rule) = MOVE_TO_PARENT_LEVEL;
+
+    enum HouseType {
+      MOBILE = 0;
+      SINGLE = 1;
+      TOWN = 2;
+    }
+
+    string myhouse = 1;
+
+    message Door {
+      string colour = 1;
+      string size = 2;
+    }
+}
+
+message Girl {
+    option (voltha.yang_message_rule) = CREATE_BOTH_GROUPING_AND_CONTAINER;
+    repeated House houses = 4;
+}
+
+message Person {
+  option (voltha.yang_message_rule) = CREATE_BOTH_GROUPING_AND_CONTAINER;
+
+  string name = 1;
+  int32 id = 2;        // Unique ID number for this person.
+  string email = 3;
+  repeated string khen = 4;
+  repeated PhoneNumber phones = 5;
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    string number = 1;
+    PhoneType type = 2;
+  }
+
+}
+
+// Our address book file is just one of these.
+message AddressBook {
+   Person people = 1  [(voltha.yang_inline_node).id = 'people',
+                              (voltha.yang_inline_node).type = 'book-Person'] ;
+   Girl girl = 2;
+}
diff --git a/experiments/netconf/proto2yang/common.proto b/experiments/netconf/proto2yang/common.proto
deleted file mode 100644
index 0ec8ce3..0000000
--- a/experiments/netconf/proto2yang/common.proto
+++ /dev/null
@@ -1,71 +0,0 @@
-syntax = "proto3";
-
-package voltha;
-
-// Convey a resource identifier
-message ID {
-    string id = 1;
-}
-
-
-// Logging verbosity level
-enum LogLevel {
-    DEBUG = 0;
-    INFO = 1;
-    WARNING = 2;
-    ERROR = 3;
-    CRITICAL = 4;
-}
-
-// Administrative State
-enum AdminState {
-
-    // The administrative state of the device is unknown
-    AS_UNKNOWN = 0;
-
-    // The device is pre-provisioned into Voltha, but not contacted by it
-    AS_PREPROVISIONED = 1;
-
-    // The device is enabled for activation and operation
-    AS_ENABLED = 3;
-
-    // The device is disabled and shall not perform its intended forwarding
-    // functions other than being available for re-activation.
-    AS_DISABLED = 2;
-}
-
-// Operational Status
-enum OperStatus {
-
-    // The status of the device is unknown at this point
-    OS_UNKNOWN = 0;
-
-    // The device has been discovered, but not yet activated
-    OS_DISCOVERED = 1;
-
-    // The device is being activated (booted, rebooted, upgraded, etc.)
-    OS_ACTIVATING = 2;
-
-    // Service impacting tests are being conducted
-    OS_TESTING = 3;
-
-    // The device is up and active
-    OS_ACTIVE = 4;
-
-    // The device has failed and cannot fulfill its intended role
-    OS_FAILED = 5;
-}
-
-// Connectivity Status
-enum ConnectStatus {
-
-    // The device connectivity status is unknown
-    CS_UNKNOWN = 0;
-
-    // The device cannot be reached by Voltha
-    CS_UNREACHABLE = 1;
-
-    // There is live communication between device and Voltha
-    CS_REACHABLE = 2;
-}
-
diff --git a/experiments/netconf/proto2yang/device.proto b/experiments/netconf/proto2yang/device.proto
deleted file mode 100644
index 4fc261f..0000000
--- a/experiments/netconf/proto2yang/device.proto
+++ /dev/null
@@ -1,135 +0,0 @@
-syntax = "proto3";
-
-package voltha;
-
-import "meta.proto";
-import "google/protobuf/any.proto";
-import "common.proto";
-import "openflow_13.proto";
-
-// A Device Type
-message DeviceType {
-
-    // Unique name for the device type
-    string id = 1;
-
-    // Name of the adapter that handles device type
-    string adapter = 2;
-
-    // Capabilitities
-
-    bool accepts_bulk_flow_update = 3;
-    bool accepts_add_remove_flow_updates = 4;
-
-}
-
-// A plurality of device types
-message DeviceTypes {
-    repeated DeviceType items = 1;
-}
-
-message Port {
-
-    enum PortType {
-        UNKNOWN = 0;
-        ETHERNET_NNI = 1;
-        ETHERNET_UNI = 2;
-        PON_OLT = 3;
-        PON_ONU = 4;
-    }
-
-    uint32 port_no = 1;  // Device-unique port number
-
-    string label = 2;  // Arbitrary port label
-
-    PortType type = 3;  //  Type of port
-
-    AdminState admin_state = 5;
-
-    OperStatus oper_status = 6;
-
-    string device_id = 7;  // Unique .id of device that owns this port
-
-    message PeerPort {
-        string device_id = 1;
-        uint32 port_no = 2;
-    }
-    repeated PeerPort peers = 8;
-
-}
-
-message Ports {
-    repeated Port items = 1;
-}
-
-// A Physical Device instance
-message Device {
-
-    // Voltha's device identifier
-    string id = 1 [(access) = READ_ONLY];
-
-    // Device type, refers to one of the registered device types
-    string type = 2 [(access) = READ_ONLY];
-
-    // Is this device a root device. Each logical switch has one root
-    // device that is associated with the logical flow switch.
-    bool root = 3 [(access) = READ_ONLY];
-
-    // Parent device id, in the device tree (for a root device, the parent_id
-    // is the logical_device.id)
-    string parent_id = 4 [(access) = READ_ONLY];
-    uint32 parent_port_no = 20 [(access) = READ_ONLY];
-
-    // Vendor, version, serial number, etc.
-    string vendor = 5 [(access) = READ_ONLY];
-    string model = 6 [(access) = READ_ONLY];
-    string hardware_version = 7 [(access) = READ_ONLY];
-    string firmware_version = 8 [(access) = READ_ONLY];
-    string software_version = 9 [(access) = READ_ONLY];
-    string serial_number = 10 [(access) = READ_ONLY];
-
-    // Addapter that takes care of device
-    string adapter = 11 [(access) = READ_ONLY];
-
-    // Device contact on vlan (if 0, no vlan)
-    uint32 vlan = 12;
-
-    message ProxyAddress {
-        string device_id = 1;  // Which device to use as proxy to this device
-        uint32 channel_id = 2;  // Sub-address within proxy device
-    };
-
-    oneof address {
-        // Device contact MAC address (format: "xx:xx:xx:xx:xx:xx")
-        string mac_address = 13;
-
-        // Device contact IPv4 address (format: "a.b.c.d" or can use hostname too)
-        string ipv4_address = 14;
-
-        // Device contact IPv6 address using the canonical string form
-        // ("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx")
-        string ipv6_address = 15;
-
-        ProxyAddress proxy_address = 19;
-    };
-
-    AdminState admin_state = 16;
-
-    OperStatus oper_status = 17 [(access) = READ_ONLY];
-
-    ConnectStatus connect_status = 18 [(access) = READ_ONLY];
-
-    // TODO additional common attribute here
-
-    // Device type specific attributes
-    google.protobuf.Any custom = 64;
-
-    repeated Port ports = 128  [(child_node) = {key: "port_no"}];
-    openflow_13.Flows flows = 129 [(child_node) = {}];
-    openflow_13.FlowGroups flow_groups = 130 [(child_node) = {}];
-
-}
-
-message Devices {
-    repeated Device items = 1;
-}
diff --git a/experiments/netconf/proto2yang/health.proto b/experiments/netconf/proto2yang/health.proto
deleted file mode 100644
index 19383a9..0000000
--- a/experiments/netconf/proto2yang/health.proto
+++ /dev/null
@@ -1,34 +0,0 @@
-syntax = "proto3";
-
-package voltha;
-
-import "google/api/annotations.proto";
-import "google/protobuf/empty.proto";
-import "meta.proto";
-
-// Encode health status of a Voltha instance
-message HealthStatus {
-
-    // Health states
-    enum HealthState {
-        HEALTHY = 0;  // The instance is healthy
-        OVERLOADED = 1;  // The instance is overloaded, decrease query rate
-        DYING = 2;  // The instance is in a critical condition, do not use it
-    }
-
-    // Current state of health of this Voltha instance
-    HealthState state = 1 [(access) = READ_ONLY];
-}
-
-// Health related services
-service HealthService {
-
-    // Return current health status of a Voltha instance
-    rpc GetHealthStatus(google.protobuf.Empty) returns (HealthStatus) {
-        option (google.api.http) = {
-            get: "/health"
-        };
-    }
-
-}
-
diff --git a/experiments/netconf/proto2yang/ietf-adapter.yang b/experiments/netconf/proto2yang/ietf-adapter.yang
deleted file mode 100644
index 42ef6e3..0000000
--- a/experiments/netconf/proto2yang/ietf-adapter.yang
+++ /dev/null
@@ -1,105 +0,0 @@
-
-module ietf-adapter {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-adapter";
-    prefix adapter;
-
-    import ietf-common { prefix common ; }
-    import ietf-any { prefix any ; }
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    grouping AdapterConfig {
-        description
-            "";
-        leaf log_level {
-            type  common:LogLevel;
-
-            description
-                "Common adapter config attributes here";
-        }
-
-        container additional_config {
-            uses  any: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: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
-                "";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-annotations.yang b/experiments/netconf/proto2yang/ietf-annotations.yang
deleted file mode 100644
index 8af4415..0000000
--- a/experiments/netconf/proto2yang/ietf-annotations.yang
+++ /dev/null
@@ -1,22 +0,0 @@
-
-module ietf-annotations {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-annotations";
-    prefix annotations;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-any.yang b/experiments/netconf/proto2yang/ietf-any.yang
deleted file mode 100644
index bf318af..0000000
--- a/experiments/netconf/proto2yang/ietf-any.yang
+++ /dev/null
@@ -1,127 +0,0 @@
-
-module ietf-any {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-any";
-    prefix any;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    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.";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-common.yang b/experiments/netconf/proto2yang/ietf-common.yang
deleted file mode 100644
index b2f6fab..0000000
--- a/experiments/netconf/proto2yang/ietf-common.yang
+++ /dev/null
@@ -1,111 +0,0 @@
-
-module ietf-common {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-common";
-    prefix common;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-    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 AS_UNKNOWN {
-                description "";
-            }
-            enum AS_PREPROVISIONED {
-                description "";
-            }
-            enum AS_ENABLED {
-                description "";
-            }
-            enum AS_DISABLED {
-                description "";
-            }
-        }
-        description
-            "Administrative State";
-    }
-    typedef OperStatus {
-        type enumeration {
-            enum OS_UNKNOWN {
-                description "";
-            }
-            enum OS_DISCOVERED {
-                description "";
-            }
-            enum OS_ACTIVATING {
-                description "";
-            }
-            enum OS_TESTING {
-                description "";
-            }
-            enum OS_ACTIVE {
-                description "";
-            }
-            enum OS_FAILED {
-                description "";
-            }
-        }
-        description
-            "Operational Status";
-    }
-    typedef ConnectStatus {
-        type enumeration {
-            enum CS_UNKNOWN {
-                description "";
-            }
-            enum CS_UNREACHABLE {
-                description "";
-            }
-            enum CS_REACHABLE {
-                description "";
-            }
-        }
-        description
-            "Connectivity Status";
-    }
-
-    grouping ID {
-        description
-            "Convey a resource identifier";
-        leaf id {
-            type  string; 
-            description
-                "";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-descriptor.yang b/experiments/netconf/proto2yang/ietf-descriptor.yang
deleted file mode 100644
index 487f100..0000000
--- a/experiments/netconf/proto2yang/ietf-descriptor.yang
+++ /dev/null
@@ -1,1331 +0,0 @@
-
-module ietf-descriptor {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-descriptor";
-    prefix descriptor;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    container FileDescriptorSet {
-        description
-            "The protocol compiler can output a FileDescriptorSet containing the .proto
- files it parses.";
-        list file {
-            key "name";
-            uses  FileDescriptorProto;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping FileDescriptorProto {
-        description
-            "Describes a complete .proto file.";
-        leaf name {
-            type  string; 
-            description
-                "file name, relative to root of source tree";
-        }
-
-        leaf package {
-            type  string; 
-            description
-                "e.g.  foo ,  foo.bar , etc.";
-        }
-
-        list dependency {
-            key "dependency";
-            leaf dependency {
-                type  string; 
-                description
-                    "Names of files imported by this file.";
-            }
-            description
-                "Names of files imported by this file.";
-        }
-
-        list public_dependency {
-            key "public_dependency";
-            leaf public_dependency {
-                type  int32; 
-                description
-                    "Indexes of the public imported files in the dependency list above.";
-            }
-            description
-                "Indexes of the public imported files in the dependency list above.";
-        }
-
-        list weak_dependency {
-            key "weak_dependency";
-            leaf weak_dependency {
-                type  int32; 
-                description
-                    "Indexes of the weak imported files in the dependency list.
- For Google-internal migration only. Do not use.";
-            }
-            description
-                "Indexes of the weak imported files in the dependency list.
- For Google-internal migration only. Do not use.";
-        }
-
-        list message_type {
-            key "name";
-            uses  DescriptorProto;
-
-            description
-                "All top-level definitions in this file.";
-        }
-
-        list enum_type {
-            key "name";
-            uses  EnumDescriptorProto;
-
-            description
-                "";
-        }
-
-        list service {
-            key "name";
-            uses  ServiceDescriptorProto;
-
-            description
-                "";
-        }
-
-        list extension {
-            key "name";
-            uses  FieldDescriptorProto;
-
-            description
-                "";
-        }
-
-        container options {
-            uses  FileOptions;
-
-            description
-                "";
-        }
-
-        container source_code_info {
-            uses  SourceCodeInfo;
-
-            description
-                "This field contains optional information about the original source code.
- You may safely remove this entire field without harming runtime
- functionality of the descriptors -- the information is needed only by
- development tools.";
-        }
-
-        leaf syntax {
-            type  string; 
-            description
-                "The syntax of the proto file.
- The supported values are  proto2  and  proto3 .";
-        }
-
-    }
-
-    grouping DescriptorProto {
-        description
-            "Describes a message type.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        list field {
-            key "name";
-            uses  FieldDescriptorProto;
-
-            description
-                "";
-        }
-
-        list extension {
-            key "name";
-            uses  FieldDescriptorProto;
-
-            description
-                "";
-        }
-
-        list nested_type {
-            key "name";
-            uses  DescriptorProto;
-
-            description
-                "";
-        }
-
-        list enum_type {
-            key "name";
-            uses  EnumDescriptorProto;
-
-            description
-                "";
-        }
-
-
-        list oneof_decl {
-            key "name";
-            uses  OneofDescriptorProto;
-
-            description
-                "";
-        }
-
-        container options {
-            uses  MessageOptions;
-
-            description
-                "";
-        }
-
-
-        list reserved_name {
-            key "reserved_name";
-            leaf reserved_name {
-                type  string; 
-                description
-                    "Reserved field names, which may not be used by fields in the same message.
- A given name may only be reserved once.";
-            }
-            description
-                "Reserved field names, which may not be used by fields in the same message.
- A given name may only be reserved once.";
-        }
-
-        grouping ExtensionRange {
-            description
-                "";
-            leaf start {
-                type  int32; 
-                description
-                    "";
-            }
-    
-            leaf end {
-                type  int32; 
-                description
-                    "";
-            }
-    
-        }
-    
-        grouping ReservedRange {
-            description
-                "Range of reserved tag numbers. Reserved tag numbers may not be used by
-     fields or extension ranges in the same message. Reserved ranges may
-     not overlap.";
-            leaf start {
-                type  int32; 
-                description
-                    "Inclusive.";
-            }
-    
-            leaf end {
-                type  int32; 
-                description
-                    "Exclusive.";
-            }
-    
-        }
-    
-    }
-
-    grouping FieldDescriptorProto {
-        description
-            "Describes a field within a message.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        leaf number {
-            type  int32; 
-            description
-                "";
-        }
-
-        leaf label {
-            type  Label; 
-            description
-                "";
-        }
-
-        leaf type {
-            type  Type; 
-            description
-                "If type_name is set, this need not be set.  If both this and type_name
- are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.";
-        }
-
-        leaf type_name {
-            type  string; 
-            description
-                "For message and enum types, this is the name of the type.  If the name
- starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
- rules are used to find the type (i.e. first the nested types within this
- message are searched, then within the parent, on up to the root
- namespace).";
-        }
-
-        leaf extendee {
-            type  string; 
-            description
-                "For extensions, this is the name of the type being extended.  It is
- resolved in the same manner as type_name.";
-        }
-
-        leaf default_value {
-            type  string; 
-            description
-                "For numeric types, contains the original text representation of the value.
- For booleans,  true  or  false .
- For strings, contains the default text contents (not escaped in any way).
- For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
- TODO(kenton):  Base-64 encode?";
-        }
-
-        leaf oneof_index {
-            type  int32; 
-            description
-                "If set, gives the index of a oneof in the containing type's oneof_decl
- list.  This field is a member of that oneof.";
-        }
-
-        leaf json_name {
-            type  string; 
-            description
-                "JSON name of this field. The value is set by protocol compiler. If the
- user has set a  json_name  option on this field, that option's value
- will be used. Otherwise, it's deduced from the field's name by converting
- it to camelCase.";
-        }
-
-        container options {
-            uses  FieldOptions;
-
-            description
-                "";
-        }
-
-        typedef Type {
-            type enumeration {
-                enum TYPE_DOUBLE {
-                    description "";
-                }
-                enum TYPE_FLOAT {
-                    description "";
-                }
-                enum TYPE_INT64 {
-                    description "";
-                }
-                enum TYPE_UINT64 {
-                    description "";
-                }
-                enum TYPE_INT32 {
-                    description "";
-                }
-                enum TYPE_FIXED64 {
-                    description "";
-                }
-                enum TYPE_FIXED32 {
-                    description "";
-                }
-                enum TYPE_BOOL {
-                    description "";
-                }
-                enum TYPE_STRING {
-                    description "";
-                }
-                enum TYPE_GROUP {
-                    description "";
-                }
-                enum TYPE_MESSAGE {
-                    description "";
-                }
-                enum TYPE_BYTES {
-                    description "";
-                }
-                enum TYPE_UINT32 {
-                    description "";
-                }
-                enum TYPE_ENUM {
-                    description "";
-                }
-                enum TYPE_SFIXED32 {
-                    description "";
-                }
-                enum TYPE_SFIXED64 {
-                    description "";
-                }
-                enum TYPE_SINT32 {
-                    description "";
-                }
-                enum TYPE_SINT64 {
-                    description "";
-                }
-            }
-            description
-                "";
-        }
-
-        typedef Label {
-            type enumeration {
-                enum LABEL_OPTIONAL {
-                    description "";
-                }
-                enum LABEL_REQUIRED {
-                    description "";
-                }
-                enum LABEL_REPEATED {
-                    description "";
-                }
-            }
-            description
-                "";
-        }
-
-    }
-
-    grouping OneofDescriptorProto {
-        description
-            "Describes a oneof.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        container options {
-            uses  OneofOptions;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping EnumDescriptorProto {
-        description
-            "Describes an enum type.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        list value {
-            key "name";
-            uses  EnumValueDescriptorProto;
-
-            description
-                "";
-        }
-
-        container options {
-            uses  EnumOptions;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping EnumValueDescriptorProto {
-        description
-            "Describes a value within an enum.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        leaf number {
-            type  int32; 
-            description
-                "";
-        }
-
-        container options {
-            uses  EnumValueOptions;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping ServiceDescriptorProto {
-        description
-            "Describes a service.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        list method {
-            key "name";
-            uses  MethodDescriptorProto;
-
-            description
-                "";
-        }
-
-        container options {
-            uses  ServiceOptions;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping MethodDescriptorProto {
-        description
-            "Describes a method of a service.";
-        leaf name {
-            type  string; 
-            description
-                "";
-        }
-
-        leaf input_type {
-            type  string; 
-            description
-                "Input and output type names.  These are resolved in the same way as
- FieldDescriptorProto.type_name, but must refer to a message type.";
-        }
-
-        leaf output_type {
-            type  string; 
-            description
-                "";
-        }
-
-        container options {
-            uses  MethodOptions;
-
-            description
-                "";
-        }
-
-        leaf client_streaming {
-            type  boolean; 
-            description
-                "Identifies if client streams multiple client messages";
-        }
-
-        leaf server_streaming {
-            type  boolean; 
-            description
-                "Identifies if server streams multiple server messages";
-        }
-
-    }
-
-    grouping FileOptions {
-        description
-            "===================================================================
- Options
-Each of the definitions above may have  options  attached.  These are
- just annotations which may cause code to be generated slightly differently
- or may contain hints for code that manipulates protocol messages.
-
- Clients may define custom options as extensions of the  Options messages.
- These extensions may not yet be known at parsing time, so the parser cannot
- store the values in them.  Instead it stores them in a field in the  Options
- message called uninterpreted_option. This field must have the same name
- across all  Options messages. We then use this field to populate the
- extensions when we build a descriptor, at which point all protos have been
- parsed and so all extensions are known.
-
- Extension numbers for custom options may be chosen as follows:
-   For options which will only be used within a single application or
-   organization, or for experimental options, use field numbers 50000
-   through 99999.  It is up to you to ensure that you do not use the
-   same number for multiple options.
-   For options which will be published and used publicly by multiple
-   independent entities, e-mail protobuf-global-extension-registry@google.com
-   to reserve extension numbers. Simply provide your project name (e.g.
-   Objective-C plugin) and your project website (if available) -- there's no
-   need to explain how you intend to use them. Usually you only need one
-   extension number. You can declare multiple options with only one extension
-   number by putting them in a sub-message. See the Custom Options section of
-   the docs for examples:
-   https:  developers.google.com protocol-buffers docs proto#options
-   If this turns out to be popular, a web service will be set up
-   to automatically assign option numbers.";
-        leaf java_package {
-            type  string; 
-            description
-                "Sets the Java package where classes generated from this .proto will be
- placed.  By default, the proto package is used, but this is often
- inappropriate because proto packages do not normally start with backwards
- domain names.";
-        }
-
-        leaf java_outer_classname {
-            type  string; 
-            description
-                "If set, all the classes from the .proto file are wrapped in a single
- outer class with the given name.  This applies to both Proto1
- (equivalent to the old  --one_java_file  option) and Proto2 (where
- a .proto always translates to a single class, but you may want to
- explicitly choose the class name).";
-        }
-
-        leaf java_multiple_files {
-            type  boolean; 
-            description
-                "If set true, then the Java code generator will generate a separate .java
- file for each top-level message, enum, and service defined in the .proto
- file.  Thus, these types will  not  be nested inside the outer class
- named by java_outer_classname.  However, the outer class will still be
- generated to contain the file's getDescriptor() method as well as any
- top-level extensions defined in the file.";
-        }
-
-        leaf java_generate_equals_and_hash {
-            type  boolean; 
-            description
-                "If set true, then the Java code generator will generate equals() and
- hashCode() methods for all messages defined in the .proto file.
- This increases generated code size, potentially substantially for large
- protos, which may harm a memory-constrained application.
- - In the full runtime this is a speed optimization, as the
- AbstractMessage base class includes reflection-based implementations of
- these methods.
- - In the lite runtime, setting this option changes the semantics of
- equals() and hashCode() to more closely match those of the full runtime;
- the generated methods compute their results based on field values rather
- than object identity. (Implementations should not assume that hashcodes
- will be consistent across runtimes or versions of the protocol compiler.)";
-        }
-
-        leaf java_string_check_utf8 {
-            type  boolean; 
-            description
-                "If set true, then the Java2 code generator will generate code that
- throws an exception whenever an attempt is made to assign a non-UTF-8
- byte sequence to a string field.
- Message reflection will do the same.
- However, an extension field still accepts non-UTF-8 byte sequences.
- This option has no effect on when used with the lite runtime.";
-        }
-
-        leaf optimize_for {
-            type  OptimizeMode; 
-            description
-                "";
-        }
-
-        leaf go_package {
-            type  string; 
-            description
-                "Sets the Go package where structs generated from this .proto will be
- placed. If omitted, the Go package will be derived from the following:
-   - The basename of the package import path, if provided.
-   - Otherwise, the package statement in the .proto file, if present.
-   - Otherwise, the basename of the .proto file, without extension.";
-        }
-
-        leaf cc_generic_services {
-            type  boolean; 
-            description
-                "Should generic services be generated in each language?   Generic  services
- are not specific to any particular RPC system.  They are generated by the
- main code generators in each language (without additional plugins).
- Generic services were the only kind of service generation supported by
- early versions of google.protobuf.
-
- Generic services are now considered deprecated in favor of using plugins
- that generate code specific to your particular RPC system.  Therefore,
- these default to false.  Old code which depends on generic services should
- explicitly set them to true.";
-        }
-
-        leaf java_generic_services {
-            type  boolean; 
-            description
-                "";
-        }
-
-        leaf py_generic_services {
-            type  boolean; 
-            description
-                "";
-        }
-
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this file deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for everything in the file, or it will be completely ignored; in the very
- least, this is a formalization for deprecating files.";
-        }
-
-        leaf cc_enable_arenas {
-            type  boolean; 
-            description
-                "Enables the use of arenas for the proto messages in this file. This applies
- only to generated classes for C++.";
-        }
-
-        leaf objc_class_prefix {
-            type  string; 
-            description
-                "Sets the objective c class prefix which is prepended to all objective c
- generated classes from this .proto. There is no default.";
-        }
-
-        leaf csharp_namespace {
-            type  string; 
-            description
-                "Namespace for generated classes; defaults to the package.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-        typedef OptimizeMode {
-            type enumeration {
-                enum SPEED {
-                    description "";
-                }
-                enum CODE_SIZE {
-                    description "";
-                }
-                enum LITE_RUNTIME {
-                    description "";
-                }
-            }
-            description
-                "Generated classes can be optimized for speed or code size.";
-        }
-
-    }
-
-    grouping MessageOptions {
-        description
-            "";
-        leaf message_set_wire_format {
-            type  boolean; 
-            description
-                "Set true to use the old proto1 MessageSet wire format for extensions.
- This is provided for backwards-compatibility with the MessageSet wire
- format.  You should not use this for any other reason:  It's less
- efficient, has fewer features, and is more complicated.
-
- The message must be defined exactly as follows:
-   message Foo  
-     option message_set_wire_format = true;
-     extensions 4 to max;
-    
- Note that the message cannot have any defined fields; MessageSets only
- have extensions.
-
- All extensions of your type must be singular messages; e.g. they cannot
- be int32s, enums, or repeated messages.
-
- Because this is an option, the above two restrictions are not enforced by
- the protocol compiler.";
-        }
-
-        leaf no_standard_descriptor_accessor {
-            type  boolean; 
-            description
-                "Disables the generation of the standard  descriptor()  accessor, which can
- conflict with a field of the same name.  This is meant to make migration
- from proto1 easier; new code should avoid fields named  descriptor .";
-        }
-
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this message deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for the message, or it will be completely ignored; in the very least,
- this is a formalization for deprecating messages.";
-        }
-
-        leaf map_entry {
-            type  boolean; 
-            description
-                "Whether the message is an automatically generated map entry type for the
- maps field.
-
- For maps fields:
-     map<KeyType, ValueType> map_field = 1;
- The parsed descriptor looks like:
-     message MapFieldEntry  
-         option map_entry = true;
-         optional KeyType key = 1;
-         optional ValueType value = 2;
-      
-     repeated MapFieldEntry map_field = 1;
-
- Implementations may choose not to generate the map_entry=true message, but
- use a native map in the target language to hold the keys and values.
- The reflection APIs in such implementions still need to work as
- if the field is a repeated message field.
-
- NOTE: Do not set the option in .proto files. Always use the maps syntax
- instead. The option should only be implicitly set by the proto compiler
- parser.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-    }
-
-    grouping FieldOptions {
-        description
-            "";
-        leaf ctype {
-            type  CType; 
-            description
-                "The ctype option instructs the C++ code generator to use a different
- representation of the field than it normally would.  See the specific
- options below.  This option is not yet implemented in the open source
- release -- sorry, we'll try to include it in a future version!";
-        }
-
-        leaf packed {
-            type  boolean; 
-            description
-                "The packed option can be enabled for repeated primitive fields to enable
- a more efficient representation on the wire. Rather than repeatedly
- writing the tag and type for each element, the entire array is encoded as
- a single length-delimited blob. In proto3, only explicit setting it to
- false will avoid using packed encoding.";
-        }
-
-        leaf jstype {
-            type  JSType; 
-            description
-                "The jstype option determines the JavaScript type used for values of the
- field.  The option is permitted only for 64 bit integral and fixed types
- (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
- represented as JavaScript strings.  This avoids loss of precision that can
- happen when a large value is converted to a floating point JavaScript
- numbers.  Specifying JS_NUMBER for the jstype causes the generated
- JavaScript code to use the JavaScript  number  type instead of strings.
- This option is an enum to permit additional types to be added,
- e.g. goog.math.Integer.";
-        }
-
-        leaf lazy {
-            type  boolean; 
-            description
-                "Should this field be parsed lazily?  Lazy applies only to message-type
- fields.  It means that when the outer message is initially parsed, the
- inner message's contents will not be parsed but instead stored in encoded
- form.  The inner message will actually be parsed when it is first accessed.
-
- This is only a hint.  Implementations are free to choose whether to use
- eager or lazy parsing regardless of the value of this option.  However,
- setting this option true suggests that the protocol author believes that
- using lazy parsing on this field is worth the additional bookkeeping
- overhead typically needed to implement it.
-
- This option does not affect the public interface of any generated code;
- all method signatures remain the same.  Furthermore, thread-safety of the
- interface is not affected by this option; const methods remain safe to
- call from multiple threads concurrently, while non-const methods continue
- to require exclusive access.
-
-
- Note that implementations may choose not to check required fields within
- a lazy sub-message.  That is, calling IsInitialized() on the outher message
- may return true even if the inner message has missing required fields.
- This is necessary because otherwise the inner message would have to be
- parsed in order to perform the check, defeating the purpose of lazy
- parsing.  An implementation which chooses not to check required fields
- must be consistent about it.  That is, for any particular sub-message, the
- implementation must either  always  check its required fields, or  never 
- check its required fields, regardless of whether or not the message has
- been parsed.";
-        }
-
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this field deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for accessors, or it will be completely ignored; in the very least, this
- is a formalization for deprecating fields.";
-        }
-
-        leaf weak {
-            type  boolean; 
-            description
-                "For Google-internal migration only. Do not use.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-        typedef CType {
-            type enumeration {
-                enum STRING {
-                    description "";
-                }
-                enum CORD {
-                    description "";
-                }
-                enum STRING_PIECE {
-                    description "";
-                }
-            }
-            description
-                "";
-        }
-
-        typedef JSType {
-            type enumeration {
-                enum JS_NORMAL {
-                    description "";
-                }
-                enum JS_STRING {
-                    description "";
-                }
-                enum JS_NUMBER {
-                    description "";
-                }
-            }
-            description
-                "";
-        }
-
-    }
-
-    grouping OneofOptions {
-        description
-            "";
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-    }
-
-    grouping EnumOptions {
-        description
-            "";
-        leaf allow_alias {
-            type  boolean; 
-            description
-                "Set this option to true to allow mapping different tag names to the same
- value.";
-        }
-
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this enum deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for the enum, or it will be completely ignored; in the very least, this
- is a formalization for deprecating enums.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-    }
-
-    grouping EnumValueOptions {
-        description
-            "";
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this enum value deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for the enum value, or it will be completely ignored; in the very least,
- this is a formalization for deprecating enum values.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-    }
-
-    grouping ServiceOptions {
-        description
-            "";
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this service deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for the service, or it will be completely ignored; in the very least,
- this is a formalization for deprecating services.
-Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-   framework.  We apologize for hoarding these numbers to ourselves, but
-   we were already using them long before we decided to release Protocol
-   Buffers.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-    }
-
-    grouping MethodOptions {
-        description
-            "";
-        leaf deprecated {
-            type  boolean; 
-            description
-                "Is this method deprecated?
- Depending on the target platform, this can emit Deprecated annotations
- for the method, or it will be completely ignored; in the very least,
- this is a formalization for deprecating methods.
-Note:  Field numbers 1 through 32 are reserved for Google's internal RPC
-   framework.  We apologize for hoarding these numbers to ourselves, but
-   we were already using them long before we decided to release Protocol
-   Buffers.";
-        }
-
-        list uninterpreted_option {
-            key "identifier_value";
-            uses  UninterpretedOption;
-
-            description
-                "The parser stores options it doesn't recognize here. See above.";
-        }
-
-    }
-
-    grouping UninterpretedOption {
-        description
-            "A message representing a option the parser does not recognize. This only
- appears in options protos created by the compiler::Parser class.
- DescriptorPool resolves these when building Descriptor objects. Therefore,
- options protos in descriptor objects (e.g. returned by Descriptor::options(),
- or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
- in them.";
-
-        leaf identifier_value {
-            type  string; 
-            description
-                "The value of the uninterpreted option, in whatever type the tokenizer
- identified it as during parsing. Exactly one of these should be set.";
-        }
-
-        leaf positive_int_value {
-            type  uint64; 
-            description
-                "";
-        }
-
-        leaf negative_int_value {
-            type  int64; 
-            description
-                "";
-        }
-
-        leaf double_value {
-            type decimal64 {
-               fraction-digits 5;
-            }
-            description
-                "";
-        }
-
-        leaf string_value {
-            type  binary; 
-            description
-                "";
-        }
-
-        leaf aggregate_value {
-            type  string; 
-            description
-                "";
-        }
-
-        grouping NamePart {
-            description
-                "The name of the uninterpreted option.  Each string represents a segment in
-     a dot-separated name.  is_extension is true iff a segment represents an
-     extension (denoted with parentheses in options specs in .proto files).
-     E.g.,    foo , false ,   bar.baz , true ,   qux , false    represents
-      foo.(bar.baz).qux .";
-            leaf name_part {
-                type  string; 
-                description
-                    "";
-            }
-    
-            leaf is_extension {
-                type  boolean; 
-                description
-                    "";
-            }
-    
-        }
-    
-    }
-
-    grouping SourceCodeInfo {
-        description
-            "Encapsulates information about the original source file from which a
- FileDescriptorProto was generated.
-===================================================================
- Optional source code info";
-
-        grouping Location {
-            description
-                "";
-            list path {
-                key "path";
-                leaf path {
-                    type  int32; 
-                    description
-                        "Identifies which part of the FileDescriptorProto was defined at this
-     location.
-    
-     Each element is a field number or an index.  They form a path from
-     the root FileDescriptorProto to the place where the definition.  For
-     example, this path:
-         4, 3, 2, 7, 1  
-     refers to:
-       file.message_type(3)     4, 3
-           .field(7)            2, 7
-           .name()              1
-     This is because FileDescriptorProto.message_type has field number 4:
-       repeated DescriptorProto message_type = 4;
-     and DescriptorProto.field has field number 2:
-       repeated FieldDescriptorProto field = 2;
-     and FieldDescriptorProto.name has field number 1:
-       optional string name = 1;
-    
-     Thus, the above path gives the location of a field name.  If we removed
-     the last element:
-         4, 3, 2, 7  
-     this path refers to the whole field declaration (from the beginning
-     of the label to the terminating semicolon).";
-                }
-                description
-                    "Identifies which part of the FileDescriptorProto was defined at this
-     location.
-    
-     Each element is a field number or an index.  They form a path from
-     the root FileDescriptorProto to the place where the definition.  For
-     example, this path:
-         4, 3, 2, 7, 1  
-     refers to:
-       file.message_type(3)     4, 3
-           .field(7)            2, 7
-           .name()              1
-     This is because FileDescriptorProto.message_type has field number 4:
-       repeated DescriptorProto message_type = 4;
-     and DescriptorProto.field has field number 2:
-       repeated FieldDescriptorProto field = 2;
-     and FieldDescriptorProto.name has field number 1:
-       optional string name = 1;
-    
-     Thus, the above path gives the location of a field name.  If we removed
-     the last element:
-         4, 3, 2, 7  
-     this path refers to the whole field declaration (from the beginning
-     of the label to the terminating semicolon).";
-            }
-    
-            list span {
-                key "span";
-                leaf span {
-                    type  int32; 
-                    description
-                        "Always has exactly three or four elements: start line, start column,
-     end line (optional, otherwise assumed same as start line), end column.
-     These are packed into a single field for efficiency.  Note that line
-     and column numbers are zero-based -- typically you will want to add
-     1 to each before displaying to a user.";
-                }
-                description
-                    "Always has exactly three or four elements: start line, start column,
-     end line (optional, otherwise assumed same as start line), end column.
-     These are packed into a single field for efficiency.  Note that line
-     and column numbers are zero-based -- typically you will want to add
-     1 to each before displaying to a user.";
-            }
-    
-            leaf leading_comments {
-                type  string; 
-                description
-                    "If this SourceCodeInfo represents a complete declaration, these are any
-     comments appearing before and after the declaration which appear to be
-     attached to the declaration.
-    
-     A series of line comments appearing on consecutive lines, with no other
-     tokens appearing on those lines, will be treated as a single comment.
-    
-     leading_detached_comments will keep paragraphs of comments that appear
-     before (but not connected to) the current element. Each paragraph,
-     separated by empty lines, will be one comment element in the repeated
-     field.
-    
-     Only the comment content is provided; comment markers (e.g.   ) are
-     stripped out.  For block comments, leading whitespace and an asterisk
-     will be stripped from the beginning of each line other than the first.
-     Newlines are included in the output.
-    
-     Examples:
-    
-       optional int32 foo = 1;     Comment attached to foo.
-          Comment attached to bar.
-       optional int32 bar = 2;
-    
-       optional string baz = 3;
-          Comment attached to baz.
-          Another line attached to baz.
-    
-          Comment attached to qux.
-         
-          Another line attached to qux.
-       optional double qux = 4;
-    
-          Detached comment for corge. This is not leading or trailing comments
-          to qux or corge because there are blank lines separating it from
-          both.
-    
-          Detached comment for corge paragraph 2.
-    
-       optional string corge = 5;
-          Block comment attached
-          to corge.  Leading asterisks
-          will be removed.   
-          Block comment attached to
-          grault.   
-       optional int32 grault = 6;
-    
-          ignored detached comments.";
-            }
-    
-            leaf trailing_comments {
-                type  string; 
-                description
-                    "";
-            }
-    
-            list leading_detached_comments {
-                key "leading_detached_comments";
-                leaf leading_detached_comments {
-                    type  string; 
-                    description
-                        "";
-                }
-                description
-                    "";
-            }
-    
-        }
-    
-    }
-
-    container GeneratedCodeInfo {
-        description
-            "Describes the relationship between generated code and its original source
- file. A GeneratedCodeInfo message is associated with only one generated
- source file, but may contain references to different source .proto files.";
-
-        grouping Annotation {
-            description
-                "";
-            list path {
-                key "path";
-                leaf path {
-                    type  int32; 
-                    description
-                        "Identifies the element in the original source .proto file. This field
-     is formatted the same as SourceCodeInfo.Location.path.";
-                }
-                description
-                    "Identifies the element in the original source .proto file. This field
-     is formatted the same as SourceCodeInfo.Location.path.";
-            }
-    
-            leaf source_file {
-                type  string; 
-                description
-                    "Identifies the filesystem path to the original source .proto.";
-            }
-    
-            leaf begin {
-                type  int32; 
-                description
-                    "Identifies the starting offset in bytes in the generated code
-     that relates to the identified object.";
-            }
-    
-            leaf end {
-                type  int32; 
-                description
-                    "Identifies the ending offset in bytes in the generated code that
-     relates to the identified offset. The end offset should be one past
-     the last relevant byte (so the length of the text = end - begin).";
-            }
-    
-        }
-    
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-device.yang b/experiments/netconf/proto2yang/ietf-device.yang
deleted file mode 100644
index 0a37cf3..0000000
--- a/experiments/netconf/proto2yang/ietf-device.yang
+++ /dev/null
@@ -1,349 +0,0 @@
-
-module ietf-device {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-device";
-    prefix device;
-
-    import ietf-openflow_13 { prefix openflow_13 ; }
-    import ietf-common { prefix common ; }
-    import ietf-any { prefix any ; }
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    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 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  common:AdminState;
-
-            description
-                "";
-        }
-
-        leaf oper_status {
-            type  common:OperStatus;
-
-            description
-                "";
-        }
-
-        leaf device_id {
-            type  string; 
-            description
-                "Unique .id of device that owns this port";
-        }
-
-
-        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 PeerPort {
-            description
-                "";
-            leaf device_id {
-                type  string; 
-                description
-                    "";
-            }
-    
-            leaf port_no {
-                type  uint32; 
-                description
-                    "";
-            }
-    
-        }
-    
-    }
-
-    grouping Ports {
-        description
-            "";
-        list items {
-            key "port_no";
-            uses  Port;
-
-            description
-                "";
-        }
-
-    }
-
-    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)";
-        }
-
-        leaf mac_address {
-            type  string; 
-            description
-                "Device contact MAC address (format:  xx:xx:xx:xx:xx:xx )";
-        }
-
-        leaf ipv4_address {
-            type  string; 
-            description
-                "Device contact IPv4 address (format:  a.b.c.d  or can use hostname too)";
-        }
-
-        leaf ipv6_address {
-            type  string; 
-            description
-                "Device contact IPv6 address using the canonical string form
- ( xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx )";
-        }
-
-
-        leaf admin_state {
-            type  common:AdminState;
-
-            description
-                "";
-        }
-
-        leaf oper_status {
-            type  common:OperStatus;
-
-            description
-                "";
-        }
-
-        leaf connect_status {
-            type  common:ConnectStatus;
-
-            description
-                "";
-        }
-
-        container custom {
-            uses  any:Any;
-
-            description
-                "Device type specific attributes
-TODO additional common attribute here";
-        }
-
-        list ports {
-            key "port_no";
-            uses  Port;
-
-            description
-                "";
-        }
-
-        container flows {
-            uses  openflow_13:Flows;
-
-            description
-                "";
-        }
-
-        container flow_groups {
-            uses  openflow_13:FlowGroups;
-
-            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 device";
-            }
-    
-        }
-    
-    }
-
-    grouping Devices {
-        description
-            "";
-        list items {
-            key "id";
-            uses  Device;
-
-            description
-                "";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-empty.yang b/experiments/netconf/proto2yang/ietf-empty.yang
deleted file mode 100644
index c2ee52b..0000000
--- a/experiments/netconf/proto2yang/ietf-empty.yang
+++ /dev/null
@@ -1,35 +0,0 @@
-
-module ietf-empty {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-empty";
-    prefix empty;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    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 `  `.";
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-health.yang b/experiments/netconf/proto2yang/ietf-health.yang
deleted file mode 100644
index e79c30a..0000000
--- a/experiments/netconf/proto2yang/ietf-health.yang
+++ /dev/null
@@ -1,65 +0,0 @@
-
-module ietf-health {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-health";
-    prefix health;
-
-    import ietf-empty { prefix empty ; }
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    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";
-        }
-
-    }
-
-    /*  Health related services" */
-    rpc HealthService-GetHealthStatus {
-        description
-            "Return current health status of a Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  HealthStatus;
-
-        }
-    }
-
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-http.yang b/experiments/netconf/proto2yang/ietf-http.yang
deleted file mode 100644
index 3d9cf2c..0000000
--- a/experiments/netconf/proto2yang/ietf-http.yang
+++ /dev/null
@@ -1,158 +0,0 @@
-
-module ietf-http {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-http";
-    prefix http;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    grouping HttpRule {
-        description
-            "`HttpRule` defines the mapping of an RPC method to one or more HTTP REST API
- methods. The mapping determines what portions of the request message are
- populated from the path, query parameters, or body of the HTTP request.  The
- mapping is typically specified as an `google.api.http` annotation, see
-  google api annotations.proto  for details.
-
- The mapping consists of a mandatory field specifying a path template and an
- optional `body` field specifying what data is represented in the HTTP request
- body. The field name for the path indicates the HTTP method. Example:
-
- ```
- package google.storage.v2;
-
- import  google api annotations.proto ;
-
- service Storage  
-   rpc CreateObject(CreateObjectRequest) returns (Object)  
-     option (google.api.http)  
-       post:   v2  bucket_name=buckets    objects 
-       body:  object 
-      ;
-    ;
-  
- ```
-
- Here `bucket_name` and `object` bind to fields of the request message
- `CreateObjectRequest`.
-
- The rules for mapping HTTP path, query parameters, and body fields
- to the request message are as follows:
-
- 1. The `body` field specifies either ` ` or a field path, or is
-    omitted. If omitted, it assumes there is no HTTP body.
- 2. Leaf fields (recursive expansion of nested messages in the
-    request) can be classified into three types:
-     (a) Matched in the URL template.
-     (b) Covered by body (if body is ` `, everything except (a) fields;
-         else everything under the body field)
-     (c) All other fields.
- 3. URL query parameters found in the HTTP request are mapped to (c) fields.
- 4. Any body sent with an HTTP request can contain only (b) fields.
-
- The syntax of the path template is as follows:
-
-     Template =     Segments   Verb   ;
-     Segments = Segment       Segment   ;
-     Segment  =     |      | LITERAL | Variable ;
-     Variable =     FieldPath    =  Segments       ;
-     FieldPath = IDENT    .  IDENT   ;
-     Verb     =  :  LITERAL ;
-
- ` ` matches a single path component, `  ` zero or more path components, and
- `LITERAL` a constant.  A `Variable` can match an entire path as specified
- again by a template; this nested template must not contain further variables.
- If no template is given with a variable, it matches a single path component.
- The notation ` var ` is henceforth equivalent to ` var=  `.
-
- Use CustomHttpPattern to specify any HTTP method that is not included in the
- pattern field, such as HEAD, or     to leave the HTTP method unspecified for
- a given URL path rule. The wild-card rule is useful for services that provide
- content to Web (HTML) clients.";
-        leaf get {
-            type  string; 
-            description
-                "Used for listing and getting information about resources.";
-        }
-
-        leaf put {
-            type  string; 
-            description
-                "Used for updating a resource.";
-        }
-
-        leaf post {
-            type  string; 
-            description
-                "Used for creating a resource.";
-        }
-
-        leaf delete {
-            type  string; 
-            description
-                "Used for deleting a resource.";
-        }
-
-        leaf patch {
-            type  string; 
-            description
-                "Used for updating a resource.";
-        }
-
-        container custom {
-            uses  CustomHttpPattern;
-
-            description
-                "Custom pattern is used for defining custom verbs.";
-        }
-
-        leaf body {
-            type  string; 
-            description
-                "The name of the request field whose value is mapped to the HTTP body, or
- ` ` for mapping all fields not captured by the path pattern to the HTTP
- body.";
-        }
-
-        list additional_bindings {
-            key "get";
-            uses  HttpRule;
-
-            description
-                "Additional HTTP bindings for the selector. Nested bindings must not
- specify a selector and must not contain additional bindings.";
-        }
-
-    }
-
-    grouping CustomHttpPattern {
-        description
-            "A custom pattern is used for defining custom HTTP verb.";
-        leaf kind {
-            type  string; 
-            description
-                "The name of this custom HTTP verb.";
-        }
-
-        leaf path {
-            type  string; 
-            description
-                "The path matched by this custom verb.";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-logical_device.yang b/experiments/netconf/proto2yang/ietf-logical_device.yang
deleted file mode 100644
index 6c65d4d..0000000
--- a/experiments/netconf/proto2yang/ietf-logical_device.yang
+++ /dev/null
@@ -1,144 +0,0 @@
-
-module ietf-logical_device {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-logical_device";
-    prefix logical_device;
-
-    import ietf-openflow_13 { prefix openflow_13 ; }
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-
-    grouping LogicalPort {
-        description
-            "";
-        leaf id {
-            type  string; 
-            description
-                "";
-        }
-
-        container ofp_port {
-            uses  openflow_13: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  openflow_13:ofp_desc;
-
-            description
-                "device description";
-        }
-
-        container switch_features {
-            uses  openflow_13: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  openflow_13:Flows;
-
-            description
-                "flows configured on the logical device";
-        }
-
-        container flow_groups {
-            uses  openflow_13:FlowGroups;
-
-            description
-                "flow groups configured on the logical device";
-        }
-
-    }
-
-    grouping LogicalDevices {
-        description
-            "";
-        list items {
-            key "id";
-            uses  LogicalDevice;
-
-            description
-                "";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-meta.yang b/experiments/netconf/proto2yang/ietf-meta.yang
deleted file mode 100644
index 05fff41..0000000
--- a/experiments/netconf/proto2yang/ietf-meta.yang
+++ /dev/null
@@ -1,48 +0,0 @@
-
-module ietf-meta {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-meta";
-    prefix meta;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-    typedef Access {
-        type enumeration {
-            enum CONFIG {
-                description "";
-            }
-            enum READ_ONLY {
-                description "";
-            }
-            enum REAL_TIME {
-                description "";
-            }
-        }
-        description
-            "";
-    }
-
-    container ChildNode {
-        description
-            "";
-        leaf key {
-            type  string; 
-            description
-                "";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-openflow_13.yang b/experiments/netconf/proto2yang/ietf-openflow_13.yang
deleted file mode 100644
index 43b0bcb..0000000
--- a/experiments/netconf/proto2yang/ietf-openflow_13.yang
+++ /dev/null
@@ -1,4873 +0,0 @@
-
-module ietf-openflow_13 {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-openflow_13";
-    prefix openflow_13;
-
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-    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_ .";
-        }
-
-        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 .";
-        }
-
-    }
-
-    container 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
-                "";
-        }
-
-        container ofb_field {
-            uses  ofp_oxm_ofb_field;
-
-            description
-                "2 and 3 reserved for NXM_0 and NXM-1 OXM classes";
-        }
-
-        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
-                "";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        leaf eth_src {
-            type  binary; 
-            description
-                "Used for OFPXMT_OFB_ETH_SRC (exactly 6 bytes)";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        leaf ipv4_dst {
-            type  uint32; 
-            description
-                "Used for OFPXMT_OFB_IPV4_DST";
-        }
-
-        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.";
-        }
-
-        leaf tcp_dst {
-            type  uint32; 
-            description
-                "Used for OFPXMT_OFB_TCP_DST";
-        }
-
-        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.";
-        }
-
-        leaf udp_dst {
-            type  uint32; 
-            description
-                "Used for OFPXMT_OFB_UDP_DST";
-        }
-
-        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.";
-        }
-
-        leaf sctp_dst {
-            type  uint32; 
-            description
-                "Used for OFPXMT_OFB_SCTP_DST";
-        }
-
-        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.";
-        }
-
-        leaf icmpv4_code {
-            type  uint32; 
-            description
-                "Used for OFPXMT_OFB_ICMPV4_CODE";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        leaf arp_tpa {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_ARP_TPA";
-        }
-
-        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.";
-        }
-
-        leaf arp_tha {
-            type  binary; 
-            description
-                "For OFPXMT_OFB_ARP_THA (6 bytes)";
-        }
-
-        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.";
-        }
-
-        leaf ipv6_dst {
-            type  binary; 
-            description
-                "For OFPXMT_OFB_IPV6_DST";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        leaf icmpv6_code {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_ICMPV6_CODE";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        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.";
-        }
-
-        leaf table_metadata_mask {
-            type  uint64; 
-            description
-                "For OFPXMT_OFB_METADATA";
-        }
-
-        leaf eth_dst_mask {
-            type  binary; 
-            description
-                "For OFPXMT_OFB_ETH_DST (exactly 6 bytes)";
-        }
-
-        leaf eth_src_mask {
-            type  binary; 
-            description
-                "For OFPXMT_OFB_ETH_SRC (exactly 6 bytes)";
-        }
-
-        leaf vlan_vid_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_VLAN_VID";
-        }
-
-        leaf ipv4_src_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_IPV4_SRC";
-        }
-
-        leaf ipv4_dst_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_IPV4_DST";
-        }
-
-        leaf arp_spa_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_ARP_SPA";
-        }
-
-        leaf arp_tpa_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_ARP_TPA";
-        }
-
-        leaf ipv6_src_mask {
-            type  binary; 
-            description
-                "For OFPXMT_OFB_IPV6_SRC";
-        }
-
-        leaf ipv6_dst_mask {
-            type  binary; 
-            description
-                "For OFPXMT_OFB_IPV6_DST";
-        }
-
-        leaf ipv6_flabel_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_IPV6_FLABEL";
-        }
-
-        leaf pbb_isid_mask {
-            type  uint32; 
-            description
-                "For OFPXMT_OFB_PBB_ISID";
-        }
-
-        leaf tunnel_id_mask {
-            type  uint64; 
-            description
-                "For OFPXMT_OFB_TUNNEL_ID";
-        }
-
-        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_ .";
-        }
-
-        container output {
-            uses  ofp_action_output;
-
-            description
-                "";
-        }
-
-        container mpls_ttl {
-            uses  ofp_action_mpls_ttl;
-
-            description
-                "";
-        }
-
-        container push {
-            uses  ofp_action_push;
-
-            description
-                "";
-        }
-
-        container pop_mpls {
-            uses  ofp_action_pop_mpls;
-
-            description
-                "";
-        }
-
-        container group {
-            uses  ofp_action_group;
-
-            description
-                "";
-        }
-
-        container nw_ttl {
-            uses  ofp_action_nw_ttl;
-
-            description
-                "";
-        }
-
-        container set_field {
-            uses  ofp_action_set_field;
-
-            description
-                "";
-        }
-
-        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";
-        }
-
-        container goto_table {
-            uses  ofp_instruction_goto_table;
-
-            description
-                "";
-        }
-
-        container write_metadata {
-            uses  ofp_instruction_write_metadata;
-
-            description
-                "";
-        }
-
-        container actions {
-            uses  ofp_instruction_actions;
-
-            description
-                "";
-        }
-
-        container meter {
-            uses  ofp_instruction_meter;
-
-            description
-                "";
-        }
-
-        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_ .";
-        }
-
-        container instructions {
-            uses  ofp_table_feature_prop_instructions;
-
-            description
-                "";
-        }
-
-        container next_tables {
-            uses  ofp_table_feature_prop_next_tables;
-
-            description
-                "";
-        }
-
-        container actions {
-            uses  ofp_table_feature_prop_actions;
-
-            description
-                "";
-        }
-
-        container oxm {
-            uses  ofp_table_feature_prop_oxm;
-
-            description
-                "";
-        }
-
-        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.";
-        }
-
-    }
-
-    container 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
-                "ofp_group_desc desc = 1;";
-        }
-
-    }
-
-    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
-                "";
-        }
-
-    }
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/ietf-voltha.yang b/experiments/netconf/proto2yang/ietf-voltha.yang
deleted file mode 100644
index b79eef1..0000000
--- a/experiments/netconf/proto2yang/ietf-voltha.yang
+++ /dev/null
@@ -1,798 +0,0 @@
-
-module ietf-voltha {
-
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-voltha";
-    prefix voltha;
-
-    import ietf-openflow_13 { prefix openflow_13 ; }
-    import ietf-adapter { prefix adapter ; }
-    import ietf-health { prefix health ; }
-    import ietf-common { prefix common ; }
-    import ietf-device { prefix device ; }
-    import ietf-logical_device { prefix logical_device ; }
-    import ietf-empty { prefix empty ; }
-
-    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  logical_device:LogicalDevice;
-
-            description
-                "";
-        }
-
-        list devices {
-            key "id";
-            uses  device:Device;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping DeviceGroups {
-        description
-            "";
-        list items {
-            key "id";
-            uses  DeviceGroup;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping 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  common:LogLevel;
-
-            description
-                "";
-        }
-
-        container health {
-            uses  health:HealthStatus;
-
-            description
-                "";
-        }
-
-        list adapters {
-            key "id";
-            uses  adapter:Adapter;
-
-            description
-                "";
-        }
-
-        list logical_devices {
-            key "id";
-            uses  logical_device:LogicalDevice;
-
-            description
-                "";
-        }
-
-        list devices {
-            key "id";
-            uses  device:Device;
-
-            description
-                "";
-        }
-
-        list device_types {
-            key "id";
-            uses  device:DeviceType;
-
-            description
-                "";
-        }
-
-        list device_groups {
-            key "id";
-            uses  DeviceGroup;
-
-            description
-                "";
-        }
-
-    }
-
-    grouping VolthaInstances {
-        description
-            "";
-        list items {
-            key "items";
-            leaf items {
-                type  string; 
-                description
-                    "";
-            }
-            description
-                "";
-        }
-
-    }
-
-    grouping Voltha {
-        description
-            "Voltha representing the entire Voltha cluster";
-        leaf version {
-            type  string; 
-            description
-                "";
-        }
-
-        leaf log_level {
-            type  common:LogLevel;
-
-            description
-                "";
-        }
-
-        list instances {
-            key "instance_id";
-            uses  VolthaInstance;
-
-            description
-                "";
-        }
-
-        list adapters {
-            key "id";
-            uses  adapter:Adapter;
-
-            description
-                "";
-        }
-
-        list logical_devices {
-            key "id";
-            uses  logical_device:LogicalDevice;
-
-            description
-                "";
-        }
-
-        list devices {
-            key "id";
-            uses  device:Device;
-
-            description
-                "";
-        }
-
-        list device_groups {
-            key "id";
-            uses  DeviceGroup;
-
-            description
-                "";
-        }
-
-    }
-
-    /*  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:Empty;
-
-        }
-        output {
-            uses  Voltha;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListVolthaInstances {
-        description
-            "List all Voltha cluster instances";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  VolthaInstances;
-
-        }
-    }
-
-    rpc VolthaGlobalService-GetVolthaInstance {
-        description
-            "Get details on a Voltha cluster instance";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  VolthaInstance;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListLogicalDevices {
-        description
-            "List all logical devices managed by the Voltha cluster";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  logical_device:LogicalDevices;
-
-        }
-    }
-
-    rpc VolthaGlobalService-GetLogicalDevice {
-        description
-            "Get additional information on a given logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  logical_device:LogicalDevice;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListLogicalDevicePorts {
-        description
-            "List ports of a logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  logical_device:LogicalPorts;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListLogicalDeviceFlows {
-        description
-            "List all flows of a logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:Flows;
-
-        }
-    }
-
-    rpc VolthaGlobalService-UpdateLogicalDeviceFlowTable {
-        description
-            "Update flow table for logical device";
-        input {
-            uses  openflow_13:FlowTableUpdate;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListLogicalDeviceFlowGroups {
-        description
-            "List all flow groups of a logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:FlowGroups;
-
-        }
-    }
-
-    rpc VolthaGlobalService-UpdateLogicalDeviceFlowGroupTable {
-        description
-            "Update group table for device";
-        input {
-            uses  openflow_13:FlowGroupTableUpdate;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListDevices {
-        description
-            "List all physical devices controlled by the Voltha cluster";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  device:Devices;
-
-        }
-    }
-
-    rpc VolthaGlobalService-GetDevice {
-        description
-            "Get more information on a given physical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  device:Device;
-
-        }
-    }
-
-    rpc VolthaGlobalService-CreateDevice {
-        description
-            "Pre-provision a new physical device";
-        input {
-            uses  device:Device;
-
-        }
-        output {
-            uses  device:Device;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ActivateDevice {
-        description
-            "Activate a pre-provisioned device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListDevicePorts {
-        description
-            "List ports of a device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  device:Ports;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListDeviceFlows {
-        description
-            "List all flows of a device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:Flows;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListDeviceFlowGroups {
-        description
-            "List all flow groups of a device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:FlowGroups;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListDeviceTypes {
-        description
-            "List device types known to Voltha";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  device:DeviceTypes;
-
-        }
-    }
-
-    rpc VolthaGlobalService-GetDeviceType {
-        description
-            "Get additional information on a device type";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  device:DeviceType;
-
-        }
-    }
-
-    rpc VolthaGlobalService-ListDeviceGroups {
-        description
-            "List all device sharding groups";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  DeviceGroups;
-
-        }
-    }
-
-    rpc VolthaGlobalService-GetDeviceGroup {
-        description
-            "Get additional information on a device group";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  DeviceGroup;
-
-        }
-    }
-
-
-    /*  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:Empty;
-
-        }
-        output {
-            uses  VolthaInstance;
-
-        }
-    }
-
-    rpc VolthaLocalService-GetHealth {
-        description
-            "Get the health state of the Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  health:HealthStatus;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListAdapters {
-        description
-            "List all active adapters (plugins) in this Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  adapter:Adapters;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListLogicalDevices {
-        description
-            "List all logical devices managed by this Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  logical_device:LogicalDevices;
-
-        }
-    }
-
-    rpc VolthaLocalService-GetLogicalDevice {
-        description
-            "Get additional information on given logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  logical_device:LogicalDevice;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListLogicalDevicePorts {
-        description
-            "List ports of a logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  logical_device:LogicalPorts;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListLogicalDeviceFlows {
-        description
-            "List all flows of a logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:Flows;
-
-        }
-    }
-
-    rpc VolthaLocalService-UpdateLogicalDeviceFlowTable {
-        description
-            "Update flow table for logical device";
-        input {
-            uses  openflow_13:FlowTableUpdate;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListLogicalDeviceFlowGroups {
-        description
-            "List all flow groups of a logical device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:FlowGroups;
-
-        }
-    }
-
-    rpc VolthaLocalService-UpdateLogicalDeviceFlowGroupTable {
-        description
-            "Update group table for logical device";
-        input {
-            uses  openflow_13:FlowGroupTableUpdate;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListDevices {
-        description
-            "List all physical devices managed by this Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  device:Devices;
-
-        }
-    }
-
-    rpc VolthaLocalService-GetDevice {
-        description
-            "Get additional information on this device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  device:Device;
-
-        }
-    }
-
-    rpc VolthaLocalService-CreateDevice {
-        description
-            "Pre-provision a new physical device";
-        input {
-            uses  device:Device;
-
-        }
-        output {
-            uses  device:Device;
-
-        }
-    }
-
-    rpc VolthaLocalService-ActivateDevice {
-        description
-            "Activate a pre-provisioned device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListDevicePorts {
-        description
-            "List ports of a device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  device:Ports;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListDeviceFlows {
-        description
-            "List all flows of a device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:Flows;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListDeviceFlowGroups {
-        description
-            "List all flow groups of a device";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  openflow_13:FlowGroups;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListDeviceTypes {
-        description
-            "List device types know to Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  device:DeviceTypes;
-
-        }
-    }
-
-    rpc VolthaLocalService-GetDeviceType {
-        description
-            "Get additional information on given device type";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  device:DeviceType;
-
-        }
-    }
-
-    rpc VolthaLocalService-ListDeviceGroups {
-        description
-            "List device sharding groups managed by this Voltha instance";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  DeviceGroups;
-
-        }
-    }
-
-    rpc VolthaLocalService-GetDeviceGroup {
-        description
-            "Get more information on given device shard";
-        input {
-            uses  common:ID;
-
-        }
-        output {
-            uses  DeviceGroup;
-
-        }
-    }
-
-    rpc VolthaLocalService-StreamPacketsOut {
-        description
-            "Stream control packets to the dataplane
-This does not have an HTTP representation";
-        input {
-            uses  openflow_13:PacketOut;
-
-        }
-        output {
-            uses  empty:Empty;
-
-        }
-    }
-
-    rpc VolthaLocalService-ReceivePacketsIn {
-        description
-            "Receive control packet stream
-This does not have an HTTP representation";
-        input {
-            uses  empty:Empty;
-
-        }
-        output {
-            uses  openflow_13:PacketIn;
-
-        }
-    }
-
-
-}
\ No newline at end of file
diff --git a/experiments/netconf/proto2yang/logical_device.proto b/experiments/netconf/proto2yang/logical_device.proto
deleted file mode 100644
index 94d9588..0000000
--- a/experiments/netconf/proto2yang/logical_device.proto
+++ /dev/null
@@ -1,52 +0,0 @@
-syntax = "proto3";
-
-package voltha;
-
-import "meta.proto";
-import "google/api/annotations.proto";
-import "openflow_13.proto";
-
-
-message LogicalPort {
-    string id = 1;
-    openflow_13.ofp_port ofp_port = 2;
-    string device_id = 3;
-    uint32 device_port_no = 4;
-    bool root_port = 5;
-}
-
-message LogicalPorts {
-    repeated LogicalPort items = 1;
-}
-
-message LogicalDevice {
-
-    // unique id of logical device
-    string id = 1;
-
-    // unique datapath id for the logical device (used by the SDN controller)
-    uint64 datapath_id = 2;
-
-    // device description
-    openflow_13.ofp_desc desc = 3;
-
-    // device features
-    openflow_13.ofp_switch_features switch_features = 4;
-
-    // name of the root device anchoring logical device
-    string root_device_id = 5;
-
-    // logical device ports
-    repeated LogicalPort ports = 128 [(child_node) = {key: "id"}];
-
-    // flows configured on the logical device
-    openflow_13.Flows flows = 129 [(child_node) = {}];
-
-    // flow groups configured on the logical device
-    openflow_13.FlowGroups flow_groups = 130 [(child_node) = {}];
-
-}
-
-message LogicalDevices {
-    repeated LogicalDevice items = 1;
-}
diff --git a/experiments/netconf/proto2yang/meta.proto b/experiments/netconf/proto2yang/meta.proto
deleted file mode 100644
index b78c9e3..0000000
--- a/experiments/netconf/proto2yang/meta.proto
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2015, Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file contains annotation definitions that can be used to describe
-// a configuration tree.
-
-syntax = "proto3";
-
-package voltha;
-
-import "google/protobuf/descriptor.proto";
-
-message ChildNode {
-    string key = 1;
-}
-
-enum Access {
-
-    // read-write, stored attribute
-    CONFIG = 0;
-
-    // read-only field, stored with the model, covered by its hash
-    READ_ONLY = 1;
-
-    // A read-only attribute that is not stored in the model, not covered
-    // by its hash, its value is filled real-time upon each request.
-    REAL_TIME = 2;
-
-}
-
-extend google.protobuf.FieldOptions {
-
-    // If present, it indicates that this field is stored as external child node
-    // or children nodes in Voltha's internal configuration tree.
-    // If the field is a container field and if the option specifies a key
-    // the child objects will be addressible by that key.
-    ChildNode child_node = 7761772;
-
-    // This annotation can be used to indicate that a field is read-only,
-    // from the perspective of NBI access. Backend plugins and system
-    // internals can update the field but the update requests through the
-    // NBI will ignore for instance a field that is marked as read-only (RO).
-    Access access = 7761773;
-}
diff --git a/experiments/netconf/proto2yang/openflow_13.proto b/experiments/netconf/proto2yang/openflow_13.proto
deleted file mode 100644
index c99cd5d..0000000
--- a/experiments/netconf/proto2yang/openflow_13.proto
+++ /dev/null
@@ -1,2278 +0,0 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
- * Junior University
- * Copyright (c) 2011, 2012 Open Networking Foundation
- *
- * We are making the OpenFlow specification and associated documentation
- * (Software) available for public use and benefit with the expectation
- * that others will use, modify and enhance the Software and contribute
- * those enhancements back to the community. However, since we would
- * like to make the Software available for broadest use, with as few
- * restrictions as possible permission is hereby granted, free of
- * charge, to any person obtaining a copy of this Software to deal in
- * the Software under the copyrights without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * The name and trademarks of copyright holder(s) may NOT be used in
- * advertising or publicity pertaining to the Software or any
- * derivatives without specific, written prior permission.
- */
-
-/* OpenFlow: protocol between controller and datapath. */
-
-/*
- * This is a relatively straightforward rendering of OpenFlow message
- * definitions into protocol buffer messages. We preserved the snake
- * case syntax, and made the following changes:
- * - all pad fields dropped
- * - for each enum value above 0x7fffffff the MSB is dropped. For example,
- *   0xffffffff is now 0x7fffffff.
- * - '<type> thing[...]' is replaced with 'repeated <type> thing'
- * - 'char thing[...]' is replaced with 'string thing'
- * - 'uint8_t data[...]' is replaced with 'bytes data'
- * - the following systematic changes are done to various integer types:
- *   uint8_t  -> uint32
- *   uint16_t -> uint32
- *   uint32_t -> uint32
- *   uint64_t -> uint64
- * - removed most length, len, size fields where these values can be determined
- *   from the explicitly encoded length of "repeated" protobuf fields.
- * - explicit use of enum types whereever it is unambigous (and not used as
- *   bitmask/flags value.
- *
- */
-syntax = "proto3";
-
-package openflow_13;
-
-
-/* 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. */
-
-/* Port numbering. Ports are numbered starting from 1. */
-enum ofp_port_no {
-    OFPP_INVALID    = 0;
-
-    /* Maximum number of physical and logical switch ports. */
-    OFPP_MAX        = 0x7fffff00;
-
-    /* Reserved OpenFlow Port (fake output "ports"). */
-    OFPP_IN_PORT    = 0x7ffffff8;  /* Send the packet out the input port.  This
-                                      reserved port must be explicitly used
-                                      in order to send back out of the input
-                                      port. */
-    OFPP_TABLE      = 0x7ffffff9;  /* Submit the packet to the first flow table
-                                      NB: This destination port can only be
-                                      used in packet-out messages. */
-    OFPP_NORMAL     = 0x7ffffffa;  /* Forward using non-OpenFlow pipeline. */
-    OFPP_FLOOD      = 0x7ffffffb;  /* Flood using non-OpenFlow pipeline. */
-    OFPP_ALL        = 0x7ffffffc;  /* All standard ports except input port. */
-    OFPP_CONTROLLER = 0x7ffffffd;  /* Send to controller. */
-    OFPP_LOCAL      = 0x7ffffffe;  /* Local openflow "port". */
-    OFPP_ANY        = 0x7fffffff;  /* Special value used in some requests when
-                                      no port is specified (i.e. wildcarded).*/
-};
-
-enum ofp_type {
-
-    /* Immutable messages. */
-    OFPT_HELLO                      = 0;  /* Symmetric message */
-    OFPT_ERROR                      = 1;  /* Symmetric message */
-    OFPT_ECHO_REQUEST               = 2;  /* Symmetric message */
-    OFPT_ECHO_REPLY                 = 3;  /* Symmetric message */
-    OFPT_EXPERIMENTER               = 4;  /* Symmetric message */
-
-    /* Switch configuration messages. */
-    OFPT_FEATURES_REQUEST           = 5;  /* Controller/switch message */
-    OFPT_FEATURES_REPLY             = 6;  /* Controller/switch message */
-    OFPT_GET_CONFIG_REQUEST         = 7;  /* Controller/switch message */
-    OFPT_GET_CONFIG_REPLY           = 8;  /* Controller/switch message */
-    OFPT_SET_CONFIG                 = 9;  /* Controller/switch message */
-
-    /* Asynchronous messages. */
-    OFPT_PACKET_IN                  = 10; /* Async message */
-    OFPT_FLOW_REMOVED               = 11; /* Async message */
-    OFPT_PORT_STATUS                = 12; /* Async message */
-
-    /* Controller command messages. */
-    OFPT_PACKET_OUT                 = 13; /* Controller/switch message */
-    OFPT_FLOW_MOD                   = 14; /* Controller/switch message */
-    OFPT_GROUP_MOD                  = 15; /* Controller/switch message */
-    OFPT_PORT_MOD                   = 16; /* Controller/switch message */
-    OFPT_TABLE_MOD                  = 17; /* Controller/switch message */
-
-    /* Multipart messages. */
-    OFPT_MULTIPART_REQUEST          = 18; /* Controller/switch message */
-    OFPT_MULTIPART_REPLY            = 19; /* Controller/switch message */
-
-    /* Barrier messages. */
-    OFPT_BARRIER_REQUEST            = 20; /* Controller/switch message */
-    OFPT_BARRIER_REPLY              = 21; /* Controller/switch message */
-
-    /* Queue Configuration messages. */
-    OFPT_QUEUE_GET_CONFIG_REQUEST   = 22;  /* Controller/switch message */
-    OFPT_QUEUE_GET_CONFIG_REPLY     = 23;  /* Controller/switch message */
-
-    /* Controller role change request messages. */
-    OFPT_ROLE_REQUEST               = 24; /* Controller/switch message */
-    OFPT_ROLE_REPLY                 = 25; /* Controller/switch message */
-
-    /* Asynchronous message configuration. */
-    OFPT_GET_ASYNC_REQUEST          = 26; /* Controller/switch message */
-    OFPT_GET_ASYNC_REPLY            = 27; /* Controller/switch message */
-    OFPT_SET_ASYNC                  = 28; /* Controller/switch message */
-
-    /* Meters and rate limiters configuration messages. */
-    OFPT_METER_MOD                  = 29; /* Controller/switch message */
-};
-
-/* Header on all OpenFlow packets. */
-message ofp_header {
-    uint32 version = 1;    /* OFP_VERSION. */
-    ofp_type type = 2;     /* One of the OFPT_ constants. */
-    uint32 xid = 3;        /* Transaction id associated with this packet.
-                              Replies use the same id as was in the request
-                              to facilitate pairing. */
-};
-
-/* Hello elements types.
- */
-enum ofp_hello_elem_type {
-    OFPHET_INVALID                = 0;
-    OFPHET_VERSIONBITMAP          = 1;  /* Bitmap of version supported. */
-};
-
-/* Common header for all Hello Elements */
-message ofp_hello_elem_header {
-    ofp_hello_elem_type type = 1;       /* One of OFPHET_*. */
-    oneof element {
-        ofp_hello_elem_versionbitmap versionbitmap = 2;
-    }
-};
-
-/* Version bitmap Hello Element */
-message ofp_hello_elem_versionbitmap {
-    repeated uint32 bitmaps = 2;   /* List of bitmaps - supported versions */
-};
-
-/* 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. */
-message ofp_hello {
-    //ofp_header header;
-    /* Hello element list */
-    repeated ofp_hello_elem_header elements = 1; /* 0 or more */
-};
-
-//#define OFP_DEFAULT_MISS_SEND_LEN   128
-
-enum ofp_config_flags {
-    /* Handling of IP fragments. */
-    OFPC_FRAG_NORMAL   = 0;       /* No special handling for fragments. */
-    OFPC_FRAG_DROP     = 1;       /* Drop fragments. */
-    OFPC_FRAG_REASM    = 2;       /* Reassemble (only if OFPC_IP_REASM set). */
-    OFPC_FRAG_MASK     = 3;       /* Bitmask of flags dealing with frag. */
-};
-
-/* Switch configuration. */
-message ofp_switch_config {
-    //ofp_header header;
-    uint32 flags = 1;             /* Bitmap of OFPC_* flags. */
-    uint32 miss_send_len = 2;     /* Max bytes of packet that datapath
-                                     should send to the controller. See
-                                     ofp_controller_max_len for valid values.
-                                   */
-};
-
-/* Flags to configure the table. Reserved for future use. */
-enum ofp_table_config {
-    OFPTC_INVALID = 0;
-    OFPTC_DEPRECATED_MASK = 3;     /* Deprecated bits */
-};
-
-/* Table numbering. Tables can use any number up to OFPT_MAX. */
-enum ofp_table {
-
-    OFPTT_INVALID = 0;
-
-    /* Last usable table number. */
-    OFPTT_MAX        = 0xfe;
-
-    /* Fake tables. */
-    OFPTT_ALL        = 0xff;   /* Wildcard table used for table config,
-                                  flow stats and flow deletes. */
-};
-
-
-/* Configure/Modify behavior of a flow table */
-message ofp_table_mod {
-    //ofp_header header;
-    uint32 table_id = 1;  /* ID of the table, OFPTT_ALL indicates all tables */
-    uint32 config = 2;    /* Bitmap of OFPTC_* flags */
-};
-
-/* Capabilities supported by the datapath. */
-enum ofp_capabilities {
-    OFPC_INVALID        = 0;
-    OFPC_FLOW_STATS     = 1;    /* Flow statistics. */
-    OFPC_TABLE_STATS    = 2;    /* Table statistics. */
-    OFPC_PORT_STATS     = 4;    /* Port statistics. */
-    OFPC_GROUP_STATS    = 8;    /* Group statistics. */
-    OFPC_IP_REASM       = 32;   /* Can reassemble IP fragments. */
-    OFPC_QUEUE_STATS    = 64;   /* Queue statistics. */
-    OFPC_PORT_BLOCKED   = 256;  /* Switch will block looping ports. */
-};
-
-/* 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.
- */
-enum ofp_port_config {
-    OFPPC_INVALID      = 0;
-    OFPPC_PORT_DOWN    = 1;   /* Port is administratively down. */
-
-    OFPPC_NO_RECV      = 4;   /* Drop all packets received by port. */
-    OFPPC_NO_FWD       = 32;  /* Drop packets forwarded to port. */
-    OFPPC_NO_PACKET_IN = 64;  /* Do not send packet-in msgs for port. */
-};
-
-/* Current state of the physical port.  These are not configurable from
- * the controller.
- */
-enum ofp_port_state {
-    OFPPS_INVALID      = 0;
-    OFPPS_LINK_DOWN    = 1;  /* No physical link present. */
-    OFPPS_BLOCKED      = 2;  /* Port is blocked */
-    OFPPS_LIVE         = 4;  /* Live for Fast Failover Group. */
-};
-
-/* Features of ports available in a datapath. */
-enum ofp_port_features {
-    OFPPF_INVALID    = 0;
-    OFPPF_10MB_HD    = 1;      /* 10 Mb half-duplex rate support. */
-    OFPPF_10MB_FD    = 2;      /* 10 Mb full-duplex rate support. */
-    OFPPF_100MB_HD   = 4;      /* 100 Mb half-duplex rate support. */
-    OFPPF_100MB_FD   = 8;      /* 100 Mb full-duplex rate support. */
-    OFPPF_1GB_HD     = 16;     /* 1 Gb half-duplex rate support. */
-    OFPPF_1GB_FD     = 32;     /* 1 Gb full-duplex rate support. */
-    OFPPF_10GB_FD    = 64;     /* 10 Gb full-duplex rate support. */
-    OFPPF_40GB_FD    = 128;    /* 40 Gb full-duplex rate support. */
-    OFPPF_100GB_FD   = 256;    /* 100 Gb full-duplex rate support. */
-    OFPPF_1TB_FD     = 512;    /* 1 Tb full-duplex rate support. */
-    OFPPF_OTHER      = 1024;   /* Other rate, not in the list. */
-    OFPPF_COPPER     = 2048;   /* Copper medium. */
-    OFPPF_FIBER      = 4096;   /* Fiber medium. */
-    OFPPF_AUTONEG    = 8192;   /* Auto-negotiation. */
-    OFPPF_PAUSE      = 16384;  /* Pause. */
-    OFPPF_PAUSE_ASYM = 32768;  /* Asymmetric pause. */
-};
-
-/* Description of a port */
-message ofp_port {
-    uint32 port_no = 1;
-    repeated uint32 hw_addr = 2; // [OFP_ETH_ALEN];
-    string name = 3;             /* Null-terminated */
-
-    uint32 config = 4;           /* Bitmap of OFPPC_* flags. */
-    uint32 state = 5;            /* Bitmap of OFPPS_* flags. */
-
-    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if
-     * unsupported or unavailable. */
-    uint32 curr = 6;           /* Current features. */
-    uint32 advertised = 7;     /* Features being advertised by the port. */
-    uint32 supported = 8;      /* Features supported by the port. */
-    uint32 peer = 9;           /* Features advertised by peer. */
-    uint32 curr_speed = 10;    /* Current port bitrate in kbps. */
-    uint32 max_speed = 11;     /* Max port bitrate in kbps */
-};
-
-/* Switch features. */
-message ofp_switch_features {
-    //ofp_header header;
-    uint64 datapath_id = 1;   /* Datapath unique ID.  The lower 48-bits are for
-                                 a MAC address, while the upper 16-bits are
-                                 implementer-defined. */
-
-    uint32 n_buffers = 2;     /* Max packets buffered at once. */
-
-    uint32 n_tables = 3;      /* Number of tables supported by datapath. */
-    uint32 auxiliary_id = 4;  /* Identify auxiliary connections */
-
-    /* Features. */
-    uint32 capabilities = 5;  /* Bitmap of support "ofp_capabilities". */
-};
-
-/* What changed about the physical port */
-enum ofp_port_reason {
-    OFPPR_ADD     = 0;         /* The port was added. */
-    OFPPR_DELETE  = 1;         /* The port was removed. */
-    OFPPR_MODIFY  = 2;         /* Some attribute of the port has changed. */
-};
-
-/* A physical port has changed in the datapath */
-message ofp_port_status {
-    //ofp_header header;
-    ofp_port_reason reason = 1; /* One of OFPPR_*. */
-    ofp_port desc = 2;
-};
-
-/* Modify behavior of the physical port */
-message ofp_port_mod {
-    //ofp_header header;
-    uint32 port_no = 1;
-    repeated uint32 hw_addr = 2; //[OFP_ETH_ALEN];
-                                      /* 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. */
-    uint32 config = 3;        /* Bitmap of OFPPC_* flags. */
-    uint32 mask = 4;          /* Bitmap of OFPPC_* flags to be changed. */
-
-    uint32 advertise = 5;     /* Bitmap of OFPPF_*.  Zero all bits to prevent
-                                 any action taking place. */
-};
-
-/* ## -------------------------- ## */
-/* ## OpenFlow Extensible Match. ## */
-/* ## -------------------------- ## */
-
-/* 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.
- */
-enum ofp_match_type {
-    OFPMT_STANDARD = 0;       /* Deprecated. */
-    OFPMT_OXM      = 1;       /* OpenFlow Extensible Match */
-};
-
-/* Fields to match against flows */
-message ofp_match {
-    ofp_match_type type = 1;         /* One of OFPMT_* */
-    repeated ofp_oxm_field oxm_fields = 2;  /* 0 or more */
-};
-
-/* 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))
-
-/* 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.
- */
-enum ofp_oxm_class {
-    OFPXMC_NXM_0          = 0x0000;    /* Backward compatibility with NXM */
-    OFPXMC_NXM_1          = 0x0001;    /* Backward compatibility with NXM */
-    OFPXMC_OPENFLOW_BASIC = 0x8000;    /* Basic class for OpenFlow */
-    OFPXMC_EXPERIMENTER   = 0xFFFF;    /* Experimenter class */
-};
-
-/* OXM Flow field types for OpenFlow basic class. */
-enum oxm_ofb_field_types {
-    OFPXMT_OFB_IN_PORT        = 0;  /* Switch input port. */
-    OFPXMT_OFB_IN_PHY_PORT    = 1;  /* Switch physical input port. */
-    OFPXMT_OFB_METADATA       = 2;  /* Metadata passed between tables. */
-    OFPXMT_OFB_ETH_DST        = 3;  /* Ethernet destination address. */
-    OFPXMT_OFB_ETH_SRC        = 4;  /* Ethernet source address. */
-    OFPXMT_OFB_ETH_TYPE       = 5;  /* Ethernet frame type. */
-    OFPXMT_OFB_VLAN_VID       = 6;  /* VLAN id. */
-    OFPXMT_OFB_VLAN_PCP       = 7;  /* VLAN priority. */
-    OFPXMT_OFB_IP_DSCP        = 8;  /* IP DSCP (6 bits in ToS field). */
-    OFPXMT_OFB_IP_ECN         = 9;  /* IP ECN (2 bits in ToS field). */
-    OFPXMT_OFB_IP_PROTO       = 10; /* IP protocol. */
-    OFPXMT_OFB_IPV4_SRC       = 11; /* IPv4 source address. */
-    OFPXMT_OFB_IPV4_DST       = 12; /* IPv4 destination address. */
-    OFPXMT_OFB_TCP_SRC        = 13; /* TCP source port. */
-    OFPXMT_OFB_TCP_DST        = 14; /* TCP destination port. */
-    OFPXMT_OFB_UDP_SRC        = 15; /* UDP source port. */
-    OFPXMT_OFB_UDP_DST        = 16; /* UDP destination port. */
-    OFPXMT_OFB_SCTP_SRC       = 17; /* SCTP source port. */
-    OFPXMT_OFB_SCTP_DST       = 18; /* SCTP destination port. */
-    OFPXMT_OFB_ICMPV4_TYPE    = 19; /* ICMP type. */
-    OFPXMT_OFB_ICMPV4_CODE    = 20; /* ICMP code. */
-    OFPXMT_OFB_ARP_OP         = 21; /* ARP opcode. */
-    OFPXMT_OFB_ARP_SPA        = 22; /* ARP source IPv4 address. */
-    OFPXMT_OFB_ARP_TPA        = 23; /* ARP target IPv4 address. */
-    OFPXMT_OFB_ARP_SHA        = 24; /* ARP source hardware address. */
-    OFPXMT_OFB_ARP_THA        = 25; /* ARP target hardware address. */
-    OFPXMT_OFB_IPV6_SRC       = 26; /* IPv6 source address. */
-    OFPXMT_OFB_IPV6_DST       = 27; /* IPv6 destination address. */
-    OFPXMT_OFB_IPV6_FLABEL    = 28; /* IPv6 Flow Label */
-    OFPXMT_OFB_ICMPV6_TYPE    = 29; /* ICMPv6 type. */
-    OFPXMT_OFB_ICMPV6_CODE    = 30; /* ICMPv6 code. */
-    OFPXMT_OFB_IPV6_ND_TARGET = 31; /* Target address for ND. */
-    OFPXMT_OFB_IPV6_ND_SLL    = 32; /* Source link-layer for ND. */
-    OFPXMT_OFB_IPV6_ND_TLL    = 33; /* Target link-layer for ND. */
-    OFPXMT_OFB_MPLS_LABEL     = 34; /* MPLS label. */
-    OFPXMT_OFB_MPLS_TC        = 35; /* MPLS TC. */
-    OFPXMT_OFB_MPLS_BOS       = 36; /* MPLS BoS bit. */
-    OFPXMT_OFB_PBB_ISID       = 37; /* PBB I-SID. */
-    OFPXMT_OFB_TUNNEL_ID      = 38; /* Logical Port Metadata. */
-    OFPXMT_OFB_IPV6_EXTHDR    = 39; /* IPv6 Extension Header pseudo-field */
-};
-
-/* OXM Flow match fields */
-message ofp_oxm_field {
-    ofp_oxm_class oxm_class = 1;
-    oneof field {
-        /* 2 and 3 reserved for NXM_0 and NXM-1 OXM classes */
-        ofp_oxm_ofb_field ofb_field = 4;
-        ofp_oxm_experimenter_field experimenter_field = 5;
-    }
-}
-
-/* OXM OpenFlow Basic Match Field */
-message ofp_oxm_ofb_field {
-    oxm_ofb_field_types type = 1;
-    bool has_mask = 2;
-    oneof value {
-
-        /* OpenFlow 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. */
-        //#define OXM_OF_IN_PORT    OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PORT, 4)
-        uint32 port = 3; /* Used for OFPXMT_OFB_IN_PORT */
-
-        /* Physical 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. */
-        //#define OXM_OF_IN_PHY_PORT OXM_HEADER  (0x8000, OFPXMT_OFB_IN_PHY_PORT, 4)
-        uint32 physical_port = 4; /* Used for OFPXMT_OF_IN_PHY_PORT */
-
-        /* Table metadata.
-         *
-         * Prereqs: None.
-         *
-         * Format: 64-bit integer in network byte order.
-         *
-         * Masking: Arbitrary masks.
-         */
-        //#define OXM_OF_METADATA   OXM_HEADER  (0x8000, OFPXMT_OFB_METADATA, 8)
-        //#define OXM_OF_METADATA_W OXM_HEADER_W(0x8000, OFPXMT_OFB_METADATA, 8)
-        uint64 table_metadata = 5; /* Used for OFPXMT_OFB_METADATA */
-
-        /* Source or destination address in Ethernet header.
-         *
-         * Prereqs: None.
-         *
-         * Format: 48-bit Ethernet MAC address.
-         *
-         * Masking: Arbitrary masks. */
-        //#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)
-        bytes eth_dst = 6; /* Used for OFPXMT_OFB_ETH_DST (exactly 6 bytes) */
-        bytes eth_src = 7; /* Used for OFPXMT_OFB_ETH_SRC (exactly 6 bytes) */
-
-        /* Packet's Ethernet type.
-         *
-         * Prereqs: None.
-         *
-         * Format: 16-bit integer in network byte order.
-         *
-         * Masking: Not maskable. */
-        //#define OXM_OF_ETH_TYPE   OXM_HEADER  (0x8000, OFPXMT_OFB_ETH_TYPE,2)
-        uint32 eth_type = 8; /* Used for OFPXMT_OFB_ETH_TYPE */
-
-        /* 802.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.
-         */
-        //#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)
-        uint32 vlan_vid = 9; /* Used for OFPXMT_OFB_VLAN_VID */
-
-        /* 802.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.
-         */
-        //#define OXM_OF_VLAN_PCP   OXM_HEADER  (0x8000, OFPXMT_OFB_VLAN_PCP, 1)
-        uint32 vlan_pcp = 10; /* Used for OFPXMT_OFB_VLAN_PCP */
-
-        /* The 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. */
-        //#define OXM_OF_IP_DSCP     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_DSCP, 1)
-        uint32 ip_dscp = 11; /* Used for OFPXMT_OFB_IP_DSCP */
-
-        /* The 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. */
-        //#define OXM_OF_IP_ECN     OXM_HEADER  (0x8000, OFPXMT_OFB_IP_ECN, 1)
-        uint32 ip_ecn = 12; /* Used for OFPXMT_OFB_IP_ECN */
-
-        /* The "protocol" byte in the IP header.
-         *
-         * Prereqs: OXM_OF_ETH_TYPE must be either 0x0800 or 0x86dd.
-         *
-         * Format: 8-bit integer.
-         *
-         * Masking: Not maskable. */
-        //#define OXM_OF_IP_PROTO   OXM_HEADER  (0x8000, OFPXMT_OFB_IP_PROTO, 1)
-        uint32 ip_proto = 13; /* Used for OFPXMT_OFB_IP_PROTO */
-
-        /* The 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.
-         */
-        //#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)
-        uint32 ipv4_src = 14; /* Used for OFPXMT_OFB_IPV4_SRC */
-        uint32 ipv4_dst = 15; /* Used for OFPXMT_OFB_IPV4_DST */
-
-        /* The 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. */
-        //#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)
-        uint32 tcp_src = 16; /* Used for OFPXMT_OFB_TCP_SRC */
-        uint32 tcp_dst = 17; /* Used for OFPXMT_OFB_TCP_DST */
-
-        /* The 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. */
-        //#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)
-        uint32 udp_src = 18; /* Used for OFPXMT_OFB_UDP_SRC */
-        uint32 udp_dst = 19; /* Used for OFPXMT_OFB_UDP_DST */
-
-        /* The 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. */
-        //#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)
-        uint32 sctp_src = 20; /* Used for OFPXMT_OFB_SCTP_SRC */
-        uint32 sctp_dst = 21; /* Used for OFPXMT_OFB_SCTP_DST */
-
-        /* The 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. */
-        //#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)
-        uint32 icmpv4_type = 22; /* Used for OFPXMT_OFB_ICMPV4_TYPE */
-        uint32 icmpv4_code = 23; /* Used for OFPXMT_OFB_ICMPV4_CODE */
-
-        /* ARP 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. */
-        //#define OXM_OF_ARP_OP     OXM_HEADER  (0x8000, OFPXMT_OFB_ARP_OP, 2)
-        uint32 arp_op = 24; /* Used for OFPXMT_OFB_ARP_OP */
-
-        /* For 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.
-         */
-        //#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)
-        uint32 arp_spa = 25; /* For OFPXMT_OFB_ARP_SPA */
-        uint32 arp_tpa = 26; /* For OFPXMT_OFB_ARP_TPA */
-
-        /* 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. */
-        //#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)
-        bytes arp_sha = 27; /* For OFPXMT_OFB_ARP_SHA (6 bytes) */
-        bytes arp_tha = 28; /* For OFPXMT_OFB_ARP_THA (6 bytes) */
-
-        /* The 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.
-         */
-        //#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)
-        bytes ipv6_src = 29; /* For OFPXMT_OFB_IPV6_SRC */
-        bytes ipv6_dst = 30; /* For OFPXMT_OFB_IPV6_DST */
-
-        /* The 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.
-         */
-        //#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)
-        uint32 ipv6_flabel = 31; /* For OFPXMT_OFB_IPV6_FLABEL */
-
-        /* The 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. */
-        //#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)
-        uint32 icmpv6_type = 32; /* For OFPXMT_OFB_ICMPV6_TYPE */
-        uint32 icmpv6_code = 33; /* For OFPXMT_OFB_ICMPV6_CODE */
-
-        /* The 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. */
-        //#define OXM_OF_IPV6_ND_TARGET OXM_HEADER \
-        //    (0x8000, OFPXMT_OFB_IPV6_ND_TARGET, 16)
-        bytes ipv6_nd_target = 34; /* For OFPXMT_OFB_IPV6_ND_TARGET */
-
-        /* The 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. */
-        //#define OXM_OF_IPV6_ND_SLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_SLL, 6)
-        bytes ipv6_nd_ssl = 35; /* For OFPXMT_OFB_IPV6_ND_SLL */
-
-        /* The 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. */
-        //#define OXM_OF_IPV6_ND_TLL  OXM_HEADER  (0x8000, OFPXMT_OFB_IPV6_ND_TLL, 6)
-        bytes ipv6_nd_tll = 36; /* For OFPXMT_OFB_IPV6_ND_TLL */
-
-        /* The 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. */
-        //#define OXM_OF_MPLS_LABEL  OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_LABEL, 4)
-        uint32 mpls_label = 37; /* For OFPXMT_OFB_MPLS_LABEL */
-
-        /* The 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. */
-        //#define OXM_OF_MPLS_TC     OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_TC, 1)
-        uint32 mpls_tc = 38; /* For OFPXMT_OFB_MPLS_TC */
-
-        /* The 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. */
-        //#define OXM_OF_MPLS_BOS     OXM_HEADER  (0x8000, OFPXMT_OFB_MPLS_BOS, 1)
-        uint32 mpls_bos = 39; /* For OFPXMT_OFB_MPLS_BOS */
-
-        /* IEEE 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. */
-        //#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)
-        uint32 pbb_isid = 40; /* For OFPXMT_OFB_PBB_ISID */
-
-        /* Logical 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. */
-        //#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)
-        uint64 tunnel_id = 41; /* For OFPXMT_OFB_TUNNEL_ID */
-
-        /* The 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. */
-        //#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)
-        uint32 ipv6_exthdr = 42; /* For OFPXMT_OFB_IPV6_EXTHDR */
-
-    }
-
-    /* Optional mask values (must be present when has_mask is true */
-    oneof mask {
-        uint64 table_metadata_mask = 105; /* For OFPXMT_OFB_METADATA */
-
-        bytes eth_dst_mask = 106; /* For OFPXMT_OFB_ETH_DST (exactly 6 bytes)*/
-        bytes eth_src_mask = 107; /* For OFPXMT_OFB_ETH_SRC (exactly 6 bytes)*/
-
-        uint32 vlan_vid_mask = 109; /* For OFPXMT_OFB_VLAN_VID */
-
-        uint32 ipv4_src_mask = 114; /* For OFPXMT_OFB_IPV4_SRC */
-        uint32 ipv4_dst_mask = 115; /* For OFPXMT_OFB_IPV4_DST */
-
-        uint32 arp_spa_mask = 125; /* For OFPXMT_OFB_ARP_SPA */
-        uint32 arp_tpa_mask = 126; /* For OFPXMT_OFB_ARP_TPA */
-
-        bytes ipv6_src_mask = 129; /* For OFPXMT_OFB_IPV6_SRC */
-        bytes ipv6_dst_mask = 130; /* For OFPXMT_OFB_IPV6_DST */
-
-        uint32 ipv6_flabel_mask = 131; /* For OFPXMT_OFB_IPV6_FLABEL */
-
-        uint32 pbb_isid_mask = 140; /* For OFPXMT_OFB_PBB_ISID */
-
-        uint64 tunnel_id_mask = 141; /* For OFPXMT_OFB_TUNNEL_ID */
-
-        uint32 ipv6_exthdr_mask = 142; /* For OFPXMT_OFB_IPV6_EXTHDR */
-    }
-
-}
-//#define OFPXMT_OFB_ALL    ((UINT64_C(1) << 40) - 1)
-
-
-/* The VLAN id is 12-bits, so we can use the entire 16 bits to indicate
- * special conditions.
- */
-enum ofp_vlan_id {
-    OFPVID_NONE    = 0x0000; /* No VLAN id was set. */
-    OFPVID_PRESENT = 0x1000; /* Bit that indicate that a VLAN id is set */
-};
-/* Define for compatibility */
-//#define OFP_VLAN_NONE      OFPVID_NONE
-
-/* Bit definitions for IPv6 Extension Header pseudo-field. */
-enum ofp_ipv6exthdr_flags {
-    OFPIEH_INVALID = 0;
-    OFPIEH_NONEXT  = 1;     /* "No next header" encountered. */
-    OFPIEH_ESP     = 2;     /* Encrypted Sec Payload header present. */
-    OFPIEH_AUTH    = 4;     /* Authentication header present. */
-    OFPIEH_DEST    = 8;     /* 1 or 2 dest headers present. */
-    OFPIEH_FRAG    = 16;    /* Fragment header present. */
-    OFPIEH_ROUTER  = 32;    /* Router header present. */
-    OFPIEH_HOP     = 64;    /* Hop-by-hop header present. */
-    OFPIEH_UNREP   = 128;   /* Unexpected repeats encountered. */
-    OFPIEH_UNSEQ   = 256;   /* Unexpected sequencing encountered. */
-};
-
-/* Header for OXM experimenter match fields.
- * The experimenter class should not use OXM_HEADER() macros for defining
- * fields due to this extra header. */
-message ofp_oxm_experimenter_field {
-    uint32 oxm_header = 1;    /* oxm_class = OFPXMC_EXPERIMENTER */
-    uint32 experimenter = 2;  /* Experimenter ID which takes the same
-                                 form as in struct ofp_experimenter_header. */
-};
-
-/* ## ----------------- ## */
-/* ## OpenFlow Actions. ## */
-/* ## ----------------- ## */
-
-enum ofp_action_type {
-    OFPAT_OUTPUT       = 0;  /* Output to switch port. */
-    OFPAT_COPY_TTL_OUT = 11; /* Copy TTL "outwards" -- from next-to-outermost
-                                to outermost */
-    OFPAT_COPY_TTL_IN  = 12; /* Copy TTL "inwards" -- from outermost to
-                               next-to-outermost */
-    OFPAT_SET_MPLS_TTL = 15; /* MPLS TTL */
-    OFPAT_DEC_MPLS_TTL = 16; /* Decrement MPLS TTL */
-
-    OFPAT_PUSH_VLAN    = 17; /* Push a new VLAN tag */
-    OFPAT_POP_VLAN     = 18; /* Pop the outer VLAN tag */
-    OFPAT_PUSH_MPLS    = 19; /* Push a new MPLS tag */
-    OFPAT_POP_MPLS     = 20; /* Pop the outer MPLS tag */
-    OFPAT_SET_QUEUE    = 21; /* Set queue id when outputting to a port */
-    OFPAT_GROUP        = 22; /* Apply group. */
-    OFPAT_SET_NW_TTL   = 23; /* IP TTL. */
-    OFPAT_DEC_NW_TTL   = 24; /* Decrement IP TTL. */
-    OFPAT_SET_FIELD    = 25; /* Set a header field using OXM TLV format. */
-    OFPAT_PUSH_PBB     = 26; /* Push a new PBB service tag (I-TAG) */
-    OFPAT_POP_PBB      = 27; /* Pop the outer PBB service tag (I-TAG) */
-    OFPAT_EXPERIMENTER = 0xffff;
-};
-
-/* 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. */
-message ofp_action {
-    ofp_action_type type = 1;       /* One of OFPAT_*. */
-    oneof action {
-        ofp_action_output output = 2;
-        ofp_action_mpls_ttl mpls_ttl = 3;
-        ofp_action_push push = 4;
-        ofp_action_pop_mpls pop_mpls = 5;
-        ofp_action_group group = 6;
-        ofp_action_nw_ttl nw_ttl = 7;
-        ofp_action_set_field set_field = 8;
-        ofp_action_experimenter experimenter = 9;
-    }
-};
-
-enum ofp_controller_max_len {
-    OFPCML_INVALID   = 0;
-    OFPCML_MAX       = 0xffe5; /* maximum max_len value which can be used
-                                  to request a specific byte length. */
-    OFPCML_NO_BUFFER = 0xffff; /* indicates that no buffering should be
-                                  applied and the whole packet is to be
-                                  sent to the controller. */
-};
-
-/* 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. */
-message ofp_action_output {
-    uint32 port = 1;                 /* Output port. */
-    uint32 max_len = 2;              /* Max length to send to controller. */
-};
-
-/* Action structure for OFPAT_SET_MPLS_TTL. */
-message ofp_action_mpls_ttl {
-    uint32 mpls_ttl = 1;             /* MPLS TTL */
-};
-
-/* Action structure for OFPAT_PUSH_VLAN/MPLS/PBB. */
-message ofp_action_push {
-    uint32 ethertype = 1;            /* Ethertype */
-};
-
-/* Action structure for OFPAT_POP_MPLS. */
-message ofp_action_pop_mpls {
-    uint32 ethertype = 1;            /* Ethertype */
-};
-
-/* Action structure for OFPAT_GROUP. */
-message ofp_action_group {
-    uint32 group_id = 1;             /* Group identifier. */
-};
-
-/* Action structure for OFPAT_SET_NW_TTL. */
-message ofp_action_nw_ttl {
-    uint32 nw_ttl = 1;               /* IP TTL */
-};
-
-/* Action structure for OFPAT_SET_FIELD. */
-message ofp_action_set_field {
-    ofp_oxm_field field = 1;
-};
-
-/* Action header for OFPAT_EXPERIMENTER.
- * The rest of the body is experimenter-defined. */
-message ofp_action_experimenter {
-    uint32 experimenter = 1;         /* Experimenter ID which takes the same
-                                        form as in struct
-                                        ofp_experimenter_header. */
-    bytes data = 2;
-};
-
-/* ## ---------------------- ## */
-/* ## OpenFlow Instructions. ## */
-/* ## ---------------------- ## */
-
-enum ofp_instruction_type {
-    OFPIT_INVALID    = 0;
-    OFPIT_GOTO_TABLE = 1;       /* Setup the next table in the lookup
-                                   pipeline */
-    OFPIT_WRITE_METADATA = 2;   /* Setup the metadata field for use later in
-                                   pipeline */
-    OFPIT_WRITE_ACTIONS = 3;    /* Write the action(s) onto the datapath action
-                                   set */
-    OFPIT_APPLY_ACTIONS = 4;    /* Applies the action(s) immediately */
-    OFPIT_CLEAR_ACTIONS = 5;    /* Clears all actions from the datapath
-                                   action set */
-    OFPIT_METER = 6;            /* Apply meter (rate limiter) */
-
-    OFPIT_EXPERIMENTER = 0xFFFF; /* Experimenter instruction */
-};
-
-/* 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. */
-message ofp_instruction {
-    uint32 type = 1;               /* Instruction type */
-    oneof data {
-        ofp_instruction_goto_table goto_table = 2;
-        ofp_instruction_write_metadata write_metadata = 3;
-        ofp_instruction_actions actions = 4;
-        ofp_instruction_meter meter = 5;
-        ofp_instruction_experimenter experimenter = 6;
-    }
-};
-
-/* Instruction structure for OFPIT_GOTO_TABLE */
-message ofp_instruction_goto_table {
-    uint32 table_id = 1;           /* Set next table in the lookup pipeline */
-};
-
-/* Instruction structure for OFPIT_WRITE_METADATA */
-message ofp_instruction_write_metadata {
-    uint64 metadata = 1;           /* Metadata value to write */
-    uint64 metadata_mask = 2;      /* Metadata write bitmask */
-};
-
-/* Instruction structure for OFPIT_WRITE/APPLY/CLEAR_ACTIONS */
-message ofp_instruction_actions {
-    repeated ofp_action actions = 1; /* 0 or more actions associated
-                                        with OFPIT_WRITE_ACTIONS and
-                                        OFPIT_APPLY_ACTIONS */
-};
-
-/* Instruction structure for OFPIT_METER */
-message ofp_instruction_meter {
-    uint32 meter_id = 1;           /* Meter instance. */
-};
-
-/* Instruction structure for experimental instructions */
-message ofp_instruction_experimenter {
-    uint32 experimenter = 1;     /* Experimenter ID which takes the same form
-                                   as in struct ofp_experimenter_header. */
-    /* Experimenter-defined arbitrary additional data. */
-    bytes data = 2;
-};
-
-/* ## --------------------------- ## */
-/* ## OpenFlow Flow Modification. ## */
-/* ## --------------------------- ## */
-
-enum ofp_flow_mod_command {
-    OFPFC_ADD           = 0; /* New flow. */
-    OFPFC_MODIFY        = 1; /* Modify all matching flows. */
-    OFPFC_MODIFY_STRICT = 2; /* Modify entry strictly matching wildcards and
-                                priority. */
-    OFPFC_DELETE        = 3; /* Delete all matching flows. */
-    OFPFC_DELETE_STRICT = 4; /* Delete entry strictly matching wildcards and
-                                priority. */
-};
-
-/* 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
-
-enum ofp_flow_mod_flags {
-    OFPFF_INVALID       = 0;
-    OFPFF_SEND_FLOW_REM = 1;  /* Send flow removed message when flow
-                               * expires or is deleted. */
-    OFPFF_CHECK_OVERLAP = 2;  /* Check for overlapping entries first. */
-    OFPFF_RESET_COUNTS  = 4;  /* Reset flow packet and byte counts. */
-    OFPFF_NO_PKT_COUNTS = 8;  /* Don't keep track of packet count. */
-    OFPFF_NO_BYT_COUNTS = 16; /* Don't keep track of byte count. */
-};
-
-/* Flow setup and teardown (controller -> datapath). */
-message ofp_flow_mod {
-    //ofp_header header;
-    uint64 cookie = 1;             /* Opaque controller-issued identifier. */
-    uint64 cookie_mask = 2;        /* 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. */
-    uint32 table_id = 3;           /* 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. */
-    ofp_flow_mod_command command = 4; /* One of OFPFC_*. */
-    uint32 idle_timeout = 5;       /* Idle time before discarding (seconds). */
-    uint32 hard_timeout = 6;       /* Max time before discarding (seconds). */
-    uint32 priority = 7;           /* Priority level of flow entry. */
-    uint32 buffer_id = 8;          /* Buffered packet to apply to, or
-                                      OFP_NO_BUFFER.
-                                      Not meaningful for OFPFC_DELETE*. */
-    uint32 out_port = 9;          /* For OFPFC_DELETE* commands, require
-                                      matching entries to include this as an
-                                      output port.  A value of OFPP_ANY
-                                      indicates no restriction. */
-    uint32 out_group = 10;         /* For OFPFC_DELETE* commands, require
-                                      matching entries to include this as an
-                                      output group.  A value of OFPG_ANY
-                                      indicates no restriction. */
-    uint32 flags = 11;             /* Bitmap of OFPFF_* flags. */
-    ofp_match match = 12;          /* Fields to match. Variable size. */
-    repeated ofp_instruction instructions = 13; /* 0 or more. */
-};
-
-/* Group numbering. Groups can use any number up to OFPG_MAX. */
-enum ofp_group {
-
-    OFPG_INVALID = 0;
-
-    /* Last usable group number. */
-    OFPG_MAX        = 0x7fffff00;
-
-    /* Fake groups. */
-    OFPG_ALL        = 0x7ffffffc;  /* Represents all groups for group delete
-                                      commands. */
-    OFPG_ANY        = 0x7fffffff;  /* Special wildcard: no group specified. */
-};
-
-/* Group commands */
-enum ofp_group_mod_command {
-    OFPGC_ADD    = 0;       /* New group. */
-    OFPGC_MODIFY = 1;       /* Modify all matching groups. */
-    OFPGC_DELETE = 2;       /* Delete all matching groups. */
-};
-
-/* Bucket for use in groups. */
-message ofp_bucket {
-    uint32 weight = 1;              /* Relative weight of bucket.  Only
-                                       defined for select groups. */
-    uint32 watch_port = 2;          /* Port whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    uint32 watch_group = 3;         /* Group whose state affects whether this
-                                       bucket is live.  Only required for fast
-                                       failover groups. */
-    repeated ofp_action actions = 4;
-};
-
-/* Group setup and teardown (controller -> datapath). */
-message ofp_group_mod {
-    //ofp_header header;
-    ofp_group_mod_command command = 1; /* One of OFPGC_*. */
-    ofp_group_type type = 2;           /* One of OFPGT_*. */
-    uint32 group_id = 3;               /* Group identifier. */
-    repeated ofp_bucket buckets = 4;
-};
-
-/* Group types.  Values in the range [128; 255] are reserved for experimental
- * use. */
-enum ofp_group_type {
-    OFPGT_ALL      = 0; /* All (multicast/broadcast) group.  */
-    OFPGT_SELECT   = 1; /* Select group. */
-    OFPGT_INDIRECT = 2; /* Indirect group. */
-    OFPGT_FF       = 3; /* Fast failover group. */
-};
-
-/* Special buffer-id to indicate 'no buffer' */
-//#define OFP_NO_BUFFER 0xffffffff
-
-/* Send packet (controller -> datapath). */
-message ofp_packet_out {
-    //ofp_header header;
-    uint32 buffer_id = 1;          /* ID assigned by datapath (OFP_NO_BUFFER
-                                      if none). */
-    uint32 in_port = 2;            /* Packet's input port or OFPP_CONTROLLER.*/
-    repeated ofp_action actions = 3; /* Action list - 0 or more. */
-    /* The variable size action list is optionally followed by packet data.
-     * This data is only present and meaningful if buffer_id == -1. */
-    bytes data = 4;                /* Packet data. */
-};
-
-/* Why is this packet being sent to the controller? */
-enum ofp_packet_in_reason {
-    OFPR_NO_MATCH    = 0;   /* No matching flow (table-miss flow entry). */
-    OFPR_ACTION      = 1;   /* Action explicitly output to controller. */
-    OFPR_INVALID_TTL = 2;   /* Packet has invalid TTL */
-};
-
-/* Packet received on port (datapath -> controller). */
-message ofp_packet_in {
-    //ofp_header header;
-    uint32 buffer_id = 1;     /* ID assigned by datapath. */
-    ofp_packet_in_reason reason = 2; /* Reason packet is being sent */
-    uint32 table_id = 3;      /* ID of the table that was looked up */
-    uint64 cookie = 4;        /* Cookie of the flow entry that was looked up. */
-    ofp_match match = 5;      /* Packet metadata. Variable size. */
-    bytes data = 6;           /* Ethernet frame */
-};
-
-/* Why was this flow removed? */
-enum ofp_flow_removed_reason {
-    OFPRR_IDLE_TIMEOUT = 0;     /* Flow idle time exceeded idle_timeout. */
-    OFPRR_HARD_TIMEOUT = 1;     /* Time exceeded hard_timeout. */
-    OFPRR_DELETE       = 2;     /* Evicted by a DELETE flow mod. */
-    OFPRR_GROUP_DELETE = 3;     /* Group was removed. */
-    OFPRR_METER_DELETE = 4;     /* Meter was removed */
-};
-
-/* Flow removed (datapath -> controller). */
-message ofp_flow_removed {
-    //ofp_header header;
-    uint64 cookie = 1;         /* Opaque controller-issued identifier. */
-
-    uint32 priority = 2;       /* Priority level of flow entry. */
-    ofp_flow_removed_reason reason = 3; /* One of OFPRR_*. */
-    uint32 table_id = 4;        /* ID of the table */
-
-    uint32 duration_sec = 5;   /* Time flow was alive in seconds. */
-    uint32 duration_nsec = 6;  /* Time flow was alive in nanoseconds beyond
-                                 duration_sec. */
-    uint32 idle_timeout = 7;   /* Idle timeout from original flow mod. */
-    uint32 hard_timeout = 8;   /* Hard timeout from original flow mod. */
-    uint64 packet_count = 9;
-    uint64 byte_count = 10;
-    ofp_match match = 121;  /* Description of fields. Variable size. */
-};
-
-/* Meter numbering. Flow meters can use any number up to OFPM_MAX. */
-enum ofp_meter {
-    OFPM_ZERO       = 0;
-    /* Last usable meter. */
-    OFPM_MAX        = 0x7fff0000;
-
-    /* Virtual meters. */
-    OFPM_SLOWPATH   = 0x7ffffffd;  /* Meter for slow datapath. */
-    OFPM_CONTROLLER = 0x7ffffffe;  /* Meter for controller connection. */
-    OFPM_ALL        = 0x7fffffff;  /* Represents all meters for stat requests
-                                      commands. */
-};
-
-/* Meter band types */
-enum ofp_meter_band_type {
-    OFPMBT_INVALID         = 0;
-    OFPMBT_DROP            = 1;      /* Drop packet. */
-    OFPMBT_DSCP_REMARK     = 2;      /* Remark DSCP in the IP header. */
-    OFPMBT_EXPERIMENTER    = 0xFFFF; /* Experimenter meter band. */
-};
-
-/* Common header for all meter bands */
-message ofp_meter_band_header {
-    ofp_meter_band_type type = 1;   /* One of OFPMBT_*. */
-    uint32              len = 2;    /* Length in bytes of this band. */
-    uint32              rate = 3;   /* Rate for this band. */
-    uint32              burst_size = 4;/* Size of bursts. */
-};
-
-/* OFPMBT_DROP band - drop packets */
-message ofp_meter_band_drop {
-    uint32        type = 1;   /* OFPMBT_DROP. */
-    uint32        len = 2;   /* Length in bytes of this band. */
-    uint32        rate = 3;   /* Rate for dropping packets. */
-    uint32        burst_size = 4;/* Size of bursts. */
-};
-
-/* OFPMBT_DSCP_REMARK band - Remark DSCP in the IP header */
-message ofp_meter_band_dscp_remark {
-    uint32        type = 1;       /* OFPMBT_DSCP_REMARK. */
-    uint32        len = 2;        /* Length in bytes of this band. */
-    uint32        rate = 3;       /* Rate for remarking packets. */
-    uint32        burst_size = 4; /* Size of bursts. */
-    uint32        prec_level = 5; /* Number of drop precedence level to add. */
-};
-
-/* OFPMBT_EXPERIMENTER band - Experimenter type.
- * The rest of the band is experimenter-defined. */
-message ofp_meter_band_experimenter {
-    ofp_meter_band_type type = 1;        /* One of OFPMBT_*. */
-    uint32              len = 2;         /* Length in bytes of this band. */
-    uint32              rate = 3;        /* Rate for this band. */
-    uint32              burst_size = 4;  /* Size of bursts. */
-    uint32              experimenter = 5;/* Experimenter ID which takes the
-                                            same form as in struct
-                                            ofp_experimenter_header. */
-};
-
-/* Meter commands */
-enum ofp_meter_mod_command {
-    OFPMC_ADD = 0;              /* New meter. */
-    OFPMC_MODIFY = 1;           /* Modify specified meter. */
-    OFPMC_DELETE = 2;           /* Delete specified meter. */
-};
-
-/* Meter configuration flags */
-enum ofp_meter_flags {
-    OFPMF_INVALID = 0;
-    OFPMF_KBPS    = 1;     /* Rate value in kb/s (kilo-bit per second). */
-    OFPMF_PKTPS   = 2;     /* Rate value in packet/sec. */
-    OFPMF_BURST   = 4;     /* Do burst size. */
-    OFPMF_STATS   = 8;     /* Collect statistics. */
-};
-
-/* Meter configuration. OFPT_METER_MOD. */
-message ofp_meter_mod {
-//    ofp_header   header = 1;
-    ofp_meter_mod_command command = 1;       /* One of OFPMC_*. */
-    uint32                flags = 2;         /* Bitmap of OFPMF_* flags. */
-    uint32                meter_id = 3;      /* Meter instance. */
-    repeated ofp_meter_band_header bands = 4; /* The band list length is
-                                                 inferred from the length field
-                                                 in the header. */
-};
-
-/* 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). */
-enum ofp_error_type {
-    OFPET_HELLO_FAILED         = 0;  /* Hello protocol failed. */
-    OFPET_BAD_REQUEST          = 1;  /* Request was not understood. */
-    OFPET_BAD_ACTION           = 2;  /* Error in action description. */
-    OFPET_BAD_INSTRUCTION      = 3;  /* Error in instruction list. */
-    OFPET_BAD_MATCH            = 4;  /* Error in match. */
-    OFPET_FLOW_MOD_FAILED      = 5;  /* Problem modifying flow entry. */
-    OFPET_GROUP_MOD_FAILED     = 6;  /* Problem modifying group entry. */
-    OFPET_PORT_MOD_FAILED      = 7;  /* Port mod request failed. */
-    OFPET_TABLE_MOD_FAILED     = 8;  /* Table mod request failed. */
-    OFPET_QUEUE_OP_FAILED      = 9;  /* Queue operation failed. */
-    OFPET_SWITCH_CONFIG_FAILED = 10; /* Switch config request failed. */
-    OFPET_ROLE_REQUEST_FAILED  = 11; /* Controller Role request failed. */
-    OFPET_METER_MOD_FAILED     = 12; /* Error in meter. */
-    OFPET_TABLE_FEATURES_FAILED = 13; /* Setting table features failed. */
-    OFPET_EXPERIMENTER = 0xffff;      /* Experimenter error messages. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED.  'data' contains an
- * ASCII text string that may give failure details. */
-enum ofp_hello_failed_code {
-    OFPHFC_INCOMPATIBLE = 0;    /* No compatible version. */
-    OFPHFC_EPERM        = 1;    /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_REQUEST.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_request_code {
-    OFPBRC_BAD_VERSION      = 0;  /* ofp_header.version not supported. */
-    OFPBRC_BAD_TYPE         = 1;  /* ofp_header.type not supported. */
-    OFPBRC_BAD_MULTIPART    = 2;  /* ofp_multipart_request.type not supported.
-                                   */
-    OFPBRC_BAD_EXPERIMENTER = 3;  /* Experimenter id not supported
-                                   * (in ofp_experimenter_header or
-                                   * ofp_multipart_request or
-                                   * ofp_multipart_reply). */
-    OFPBRC_BAD_EXP_TYPE     = 4;  /* Experimenter type not supported. */
-    OFPBRC_EPERM            = 5;  /* Permissions error. */
-    OFPBRC_BAD_LEN          = 6;  /* Wrong request length for type. */
-    OFPBRC_BUFFER_EMPTY     = 7;  /* Specified buffer has already been used. */
-    OFPBRC_BUFFER_UNKNOWN   = 8;  /* Specified buffer does not exist. */
-    OFPBRC_BAD_TABLE_ID     = 9;  /* Specified table-id invalid or does not
-                                   * exist. */
-    OFPBRC_IS_SLAVE         = 10; /* Denied because controller is slave. */
-    OFPBRC_BAD_PORT         = 11; /* Invalid port. */
-    OFPBRC_BAD_PACKET       = 12; /* Invalid packet in packet-out. */
-    OFPBRC_MULTIPART_BUFFER_OVERFLOW    = 13; /* ofp_multipart_request
-                                     overflowed the assigned buffer. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_ACTION.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_action_code {
-    OFPBAC_BAD_TYPE           = 0;  /* Unknown or unsupported action type. */
-    OFPBAC_BAD_LEN            = 1;  /* Length problem in actions. */
-    OFPBAC_BAD_EXPERIMENTER   = 2;  /* Unknown experimenter id specified. */
-    OFPBAC_BAD_EXP_TYPE       = 3;  /* Unknown action for experimenter id. */
-    OFPBAC_BAD_OUT_PORT       = 4;  /* Problem validating output port. */
-    OFPBAC_BAD_ARGUMENT       = 5;  /* Bad action argument. */
-    OFPBAC_EPERM              = 6;  /* Permissions error. */
-    OFPBAC_TOO_MANY           = 7;  /* Can't handle this many actions. */
-    OFPBAC_BAD_QUEUE          = 8;  /* Problem validating output queue. */
-    OFPBAC_BAD_OUT_GROUP      = 9;  /* Invalid group id in forward action. */
-    OFPBAC_MATCH_INCONSISTENT = 10; /* Action can't apply for this match,
-                                       or Set-Field missing prerequisite. */
-    OFPBAC_UNSUPPORTED_ORDER  = 11; /* Action order is unsupported for the
-                                 action list in an Apply-Actions instruction */
-    OFPBAC_BAD_TAG            = 12; /* Actions uses an unsupported
-                                       tag/encap. */
-    OFPBAC_BAD_SET_TYPE       = 13; /* Unsupported type in SET_FIELD action. */
-    OFPBAC_BAD_SET_LEN        = 14; /* Length problem in SET_FIELD action. */
-    OFPBAC_BAD_SET_ARGUMENT   = 15; /* Bad argument in SET_FIELD action. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_INSTRUCTION.  'data' contains at
- * least the first 64 bytes of the failed request. */
-enum ofp_bad_instruction_code {
-    OFPBIC_UNKNOWN_INST     = 0; /* Unknown instruction. */
-    OFPBIC_UNSUP_INST       = 1; /* Switch or table does not support the
-                                    instruction. */
-    OFPBIC_BAD_TABLE_ID     = 2; /* Invalid Table-ID specified. */
-    OFPBIC_UNSUP_METADATA   = 3; /* Metadata value unsupported by datapath. */
-    OFPBIC_UNSUP_METADATA_MASK = 4; /* Metadata mask value unsupported by
-                                       datapath. */
-    OFPBIC_BAD_EXPERIMENTER = 5; /* Unknown experimenter id specified. */
-    OFPBIC_BAD_EXP_TYPE     = 6; /* Unknown instruction for experimenter id. */
-    OFPBIC_BAD_LEN          = 7; /* Length problem in instructions. */
-    OFPBIC_EPERM            = 8; /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_BAD_MATCH.  'data' contains at least
- * the first 64 bytes of the failed request. */
-enum ofp_bad_match_code {
-    OFPBMC_BAD_TYPE         = 0;  /* Unsupported match type specified by the
-                                     match */
-    OFPBMC_BAD_LEN          = 1;  /* Length problem in match. */
-    OFPBMC_BAD_TAG          = 2;  /* Match uses an unsupported tag/encap. */
-    OFPBMC_BAD_DL_ADDR_MASK = 3;  /* Unsupported datalink addr mask - switch
-                                     does not support arbitrary datalink
-                                     address mask. */
-    OFPBMC_BAD_NW_ADDR_MASK = 4;  /* Unsupported network addr mask - switch
-                                     does not support arbitrary network
-                                     address mask. */
-    OFPBMC_BAD_WILDCARDS    = 5;  /* Unsupported combination of fields masked
-                                     or omitted in the match. */
-    OFPBMC_BAD_FIELD        = 6;  /* Unsupported field type in the match. */
-    OFPBMC_BAD_VALUE        = 7;  /* Unsupported value in a match field. */
-    OFPBMC_BAD_MASK         = 8;  /* Unsupported mask specified in the match,
-                                     field is not dl-address or nw-address. */
-    OFPBMC_BAD_PREREQ       = 9;  /* A prerequisite was not met. */
-    OFPBMC_DUP_FIELD        = 10; /* A field type was duplicated. */
-    OFPBMC_EPERM            = 11; /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_flow_mod_failed_code {
-    OFPFMFC_UNKNOWN      = 0;   /* Unspecified error. */
-    OFPFMFC_TABLE_FULL   = 1;   /* Flow not added because table was full. */
-    OFPFMFC_BAD_TABLE_ID = 2;   /* Table does not exist */
-    OFPFMFC_OVERLAP      = 3;   /* Attempted to add overlapping flow with
-                                   CHECK_OVERLAP flag set. */
-    OFPFMFC_EPERM        = 4;   /* Permissions error. */
-    OFPFMFC_BAD_TIMEOUT  = 5;   /* Flow not added because of unsupported
-                                   idle/hard timeout. */
-    OFPFMFC_BAD_COMMAND  = 6;   /* Unsupported or unknown command. */
-    OFPFMFC_BAD_FLAGS    = 7;   /* Unsupported or unknown flags. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_GROUP_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_group_mod_failed_code {
-    OFPGMFC_GROUP_EXISTS         = 0;  /* Group not added because a group ADD
-                                          attempted to replace an
-                                          already-present group. */
-    OFPGMFC_INVALID_GROUP        = 1;  /* Group not added because Group
-                                          specified is invalid. */
-    OFPGMFC_WEIGHT_UNSUPPORTED   = 2;  /* Switch does not support unequal load
-                                          sharing with select groups. */
-    OFPGMFC_OUT_OF_GROUPS        = 3;  /* The group table is full. */
-    OFPGMFC_OUT_OF_BUCKETS       = 4;  /* The maximum number of action buckets
-                                          for a group has been exceeded. */
-    OFPGMFC_CHAINING_UNSUPPORTED = 5;  /* Switch does not support groups that
-                                          forward to groups. */
-    OFPGMFC_WATCH_UNSUPPORTED    = 6;  /* This group cannot watch the
-                                          watch_port or watch_group specified.
-                                        */
-    OFPGMFC_LOOP                 = 7;  /* Group entry would cause a loop. */
-    OFPGMFC_UNKNOWN_GROUP        = 8;  /* Group not modified because a group
-                                          MODIFY attempted to modify a
-                                          non-existent group. */
-    OFPGMFC_CHAINED_GROUP        = 9;  /* Group not deleted because another
-                                          group is forwarding to it. */
-    OFPGMFC_BAD_TYPE             = 10; /* Unsupported or unknown group type. */
-    OFPGMFC_BAD_COMMAND          = 11; /* Unsupported or unknown command. */
-    OFPGMFC_BAD_BUCKET           = 12; /* Error in bucket. */
-    OFPGMFC_BAD_WATCH            = 13; /* Error in watch port/group. */
-    OFPGMFC_EPERM                = 14; /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_PORT_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_port_mod_failed_code {
-    OFPPMFC_BAD_PORT      = 0;   /* Specified port number does not exist. */
-    OFPPMFC_BAD_HW_ADDR   = 1;   /* Specified hardware address does not
-                                  * match the port number. */
-    OFPPMFC_BAD_CONFIG    = 2;   /* Specified config is invalid. */
-    OFPPMFC_BAD_ADVERTISE = 3;   /* Specified advertise is invalid. */
-    OFPPMFC_EPERM         = 4;   /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_TABLE_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_table_mod_failed_code {
-    OFPTMFC_BAD_TABLE  = 0;      /* Specified table does not exist. */
-    OFPTMFC_BAD_CONFIG = 1;      /* Specified config is invalid. */
-    OFPTMFC_EPERM      = 2;      /* Permissions error. */
-};
-
-/* ofp_error msg 'code' values for OFPET_QUEUE_OP_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request */
-enum ofp_queue_op_failed_code {
-    OFPQOFC_BAD_PORT   = 0;     /* Invalid port (or port does not exist). */
-    OFPQOFC_BAD_QUEUE  = 1;     /* Queue does not exist. */
-    OFPQOFC_EPERM      = 2;     /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_SWITCH_CONFIG_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_switch_config_failed_code {
-    OFPSCFC_BAD_FLAGS  = 0;      /* Specified flags is invalid. */
-    OFPSCFC_BAD_LEN    = 1;      /* Specified len is invalid. */
-    OFPSCFC_EPERM      = 2;      /* Permissions error. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_ROLE_REQUEST_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_role_request_failed_code {
-    OFPRRFC_STALE      = 0;      /* Stale Message: old generation_id. */
-    OFPRRFC_UNSUP      = 1;      /* Controller role change unsupported. */
-    OFPRRFC_BAD_ROLE   = 2;      /* Invalid role. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_METER_MOD_FAILED.  'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_meter_mod_failed_code {
-    OFPMMFC_UNKNOWN       = 0;  /* Unspecified error. */
-    OFPMMFC_METER_EXISTS  = 1;  /* Meter not added because a Meter ADD
-                                 * attempted to replace an existing Meter. */
-    OFPMMFC_INVALID_METER = 2;  /* Meter not added because Meter specified
-                                 * is invalid,
-                                 * or invalid meter in meter action. */
-    OFPMMFC_UNKNOWN_METER = 3;  /* Meter not modified because a Meter MODIFY
-                                 * attempted to modify a non-existent Meter,
-                                 * or bad meter in meter action. */
-    OFPMMFC_BAD_COMMAND   = 4;  /* Unsupported or unknown command. */
-    OFPMMFC_BAD_FLAGS     = 5;  /* Flag configuration unsupported. */
-    OFPMMFC_BAD_RATE      = 6;  /* Rate unsupported. */
-    OFPMMFC_BAD_BURST     = 7;  /* Burst size unsupported. */
-    OFPMMFC_BAD_BAND      = 8;  /* Band unsupported. */
-    OFPMMFC_BAD_BAND_VALUE = 9; /* Band value unsupported. */
-    OFPMMFC_OUT_OF_METERS = 10; /* No more meters available. */
-    OFPMMFC_OUT_OF_BANDS  = 11; /* The maximum number of properties
-                                 * for a meter has been exceeded. */
-};
-
-/* ofp_error_msg 'code' values for OFPET_TABLE_FEATURES_FAILED. 'data' contains
- * at least the first 64 bytes of the failed request. */
-enum ofp_table_features_failed_code {
-    OFPTFFC_BAD_TABLE    = 0;      /* Specified table does not exist. */
-    OFPTFFC_BAD_METADATA = 1;      /* Invalid metadata mask. */
-    OFPTFFC_BAD_TYPE     = 2;      /* Unknown property type. */
-    OFPTFFC_BAD_LEN      = 3;      /* Length problem in properties. */
-    OFPTFFC_BAD_ARGUMENT = 4;      /* Unsupported property value. */
-    OFPTFFC_EPERM        = 5;      /* Permissions error. */
-};
-
-/* OFPT_ERROR: Error message (datapath -> controller). */
-message ofp_error_msg {
-    //ofp_header header;
-    uint32 type = 1;
-    uint32 code = 2;
-    bytes data = 3;          /* Variable-length data.  Interpreted based
-                                 on the type and code.  No padding. */
-};
-
-/* OFPET_EXPERIMENTER: Error message (datapath -> controller). */
-message ofp_error_experimenter_msg {
-    //ofp_header header;
-
-    uint32 type = 1;           /* OFPET_EXPERIMENTER. */
-    uint32 exp_type = 2;       /* Experimenter defined. */
-    uint32 experimenter = 3;   /* Experimenter ID which takes the same form
-                                    as in struct ofp_experimenter_header. */
-    bytes data = 4;              /* Variable-length data.  Interpreted based
-                                    on the type and code.  No padding. */
-};
-
-enum ofp_multipart_type {
-    /* Description of this OpenFlow switch.
-     * The request body is empty.
-     * The reply body is struct ofp_desc. */
-    OFPMP_DESC = 0;
-
-    /* Individual flow statistics.
-     * The request body is struct ofp_flow_stats_request.
-     * The reply body is an array of struct ofp_flow_stats. */
-    OFPMP_FLOW = 1;
-
-    /* Aggregate flow statistics.
-     * The request body is struct ofp_aggregate_stats_request.
-     * The reply body is struct ofp_aggregate_stats_reply. */
-    OFPMP_AGGREGATE = 2;
-
-    /* Flow table statistics.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_table_stats. */
-    OFPMP_TABLE = 3;
-
-    /* Port statistics.
-     * The request body is struct ofp_port_stats_request.
-     * The reply body is an array of struct ofp_port_stats. */
-    OFPMP_PORT_STATS = 4;
-
-    /* Queue statistics for a port
-     * The request body is struct ofp_queue_stats_request.
-     * The reply body is an array of struct ofp_queue_stats */
-    OFPMP_QUEUE = 5;
-
-    /* Group counter statistics.
-     * The request body is struct ofp_group_stats_request.
-     * The reply is an array of struct ofp_group_stats. */
-    OFPMP_GROUP = 6;
-
-    /* Group description.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_group_desc. */
-    OFPMP_GROUP_DESC = 7;
-
-    /* Group features.
-     * The request body is empty.
-     * The reply body is struct ofp_group_features. */
-    OFPMP_GROUP_FEATURES = 8;
-
-    /* Meter statistics.
-     * The request body is struct ofp_meter_multipart_requests.
-     * The reply body is an array of struct ofp_meter_stats. */
-    OFPMP_METER = 9;
-
-    /* Meter configuration.
-     * The request body is struct ofp_meter_multipart_requests.
-     * The reply body is an array of struct ofp_meter_config. */
-    OFPMP_METER_CONFIG = 10;
-
-    /* Meter features.
-     * The request body is empty.
-     * The reply body is struct ofp_meter_features. */
-    OFPMP_METER_FEATURES = 11;
-
-    /* Table features.
-     * The request body is either empty or contains an array of
-     * struct ofp_table_features containing the controller's
-     * desired view of the switch. If the switch is unable to
-     * set the specified view an error is returned.
-     * The reply body is an array of struct ofp_table_features. */
-    OFPMP_TABLE_FEATURES = 12;
-
-    /* Port description.
-     * The request body is empty.
-     * The reply body is an array of struct ofp_port. */
-    OFPMP_PORT_DESC = 13;
-
-    /* Experimenter extension.
-     * The request and reply bodies begin with
-     * struct ofp_experimenter_multipart_header.
-     * The request and reply bodies are otherwise experimenter-defined. */
-    OFPMP_EXPERIMENTER = 0xffff;
-};
-
-/* Backward compatibility with 1.3.1 - avoid breaking the API. */
-//#define ofp_multipart_types ofp_multipart_type
-
-enum ofp_multipart_request_flags {
-    OFPMPF_REQ_INVALID = 0;
-    OFPMPF_REQ_MORE  = 1;  /* More requests to follow. */
-};
-
-message ofp_multipart_request {
-    //ofp_header header;
-    ofp_multipart_type type = 1; /* One of the OFPMP_* constants. */
-    uint32 flags = 2;            /* OFPMPF_REQ_* flags. */
-    bytes body = 3;              /* Body of the request. 0 or more bytes. */
-};
-
-enum ofp_multipart_reply_flags {
-    OFPMPF_REPLY_INVALID = 0;
-    OFPMPF_REPLY_MORE  = 1;  /* More replies to follow. */
-};
-
-message ofp_multipart_reply {
-    //ofp_header header;
-    ofp_multipart_type type = 1; /* One of the OFPMP_* constants. */
-    uint32 flags = 2;            /* OFPMPF_REPLY_* flags. */
-    bytes body = 3;              /* Body of the reply. 0 or more bytes. */
-};
-
-//#define DESC_STR_LEN   256
-//#define SERIAL_NUM_LEN 32
-/* Body of reply to OFPMP_DESC request.  Each entry is a NULL-terminated
- * ASCII string. */
-message ofp_desc {
-    string mfr_desc = 1;       /* Manufacturer description. */
-    string hw_desc = 2;        /* Hardware description. */
-    string sw_desc = 3;        /* Software description. */
-    string serial_num = 4;     /* Serial number. */
-    string dp_desc = 5;        /* Human readable description of datapath. */
-};
-
-/* Body for ofp_multipart_request of type OFPMP_FLOW. */
-message ofp_flow_stats_request {
-    uint32 table_id = 1;       /* ID of table to read (from ofp_table_stats),
-                                    OFPTT_ALL for all tables. */
-    uint32 out_port = 2;       /* Require matching entries to include this
-                                    as an output port.  A value of OFPP_ANY
-                                    indicates no restriction. */
-    uint32 out_group = 3;      /* Require matching entries to include this
-                                    as an output group.  A value of OFPG_ANY
-                                    indicates no restriction. */
-    uint64 cookie = 4;         /* Require matching entries to contain this
-                                    cookie value */
-    uint64 cookie_mask = 5;    /* Mask used to restrict the cookie bits that
-                                    must match. A value of 0 indicates
-                                    no restriction. */
-    ofp_match match = 6;         /* Fields to match. Variable size. */
-};
-
-/* Body of reply to OFPMP_FLOW request. */
-message ofp_flow_stats {
-    uint64 id = 14;            /* Unique ID of flow within device. */
-    uint32 table_id = 1;       /* ID of table flow came from. */
-    uint32 duration_sec = 2;   /* Time flow has been alive in seconds. */
-    uint32 duration_nsec = 3;  /* Time flow has been alive in nanoseconds
-                                  beyond duration_sec. */
-    uint32 priority = 4;       /* Priority of the entry. */
-    uint32 idle_timeout = 5;   /* Number of seconds idle before expiration. */
-    uint32 hard_timeout = 6;   /* Number of seconds before expiration. */
-    uint32 flags = 7;          /* Bitmap of OFPFF_* flags. */
-    uint64 cookie = 8;         /* Opaque controller-issued identifier. */
-    uint64 packet_count = 9;   /* Number of packets in flow. */
-    uint64 byte_count = 10;    /* Number of bytes in flow. */
-    ofp_match match = 12;      /* Description of fields. Variable size. */
-    repeated ofp_instruction instructions = 13; /* Instruction set
-                                                   (0 or more) */
-};
-
-/* Body for ofp_multipart_request of type OFPMP_AGGREGATE. */
-message ofp_aggregate_stats_request {
-    uint32 table_id = 1;      /* ID of table to read (from ofp_table_stats)
-                                 OFPTT_ALL for all tables. */
-    uint32 out_port = 2;      /* Require matching entries to include this
-                                 as an output port.  A value of OFPP_ANY
-                                 indicates no restriction. */
-    uint32 out_group = 3;     /* Require matching entries to include this
-                                 as an output group.  A value of OFPG_ANY
-                                 indicates no restriction. */
-    uint64 cookie = 4;        /* Require matching entries to contain this
-                                 cookie value */
-    uint64 cookie_mask = 5;   /* Mask used to restrict the cookie bits that
-                                 must match. A value of 0 indicates
-                                 no restriction. */
-    ofp_match match = 6;      /* Fields to match. Variable size. */
-};
-
-/* Body of reply to OFPMP_AGGREGATE request. */
-message ofp_aggregate_stats_reply {
-    uint64 packet_count = 1;   /* Number of packets in flows. */
-    uint64 byte_count = 2;     /* Number of bytes in flows. */
-    uint32 flow_count = 3;     /* Number of flows. */
-};
-
-/* 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.
- */
-enum ofp_table_feature_prop_type {
-    OFPTFPT_INSTRUCTIONS           = 0;  /* Instructions property. */
-    OFPTFPT_INSTRUCTIONS_MISS      = 1;  /* Instructions for table-miss. */
-    OFPTFPT_NEXT_TABLES            = 2;  /* Next Table property. */
-    OFPTFPT_NEXT_TABLES_MISS       = 3;  /* Next Table for table-miss. */
-    OFPTFPT_WRITE_ACTIONS          = 4;  /* Write Actions property. */
-    OFPTFPT_WRITE_ACTIONS_MISS     = 5;  /* Write Actions for table-miss. */
-    OFPTFPT_APPLY_ACTIONS          = 6;  /* Apply Actions property. */
-    OFPTFPT_APPLY_ACTIONS_MISS     = 7;  /* Apply Actions for table-miss. */
-    OFPTFPT_MATCH                  = 8;  /* Match property. */
-    OFPTFPT_WILDCARDS              = 10; /* Wildcards property. */
-    OFPTFPT_WRITE_SETFIELD         = 12; /* Write Set-Field property. */
-    OFPTFPT_WRITE_SETFIELD_MISS    = 13; /* Write Set-Field for table-miss. */
-    OFPTFPT_APPLY_SETFIELD         = 14; /* Apply Set-Field property. */
-    OFPTFPT_APPLY_SETFIELD_MISS    = 15; /* Apply Set-Field for table-miss. */
-    OFPTFPT_EXPERIMENTER           = 0xFFFE; /* Experimenter property. */
-    OFPTFPT_EXPERIMENTER_MISS      = 0xFFFF; /* Experimenter for table-miss. */
-};
-
-/* Common header for all Table Feature Properties */
-message ofp_table_feature_property {
-    ofp_table_feature_prop_type type = 1;   /* One of OFPTFPT_*. */
-    oneof value {
-        ofp_table_feature_prop_instructions instructions = 2;
-        ofp_table_feature_prop_next_tables next_tables = 3;
-        ofp_table_feature_prop_actions actions = 4;
-        ofp_table_feature_prop_oxm oxm = 5;
-        ofp_table_feature_prop_experimenter experimenter = 6;
-    }
-};
-
-/* Instructions property */
-message ofp_table_feature_prop_instructions {
-    /* One of OFPTFPT_INSTRUCTIONS,
-       OFPTFPT_INSTRUCTIONS_MISS. */
-    repeated ofp_instruction instructions = 1;   /* List of instructions */
-};
-
-/* Next Tables property */
-message ofp_table_feature_prop_next_tables {
-    /* One of OFPTFPT_NEXT_TABLES,
-       OFPTFPT_NEXT_TABLES_MISS. */
-    repeated uint32 next_table_ids = 1;     /* List of table ids. */
-};
-
-/* Actions property */
-message ofp_table_feature_prop_actions {
-    /* One of OFPTFPT_WRITE_ACTIONS,
-       OFPTFPT_WRITE_ACTIONS_MISS,
-       OFPTFPT_APPLY_ACTIONS,
-       OFPTFPT_APPLY_ACTIONS_MISS. */
-    repeated ofp_action actions = 1; /* List of actions */
-};
-
-/* Match, Wildcard or Set-Field property */
-message ofp_table_feature_prop_oxm {
-    /* One of OFPTFPT_MATCH,
-       OFPTFPT_WILDCARDS,
-       OFPTFPT_WRITE_SETFIELD,
-       OFPTFPT_WRITE_SETFIELD_MISS,
-       OFPTFPT_APPLY_SETFIELD,
-       OFPTFPT_APPLY_SETFIELD_MISS. */
-    /* TODO is this a uint32??? */
-    repeated uint32 oxm_ids = 3;    /* Array of OXM headers */
-};
-
-/* Experimenter table feature property */
-message ofp_table_feature_prop_experimenter {
-    /* One of OFPTFPT_EXPERIMENTER,
-       OFPTFPT_EXPERIMENTER_MISS. */
-    uint32         experimenter = 2; /* Experimenter ID which takes the same
-                                        form as in struct
-                                        ofp_experimenter_header. */
-    uint32         exp_type = 3;      /* Experimenter defined. */
-    repeated uint32 experimenter_data = 4;
-};
-
-/* Body for ofp_multipart_request of type OFPMP_TABLE_FEATURES./
- * Body of reply to OFPMP_TABLE_FEATURES request. */
-message ofp_table_features {
-    uint32 table_id = 1;       /* Identifier of table.  Lower numbered tables
-                                are consulted first. */
-    string name = 2;
-    uint64 metadata_match = 3; /* Bits of metadata table can match. */
-    uint64 metadata_write = 4; /* Bits of metadata table can write. */
-    uint32 config = 5;         /* Bitmap of OFPTC_* values */
-    uint32 max_entries = 6;    /* Max number of entries supported. */
-
-    /* Table Feature Property list */
-    repeated ofp_table_feature_property properties = 7;
-};
-
-/* Body of reply to OFPMP_TABLE request. */
-message ofp_table_stats {
-    uint32 table_id = 1;      /* Identifier of table.  Lower numbered tables
-                                 are consulted first. */
-    uint32 active_count = 2;  /* Number of active entries. */
-    uint64 lookup_count = 3;  /* Number of packets looked up in table. */
-    uint64 matched_count = 4; /* Number of packets that hit table. */
-};
-
-/* Body for ofp_multipart_request of type OFPMP_PORT. */
-message ofp_port_stats_request {
-    uint32 port_no = 1;       /* OFPMP_PORT message must request statistics
-                               * either for a single port (specified in
-                               * port_no) or for all ports (if port_no ==
-                               * OFPP_ANY). */
-};
-
-/* Body of reply to OFPMP_PORT request. If a counter is unsupported, set
- * the field to all ones. */
-message ofp_port_stats {
-    uint32 port_no = 1;
-    uint64 rx_packets = 2;   /* Number of received packets. */
-    uint64 tx_packets = 3;   /* Number of transmitted packets. */
-    uint64 rx_bytes = 4;     /* Number of received bytes. */
-    uint64 tx_bytes = 5;     /* Number of transmitted bytes. */
-    uint64 rx_dropped = 6;   /* Number of packets dropped by RX. */
-    uint64 tx_dropped = 7;   /* Number of packets dropped by TX. */
-    uint64 rx_errors = 8;    /* 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. */
-    uint64 tx_errors = 9;    /* 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.) */
-    uint64 rx_frame_err = 10;  /* Number of frame alignment errors. */
-    uint64 rx_over_err = 11;   /* Number of packets with RX overrun. */
-    uint64 rx_crc_err = 12;    /* Number of CRC errors. */
-    uint64 collisions = 13;    /* Number of collisions. */
-    uint32 duration_sec = 14;  /* Time port has been alive in seconds. */
-    uint32 duration_nsec = 15; /* Time port has been alive in nanoseconds
-                                  beyond duration_sec. */
-};
-
-/* Body of OFPMP_GROUP request. */
-message ofp_group_stats_request {
-    uint32 group_id = 1;      /* All groups if OFPG_ALL. */
-};
-
-/* Used in group stats replies. */
-message ofp_bucket_counter {
-    uint64 packet_count = 1;  /* Number of packets processed by bucket. */
-    uint64 byte_count = 2;    /* Number of bytes processed by bucket. */
-};
-
-/* Body of reply to OFPMP_GROUP request. */
-message ofp_group_stats {
-    uint32 group_id = 1;      /* Group identifier. */
-    uint32 ref_count = 2;     /* Number of flows or groups that directly
-                                 forward to this group. */
-    uint64 packet_count = 3;  /* Number of packets processed by group. */
-    uint64 byte_count = 4;    /* Number of bytes processed by group. */
-    uint32 duration_sec = 5;  /* Time group has been alive in seconds. */
-    uint32 duration_nsec = 6; /* Time group has been alive in nanoseconds
-                                 beyond duration_sec. */
-    repeated ofp_bucket_counter bucket_stats = 7; /* One counter set per
-                                                     bucket. */
-};
-
-/* Body of reply to OFPMP_GROUP_DESC request. */
-message ofp_group_desc {
-    ofp_group_type type = 1;       /* One of OFPGT_*. */
-    uint32 group_id = 2;           /* Group identifier. */
-    repeated ofp_bucket buckets = 3;   /* List of buckets - 0 or more. */
-};
-
-message ofp_group_entry {
-    ofp_group_type type = 1;       /* One of OFPGT_*. */
-    uint32 group_id = 2;           /* Group identifier. */
-    repeated ofp_bucket buckets = 3;   /* List of buckets - 0 or more. */
-//    ofp_group_desc desc = 1;
-    ofp_group_stats stats = 4;
-};
-
-/* Backward compatibility with 1.3.1 - avoid breaking the API. */
-//#define ofp_group_desc_stats ofp_group_desc
-
-/* Group configuration flags */
-enum ofp_group_capabilities {
-    OFPGFC_INVALID         = 0;
-    OFPGFC_SELECT_WEIGHT   = 1;  /* Support weight for select groups */
-    OFPGFC_SELECT_LIVENESS = 2;  /* Support liveness for select groups */
-    OFPGFC_CHAINING        = 4;  /* Support chaining groups */
-    OFPGFC_CHAINING_CHECKS = 8;  /* Check chaining for loops and delete */
-};
-
-/* Body of reply to OFPMP_GROUP_FEATURES request. Group features. */
-message ofp_group_features {
-    uint32  types = 1;         /* Bitmap of (1 << OFPGT_*) values supported. */
-    uint32  capabilities = 2;  /* Bitmap of OFPGFC_* capability supported. */
-    repeated uint32 max_groups = 3; /* Maximum number of groups for each type.
-                                     */
-    repeated uint32 actions = 4;    /* Bitmaps of (1 << OFPAT_*) values
-                                       supported. */
-};
-
-/* Body of OFPMP_METER and OFPMP_METER_CONFIG requests. */
-message ofp_meter_multipart_request {
-    uint32 meter_id = 1;      /* Meter instance, or OFPM_ALL. */
-};
-
-/* Statistics for each meter band */
-message ofp_meter_band_stats {
-    uint64        packet_band_count = 1;  /* Number of packets in band. */
-    uint64        byte_band_count = 2;    /* Number of bytes in band. */
-};
-
-/* Body of reply to OFPMP_METER request. Meter statistics. */
-message ofp_meter_stats {
-    uint32        meter_id = 1;        /* Meter instance. */
-    uint32        flow_count = 2;      /* Number of flows bound to meter. */
-    uint64        packet_in_count = 3; /* Number of packets in input. */
-    uint64        byte_in_count = 4;   /* Number of bytes in input. */
-    uint32        duration_sec = 5; /* Time meter has been alive in seconds. */
-    uint32        duration_nsec = 6;/* Time meter has been alive in nanoseconds
-                                       beyond duration_sec. */
-    repeated ofp_meter_band_stats band_stats = 7; /* The band_stats length is
-                                         inferred from the length field. */
-};
-
-/* Body of reply to OFPMP_METER_CONFIG request. Meter configuration. */
-message ofp_meter_config {
-    uint32        flags = 1;           /* All OFPMF_* that apply. */
-    uint32        meter_id = 2;        /* Meter instance. */
-    repeated ofp_meter_band_header bands = 3; /* The bands length is
-                                             inferred from the length field. */
-};
-
-/* Body of reply to OFPMP_METER_FEATURES request. Meter features. */
-message ofp_meter_features {
-    uint32    max_meter = 1;    /* Maximum number of meters. */
-    uint32    band_types = 2;   /* Bitmaps of (1 << OFPMBT_*) values supported.
-                                 */
-    uint32    capabilities = 3; /* Bitmaps of "ofp_meter_flags". */
-    uint32    max_bands = 4;    /* Maximum bands per meters */
-    uint32    max_color = 5;    /* Maximum color value */
-};
-
-/* Body for ofp_multipart_request/reply of type OFPMP_EXPERIMENTER. */
-message ofp_experimenter_multipart_header {
-    uint32 experimenter = 1;   /* Experimenter ID which takes the same form
-                                  as in struct ofp_experimenter_header. */
-    uint32 exp_type = 2;       /* Experimenter defined. */
-    bytes data = 3; /* Experimenter-defined arbitrary additional data. */
-};
-
-/* Experimenter extension. */
-message ofp_experimenter_header {
-    //ofp_header header;  /* Type OFPT_EXPERIMENTER. */
-    uint32 experimenter = 1;     /* Experimenter ID:
-                                 * - MSB 0: low-order bytes are IEEE OUI.
-                                 * - MSB != 0: defined by ONF. */
-    uint32 exp_type = 2;         /* Experimenter defined. */
-    bytes data = 3; /* Experimenter-defined arbitrary additional data. */
-};
-
-/* 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
-
-enum ofp_queue_properties {
-    OFPQT_INVALID       = 0;
-    OFPQT_MIN_RATE      = 1;      /* Minimum datarate guaranteed. */
-    OFPQT_MAX_RATE      = 2;      /* Maximum datarate. */
-    OFPQT_EXPERIMENTER  = 0xffff; /* Experimenter defined property. */
-};
-
-/* Common description for a queue. */
-message ofp_queue_prop_header {
-    uint32 property = 1;   /* One of OFPQT_. */
-    uint32 len = 2;        /* Length of property, including this header. */
-};
-
-/* Min-Rate queue property description. */
-message ofp_queue_prop_min_rate {
-    ofp_queue_prop_header prop_header = 1;/* prop: OFPQT_MIN, len: 16. */
-    uint32 rate = 2;       /* In 1/10 of a percent = 0;>1000 -> disabled. */
-};
-
-/* Max-Rate queue property description. */
-message ofp_queue_prop_max_rate {
-    ofp_queue_prop_header prop_header = 1;/* prop: OFPQT_MAX, len: 16. */
-    uint32 rate = 2;       /* In 1/10 of a percent = 0;>1000 -> disabled. */
-};
-
-/* Experimenter queue property description. */
-message ofp_queue_prop_experimenter {
-    ofp_queue_prop_header prop_header = 1;/* prop: OFPQT_EXPERIMENTER */
-    uint32 experimenter = 2;         /* Experimenter ID which takes the same
-                                          form as in struct
-                                          ofp_experimenter_header. */
-    bytes data = 3;                    /* Experimenter defined data. */
-};
-
-/* Full description for a queue. */
-message ofp_packet_queue {
-    uint32 queue_id = 1;    /* id for the specific queue. */
-    uint32 port = 2;        /* Port this queue is attached to. */
-    repeated ofp_queue_prop_header properties = 4; /* List of properties. */
-};
-
-/* Query for port queue configuration. */
-message ofp_queue_get_config_request {
-    //ofp_header header;
-    uint32 port = 1;        /* Port to be queried. Should refer
-                              to a valid physical port (i.e. <= OFPP_MAX),
-                              or OFPP_ANY to request all configured
-                              queues.*/
-};
-
-/* Queue configuration for a given port. */
-message ofp_queue_get_config_reply {
-    //ofp_header header;
-    uint32 port = 1;
-    repeated ofp_packet_queue queues = 2; /* List of configured queues. */
-};
-
-/* OFPAT_SET_QUEUE action struct: send packets to given queue on port. */
-message ofp_action_set_queue {
-    uint32 type = 1;           /* OFPAT_SET_QUEUE. */
-    uint32 queue_id = 3;       /* Queue id for the packets. */
-};
-
-message ofp_queue_stats_request {
-    uint32 port_no = 1;       /* All ports if OFPP_ANY. */
-    uint32 queue_id = 2;      /* All queues if OFPQ_ALL. */
-};
-
-message ofp_queue_stats {
-    uint32 port_no = 1;
-    uint32 queue_id = 2;      /* Queue i.d */
-    uint64 tx_bytes = 3;      /* Number of transmitted bytes. */
-    uint64 tx_packets = 4;    /* Number of transmitted packets. */
-    uint64 tx_errors = 5;     /* Number of packets dropped due to overrun. */
-    uint32 duration_sec = 6;  /* Time queue has been alive in seconds. */
-    uint32 duration_nsec = 7; /* Time queue has been alive in nanoseconds
-                                 beyond duration_sec. */
-};
-
-/* 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.
- */
-
-/* Controller roles. */
-enum ofp_controller_role {
-    OFPCR_ROLE_NOCHANGE = 0;    /* Don't change current role. */
-    OFPCR_ROLE_EQUAL    = 1;    /* Default role, full access. */
-    OFPCR_ROLE_MASTER   = 2;    /* Full access, at most one master. */
-    OFPCR_ROLE_SLAVE    = 3;    /* Read-only access. */
-};
-
-/* Role request and reply message. */
-message ofp_role_request {
-    //ofp_header header;        /* Type OFPT_ROLE_REQUEST/OFPT_ROLE_REPLY. */
-    ofp_controller_role role = 1; /* One of OFPCR_ROLE_*. */
-    uint64 generation_id = 2;     /* Master Election Generation Id */
-};
-
-/* Asynchronous message configuration. */
-message ofp_async_config {
-    //ofp_header header;    /* OFPT_GET_ASYNC_REPLY or OFPT_SET_ASYNC. */
-    repeated uint32 packet_in_mask = 1;   /* Bitmasks of OFPR_* values. */
-    repeated uint32 port_status_mask = 2; /* Bitmasks of OFPPR_* values. */
-    repeated uint32 flow_removed_mask = 3;/* Bitmasks of OFPRR_* values. */
-};
-
-
-/* ADDITIONAL VOLTHA SPECIFIC MESSAGE TYPES, AIDING RPC CALLS */
-
-message FlowTableUpdate {
-    string id = 1;  // Device.id or LogicalDevice.id
-    ofp_flow_mod flow_mod = 2;
-}
-
-message FlowGroupTableUpdate {
-    string id = 1;  // Device.id or LogicalDevice.id
-    ofp_group_mod group_mod = 2;
-}
-
-message Flows {
-    repeated ofp_flow_stats items = 1;
-}
-
-message FlowGroups {
-    repeated ofp_group_entry items = 1;
-}
-
-message PacketIn {
-    string id = 1;  // LogicalDevice.id
-    ofp_packet_in packet_in = 2;
-}
-
-message PacketOut {
-    string id = 1;  // LogicalDevice.id
-    ofp_packet_out packet_out = 2;
-}
diff --git a/experiments/netconf/proto2yang/proto2yang.py b/experiments/netconf/proto2yang/proto2yang.py
deleted file mode 100755
index ae1999e..0000000
--- a/experiments/netconf/proto2yang/proto2yang.py
+++ /dev/null
@@ -1,605 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2016 the original author or authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-"""protoc plugin to convert a protobuf schema to a yang schema
-
-   - basic support for message, fields. enumeration, service, method
-
-   - yang semantic rules needs to be implemented
-
-   - to run this plugin :
-
-   $ python -m grpc.tools.protoc -I.
-   --plugin=protoc-gen-custom=./proto2yang.py --custom_out=. <proto file>.proto
-
-   - the above will produce a ietf-<proto file>.yang file formatted for yang
-
-   - two examples of proto that can be used in the same directory are
-   yang.proto and addressbook.proto
-
-"""
-
-import sys
-
-from jinja2 import Template
-from google.protobuf.compiler import plugin_pb2 as plugin
-from descriptor_parser import DescriptorParser
-
-from google.protobuf.descriptor import FieldDescriptor
-
-template_yang = Template("""
-module ietf-{{ module.name }} {
-
-    {% macro set_module_prefix(type) %}
-        {% for t in module.data_types %}
-            {% if t.type == type %}
-                {% if t.module != module.name %} {{ t.module }}:{{ type }};
-                {% else %} {{ type }};
-                {% endif %}
-                {% set found=True %}
-            {% endif %}
-        {% if loop.last %}
-            {% if not found %} {{ type }}; {% endif %}
-        {% endif %}
-        {% endfor %}
-    {% endmacro %}
-
-    namespace "urn:opencord:params:xml:ns:voltha:ietf-{{ module.name }}";
-    prefix {{ module.name }};
-
-    {% for imp in module.imports %}
-    import ietf-{{ imp.name }} { prefix {{ imp.name }} ; }
-    {% endfor %}
-
-    organization "CORD";
-    contact
-        " Any name";
-
-    description
-        "{{ module.description }}";
-
-    revision "2016-11-15" {
-        description "Initial revision.";
-        reference "reference";
-    }
-
-    {% for enum in module.enums %}
-    typedef {{ enum.name }} {
-        type enumeration {
-        {% for v in enum.value %}
-            enum {{ v.name }} {
-                description "{{ v.description }}";
-            }
-        {% endfor %}
-        }
-        description
-            "{{ enum.description }}";
-    }
-    {% endfor %}
-
-    {% for message in module.messages recursive %}
-    {% if message.name in module.referred_messages %}
-    grouping {{ message.name }} {
-    {% else %}
-    container {{ message.name }} {
-    {% endif %}
-        description
-            "{{ message.description }}";
-        {% for field in message.fields %}
-        {% if field.type_ref %}
-        {% for dict_item in module.referred_messages_with_keys %}
-            {% if dict_item.name == field.type %}
-                {% if not field.repeated %}
-        container {{ field.name }} {
-                {% else %}
-        list {{ field.name }} {
-            key "{{ dict_item.key }}";
-            {% if not field.repeated %}
-            max-elements 1;
-            {% endif %}
-            {% endif %}
-            uses {{ set_module_prefix(field.type) }}
-            description
-                "{{ field.description }}";
-        }
-            {% endif %}
-        {% endfor %}
-        {% elif field.repeated %}
-        list {{ field.name }} {
-            key "{{ field.name }}";
-            leaf {{ field.name }} {
-                {% if field.type == "decimal64" %}
-                type {{ field.type }} {
-                   fraction-digits 5;
-                }
-                {% else %}
-                type {{ set_module_prefix(field.type) }}
-                {% endif %}
-                description
-                    "{{ field.description }}";
-            }
-            description
-                "{{ field.description }}";
-        }
-        {% else %}
-        leaf {{ field.name }} {
-            {% if field.type == "decimal64" %}
-            type {{ field.type }} {
-               fraction-digits 5;
-            }
-            {% else %}
-            type {{ set_module_prefix(field.type) }}
-            {% endif %}
-            description
-                "{{ field.description }}";
-        }
-        {% endif %}
-
-        {% endfor %}
-        {% for enum_type in message.enums %}
-        typedef {{ enum_type.name }} {
-            type enumeration {
-            {% for v in enum_type.value %}
-                enum {{ v.name }} {
-                    description "{{ v.description }}";
-                }
-            {% endfor %}
-            }
-            description
-                "{{ enum_type.description }}";
-        }
-
-        {% endfor %}
-    {% if message.messages %}
-    {{ loop (message.messages)|indent(4, false) }}
-    {% endif %}
-    }
-
-    {% endfor %}
-    {% for service in module.services %}
-    {% if service.description %}
-    /*  {{ service.description }}" */
-    {% endif %}
-    {% for method in service.methods %}
-    rpc {{ service.service }}-{{ method.method }} {
-        description
-            "{{ method.description }}";
-        {% if method.input %}
-        input {
-            {% if method.input_ref %}
-            uses {{ set_module_prefix(method.input) }}
-            {% else %}
-            leaf {{ method.input }} {
-                type {{ set_module_prefix(method.input) }}
-            }
-            {% endif %}
-        }
-        {% endif %}
-        {% if method.output %}
-        output {
-            {% if method.output_ref %}
-            uses {{ set_module_prefix(method.output) }}
-            {% else %}
-            leaf {{ method.output }} {
-                type {{ set_module_prefix(method.output) }}
-            }
-            {% endif %}
-        }
-        {% endif %}
-    }
-
-    {% endfor %}
-
-    {% endfor %}
-}
-""", trim_blocks=True, lstrip_blocks=True)
-
-# def traverse_dependencies(descriptor):
-#     dependencies = []
-#     proto_imports = descriptor.get('dependency', [])
-#     for proto_import in proto_imports:
-#         # If the import file has a directory path to it remove it as it is not
-#         # allowed in Yang.  The proto extension should be removed as well
-#         dependencies.append (
-#             {
-#             'name' : proto_import.split('/')[-1][:-len('.proto')]
-#             }
-#         )
-#     return dependencies
-
-
-def traverse_messages(message_types, prefix, referenced_messages):
-    messages = []
-    for message_type in message_types:
-        assert message_type['_type'] == 'google.protobuf.DescriptorProto'
-
-        # full_name = prefix + '-' + message_type['name']
-        full_name = message_type['name']
-
-        # parse the fields
-        fields = traverse_fields(message_type.get('field', []), full_name,
-                                 referenced_messages)
-
-        # parse the enums
-        enums = traverse_enums(message_type.get('enum_type', []), full_name)
-
-        # parse nested messages
-        nested = message_type.get('nested_type', [])
-        nested_messages = traverse_messages(nested, full_name,
-                                            referenced_messages)
-        messages.append(
-            {
-                'name': full_name,
-                'fields': fields,
-                'enums': enums,
-                # 'extensions': extensions,
-                'messages': nested_messages,
-                'description': remove_unsupported_characters(
-                    message_type.get('_description', '')),
-                # 'extension_ranges': extension_ranges,
-                # 'oneof': oneof
-            }
-        )
-    return messages
-
-
-def traverse_fields(fields_desc, prefix, referenced_messages):
-    fields = []
-    for field in fields_desc:
-        assert field['_type'] == 'google.protobuf.FieldDescriptorProto'
-        yang_base_type = is_base_type(field['type'])
-        _type = get_yang_type(field)
-        if not yang_base_type:
-            referenced_messages.append(_type)
-        # add to referred messages also if it is an enumeration type
-        if is_enumeration(field['type']):
-            referenced_messages.append(_type)
-
-        fields.append(
-            {
-                # 'name': prefix + '-' + field.get('name', ''),
-                'name': field.get('name', ''),
-                'label': field.get('label', ''),
-                'repeated': field['label'] == FieldDescriptor.LABEL_REPEATED,
-                'number': field.get('number', ''),
-                'options': field.get('options', ''),
-                'type_name': field.get('type_name', ''),
-                'type': _type,
-                'type_ref': not yang_base_type,
-                'description': remove_unsupported_characters(field.get(
-                    '_description', ''))
-            }
-        )
-    return fields
-
-
-def traverse_enums(enums_desc, prefix):
-    enums = []
-    for enum in enums_desc:
-        assert enum['_type'] == 'google.protobuf.EnumDescriptorProto'
-        # full_name = prefix + '-' + enum.get('name', '')
-        full_name = enum.get('name', '')
-        enums.append(
-            {
-                'name': full_name,
-                'value': enum.get('value', ''),
-                'description': remove_unsupported_characters(enum.get(
-                    '_description', ''))
-            }
-        )
-    return enums
-
-
-def traverse_services(service_desc, referenced_messages):
-    services = []
-    for service in service_desc:
-        methods = []
-        for method in service.get('method', []):
-            assert method['_type'] == 'google.protobuf.MethodDescriptorProto'
-
-            input_name = method.get('input_type')
-            input_ref = False
-            if not is_base_type(input_name):
-                input_name = remove_first_character_if_match(input_name, '.')
-                # input_name = input_name.replace(".", "-")
-                input_name = input_name.split('.')[-1]
-                referenced_messages.append(input_name)
-                input_ref = True
-
-            output_name = method.get('output_type')
-            output_ref = False
-            if not is_base_type(output_name):
-                output_name = remove_first_character_if_match(output_name, '.')
-                # output_name = output_name.replace(".", "-")
-                output_name = output_name.split('.')[-1]
-                referenced_messages.append(output_name)
-                output_ref = True
-
-            methods.append(
-                {
-                    'method': method.get('name', ''),
-                    'input': input_name,
-                    'input_ref': input_ref,
-                    'output': output_name,
-                    'output_ref': output_ref,
-                    'description': remove_unsupported_characters(method.get(
-                        '_description', '')),
-                    'server_streaming': method.get('server_streaming',
-                                                   False) == True
-                }
-            )
-        services.append(
-            {
-                'service': service.get('name', ''),
-                'methods': methods,
-                'description': remove_unsupported_characters(service.get(
-                    '_description', '')),
-            }
-        )
-    return services
-
-
-def rchop(thestring, ending):
-    if thestring.endswith(ending):
-        return thestring[:-len(ending)]
-    return thestring
-
-
-def traverse_desc(descriptor):
-    referenced_messages = []
-    name = rchop(descriptor.get('name', ''), '.proto')
-    package = descriptor.get('package', '')
-    description = descriptor.get('_description', '')
-    # imports=traverse_dependencies(descriptor)
-    messages = traverse_messages(descriptor.get('message_type', []),
-                                 package, referenced_messages)
-    enums = traverse_enums(descriptor.get('enum_type', []), package)
-    services = traverse_services(descriptor.get('service', []),
-                                 referenced_messages)
-    # extensions = _traverse_extensions(descriptors)
-    # options = _traverse_options(descriptors)
-    # set_messages_keys(messages)
-    # unique_referred_messages_with_keys = []
-    # for message_name in list(set(referenced_messages)):
-    #     unique_referred_messages_with_keys.append(
-    #         {
-    #             'name': message_name,
-    #             'key': get_message_key(message_name, messages)
-    #         }
-    #     )
-
-    # Get a list of type definitions (messages, enums) defined in this
-    # descriptor
-    defined_types = [m['name'].split('/')[-1] for m in messages] + \
-                    [e['name'].split('/')[-1]  for e in enums]
-
-    data = {
-        'name': name.split('/')[-1],
-        'package': package,
-        'description': description,
-        # 'imports' : imports,
-        'messages': messages,
-        'enums': enums,
-        'services': services,
-        'defined_types' : defined_types,
-        'referenced_messages': list(set(referenced_messages)),
-        # TODO:  simplify for easier jinja2 template use
-        # 'referred_messages_with_keys': unique_referred_messages_with_keys,
-        # 'extensions': extensions,
-        # 'options': options
-    }
-    return data
-
-
-def set_messages_keys(messages):
-    for message in messages:
-        message['key'] = _get_message_key(message, messages)
-        if message['messages']:
-            set_messages_keys(message['messages'])
-
-def _get_message_key(message, messages):
-    # assume key is first yang base type field
-    for field in message['fields']:
-        if not field['type_ref']:
-            return field['name']
-        else:
-            # if the field name is a message then loop for the key in that
-            # message
-            ref_message = _get_message(field['type'], messages)
-            if ref_message:
-                return _get_message_key(ref_message, messages)
-
-    # no key yet - search nested messaged
-    for m in message['messages']:
-        key = _get_message_key(m, messages)
-        if key is not None:
-            return key
-    else:
-        return None
-
-def _get_message(name, messages):
-    for m in messages:
-        if m['name'] == name:
-            return m
-    return None
-
-def get_message_key(message_name, messages):
-    for message in messages:
-        if message_name == message['name']:
-            return message['key']
-        if message['messages']:
-            return get_message_key(message_name, message['messages'])
-    return None
-
-
-def update_module_imports(module):
-    used_imports = set()
-    for ref_msg in module['referenced_messages']:
-        for type_dict in module['data_types']:
-            if ref_msg == type_dict['type']:
-                if module['name'] != type_dict['module']:
-                    used_imports.add(type_dict['module'])
-                break
-    module['imports'] = [{'name' : i} for i in used_imports]
-
-
-def generate_code(request, response):
-    assert isinstance(request, plugin.CodeGeneratorRequest)
-
-    parser = DescriptorParser()
-
-    # First process the proto file with the imports
-    all_defined_types = []
-    all_proto_data = []
-    all_referred_messages = []
-    all_messages = []
-    for proto_file in request.proto_file:
-        native_data = parser.parse_file_descriptor(proto_file,
-                                                   type_tag_name='_type',
-                                                   fold_comments=True)
-
-        # Consolidate the defined types across imports
-        yang_data = traverse_desc(native_data)
-        for type in yang_data['defined_types']:
-            all_defined_types.append(
-                {
-                    'type' : type,
-                    'module' : yang_data['name']
-                }
-            )
-
-        all_proto_data.append(
-            {
-                'file_name': '{}-{}'.format('ietf', proto_file.name.split(
-                    '/')[-1].replace('.proto','.yang')),
-                'module': yang_data
-            }
-        )
-
-        # Consolidate referred messages across imports
-        all_referred_messages = all_referred_messages + yang_data['referenced_messages']
-
-        # consolidate all messages
-        all_messages = all_messages + yang_data['messages']
-
-    # Set the message keys - required for List definitions (repeated label)
-    set_messages_keys(all_messages)
-    unique_referred_messages_with_keys = []
-    for m in all_messages:
-        unique_referred_messages_with_keys.append(
-                {
-                    'name': m['name'],
-                    'key': m['key']
-                }
-            )
-
-    # Create the files
-    for proto_data in all_proto_data:
-        f = response.file.add()
-        f.name = proto_data['file_name']
-        proto_data['module']['data_types'] = all_defined_types
-        proto_data['module']['referred_messages'] = all_referred_messages
-        proto_data['module']['referred_messages_with_keys'] = unique_referred_messages_with_keys
-        update_module_imports(proto_data['module'])
-        f.content = template_yang.render(module=proto_data['module'])
-
-
-def get_yang_type(field):
-    type = field['type']
-    if type in YANG_TYPE_MAP.keys():
-        _type, _ = YANG_TYPE_MAP[type]
-        if _type in ['enumeration', 'message', 'group']:
-            return field['type_name'].split('.')[-1]
-            # return remove_first_character_if_match(field['type_name'],
-            #                                        '.').replace('.', '-')
-        else:
-            return _type
-    else:
-        return type
-
-def is_enumeration(type):
-    if type in YANG_TYPE_MAP.keys():
-        _type, _ = YANG_TYPE_MAP[type]
-        return _type in ['enumeration']
-    return False
-
-def is_base_type(type):
-    # check numeric value of the type first
-    if type in YANG_TYPE_MAP.keys():
-        _type, _ = YANG_TYPE_MAP[type]
-        return _type not in ['message', 'group']
-    else:
-        # proto name of the type
-        result = [_format for (_, _format) in YANG_TYPE_MAP.values() if
-                  _format == type and _format not in ['message',
-                                                      'group']]
-        return len(result) > 0
-
-
-def remove_unsupported_characters(text):
-    unsupported_characters = ["{", "}", "[", "]", "\"", "\\", "*", "/"]
-    return ''.join([i if i not in unsupported_characters else ' ' for i in
-                    text])
-
-
-def remove_first_character_if_match(str, char):
-    if str.startswith(char):
-        return str[1:]
-    return str
-
-
-YANG_TYPE_MAP = {
-    FieldDescriptor.TYPE_BOOL: ('boolean', 'boolean'),
-    FieldDescriptor.TYPE_BYTES: ('binary', 'byte'),
-    FieldDescriptor.TYPE_DOUBLE: ('decimal64', 'double'),
-    FieldDescriptor.TYPE_ENUM: ('enumeration', 'enum'),
-    FieldDescriptor.TYPE_FIXED32: ('int32', 'int64'),
-    FieldDescriptor.TYPE_FIXED64: ('int64', 'uint64'),
-    FieldDescriptor.TYPE_FLOAT: ('decimal64', 'float'),
-    FieldDescriptor.TYPE_INT32: ('int32', 'int32'),
-    FieldDescriptor.TYPE_INT64: ('int64', 'int64'),
-    FieldDescriptor.TYPE_SFIXED32: ('int32', 'int32'),
-    FieldDescriptor.TYPE_SFIXED64: ('int64', 'int64'),
-    FieldDescriptor.TYPE_STRING: ('string', 'string'),
-    FieldDescriptor.TYPE_SINT32: ('int32', 'int32'),
-    FieldDescriptor.TYPE_SINT64: ('int64', 'int64'),
-    FieldDescriptor.TYPE_UINT32: ('uint32', 'int64'),
-    FieldDescriptor.TYPE_UINT64: ('uint64', 'uint64'),
-    FieldDescriptor.TYPE_MESSAGE: ('message', 'message'),
-    FieldDescriptor.TYPE_GROUP: ('group', 'group')
-}
-
-if __name__ == '__main__':
-    # Read request message from stdin
-    data = sys.stdin.read()
-
-    # Parse request
-    request = plugin.CodeGeneratorRequest()
-    request.ParseFromString(data)
-
-    # Create response
-    response = plugin.CodeGeneratorResponse()
-
-    # Generate code
-    generate_code(request, response)
-
-    # Serialise response message
-    output = response.SerializeToString()
-
-    # Write to stdout
-    sys.stdout.write(output)
-    # print is_base_type(9)
diff --git a/experiments/netconf/proto2yang/schema.proto b/experiments/netconf/proto2yang/schema.proto
deleted file mode 100644
index 1023f1a..0000000
--- a/experiments/netconf/proto2yang/schema.proto
+++ /dev/null
@@ -1,38 +0,0 @@
-syntax = "proto3";
-
-package schema;
-
-import "google/api/annotations.proto";
-import "google/protobuf/empty.proto";
-
-// Contains the name and content of a *.proto file
-message ProtoFile {
-    string file_name = 1;  // name of proto file
-    string proto = 2;  // content of proto file
-    bytes descriptor = 3;  // compiled descriptor for proto (zlib compressed)
-}
-
-// Proto files and compiled descriptors for this interface
-message Schemas {
-
-    // Proto files
-    repeated ProtoFile protos = 1;
-
-    // Proto file name from which swagger.json shall be generated
-    string swagger_from = 2;
-
-    // Proto file name from which yang schemas shall be generated
-    string yang_from = 3;
-}
-
-// Schema services
-service SchemaService {
-
-    // Return active grpc schemas
-    rpc GetSchema(google.protobuf.Empty) returns (Schemas) {
-        option (google.api.http) = {
-            get: "/schema"
-        };
-    }
-
-}
diff --git a/experiments/netconf/proto2yang/voltha.proto b/experiments/netconf/proto2yang/voltha.proto
deleted file mode 100644
index a5ee22e..0000000
--- a/experiments/netconf/proto2yang/voltha.proto
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- * Top-level Voltha API definition
- *
- * For details, see individual definition files.
- */
-
-syntax = "proto3";
-
-package voltha;
-
-import "google/protobuf/empty.proto";
-import "google/api/annotations.proto";
-
-import public "meta.proto";
-import public "common.proto";
-import public "health.proto";
-import public "logical_device.proto";
-import public "device.proto";
-import public "adapter.proto";
-import public "openflow_13.proto";
-
-option java_package = "org.opencord.voltha";
-option java_outer_classname = "VolthaProtos";
-option csharp_namespace = "Opencord.Voltha.Voltha";
-
-message DeviceGroup {
-
-    string id = 1 [(access) = READ_ONLY];
-
-    repeated LogicalDevice logical_devices = 2 [(child_node) = {key: "id"}];
-
-    repeated Device devices = 3 [(child_node) = {key: "id"}];
-}
-
-message DeviceGroups {
-    repeated DeviceGroup items = 1;
-}
-
-// Top-level (root) node for a Voltha Instance
-message VolthaInstance {
-
-    string instance_id = 1  [(access) = READ_ONLY];
-
-    string version = 2 [(access) = READ_ONLY];
-
-    LogLevel log_level = 3;
-
-    HealthStatus health = 10 [(child_node) = {}];
-
-    repeated Adapter adapters = 11 [(child_node) = {key: "id" }];
-
-    repeated LogicalDevice logical_devices = 12 [(child_node) = {key: "id"}];
-
-    repeated Device devices = 13 [(child_node) = {key: "id"}];
-
-    repeated DeviceType device_types = 14 [(child_node) = {key: "id"}];
-
-    repeated DeviceGroup device_groups = 15 [(child_node) = {key: "id"}];
-}
-
-message VolthaInstances {
-    repeated string items = 1;
-}
-
-// Voltha representing the entire Voltha cluster
-message Voltha {
-
-    string version = 1 [(access) = READ_ONLY];
-
-    LogLevel log_level = 2;
-
-    repeated VolthaInstance instances = 3 [(child_node) = {key: "instance_id"}];
-
-    repeated Adapter adapters = 11 [(child_node) = {key: "id"}];
-
-    repeated LogicalDevice logical_devices = 12 [(child_node) = {key: "id"}];
-
-    repeated Device devices = 13 [(child_node) = {key: "id"}];
-
-    repeated DeviceGroup device_groups = 15 [(child_node) = {key: "id"}];
-
-}
-
-
-/*
- * 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.
- *
- */
-service VolthaGlobalService {
-
-    // Get high level information on the Voltha cluster
-    rpc GetVoltha(google.protobuf.Empty) returns(Voltha) {
-        option (google.api.http) = {
-            get: "/api/v1"
-        };
-    }
-
-    // List all Voltha cluster instances
-    rpc ListVolthaInstances(google.protobuf.Empty) returns(VolthaInstances) {
-        option (google.api.http) = {
-            get: "/api/v1/instances"
-        };
-    }
-
-    // Get details on a Voltha cluster instance
-    rpc GetVolthaInstance(ID) returns(VolthaInstance) {
-        option (google.api.http) = {
-            get: "/api/v1/instances/{id}"
-        };
-    }
-
-    // List all logical devices managed by the Voltha cluster
-    rpc ListLogicalDevices(google.protobuf.Empty) returns(LogicalDevices) {
-        option (google.api.http) = {
-            get: "/api/v1/logical_devices"
-        };
-    }
-
-    // Get additional information on a given logical device
-    rpc GetLogicalDevice(ID) returns(LogicalDevice) {
-        option (google.api.http) = {
-            get: "/api/v1/logical_devices/{id}"
-        };
-    }
-
-    // List ports of a logical device
-    rpc ListLogicalDevicePorts(ID) returns(LogicalPorts) {
-        option (google.api.http) = {
-            get: "/api/v1/logical_devices/{id}/ports"
-        };
-    }
-
-    // List all flows of a logical device
-    rpc ListLogicalDeviceFlows(ID) returns(openflow_13.Flows) {
-        option (google.api.http) = {
-            get: "/api/v1/logical_devices/{id}/flows"
-        };
-    }
-
-    // Update flow table for logical device
-    rpc UpdateLogicalDeviceFlowTable(openflow_13.FlowTableUpdate)
-            returns(google.protobuf.Empty) {
-        option (google.api.http) = {
-            post: "/api/v1/logical_devices/{id}/flows"
-            body: "*"
-        };
-    }
-
-    // List all flow groups of a logical device
-    rpc ListLogicalDeviceFlowGroups(ID) returns(openflow_13.FlowGroups) {
-        option (google.api.http) = {
-            get: "/api/v1/logical_devices/{id}/flow_groups"
-        };
-    }
-
-    // Update group table for device
-    rpc UpdateLogicalDeviceFlowGroupTable(openflow_13.FlowGroupTableUpdate)
-            returns(google.protobuf.Empty) {
-        option (google.api.http) = {
-            post: "/api/v1/logical_devices/{id}/flow_groups"
-            body: "*"
-        };
-    }
-
-    // List all physical devices controlled by the Voltha cluster
-    rpc ListDevices(google.protobuf.Empty) returns(Devices) {
-        option (google.api.http) = {
-            get: "/api/v1/devices"
-        };
-    }
-
-    // Get more information on a given physical device
-    rpc GetDevice(ID) returns(Device) {
-        option (google.api.http) = {
-            get: "/api/v1/devices/{id}"
-        };
-    }
-
-    // Pre-provision a new physical device
-    rpc CreateDevice(Device) returns(Device) {
-        option (google.api.http) = {
-            post: "/api/v1/devices"
-            body: "*"
-        };
-    }
-
-    // Activate a pre-provisioned device
-    rpc ActivateDevice(ID) returns(google.protobuf.Empty) {
-        option (google.api.http) = {
-            post: "/api/v1/devices/{id}/activate"
-        };
-    }
-
-    // List ports of a device
-    rpc ListDevicePorts(ID) returns(Ports) {
-        option (google.api.http) = {
-            get: "/api/v1/devices/{id}/ports"
-        };
-    }
-
-    // List all flows of a device
-    rpc ListDeviceFlows(ID) returns(openflow_13.Flows) {
-        option (google.api.http) = {
-            get: "/api/v1/devices/{id}/flows"
-        };
-    }
-
-    // List all flow groups of a device
-    rpc ListDeviceFlowGroups(ID) returns(openflow_13.FlowGroups) {
-        option (google.api.http) = {
-            get: "/api/v1/devices/{id}/flow_groups"
-        };
-    }
-
-    // List device types known to Voltha
-    rpc ListDeviceTypes(google.protobuf.Empty) returns(DeviceTypes) {
-        option (google.api.http) = {
-            get: "/api/v1/device_types"
-        };
-    }
-
-    // Get additional information on a device type
-    rpc GetDeviceType(ID) returns(DeviceType) {
-        option (google.api.http) = {
-            get: "/api/v1/device_types/{id}"
-        };
-    }
-
-    // List all device sharding groups
-    rpc ListDeviceGroups(google.protobuf.Empty) returns(DeviceGroups) {
-        option (google.api.http) = {
-            get: "/api/v1/device_groups"
-        };
-    }
-
-    // Get additional information on a device group
-    rpc GetDeviceGroup(ID) returns(DeviceGroup) {
-        option (google.api.http) = {
-            get: "/api/v1/device_groups/{id}"
-        };
-    }
-
-}
-
-/*
- * Per-instance APIs
- *
- * These APIs are always served locally by the Voltha instance on which the
- * call is made.
- */
-service VolthaLocalService {
-
-    // Get information on this Voltha instance
-    rpc GetVolthaInstance(google.protobuf.Empty) returns(VolthaInstance) {
-        option (google.api.http) = {
-            get: "/api/v1/local"
-        };
-    }
-
-    // Get the health state of the Voltha instance
-    rpc GetHealth(google.protobuf.Empty) returns(HealthStatus) {
-        option (google.api.http) = {
-            get: "/api/v1/local/health"
-        };
-    }
-
-    // List all active adapters (plugins) in this Voltha instance
-    rpc ListAdapters(google.protobuf.Empty) returns(Adapters) {
-        option (google.api.http) = {
-            get: "/api/v1/local/adapters"
-        };
-    }
-
-    // List all logical devices managed by this Voltha instance
-    rpc ListLogicalDevices(google.protobuf.Empty) returns(LogicalDevices) {
-        option (google.api.http) = {
-            get: "/api/v1/local/logical_devices"
-        };
-    }
-
-    // Get additional information on given logical device
-    rpc GetLogicalDevice(ID) returns(LogicalDevice) {
-        option (google.api.http) = {
-            get: "/api/v1/local/logical_devices/{id}"
-        };
-    }
-
-    // List ports of a logical device
-    rpc ListLogicalDevicePorts(ID) returns(LogicalPorts) {
-        option (google.api.http) = {
-            get: "/api/v1/local/logical_devices/{id}/ports"
-        };
-    }
-
-    // List all flows of a logical device
-    rpc ListLogicalDeviceFlows(ID) returns(openflow_13.Flows) {
-        option (google.api.http) = {
-            get: "/api/v1/local/logical_devices/{id}/flows"
-        };
-    }
-
-    // Update flow table for logical device
-    rpc UpdateLogicalDeviceFlowTable(openflow_13.FlowTableUpdate)
-            returns(google.protobuf.Empty) {
-        option (google.api.http) = {
-            post: "/api/v1/local/logical_devices/{id}/flows"
-            body: "*"
-        };
-    }
-
-    // List all flow groups of a logical device
-    rpc ListLogicalDeviceFlowGroups(ID) returns(openflow_13.FlowGroups) {
-        option (google.api.http) = {
-            get: "/api/v1/local/logical_devices/{id}/flow_groups"
-        };
-    }
-
-    // Update group table for logical device
-    rpc UpdateLogicalDeviceFlowGroupTable(openflow_13.FlowGroupTableUpdate)
-            returns(google.protobuf.Empty) {
-        option (google.api.http) = {
-            post: "/api/v1/local/logical_devices/{id}/flow_groups"
-            body: "*"
-        };
-    }
-
-    // List all physical devices managed by this Voltha instance
-    rpc ListDevices(google.protobuf.Empty) returns(Devices) {
-        option (google.api.http) = {
-            get: "/api/v1/local/devices"
-        };
-    }
-
-    // Get additional information on this device
-    rpc GetDevice(ID) returns(Device) {
-        option (google.api.http) = {
-            get: "/api/v1/local/devices/{id}"
-        };
-    }
-
-    // Pre-provision a new physical device
-    rpc CreateDevice(Device) returns(Device) {
-        option (google.api.http) = {
-            post: "/api/v1/local/devices"
-            body: "*"
-        };
-    }
-
-    // Activate a pre-provisioned device
-    rpc ActivateDevice(ID) returns(google.protobuf.Empty) {
-        option (google.api.http) = {
-            post: "/api/v1/local/devices/{id}/activate"
-        };
-    }
-
-    // List ports of a device
-    rpc ListDevicePorts(ID) returns(Ports) {
-        option (google.api.http) = {
-            get: "/api/v1/local/devices/{id}/ports"
-        };
-    }
-
-    // List all flows of a device
-    rpc ListDeviceFlows(ID) returns(openflow_13.Flows) {
-        option (google.api.http) = {
-            get: "/api/v1/local/devices/{id}/flows"
-        };
-    }
-
-    // List all flow groups of a device
-    rpc ListDeviceFlowGroups(ID) returns(openflow_13.FlowGroups) {
-        option (google.api.http) = {
-            get: "/api/v1/local/devices/{id}/flow_groups"
-        };
-    }
-
-    // List device types know to Voltha instance
-    rpc ListDeviceTypes(google.protobuf.Empty) returns(DeviceTypes) {
-        option (google.api.http) = {
-            get: "/api/v1/local/device_types"
-        };
-    }
-
-    // Get additional information on given device type
-    rpc GetDeviceType(ID) returns(DeviceType) {
-        option (google.api.http) = {
-            get: "/api/v1/local/device_types/{id}"
-        };
-    }
-
-    // List device sharding groups managed by this Voltha instance
-    rpc ListDeviceGroups(google.protobuf.Empty) returns(DeviceGroups) {
-        option (google.api.http) = {
-            get: "/api/v1/local/device_groups"
-        };
-    }
-
-    // Get more information on given device shard
-    rpc GetDeviceGroup(ID) returns(DeviceGroup) {
-        option (google.api.http) = {
-            get: "/api/v1/local/device_groups/{id}"
-        };
-    }
-
-    // Stream control packets to the dataplane
-    rpc StreamPacketsOut(stream openflow_13.PacketOut)
-        returns(google.protobuf.Empty) {
-        // This does not have an HTTP representation
-    }
-
-    // Receive control packet stream
-    rpc ReceivePacketsIn(google.protobuf.Empty)
-        returns(stream openflow_13.PacketIn) {
-        // This does not have an HTTP representation
-    }
-
-}
diff --git a/experiments/netconf/proto2yang/yang_options.proto b/experiments/netconf/proto2yang/yang_options.proto
new file mode 100644
index 0000000..5ff2ed6
--- /dev/null
+++ b/experiments/netconf/proto2yang/yang_options.proto
@@ -0,0 +1,52 @@
+// Copyright (c) 2015, Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This file contains annotation definitions that can be used to describe
+// a configuration tree.
+
+syntax = "proto3";
+
+package voltha;
+
+import "google/protobuf/descriptor.proto";
+
+enum MessageParserOption {
+    // Move any enclosing child enum/message definition to the same level
+    // as the parent (this message) in the yang generated file
+    MOVE_TO_PARENT_LEVEL= 0;
+
+    // Create both a grouping and a container for this message.  The container
+    // name will be the message name.  The grouping name will be the message
+    // name prefixed with "grouping_"
+    CREATE_BOTH_GROUPING_AND_CONTAINER = 1;
+}
+
+message InlineNode {
+    string id = 1;
+    string type = 2;
+}
+
+extend google.protobuf.MessageOptions {
+    // This annotation is used to indicate how a message is parsed when
+    // converting from proto to yang format.
+    MessageParserOption yang_child_rule = 7761774;
+
+    MessageParserOption yang_message_rule = 7761775;
+}
+
+extend google.protobuf.FieldOptions {
+    // If present, the field (a message reference) should be replaced by the
+    // message itself.  For now, this applies only to non-repeated fields.
+    InlineNode yang_inline_node = 7761776;
+}