1 module openflow-protocol {
\r
2 namespace "urn:opendaylight:openflow:protocol";
\r
5 import ietf-inet-types {prefix inet;}
\r
6 import ietf-yang-types {prefix yang;}
\r
8 import openflow-types {prefix oft;}
\r
9 import openflow-extensible-match { prefix oxm;}
\r
10 import openflow-instruction { prefix ofinstruction;}
\r
11 import openflow-action {prefix ofaction;}
\r
13 revision "2013-07-31" {
\r
14 description "OpenFlow 1.3 - protocol objects model";
\r
17 // Generic Structures
\r
19 // reference "ofp_port";
\r
21 // reference "ofp_port.port_no";
\r
25 // reference "ofp_port.hw_addr";
\r
26 type yang:mac-address;
\r
29 // reference "ofp_port.name";
\r
33 // reference "ofp_port.config";
\r
34 type oft:port-config;
\r
37 // reference "ofp_port.state";
\r
38 type oft:port-state;
\r
40 leaf current-features {
\r
41 description "Current features.";
\r
42 // reference "ofp_port.curr";
\r
43 type oft:port-features;
\r
45 leaf advertised-features {
\r
46 description "Features being advertised by the port.";
\r
47 // reference "ofp_port.advertised";
\r
48 type oft:port-features;
\r
50 leaf supported-features {
\r
51 description "Features supported by the port.";
\r
52 // reference "ofp_port.supported";
\r
53 type oft:port-features;
\r
55 leaf peer-features {
\r
56 description "Features advertised by peer.";
\r
57 // reference "ofp_port.peer";
\r
58 type oft:port-features;
\r
61 description "Current port bitrate in kbps.";
\r
62 // reference "ofp_port.curr_speed";
\r
67 description "Max port bitrate in kbps";
\r
68 // reference "ofp_port.max_speed";
\r
75 // reference "ofp_port.config";
\r
76 type oft:port-config-v10;
\r
79 // reference "ofp_port.state";
\r
80 type oft:port-state-v10;
\r
82 leaf current-features-v10 {
\r
83 description "Current features.";
\r
84 // reference "ofp_port.curr";
\r
85 type oft:port-features-v10;
\r
87 leaf advertised-features-v10 {
\r
88 description "Features being advertised by the port.";
\r
89 // reference "ofp_port.advertised";
\r
90 type oft:port-features-v10;
\r
92 leaf supported-features-v10 {
\r
93 description "Features supported by the port.";
\r
94 // reference "ofp_port.supported";
\r
95 type oft:port-features-v10;
\r
97 leaf peer-features-v10 {
\r
98 description "Features advertised by peer.";
\r
99 // reference "ofp_port.peer";
\r
100 type oft:port-features-v10;
\r
104 grouping match-grouping {
\r
108 base oft:match-type-base;
\r
111 uses oxm:oxm-fields;
\r
116 list buckets-list {
\r
126 type oft:port-number;
\r
132 uses ofaction:actions;
\r
135 container table-features-properties-container {
\r
136 uses table-features-properties;
\r
139 grouping table-features-properties {
\r
140 list table-feature-properties {
\r
142 type oft:table-features-prop-type;
\r
147 // # MESSAGE Structures
\r
148 /* Immutable messages. */
\r
149 grouping ofHeader {
\r
150 //reference "ofpt_header struct in Openflow Switch 1.3 Spec"
\r
153 //reference "OpenFlow Header - OFP_VERSION";
\r
157 //reference "OpenFlow Header - transaction id";
\r
160 grouping ofHelloElementHeader {
\r
161 //reference "ofpt_hello_elem_header struct in Openflow Switch 1.3 Spec"
\r
163 type oft:hello-element-type;
\r
164 //reference "OpenFlow Header element type - OFPHET_*";
\r
168 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
169 /* Symmetric message */
\r
173 uses ofHelloElementHeader;
\r
175 leaf-list version-bitmap {
\r
181 // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"
\r
182 /* Symmetric message */
\r
186 type oft:error-type;
\r
194 // OF1.0 structures
\r
196 type oft:error-type-v10;
\r
199 grouping echo-request {
\r
200 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
201 /* Symmetric message */
\r
208 grouping echo-reply {
\r
209 // reference "OFPT_ECHO_REPLY message in Openflow Switch 1.3 Spec"
\r
210 /* Symmetric message */
\r
217 grouping experimenter {
\r
218 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
219 /* Symmetric message */
\r
222 leaf experimenter {
\r
232 /* Switch configuration messages. */
\r
233 grouping features-request {
\r
234 // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
\r
235 /* Controller/switch message */
\r
238 grouping features-reply {
\r
239 // reference "OFPT_FEATURES_REPLY message in Openflow Switch 1.3 Spec"
\r
240 /* Controller/switch message */
\r
255 leaf capabilities {
\r
256 type oft:capabilities;
\r
261 // OF1.0 structures
\r
262 leaf capabilities-v10 {
\r
263 type oft:capabilities-v10;
\r
266 type oft:action-type-v10;
\r
270 grouping get-config-request {
\r
271 // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
272 /* Controller/switch message */
\r
275 grouping get-config-reply {
\r
276 // reference "OFPT_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
277 /* Controller/switch message */
\r
281 type oft:switch-config-flag;
\r
283 leaf miss-send-len {
\r
287 grouping set-config {
\r
288 // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
\r
289 /* Controller/switch message */
\r
294 type oft:switch-config-flag;
\r
296 leaf miss-send-len {
\r
300 /* Asynchronous messages. */
\r
301 grouping packet-in {
\r
302 // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"
\r
303 /* Async message */
\r
308 // ID assigned by datapath.
\r
312 // Full length of frame.
\r
316 // Reason packet is being sent (one of OFPR_*)
\r
320 // ID of the table that was looked up
\r
324 // Cookie of the flow entry that was looked up.
\r
327 uses match-grouping;
\r
329 // struct ofp_match match; /* Packet metadata. Variable size. */
\r
330 // /* The variable size and padded match is always followed by:
\r
331 // * - Exactly 2 all-zero padding bytes, then
\r
332 // * - An Ethernet frame whose length is inferred from header.length.
\r
333 // * The padding bytes preceding the Ethernet frame ensure that the IP
\r
334 // * header (if any) following the Ethernet header is 32-bit aligned.
\r
340 // OF1.0 structures
\r
345 grouping flow-removed {
\r
346 // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"
\r
347 /* Async message */
\r
357 type oft:flow-removed-reason;
\r
362 leaf duration-sec {
\r
365 leaf duration-nsec {
\r
368 leaf idle-timeout {
\r
371 leaf hard-timeout {
\r
374 leaf packet-count {
\r
380 uses match-grouping;
\r
382 // OF1.0 structures
\r
383 uses oxm:match-v10-grouping;
\r
385 grouping port-status {
\r
386 // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"
\r
393 type oft:port-reason;
\r
395 } /* Async message */
\r
396 /* Controller command messages. */
\r
397 grouping packet-out {
\r
398 // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"
\r
399 /* Controller/switch message */
\r
403 uses ofaction:actions;
\r
412 type oft:port-number;
\r
415 grouping flow-mod {
\r
416 // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"
\r
417 /* Controller/switch message */
\r
431 type oft:flow-mod-command;
\r
433 leaf idle-timeout {
\r
436 leaf hard-timeout {
\r
446 type oft:port-number;
\r
452 type oft:flow-mod-flags;
\r
454 uses match-grouping;
\r
456 uses ofinstruction:instructions;
\r
458 // OF1.0 structures
\r
460 type oft:flow-mod-flags-v10;
\r
462 uses oxm:match-v10-grouping;
\r
463 uses ofaction:actions;
\r
465 grouping group-mod {
\r
466 // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"
\r
467 /* Controller/switch message */
\r
472 type oft:group-mod-command;
\r
475 type oft:group-type;
\r
484 grouping port-mod {
\r
485 // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"
\r
486 /* Controller/switch message */
\r
491 type oft:port-number;
\r
494 type yang:mac-address;
\r
497 type oft:port-config;
\r
500 type oft:port-config;
\r
503 type oft:port-features;
\r
505 // OF1.0 structures
\r
507 type oft:port-config-v10;
\r
510 type oft:port-config-v10;
\r
512 leaf advertise-v10 {
\r
513 type oft:port-features-v10;
\r
516 grouping table-mod {
\r
517 // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"
\r
518 /* Controller/switch message */
\r
526 type oft:port-config;
\r
530 /* Multipart messages. */
\r
531 grouping multipart-request {
\r
532 // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
\r
533 /* Controller/switch message */
\r
538 type oft:multipart-type;
\r
541 type oft:multipart-request-flags;
\r
543 choice multipart-request-body {
\r
544 case multipart-request-flow {
\r
560 uses match-grouping;
\r
562 // OF1.0 structures
\r
563 uses oxm:match-v10-grouping;
\r
565 case multipart-request-aggregate {
\r
581 uses match-grouping;
\r
583 // OF1.0 structures
\r
584 uses oxm:match-v10-grouping;
\r
586 case multipart-request-port-stats {
\r
591 case multipart-request-queue {
\r
599 case multipart-request-group {
\r
604 case multipart-request-meter {
\r
609 case multipart-request-meter-config {
\r
614 case multipart-request-table-features {
\r
615 list table-features {
\r
622 leaf metadata-match {
\r
625 leaf metadata-write {
\r
629 type oft:table-config;
\r
634 uses table-features-properties;
\r
637 case multipart-request-experimenter {
\r
638 leaf experimenter {
\r
650 grouping multipart-reply {
\r
651 // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"
\r
652 /* Controller/switch message */
\r
657 type oft:multipart-type;
\r
660 type oft:multipart-request-flags;
\r
662 choice multipart-reply-body {
\r
663 case multipart-reply-desc {
\r
680 case multipart-reply-flow {
\r
685 leaf duration-sec {
\r
688 leaf duration-nsec {
\r
694 leaf idle-timeout {
\r
697 leaf hard-timeout {
\r
701 type oft:flow-mod-flags;
\r
706 leaf packet-count {
\r
712 uses match-grouping;
\r
714 uses ofinstruction:instructions;
\r
716 // OF1.0 structures
\r
717 uses oxm:match-v10-grouping;
\r
718 uses ofaction:actions;
\r
721 case multipart-reply-aggregate {
\r
722 leaf packet-count {
\r
732 case multipart-reply-table {
\r
737 leaf active-count {
\r
740 leaf lookup-count {
\r
743 leaf matched-count {
\r
747 // OF1.0 structures
\r
753 case multipart-reply-port-stats {
\r
782 leaf rx-frame-err {
\r
794 leaf duration-sec {
\r
797 leaf duration-nsec {
\r
802 case multipart-reply-queue {
\r
819 leaf duration-sec {
\r
822 leaf duration-nsec {
\r
827 case multipart-reply-group {
\r
835 leaf packet-count {
\r
841 leaf duration-sec {
\r
844 leaf duration-nsec {
\r
847 list bucket-stats {
\r
848 leaf packet-count {
\r
857 case multipart-reply-group-desc {
\r
860 type oft:group-type;
\r
868 case multipart-reply-group-features {
\r
870 type oft:group-types;
\r
872 leaf capabilities {
\r
873 type oft:group-capabilities;
\r
875 leaf-list max_groups {
\r
878 leaf-list actions-bitmap {
\r
879 type oft:action-type;
\r
882 case multipart-reply-meter {
\r
890 leaf packet-in-count {
\r
893 leaf byte-in-count {
\r
896 leaf duration-sec {
\r
899 leaf duration-nsec {
\r
902 list meter-band-stats {
\r
903 leaf packet-band-count {
\r
906 leaf byte-band-count {
\r
912 case multipart-reply-meter-config {
\r
913 list meter-config {
\r
915 type oft:meter-mod-command;
\r
921 uses meter-band-header;
\r
925 case multipart-reply-meter-features {
\r
930 type oft:meter-band-type;
\r
932 leaf capabilities {
\r
933 type oft:meter-flags;
\r
942 case multipart-reply-table-features {
\r
943 list table-features {
\r
950 leaf metadata-match {
\r
953 leaf metadata-write {
\r
957 type oft:port-config;
\r
962 uses table-features-properties;
\r
965 case multipart-reply-port-desc {
\r
970 case multipart-reply-experimenter {
\r
971 leaf experimenter {
\r
983 /* Barrier messages. */
\r
984 grouping barrier-request {
\r
985 // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"
\r
986 /* Controller/switch message */
\r
989 grouping barrier-reply {
\r
990 // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"
\r
991 /* Controller/switch message */
\r
994 /* Queue Configuration messages. */
\r
995 grouping queue-get-config-request {
\r
996 // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
997 /* Controller/switch message */
\r
1002 type oft:port-number;
\r
1005 grouping queue-get-config-reply {
\r
1006 // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
1007 /* Controller/switch message */
\r
1012 type oft:port-number;
\r
1015 uses packet-queue;
\r
1018 grouping packet-queue {
\r
1020 type oft:queue-id;
\r
1023 type oft:port-number;
\r
1025 uses queue-property-header;
\r
1027 container queue-prop-container {
\r
1028 uses queue-property-header;
\r
1030 grouping queue-property-header {
\r
1031 list queue-property {
\r
1033 type oft:queue-properties;
\r
1037 /* Controller role change request messages. */
\r
1038 grouping role-request {
\r
1039 // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"
\r
1040 /* Controller/switch message */
\r
1045 type oft:controller-role;
\r
1047 leaf generation-id {
\r
1051 grouping role-reply {
\r
1052 // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"
\r
1053 /* Controller/switch message */
\r
1058 type oft:controller-role;
\r
1060 leaf generation-id {
\r
1064 /* Asynchronous message configuration. */
\r
1065 grouping get-async-request {
\r
1066 // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
\r
1067 /* Controller/switch message */
\r
1071 grouping get-async-reply {
\r
1072 // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
\r
1073 /* Controller/switch message */
\r
1077 list packet-in-mask {
\r
1079 type oft:packet-in-reason;
\r
1082 list port-status-mask {
\r
1084 type oft:port-reason;
\r
1087 list flow-removed-mask {
\r
1089 type oft:flow-removed-reason;
\r
1093 grouping set-async {
\r
1094 // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
\r
1095 /* Controller/switch message */
\r
1099 leaf-list packet-in-mask {
\r
1100 type oft:packet-in-reason;
\r
1102 leaf-list port-status-mask {
\r
1103 type oft:port-reason;
\r
1105 leaf-list flow-removed-mask {
\r
1106 type oft:flow-removed-reason;
\r
1109 /* Meters and rate limiters configuration messages. */
\r
1110 grouping meter-mod {
\r
1111 // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"
\r
1112 /* Controller/switch message */
\r
1117 type oft:meter-mod-command;
\r
1120 type oft:meter-flags;
\r
1123 type oft:meter-id;
\r
1126 uses meter-band-header;
\r
1130 grouping meter-band-header {
\r
1131 choice meter-band {
\r
1132 case meter-band-drop {
\r
1133 uses meter-band-commons;
\r
1135 case meter-band-dscp-remark {
\r
1136 uses meter-band-commons;
\r
1141 case meter-band-experimenter {
\r
1142 uses meter-band-commons;
\r
1143 leaf experimenter {
\r
1150 grouping meter-band-commons {
\r
1152 type oft:meter-band-type;
\r
1162 /* Immutable messages. */
\r
1163 notification hello-message {
\r
1165 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
1167 /* Symmetric message */
\r
1169 notification error-message {
\r
1171 // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"
\r
1173 /* Symmetric message */
\r
1175 notification echo-request-message {
\r
1176 uses echo-request;
\r
1177 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1179 /* Symmetric message */
\r
1181 notification experimenter-message {
\r
1182 uses experimenter;
\r
1183 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
1184 // TODO:: does switch send this when understood experimenter msg from lib?
\r
1185 /* Symmetric message */
\r
1187 // # Notification and RPCs
\r
1188 /* Symmetric RPC. */
\r
1190 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1192 uses echo-request;
\r
1194 /* Controller/switch message */
\r
1201 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1208 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
1214 rpc experimenter {
\r
1215 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
1217 uses experimenter;
\r
1221 /* Switch configuration messages. */
\r
1222 rpc get-features {
\r
1223 // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
\r
1225 uses features-request;
\r
1227 /* Controller/switch message */
\r
1229 uses features-reply;
\r
1234 // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
1236 uses get-config-request;
\r
1239 uses get-config-reply;
\r
1241 /* Controller/switch message */
\r
1245 // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
\r
1249 /* Controller/switch message */
\r
1251 /* Asynchronous messages. */
\r
1252 notification packet-in-message {
\r
1254 // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"
\r
1256 /* Async message */
\r
1258 notification flow-removed-message {
\r
1259 uses flow-removed;
\r
1260 // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"
\r
1262 /* Async message */
\r
1264 notification port-status-message {
\r
1266 // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"
\r
1268 } /* Async message */
\r
1270 /* Controller command messages. */
\r
1274 // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"
\r
1276 /* Controller/switch message */
\r
1281 // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"
\r
1283 /* Controller/switch message */
\r
1288 // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"
\r
1290 /* Controller/switch message */
\r
1295 // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"
\r
1297 } /* Controller/switch message */
\r
1302 // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"
\r
1304 } /* Controller/switch message */
\r
1306 /* Multipart messages. */
\r
1307 //FIXME: Arent this wire protocol specific?
\r
1309 notification multipart-request-message {
\r
1310 uses multipart-request;
\r
1311 // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
\r
1313 } /* Controller/switch message */
\r
1314 notification multipart-reply-message {
\r
1315 uses multipart-reply;
\r
1316 // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"
\r
1318 } /* Controller/switch message */
\r
1321 /* Barrier messages. */
\r
1324 uses barrier-request;
\r
1325 // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"
\r
1328 uses barrier-reply;
\r
1329 // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"
\r
1332 /* Queue Configuration messages. */
\r
1333 rpc get-queue-config {
\r
1335 uses queue-get-config-request;
\r
1336 // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
1339 uses queue-get-config-reply;
\r
1340 // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
1344 /* Controller role change request messages. */
\r
1345 rpc role-request {
\r
1347 uses role-request;
\r
1348 // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"
\r
1352 // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"
\r
1354 } /* Controller/switch message */
\r
1356 /* Asynchronous message configuration. */
\r
1359 uses get-async-request;
\r
1360 // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
\r
1363 uses get-async-reply;
\r
1364 // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
\r
1367 /* Controller/switch message */
\r
1371 // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
\r
1375 /* Meters and rate limiters configuration messages. */
\r
1379 // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"
\r
1381 } /* Controller/switch message */
\r