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
74 grouping match-grouping {
\r
78 base oft:match-type-base;
\r
81 uses oxm:oxm-fields;
\r
96 type oft:port-number;
\r
102 uses ofaction:actions;
\r
105 container table-features-properties-container {
\r
106 uses table-features-properties;
\r
109 grouping table-features-properties {
\r
110 list table-feature-properties {
\r
112 type oft:table-features-prop-type;
\r
117 // # MESSAGE Structures
\r
118 /* Immutable messages. */
\r
119 grouping ofHeader {
\r
120 //reference "ofpt_header struct in Openflow Switch 1.3 Spec"
\r
123 //reference "OpenFlow Header - OFP_VERSION";
\r
127 //reference "OpenFlow Header - transaction id";
\r
130 grouping ofHelloElementHeader {
\r
131 //reference "ofpt_hello_elem_header struct in Openflow Switch 1.3 Spec"
\r
133 type oft:hello-element-type;
\r
134 //reference "OpenFlow Header element type - OFPHET_*";
\r
138 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
139 /* Symmetric message */
\r
143 uses ofHelloElementHeader;
\r
145 leaf-list version-bitmap {
\r
151 // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"
\r
152 /* Symmetric message */
\r
156 type oft:error-type;
\r
165 grouping echo-request {
\r
166 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
167 /* Symmetric message */
\r
174 grouping echo-reply {
\r
175 // reference "OFPT_ECHO_REPLY message in Openflow Switch 1.3 Spec"
\r
176 /* Symmetric message */
\r
183 grouping experimenter {
\r
184 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
185 /* Symmetric message */
\r
188 leaf experimenter {
\r
198 /* Switch configuration messages. */
\r
199 grouping features-request {
\r
200 // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
\r
201 /* Controller/switch message */
\r
204 grouping features-reply {
\r
205 // reference "OFPT_FEATURES_REPLY message in Openflow Switch 1.3 Spec"
\r
206 /* Controller/switch message */
\r
221 leaf capabilities {
\r
228 grouping get-config-request {
\r
229 // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
230 /* Controller/switch message */
\r
233 grouping get-config-reply {
\r
234 // reference "OFPT_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
235 /* Controller/switch message */
\r
239 type oft:switch-config-flag;
\r
241 leaf miss-send-len {
\r
245 grouping set-config {
\r
246 // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
\r
247 /* Controller/switch message */
\r
252 type oft:switch-config-flag;
\r
254 leaf miss-send-len {
\r
258 /* Asynchronous messages. */
\r
259 grouping packet-in {
\r
260 // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"
\r
261 /* Async message */
\r
266 // ID assigned by datapath.
\r
270 // Full length of frame.
\r
274 // Reason packet is being sent (one of OFPR_*)
\r
278 // ID of the table that was looked up
\r
282 // Cookie of the flow entry that was looked up.
\r
285 uses match-grouping;
\r
287 // struct ofp_match match; /* Packet metadata. Variable size. */
\r
288 // /* The variable size and padded match is always followed by:
\r
289 // * - Exactly 2 all-zero padding bytes, then
\r
290 // * - An Ethernet frame whose length is inferred from header.length.
\r
291 // * The padding bytes preceding the Ethernet frame ensure that the IP
\r
292 // * header (if any) following the Ethernet header is 32-bit aligned.
\r
299 grouping flow-removed {
\r
300 // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"
\r
301 /* Async message */
\r
311 type oft:flow-removed-reason;
\r
316 leaf duration-sec {
\r
319 leaf duration-nsec {
\r
322 leaf idle-timeout {
\r
325 leaf hard-timeout {
\r
328 leaf packet-count {
\r
334 uses match-grouping;
\r
336 grouping port-status {
\r
337 // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"
\r
344 type oft:port-reason;
\r
346 } /* Async message */
\r
347 /* Controller command messages. */
\r
348 grouping packet-out {
\r
349 // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"
\r
350 /* Controller/switch message */
\r
354 uses ofaction:actions;
\r
363 type oft:port-number;
\r
366 grouping flow-mod {
\r
367 // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"
\r
368 /* Controller/switch message */
\r
382 type oft:flow-mod-command;
\r
384 leaf idle-timeout {
\r
387 leaf hard-timeout {
\r
397 type oft:port-number;
\r
403 type oft:flow-mod-flags;
\r
405 uses match-grouping;
\r
407 uses ofinstruction:instructions;
\r
409 grouping group-mod {
\r
410 // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"
\r
411 /* Controller/switch message */
\r
416 type oft:group-mod-command;
\r
419 type oft:group-type;
\r
428 grouping port-mod {
\r
429 // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"
\r
430 /* Controller/switch message */
\r
435 type oft:port-number;
\r
438 type yang:mac-address;
\r
441 type oft:port-config;
\r
444 type oft:port-config;
\r
447 type oft:port-features;
\r
450 grouping table-mod {
\r
451 // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"
\r
452 /* Controller/switch message */
\r
460 type oft:port-config;
\r
464 /* Multipart messages. */
\r
465 grouping multipart-request {
\r
466 // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
\r
467 /* Controller/switch message */
\r
472 type oft:multipart-type;
\r
475 type oft:multipart-request-flags;
\r
477 choice multipart-request-body {
\r
478 case multipart-request-flow {
\r
494 uses match-grouping;
\r
496 case multipart-request-aggregate {
\r
512 uses match-grouping;
\r
514 case multipart-request-port-stats {
\r
519 case multipart-request-queue {
\r
527 case multipart-request-group {
\r
532 case multipart-request-meter {
\r
537 case multipart-request-meter-config {
\r
542 case multipart-request-table-features {
\r
543 list table-features {
\r
550 leaf metadata-match {
\r
553 leaf metadata-write {
\r
557 type oft:table-config;
\r
562 uses table-features-properties;
\r
565 case multipart-request-experimenter {
\r
566 leaf experimenter {
\r
575 grouping multipart-reply {
\r
576 // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"
\r
577 /* Controller/switch message */
\r
582 type oft:multipart-type;
\r
585 type oft:multipart-request-flags;
\r
587 choice multipart-reply-body {
\r
588 case multipart-reply-desc {
\r
605 case multipart-reply-flow {
\r
610 leaf duration-sec {
\r
613 leaf duration-nsec {
\r
619 leaf idle-timeout {
\r
622 leaf hard-timeout {
\r
626 type oft:flow-mod-flags;
\r
631 leaf packet-count {
\r
637 uses match-grouping;
\r
639 uses ofinstruction:instructions;
\r
642 case multipart-reply-aggregate {
\r
643 leaf packet-count {
\r
653 case multipart-reply-table {
\r
658 leaf active-count {
\r
661 leaf lookup-count {
\r
664 leaf matched-count {
\r
669 case multipart-reply-port-stats {
\r
698 leaf rx-frame-err {
\r
710 leaf duration-sec {
\r
713 leaf duration-nsec {
\r
718 case multipart-reply-queue {
\r
735 leaf duration-sec {
\r
738 leaf duration-nsec {
\r
743 case multipart-reply-group {
\r
751 leaf packet-count {
\r
757 leaf duration-sec {
\r
760 leaf duration-nsec {
\r
763 list bucket-stats {
\r
764 leaf packet-count {
\r
773 case multipart-reply-group-desc {
\r
776 type oft:group-type;
\r
784 case multipart-reply-group-features {
\r
786 type oft:group-types;
\r
788 leaf capabilities {
\r
789 type oft:group-capabilities;
\r
791 leaf-list max_groups {
\r
794 leaf-list actions-bitmap {
\r
795 type oft:action-type;
\r
798 case multipart-reply-meter {
\r
806 leaf packet-in-count {
\r
809 leaf byte-in-count {
\r
812 leaf duration-sec {
\r
815 leaf duration-nsec {
\r
818 list meter-band-stats {
\r
819 leaf packet-band-count {
\r
822 leaf byte-band-count {
\r
828 case multipart-reply-meter-config {
\r
829 list meter-config {
\r
831 type oft:meter-mod-command;
\r
837 uses meter-band-header;
\r
841 case multipart-reply-meter-features {
\r
846 type oft:meter-band-type;
\r
848 leaf capabilities {
\r
849 type oft:meter-flags;
\r
858 case multipart-reply-table-features {
\r
859 list table-features {
\r
866 leaf metadata-match {
\r
869 leaf metadata-write {
\r
873 type oft:port-config;
\r
878 uses table-features-properties;
\r
881 case multipart-reply-port-desc {
\r
886 case multipart-reply-experimenter {
\r
887 leaf experimenter {
\r
899 /* Barrier messages. */
\r
900 grouping barrier-request {
\r
901 // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"
\r
902 /* Controller/switch message */
\r
905 grouping barrier-reply {
\r
906 // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"
\r
907 /* Controller/switch message */
\r
910 /* Queue Configuration messages. */
\r
911 grouping queue-get-config-request {
\r
912 // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
913 /* Controller/switch message */
\r
918 type oft:port-number;
\r
921 grouping queue-get-config-reply {
\r
922 // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
923 /* Controller/switch message */
\r
928 type oft:port-number;
\r
934 grouping packet-queue {
\r
939 type oft:port-number;
\r
941 uses queue-property-header;
\r
943 container queue-prop-container {
\r
944 uses queue-property-header;
\r
946 grouping queue-property-header {
\r
947 list queue-property {
\r
949 type oft:queue-properties;
\r
953 /* Controller role change request messages. */
\r
954 grouping role-request {
\r
955 // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"
\r
956 /* Controller/switch message */
\r
961 type oft:controller-role;
\r
963 leaf generation-id {
\r
967 grouping role-reply {
\r
968 // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"
\r
969 /* Controller/switch message */
\r
974 type oft:controller-role;
\r
976 leaf generation-id {
\r
980 /* Asynchronous message configuration. */
\r
981 grouping get-async-request {
\r
982 // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
\r
983 /* Controller/switch message */
\r
987 grouping get-async-reply {
\r
988 // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
\r
989 /* Controller/switch message */
\r
993 list packet-in-mask {
\r
995 type oft:packet-in-reason;
\r
998 list port-status-mask {
\r
1000 type oft:port-reason;
\r
1003 list flow-removed-mask {
\r
1005 type oft:flow-removed-reason;
\r
1009 grouping set-async {
\r
1010 // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
\r
1011 /* Controller/switch message */
\r
1015 leaf-list packet-in-mask {
\r
1016 type oft:packet-in-reason;
\r
1018 leaf-list port-status-mask {
\r
1019 type oft:port-reason;
\r
1021 leaf-list flow-removed-mask {
\r
1022 type oft:flow-removed-reason;
\r
1025 /* Meters and rate limiters configuration messages. */
\r
1026 grouping meter-mod {
\r
1027 // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"
\r
1028 /* Controller/switch message */
\r
1033 type oft:meter-mod-command;
\r
1036 type oft:meter-flags;
\r
1039 type oft:meter-id;
\r
1042 uses meter-band-header;
\r
1046 grouping meter-band-header {
\r
1047 choice meter-band {
\r
1048 case meter-band-drop {
\r
1049 uses meter-band-commons;
\r
1051 case meter-band-dscp-remark {
\r
1052 uses meter-band-commons;
\r
1057 case meter-band-experimenter {
\r
1058 uses meter-band-commons;
\r
1059 leaf experimenter {
\r
1066 grouping meter-band-commons {
\r
1068 type oft:meter-band-type;
\r
1078 /* Immutable messages. */
\r
1079 notification hello-message {
\r
1081 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
1083 /* Symmetric message */
\r
1085 notification error-message {
\r
1087 // reference "OFPT_ERROR message in Openflow Switch 1.3 Spec"
\r
1089 /* Symmetric message */
\r
1091 notification echo-request-message {
\r
1092 uses echo-request;
\r
1093 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1095 /* Symmetric message */
\r
1097 notification experimenter-message {
\r
1098 uses experimenter;
\r
1099 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
1100 // TODO:: does switch send this when understood experimenter msg from lib?
\r
1101 /* Symmetric message */
\r
1103 // # Notification and RPCs
\r
1104 /* Symmetric RPC. */
\r
1106 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1108 uses echo-request;
\r
1110 /* Controller/switch message */
\r
1117 // reference "OFPT_ECHO_REQUEST message in Openflow Switch 1.3 Spec"
\r
1124 // reference "OFPT_HELLO message in Openflow Switch 1.3 Spec"
\r
1130 rpc experimenter {
\r
1131 // reference "OFPT_EXPERIMENTER message in Openflow Switch 1.3 Spec"
\r
1133 uses experimenter;
\r
1137 /* Switch configuration messages. */
\r
1138 rpc get-features {
\r
1139 // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
\r
1141 uses features-request;
\r
1143 /* Controller/switch message */
\r
1145 uses features-reply;
\r
1150 // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
1152 uses get-config-request;
\r
1155 uses get-config-reply;
\r
1157 /* Controller/switch message */
\r
1161 // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
\r
1165 /* Controller/switch message */
\r
1167 /* Asynchronous messages. */
\r
1168 notification packet-in-message {
\r
1170 // reference "OFPT_PACKET_IN message in Openflow Switch 1.3 Spec"
\r
1172 /* Async message */
\r
1174 notification flow-removed-message {
\r
1175 uses flow-removed;
\r
1176 // reference "OFPT_FLOW_REMOVED message in Openflow Switch 1.3 Spec"
\r
1178 /* Async message */
\r
1180 notification port-status-message {
\r
1182 // reference "OFPT_PORT_STATUS message in Openflow Switch 1.3 Spec"
\r
1184 } /* Async message */
\r
1186 /* Controller command messages. */
\r
1190 // reference "OFPT_PACKET_OUT message in Openflow Switch 1.3 Spec"
\r
1192 /* Controller/switch message */
\r
1197 // reference "OFPT_FLOW_MOD message in Openflow Switch 1.3 Spec"
\r
1199 /* Controller/switch message */
\r
1204 // reference "OFPT_GROUP_MOD message in Openflow Switch 1.3 Spec"
\r
1206 /* Controller/switch message */
\r
1211 // reference "OFPT_PORT_MOD message in Openflow Switch 1.3 Spec"
\r
1213 } /* Controller/switch message */
\r
1218 // reference "OFPT_TABLE_MOD message in Openflow Switch 1.3 Spec"
\r
1220 } /* Controller/switch message */
\r
1222 /* Multipart messages. */
\r
1223 //FIXME: Arent this wire protocol specific?
\r
1225 notification multipart-request-message {
\r
1226 uses multipart-request;
\r
1227 // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
\r
1229 } /* Controller/switch message */
\r
1230 notification multipart-reply-message {
\r
1231 uses multipart-reply;
\r
1232 // reference "OFPT_MULTIPART_REPLY message in Openflow Switch 1.3 Spec"
\r
1234 } /* Controller/switch message */
\r
1237 /* Barrier messages. */
\r
1240 uses barrier-request;
\r
1241 // reference "OFPT_BARRIER_REQUEST message in Openflow Switch 1.3 Spec"
\r
1244 uses barrier-reply;
\r
1245 // reference "OFPT_BARRIER_REPLY message in Openflow Switch 1.3 Spec"
\r
1248 /* Queue Configuration messages. */
\r
1249 rpc get-queue-config {
\r
1251 uses queue-get-config-request;
\r
1252 // reference "OFPT_QUEUE_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
\r
1255 uses queue-get-config-reply;
\r
1256 // reference "OFPT_QUEUE_GET_CONFIG_REPLY message in Openflow Switch 1.3 Spec"
\r
1260 /* Controller role change request messages. */
\r
1261 rpc role-request {
\r
1263 uses role-request;
\r
1264 // reference "OFPT_ROLE_REQUEST message in Openflow Switch 1.3 Spec"
\r
1268 // reference "OFPT_ROLE_REPLY message in Openflow Switch 1.3 Spec"
\r
1270 } /* Controller/switch message */
\r
1272 /* Asynchronous message configuration. */
\r
1275 uses get-async-request;
\r
1276 // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
\r
1279 uses get-async-reply;
\r
1280 // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
\r
1283 /* Controller/switch message */
\r
1287 // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
\r
1291 /* Meters and rate limiters configuration messages. */
\r
1295 // reference "OFPT_METER_MOD message in Openflow Switch 1.3 Spec"
\r
1297 } /* Controller/switch message */
\r