X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflow-protocol-api%2Fsrc%2Fmain%2Fyang%2Fopenflow-protocol.yang;h=32070d14cf900c973825c3fe47985df02d7e7e3a;hb=05bc9fb5cb06c747be728f8d695d2723db911514;hp=7a71c1ce89843cb9dc63f8d21fd6effbc190e670;hpb=8d785e650476b80189b86f6ad44c5a24d5ccbf6d;p=openflowjava.git diff --git a/openflow-protocol-api/src/main/yang/openflow-protocol.yang b/openflow-protocol-api/src/main/yang/openflow-protocol.yang index 7a71c1ce..32070d14 100644 --- a/openflow-protocol-api/src/main/yang/openflow-protocol.yang +++ b/openflow-protocol-api/src/main/yang/openflow-protocol.yang @@ -1,4 +1,12 @@ -module openflow-protocol { +/* + * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + + module openflow-protocol { namespace "urn:opendaylight:openflow:protocol"; prefix "ofproto"; @@ -14,130 +22,113 @@ module openflow-protocol { } // Generic Structures - grouping port { - // reference "ofp_port"; - leaf port-no { - // reference "ofp_port.port_no"; + grouping port-grouping { + reference "ofp_port"; + leaf port-no { type uint32; } - leaf hw-addr { - // reference "ofp_port.hw_addr"; + leaf hw-addr { type yang:mac-address; } - leaf name { - // reference "ofp_port.name"; + leaf name { type string; } - leaf config { - // reference "ofp_port.config"; + leaf config { + description "Bitmap of OFPPC_* flags."; type oft:port-config; } - leaf state { - // reference "ofp_port.state"; + leaf state { + description "Bitmap of OFPPS_* flags."; type oft:port-state; } - leaf current-features { + leaf current-features { description "Current features."; - // reference "ofp_port.curr"; - type oft:port-features; + type oft:port-features; } - leaf advertised-features { + leaf advertised-features { description "Features being advertised by the port."; - // reference "ofp_port.advertised"; - type oft:port-features; + type oft:port-features; } - leaf supported-features { + leaf supported-features { description "Features supported by the port."; - // reference "ofp_port.supported"; - type oft:port-features; + type oft:port-features; } - leaf peer-features { + leaf peer-features { description "Features advertised by peer."; - // reference "ofp_port.peer"; type oft:port-features; } - leaf curr-speed { + leaf curr-speed { description "Current port bitrate in kbps."; - // reference "ofp_port.curr_speed"; - type uint32; + type uint32; units "kbps"; } - leaf max-speed { + leaf max-speed { description "Max port bitrate in kbps"; - // reference "ofp_port.max_speed"; type uint32; - units "kbps"; + units "kbps"; } - + // OF1.0 structures - leaf config-v10 { - // reference "ofp_port.config"; + leaf config-v10 { type oft:port-config-v10; } leaf state-v10 { - // reference "ofp_port.state"; type oft:port-state-v10; } - leaf current-features-v10 { + leaf current-features-v10 { description "Current features."; - // reference "ofp_port.curr"; - type oft:port-features-v10; + type oft:port-features-v10; } - leaf advertised-features-v10 { + leaf advertised-features-v10 { description "Features being advertised by the port."; - // reference "ofp_port.advertised"; - type oft:port-features-v10; + type oft:port-features-v10; } - leaf supported-features-v10 { + leaf supported-features-v10 { description "Features supported by the port."; - // reference "ofp_port.supported"; - type oft:port-features-v10; + type oft:port-features-v10; } leaf peer-features-v10 { description "Features advertised by peer."; - // reference "ofp_port.peer"; type oft:port-features-v10; } } - - grouping match-grouping { - container match { - leaf type { - type identityref { - base oft:match-type-base; - } - } - uses oxm:oxm-fields; - } - } - grouping buckets { + grouping buckets-grouping { list buckets-list { - uses bucket; + uses bucket-grouping; } } - - grouping bucket { + + grouping bucket-grouping { + description "Bucket for use in groups."; leaf weight { + description "Relative weight of bucket. Only + defined for select groups."; type uint16; } leaf watch-port { + description "Port whose state affects whether this + bucket is live. Only required for fast + failover groups."; type oft:port-number; } leaf watch-group { + description "Group whose state affects whether this + bucket is live. Only required for fast + failover groups."; type uint32; } - - uses ofaction:actions; + + uses ofaction:actions-grouping; } container table-features-properties-container { - uses table-features-properties; + uses table-features-properties-grouping; } - grouping table-features-properties { + grouping table-features-properties-grouping { list table-feature-properties { - key "type"; + config false; leaf type { type oft:table-features-prop-type; } @@ -147,25 +138,25 @@ module openflow-protocol { // # MESSAGE Structures /* Immutable messages. */ grouping ofHeader { - //reference "ofpt_header struct in Openflow Switch 1.3 Spec" + reference "ofp_header struct in Openflow Switch 1.3 Spec"; leaf version { type uint8; - //reference "OpenFlow Header - OFP_VERSION"; + description "OpenFlow version"; } leaf xid { type uint32; - //reference "OpenFlow Header - transaction id"; + description "Transaction ID"; } } grouping ofHelloElementHeader { - //reference "ofpt_hello_elem_header struct in Openflow Switch 1.3 Spec" + reference "ofpt_hello_elem_header struct in Openflow Switch 1.3 Spec"; leaf type { type oft:hello-element-type; //reference "OpenFlow Header element type - OFPHET_*"; } } grouping hello { - // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec" + reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"; /* Symmetric message */ uses ofHeader; @@ -178,7 +169,7 @@ module openflow-protocol { } } grouping error { - // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec" + reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"; /* Symmetric message */ uses ofHeader; @@ -199,7 +190,7 @@ module openflow-protocol { } } grouping echo-request { - // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"; /* Symmetric message */ uses ofHeader; @@ -208,7 +199,7 @@ module openflow-protocol { } } grouping echo-reply { - // reference "OFPT_ECHO_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_ECHO_REPLY message in Openflow Switch 1.3 Spec"; /* Symmetric message */ uses ofHeader; @@ -217,28 +208,25 @@ module openflow-protocol { } } grouping experimenter { - // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec" + reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"; /* Symmetric message */ uses ofHeader; leaf experimenter { - type uint32; + type oft:experimenter-id; } leaf exp_type { type uint32; } - leaf data { - type binary; - } } /* Switch configuration messages. */ grouping features-request { - // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; } grouping features-reply { - // reference "OFPT_FEATURES_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_FEATURES_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -268,16 +256,16 @@ module openflow-protocol { type oft:action-type-v10; } list phy-port { - uses port; + uses port-grouping; } } grouping get-config-request { - // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; } grouping get-config-reply { - // reference "OFPT_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -289,7 +277,7 @@ module openflow-protocol { } } grouping set-config { - // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec" + reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -303,7 +291,7 @@ module openflow-protocol { } /* Asynchronous messages. */ grouping packet-in { - // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec" + reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"; /* Async message */ uses ofHeader; @@ -328,15 +316,8 @@ module openflow-protocol { // Cookie of the flow entry that was looked up. type uint64; } - uses match-grouping; - -// struct ofp_match match; /* Packet metadata. Variable size. */ -// /* The variable size and padded match is always followed by: -// * - Exactly 2 all-zero padding bytes, then -// * - An Ethernet frame whose length is inferred from header.length. -// * The padding bytes preceding the Ethernet frame ensure that the IP -// * header (if any) following the Ethernet header is 32-bit aligned. -// */ + uses oxm:match-grouping; + leaf data { type binary; } @@ -347,7 +328,7 @@ module openflow-protocol { } } grouping flow-removed { - // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec" + reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"; /* Async message */ uses ofHeader; @@ -381,30 +362,30 @@ module openflow-protocol { leaf byte-count { type uint64; } - uses match-grouping; + uses oxm:match-grouping; // OF1.0 structures uses oxm:match-v10-grouping; } grouping port-status { - // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec" + reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"; uses ofHeader; - uses port; + uses port-grouping; leaf reason { type oft:port-reason; } - } /* Async message */ + } /* Controller command messages. */ grouping packet-out { - // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec" + reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; - uses ofaction:actions; + uses ofaction:actions-grouping; leaf data { type binary; @@ -417,7 +398,7 @@ module openflow-protocol { } } grouping flow-mod { - // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec" + reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -455,19 +436,19 @@ module openflow-protocol { leaf flags { type oft:flow-mod-flags; } - uses match-grouping; + uses oxm:match-grouping; - uses ofinstruction:instructions; + uses ofinstruction:instructions-grouping; // OF1.0 structures leaf flags-v10 { type oft:flow-mod-flags-v10; } uses oxm:match-v10-grouping; - uses ofaction:actions; + uses ofaction:actions-grouping; } grouping group-mod { - // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec" + reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -482,11 +463,11 @@ module openflow-protocol { type oft:group-id; } - uses buckets; + uses buckets-grouping; } grouping port-mod { - // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec" + reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -518,7 +499,7 @@ module openflow-protocol { } } grouping table-mod { - // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec" + reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -533,17 +514,17 @@ module openflow-protocol { /* Multipart messages. */ grouping multipart-request { - // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; leaf type { type oft:multipart-type; - } + } leaf flags { type oft:multipart-request-flags; - } + } choice multipart-request-body { case multipart-request-desc-case { container multipart-request-desc { @@ -569,7 +550,7 @@ module openflow-protocol { leaf cookie-mask { type uint64; } - uses match-grouping; + uses oxm:match-grouping; // OF1.0 structures uses oxm:match-v10-grouping; @@ -592,7 +573,7 @@ module openflow-protocol { leaf cookie-mask { type uint64; } - uses match-grouping; + uses oxm:match-grouping; // OF1.0 structures uses oxm:match-v10-grouping; @@ -685,7 +666,7 @@ module openflow-protocol { leaf max-entries { type uint32; } - uses table-features-properties; + uses table-features-properties-grouping; } } } @@ -698,21 +679,13 @@ module openflow-protocol { } case multipart-request-experimenter-case { container multipart-request-experimenter { - leaf experimenter { - type uint32; - } - leaf exp-type { - type uint32; - } - leaf data { - type binary; - } + // empty body - used for experimenter augmentation } } } } grouping multipart-reply { - // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -776,13 +749,13 @@ module openflow-protocol { leaf byte-count { type uint64; } - uses match-grouping; + uses oxm:match-grouping; - uses ofinstruction:instructions; + uses ofinstruction:instructions-grouping; // OF1.0 structures uses oxm:match-v10-grouping; - uses ofaction:actions; + uses ofaction:actions-grouping; } } } @@ -819,6 +792,18 @@ module openflow-protocol { leaf name { type string; } + leaf wildcards { + type oft:flow-wildcards-v10; + } + leaf nw-src-mask { + type uint8; + } + leaf nw-dst-mask { + type uint8; + } + leaf max-entries { + type uint32; + } } } } @@ -941,7 +926,7 @@ module openflow-protocol { leaf group-id { type oft:group-id; } - uses buckets; + uses buckets-grouping; } } } @@ -1048,46 +1033,38 @@ module openflow-protocol { leaf max-entries { type uint32; } - uses table-features-properties; + uses table-features-properties-grouping; } } } case multipart-reply-port-desc-case { container multipart-reply-port-desc { list ports { - uses port; + uses port-grouping; } } } case multipart-reply-experimenter-case { container multipart-reply-experimenter { - leaf experimenter { - type uint32; - } - leaf exp-type { - type uint32; - } - leaf data { - type binary; - } + // empty body - used for experimenter augmentation } } } } /* Barrier messages. */ grouping barrier-request { - // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; } grouping barrier-reply { - // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; } /* Queue Configuration messages. */ grouping queue-get-config-request { - // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -1097,7 +1074,7 @@ module openflow-protocol { } } grouping queue-get-config-reply { - // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -1123,7 +1100,7 @@ module openflow-protocol { } grouping queue-property-header { list queue-property { - key "property"; + config false; leaf property { type oft:queue-properties; } @@ -1131,7 +1108,7 @@ module openflow-protocol { } /* Controller role change request messages. */ grouping role-request { - // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -1144,7 +1121,7 @@ module openflow-protocol { } } grouping role-reply { - // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -1158,20 +1135,20 @@ module openflow-protocol { } /* Asynchronous message configuration. */ grouping get-async-request { - // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ - uses ofHeader; + uses ofHeader; } grouping get-async-reply { - // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec" + reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; uses async-body-grouping; } grouping set-async { - // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec" + reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -1197,7 +1174,7 @@ module openflow-protocol { } /* Meters and rate limiters configuration messages. */ grouping meter-mod { - // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec" + reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"; /* Controller/switch message */ uses ofHeader; @@ -1216,6 +1193,9 @@ module openflow-protocol { } } + container meter-band-container { + uses meter-band-header; + } grouping meter-band-header { choice meter-band { case meter-band-drop-case { @@ -1234,9 +1214,6 @@ module openflow-protocol { case meter-band-experimenter-case { container meter-band-experimenter { uses meter-band-commons; - leaf experimenter { - type uint32; - } } } } @@ -1257,32 +1234,31 @@ module openflow-protocol { /* Immutable messages. */ notification hello-message { uses hello; - // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec" + reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"; /* Symmetric message */ } notification error-message { uses error; - // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec" + reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"; /* Symmetric message */ } notification echo-request-message { uses echo-request; - // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec" + reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"; /* Symmetric message */ } notification experimenter-message { uses experimenter; - // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec" + reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"; // TODO:: does switch send this when understood experimenter msg from lib? /* Symmetric message */ } // # Notification and RPCs /* Symmetric RPC. */ rpc echo { - // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec" input { uses echo-request; } @@ -1293,21 +1269,18 @@ module openflow-protocol { } rpc echo-reply { - // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec" input { uses echo-reply; } } rpc hello { - // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec" input { uses hello; } } rpc experimenter { - // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec" input { uses experimenter; } @@ -1315,7 +1288,6 @@ module openflow-protocol { /* Switch configuration messages. */ rpc get-features { - // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec" input { uses features-request; } @@ -1326,7 +1298,6 @@ module openflow-protocol { } rpc get-config { - // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec" input { uses get-config-request; } @@ -1337,7 +1308,6 @@ module openflow-protocol { } rpc set-config { - // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec" input { uses set-config; } @@ -1346,19 +1316,16 @@ module openflow-protocol { /* Asynchronous messages. */ notification packet-in-message { uses packet-in; - // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec" /* Async message */ } notification flow-removed-message { uses flow-removed; - // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec" /* Async message */ } notification port-status-message { uses port-status; - // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec" } /* Async message */ @@ -1366,35 +1333,30 @@ module openflow-protocol { rpc packet-out { input { uses packet-out; - // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec" } /* Controller/switch message */ } rpc flow-mod { input { uses flow-mod; - // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec" } /* Controller/switch message */ } rpc group-mod { input { uses group-mod; - // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec" } /* Controller/switch message */ } rpc port-mod { input { uses port-mod; - // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec" } } /* Controller/switch message */ rpc table-mod { input { uses table-mod; - // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec" } } /* Controller/switch message */ @@ -1409,7 +1371,6 @@ module openflow-protocol { /* Controller/switch message */ notification multipart-reply-message { uses multipart-reply; - // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec" // notification because of multiple following responses } /* Controller/switch message */ @@ -1418,22 +1379,18 @@ module openflow-protocol { rpc barrier { input { uses barrier-request; - // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec" } output { uses barrier-reply; - // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec" } } /* Queue Configuration messages. */ rpc get-queue-config { input { uses queue-get-config-request; - // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec" } output { uses queue-get-config-reply; - // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec" } } @@ -1441,11 +1398,9 @@ module openflow-protocol { rpc role-request { input { uses role-request; - // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec" } output { uses role-reply; - // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec" } } /* Controller/switch message */ @@ -1453,18 +1408,15 @@ module openflow-protocol { rpc get-async { input { uses get-async-request; - // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec" } output { uses get-async-reply; - // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec" } } /* Controller/switch message */ rpc set-async { input { uses set-async; - // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec" } } @@ -1472,7 +1424,6 @@ module openflow-protocol { rpc meter-mod { input { uses meter-mod; - // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec" } } /* Controller/switch message */ } \ No newline at end of file