1 module openflow-protocol {
\r
2 namespace "urn:opendaylight:openflow:protocol";
\r
6 import ietf-inet-types {prefix inet;}
\r
7 import ietf-yang-types {prefix yang;}
\r
9 import openflow-types {prefix oft;}
\r
10 import openflow-extensible-match { prefix oxm;}
\r
11 import openflow-instruction { prefix ofinstruction;}
\r
12 import openflow-action {prefix ofaction;}
\r
16 revision "2013-07-31" {
\r
17 description "Initial model";
\r
20 // Generic Structures
\r
23 // reference "ofp_port";
\r
25 // reference "ofp_port.port_no";
\r
29 // reference "ofp_port.hw_addr";
\r
30 type yang:mac-address;
\r
33 // reference "ofp_port.name";
\r
37 // reference "ofp_port.config";
\r
38 type oft:port-config;
\r
41 // reference "ofp_port.state";
\r
42 type oft:port-state;
\r
44 leaf current-features {
\r
45 description "Current features.";
\r
46 // reference "ofp_port.curr";
\r
47 type oft:port-features;
\r
49 leaf advertised-features {
\r
50 description "Features being advertised by the port.";
\r
51 // reference "ofp_port.advertised";
\r
52 type oft:port-features;
\r
54 leaf supported-features {
\r
55 description "Features supported by the port.";
\r
56 // reference "ofp_port.supported";
\r
57 type oft:port-features;
\r
59 leaf peer-features {
\r
60 description "Features advertised by peer.";
\r
61 // reference "ofp_port.peer";
\r
62 type oft:port-features;
\r
65 description "Current port bitrate in kbps.";
\r
66 // reference "ofp_port.curr_speed";
\r
71 description "Max port bitrate in kbps";
\r
72 // reference "ofp_port.max_speed";
\r
81 base oft:match-type-base;
\r
84 uses oxm:oxm-fields;
\r
87 container table-features-properties-container {
\r
88 uses table-features-properties;
\r
91 grouping table-features-properties {
\r
92 list table-feature-properties {
\r
94 type oft:table-features-prop-type;
\r
99 // TODO: ofp_packet_queue
\r
101 // # MESSAGE Structures
\r
102 /* Immutable messages. */
\r
103 grouping ofHeader {
\r
104 //reference "ofpt_header struct in Openflow Switch 1.3 Spec"
\r
107 //reference "OpenFlow Header - OFP_VERSION";
\r
111 //reference "OpenFlow Header - transaction id";
\r
114 grouping ofHelloElementHeader {
\r
115 //reference "ofpt_hello_elem_header struct in Openflow Switch 1.3 Spec"
\r
117 type oft:hello-element-type;
\r
118 //reference "OpenFlow Header element type - OFPHET_*";
\r
122 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
123 /* Symmetric message */
\r
127 uses ofHelloElementHeader;
\r
129 leaf-list version-bitmap {
\r
139 // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"
\r
140 /* Symmetric message */
\r
144 type oft:error-type;
\r
153 grouping echo-request {
\r
154 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
155 /* Symmetric message */
\r
162 grouping echo-reply {
\r
163 // reference "OFPT_ECHO_REPLY message in Openflow Switch 1.3 Spec"
\r
164 /* Symmetric message */
\r
171 grouping experimenter {
\r
172 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
173 /* Symmetric message */
\r
176 leaf experimenter {
\r
186 /* Switch configuration messages. */
\r
187 grouping features-request {
\r
188 // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
\r
189 /* Controller/switch message */
\r
192 grouping features-reply {
\r
193 // reference "OFPT_FEATURES_REPLY message in Openflow Switch 1.3 Spec"
\r
194 /* Controller/switch message */
\r
209 leaf capabilities {
\r
216 grouping get-config-request {
\r
217 // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
218 /* Controller/switch message */
\r
221 grouping get-config-reply {
\r
222 // reference "OFPT_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
223 /* Controller/switch message */
\r
227 type oft:switch-config-flag;
\r
229 leaf miss-send-len {
\r
233 grouping set-config {
\r
234 // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
\r
235 /* Controller/switch message */
\r
240 type oft:switch-config-flag;
\r
242 leaf miss-send-len {
\r
246 /* Asynchronous messages. */
\r
247 grouping packet-in {
\r
248 // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"
\r
249 /* Async message */
\r
254 // ID assigned by datapath.
\r
258 // Full length of frame.
\r
262 // Reason packet is being sent (one of OFPR_*)
\r
266 // ID of the table that was looked up
\r
270 // Cookie of the flow entry that was looked up.
\r
277 // struct ofp_match match; /* Packet metadata. Variable size. */
\r
278 // /* The variable size and padded match is always followed by:
\r
279 // * - Exactly 2 all-zero padding bytes, then
\r
280 // * - An Ethernet frame whose length is inferred from header.length.
\r
281 // * The padding bytes preceding the Ethernet frame ensure that the IP
\r
282 // * header (if any) following the Ethernet header is 32-bit aligned.
\r
289 grouping flow-removed {
\r
290 // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"
\r
291 /* Async message */
\r
301 type oft:flow-removed-reason;
\r
306 leaf duration-sec {
\r
309 leaf duration-nsec {
\r
312 leaf idle-timeout {
\r
315 leaf hard-timeout {
\r
318 leaf packet-count {
\r
328 grouping port-status {
\r
329 // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"
\r
336 type oft:port-reason;
\r
338 } /* Async message */
\r
339 /* Controller command messages. */
\r
340 grouping packet-out {
\r
341 // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"
\r
342 /* Controller/switch message */
\r
346 list actions-list {
\r
347 uses ofaction:action-header;
\r
358 type oft:port-number;
\r
361 grouping flow-mod {
\r
362 // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"
\r
363 /* Controller/switch message */
\r
377 type oft:flow-mod-command;
\r
379 leaf idle-timeout {
\r
382 leaf hard-timeout {
\r
392 type oft:port-number;
\r
398 type oft:flow-mod-flags;
\r
404 grouping group-mod {
\r
405 // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"
\r
406 /* Controller/switch message */
\r
411 type oft:group-mod-command;
\r
414 type oft:group-type;
\r
429 type oft:port-number;
\r
435 list actions-list {
\r
436 uses ofaction:action-header;
\r
439 grouping port-mod {
\r
440 // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"
\r
441 /* Controller/switch message */
\r
446 type oft:port-number;
\r
449 type yang:mac-address;
\r
452 type oft:port-config;
\r
455 type oft:port-config;
\r
458 type oft:port-features;
\r
461 grouping table-mod {
\r
462 // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"
\r
463 /* Controller/switch message */
\r
471 type oft:port-config;
\r
475 /* Multipart messages. */
\r
476 grouping multipart-request {
\r
477 // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
\r
478 /* Controller/switch message */
\r
483 type oft:multipart-type;
\r
486 type oft:multipart-request-flags;
\r
488 choice multipart-request-body {
\r
489 case multipart-request-flow {
\r
509 case multipart-request-aggregate {
\r
529 case multipart-request-port-stats {
\r
534 case multipart-request-queue {
\r
542 case multipart-request-group {
\r
547 case multipart-request-meter {
\r
552 case multipart-request-meter-config {
\r
557 case multipart-request-table-features {
\r
558 list table-features {
\r
565 leaf metadata-match {
\r
568 leaf metadata-write {
\r
572 type oft:table-config;
\r
577 uses table-features-properties;
\r
580 case multipart-request-experimenter {
\r
581 leaf experimenter {
\r
590 grouping multipart-reply {
\r
591 // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"
\r
592 /* Controller/switch message */
\r
597 type oft:multipart-type;
\r
600 type oft:multipart-request-flags;
\r
602 choice multipart-reply-body {
\r
603 case multipart-reply-desc {
\r
620 case multipart-reply-flow {
\r
625 leaf duration-sec {
\r
628 leaf duration-nsec {
\r
634 leaf idle-timeout {
\r
637 leaf hard-timeout {
\r
641 type oft:flow-mod-flags;
\r
646 leaf packet-count {
\r
657 case multipart-reply-aggregate {
\r
658 leaf packet-count {
\r
668 case multipart-reply-table {
\r
673 leaf active-count {
\r
676 leaf lookup-count {
\r
679 leaf matched-count {
\r
684 case multipart-reply-port-stats {
\r
713 leaf rx-frame-err {
\r
725 leaf duration-sec {
\r
728 leaf duration-nsec {
\r
733 case multipart-reply-queue {
\r
750 leaf duration-sec {
\r
753 leaf duration-nsec {
\r
758 case multipart-reply-group {
\r
766 leaf packet-count {
\r
772 leaf duration-sec {
\r
775 leaf duration-nsec {
\r
778 list bucket-stats {
\r
779 leaf packet-count {
\r
788 case multipart-reply-group-desc {
\r
792 type oft:group-type;
\r
802 case multipart-reply-group-features {
\r
804 type oft:group-types;
\r
806 leaf capabilities {
\r
807 type oft:group-capabilities;
\r
809 leaf-list max_groups {
\r
812 //leaf-list actions {
\r
813 // type ofaction:action-type;
\r
815 list actions-list {
\r
816 uses ofaction:action-header;
\r
819 case multipart-reply-meter {
\r
827 leaf packet-in-count {
\r
830 leaf byte-in-count {
\r
833 leaf duration-sec {
\r
836 leaf duration-nsec {
\r
839 list meter-band-stats {
\r
840 leaf packet-band-count {
\r
843 leaf byte-band-count {
\r
849 case multipart-reply-meter-config {
\r
850 list meter-config {
\r
852 type oft:meter-mod-command;
\r
858 uses meter-band-header;
\r
862 case multipart-reply-meter-features {
\r
867 type oft:meter-band-type;
\r
869 leaf capabilities {
\r
870 type oft:meter-flags;
\r
879 case multipart-reply-table-features {
\r
880 list table-features {
\r
887 leaf metadata-match {
\r
890 leaf metadata-write {
\r
894 type oft:port-config;
\r
901 case multipart-reply-port-desc {
\r
906 case multipart-reply-experimenter {
\r
907 leaf experimenter {
\r
916 /* Barrier messages. */
\r
917 grouping barrier-request {
\r
918 // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"
\r
919 /* Controller/switch message */
\r
922 grouping barrier-reply {
\r
923 // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"
\r
924 /* Controller/switch message */
\r
927 /* Queue Configuration messages. */
\r
928 grouping queue-get-config-request {
\r
929 // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
930 /* Controller/switch message */
\r
935 type oft:port-number;
\r
938 grouping queue-get-config-reply {
\r
939 // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
940 /* Controller/switch message */
\r
945 type oft:port-number;
\r
951 grouping packet-queue {
\r
956 type oft:port-number;
\r
959 uses queue-property-header;
\r
962 grouping queue-property-header {
\r
964 type oft:queue-property;
\r
967 /* Controller role change request messages. */
\r
968 grouping role-request {
\r
969 // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"
\r
970 /* Controller/switch message */
\r
975 type oft:controller-role;
\r
977 leaf generation-id {
\r
981 grouping role-reply {
\r
982 // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"
\r
983 /* Controller/switch message */
\r
988 type oft:controller-role;
\r
990 leaf generation-id {
\r
994 /* Asynchronous message configuration. */
\r
995 grouping get-async-request {
\r
996 // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
\r
997 /* Controller/switch message */
\r
1001 grouping get-async-reply {
\r
1002 // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
\r
1003 /* Controller/switch message */
\r
1007 list packet-in-mask {
\r
1009 type oft:packet-in-reason;
\r
1012 list port-status-mask {
\r
1014 type oft:port-reason;
\r
1017 list flow-removed-mask {
\r
1019 type oft:flow-removed-reason;
\r
1023 grouping set-async {
\r
1024 // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
\r
1025 /* Controller/switch message */
\r
1029 leaf-list packet-in-mask {
\r
1030 type oft:packet-in-reason;
\r
1032 leaf-list port-status-mask {
\r
1033 type oft:port-reason;
\r
1035 leaf-list flow-removed-mask {
\r
1036 type oft:flow-removed-reason;
\r
1039 /* Meters and rate limiters configuration messages. */
\r
1040 grouping meter-mod {
\r
1041 // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"
\r
1042 /* Controller/switch message */
\r
1047 type oft:meter-mod-command;
\r
1050 type oft:meter-flags;
\r
1053 type oft:meter-id;
\r
1056 uses meter-band-header;
\r
1060 grouping meter-band-header {
\r
1061 choice meter-band {
\r
1062 case meter-band-drop {
\r
1063 uses meter-band-commons;
\r
1065 case meter-band-dscp-remark {
\r
1066 uses meter-band-commons;
\r
1071 case meter-band-experimenter {
\r
1072 uses meter-band-commons;
\r
1073 leaf experimenter {
\r
1080 grouping meter-band-commons {
\r
1082 type oft:meter-band-type;
\r
1093 /* Immutable messages. */
\r
1094 notification hello-message {
\r
1096 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
1098 /* Symmetric message */
\r
1100 notification error-message {
\r
1102 // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"
\r
1104 /* Symmetric message */
\r
1106 notification echo-request-message {
\r
1107 uses echo-request;
\r
1108 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1110 /* Symmetric message */
\r
1112 notification experimenter-message {
\r
1113 uses experimenter;
\r
1114 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
1115 // TODO:: does switch send this when understood experimenter msg from lib?
\r
1116 /* Symmetric message */
\r
1118 // # Notification and RPCs
\r
1119 /* Symmetric RPC. */
\r
1121 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1123 uses echo-request;
\r
1125 /* Controller/switch message */
\r
1132 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1139 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
1145 rpc experimenter {
\r
1146 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
1148 uses experimenter;
\r
1152 /* Switch configuration messages. */
\r
1153 rpc get-features {
\r
1154 // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
\r
1156 uses features-request;
\r
1158 /* Controller/switch message */
\r
1160 uses features-reply;
\r
1165 // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
1167 uses get-config-request;
\r
1170 uses get-config-reply;
\r
1172 /* Controller/switch message */
\r
1176 // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
\r
1180 /* Controller/switch message */
\r
1182 /* Asynchronous messages. */
\r
1183 notification packet-in-message {
\r
1185 // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"
\r
1187 /* Async message */
\r
1189 notification flow-removed-message {
\r
1190 uses flow-removed;
\r
1191 // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"
\r
1193 /* Async message */
\r
1195 notification port-status-message {
\r
1197 // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"
\r
1199 } /* Async message */
\r
1201 /* Controller command messages. */
\r
1205 // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"
\r
1207 /* Controller/switch message */
\r
1212 // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"
\r
1214 /* Controller/switch message */
\r
1219 // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"
\r
1221 /* Controller/switch message */
\r
1226 // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"
\r
1228 } /* Controller/switch message */
\r
1233 // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"
\r
1235 } /* Controller/switch message */
\r
1237 /* Multipart messages. */
\r
1238 //FIXME: Arent this wire protocol specific?
\r
1240 notification multipart-request-message {
\r
1241 uses multipart-request;
\r
1242 // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
\r
1244 } /* Controller/switch message */
\r
1245 notification multipart-reply-message {
\r
1246 uses multipart-reply;
\r
1247 // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"
\r
1249 } /* Controller/switch message */
\r
1252 /* Barrier messages. */
\r
1255 uses barrier-request;
\r
1256 // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"
\r
1259 uses barrier-reply;
\r
1260 // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"
\r
1263 /* Queue Configuration messages. */
\r
1264 rpc get-queue-config {
\r
1266 uses queue-get-config-request;
\r
1267 // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
1270 uses queue-get-config-reply;
\r
1271 // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
1275 /* Controller role change request messages. */
\r
1276 rpc role-request {
\r
1278 uses role-request;
\r
1279 // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"
\r
1283 // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"
\r
1285 } /* Controller/switch message */
\r
1287 /* Asynchronous message configuration. */
\r
1290 uses get-async-request;
\r
1291 // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
\r
1294 uses get-async-reply;
\r
1295 // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
\r
1298 /* Controller/switch message */
\r
1302 // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
\r
1306 /* Meters and rate limiters configuration messages. */
\r
1310 // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"
\r
1312 } /* Controller/switch message */
\r