-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";
-
- import ietf-inet-types {prefix inet;}
import ietf-yang-types {prefix yang;}
import openflow-types {prefix oft;}
import openflow-instruction { prefix ofinstruction;}
import openflow-action {prefix ofaction;}
-
-
revision "2013-07-31" {
- description "Initial model";
+ description "OpenFlow 1.3 - protocol objects model";
}
// 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 {
+ type oft:port-config-v10;
+ }
+ leaf state-v10 {
+ type oft:port-state-v10;
+ }
+ leaf current-features-v10 {
+ description "Current features.";
+ type oft:port-features-v10;
+ }
+ leaf advertised-features-v10 {
+ description "Features being advertised by the port.";
+ type oft:port-features-v10;
+ }
+ leaf supported-features-v10 {
+ description "Features supported by the port.";
+ type oft:port-features-v10;
+ }
+ leaf peer-features-v10 {
+ description "Features advertised by peer.";
+ type oft:port-features-v10;
+ }
+ }
+
+ grouping buckets-grouping {
+ list buckets-list {
+ uses bucket-grouping;
+ }
}
+
+ 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-grouping;
+ }
+
+ container table-features-properties-container {
+ uses table-features-properties-grouping;
}
- // TODO: ofp_packat_queue
+ grouping table-features-properties-grouping {
+ list table-feature-properties {
+ config false;
+ leaf type {
+ type oft:table-features-prop-type;
+ }
+ }
+ }
// # 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_*";
}
- leaf length {
- type uint16;
- //reference "OpenFlow Header element length";
- }
}
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;
list elements {
uses ofHelloElementHeader;
- leaf data {
- type binary;
+ leaf-list version-bitmap {
+ type boolean;
}
}
}
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;
leaf type {
- type oft:error-type;
+ type uint16;
}
leaf code {
type uint16;
}
+ leaf type-string {
+ type string;
+ }
+ leaf code-string {
+ type string;
+ }
leaf data {
type binary;
}
}
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;
}
}
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;
}
}
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;
}
/* 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;
type uint8;
}
leaf capabilities {
- type uint32;
+ type oft:capabilities;
}
leaf reserved {
type uint32;
}
+ // OF1.0 structures
+ leaf capabilities-v10 {
+ type oft:capabilities-v10;
+ }
+ leaf actions-v10 {
+ type oft:action-type-v10;
+ }
+ list phy-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;
}
}
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;
}
/* 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;
leaf buffer-id {
// ID assigned by datapath.
type uint32;
- }
+ }
leaf total-len {
// Full length of frame.
type uint16;
}
leaf reason {
// Reason packet is being sent (one of OFPR_*)
- type uint8;
+ type oft:packet-in-reason;
}
leaf table-id {
// ID of the table that was looked up
// Cookie of the flow entry that was looked up.
type uint64;
}
-
- //TODO:: add match leaf
- // leaf match {
- // type oft:match
- // }
+ uses oxm: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.
-// */
leaf data {
type binary;
}
+ // OF1.0 structures
+ leaf in-port {
+ type uint16;
+ }
}
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;
leaf byte-count {
type uint64;
}
- //TODO:: add match leaf
- //leaf match {
- // type oft:match;
- //}
+ 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;
- list actions {
- //TODO:: replace with>> uses ofaction:action-header;
- uses action-header;
-
- leaf data {
- type binary;
- }
- }
+ uses ofaction:actions-grouping;
+ leaf data {
+ type binary;
+ }
leaf buffer-id {
type uint32;
}
type oft:port-number;
}
}
- grouping action-header {
- //TODO:: remove this grouping
- leaf type {
- type ofaction:action-type;
- }
- }
-
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;
type uint32;
}
leaf flags {
- type uint16;
+ type oft:flow-mod-flags;
}
- //TODO:: add match leaf
+ uses oxm:match-grouping;
+
+ uses ofinstruction:instructions-grouping;
+
+ // OF1.0 structures
+ leaf flags-v10 {
+ type oft:flow-mod-flags-v10;
+ }
+ uses oxm:match-v10-grouping;
+ 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;
type oft:group-type;
}
leaf group-id {
- type uint32;
- }
-
- list buckets {
- uses bucket;
- }
- }
- grouping bucket {
- leaf weight {
- type uint16;
- }
- leaf watch-port {
- type oft:port-number;
- }
- leaf watch-group {
- type uint32;
+ type oft:group-id;
}
- list actions {
- //TODO:: replace with>> uses ofaction:action-header;
- uses action-header;
- }
+ 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;
}
leaf mask {
type oft:port-config;
- }
+ }
leaf advertise {
- type oft:port-config;
+ type oft:port-features;
+ }
+ // OF1.0 structures
+ leaf config-v10 {
+ type oft:port-config-v10;
+ }
+ leaf mask-v10 {
+ type oft:port-config-v10;
+ }
+ leaf advertise-v10 {
+ type oft:port-features-v10;
}
}
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;
type oft:table-id;
}
leaf config {
- type oft:port-config;
- }
+ type oft:table-config;
+ }
}
/* 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;
- }
- leaf body {
- type binary;
+ }
+ choice multipart-request-body {
+ case multipart-request-desc-case {
+ container multipart-request-desc {
+ leaf empty {
+ type empty;
+ }
+ }
+ }
+ case multipart-request-flow-case {
+ container multipart-request-flow {
+ leaf table-id {
+ type uint8;
+ }
+ leaf out-port {
+ type uint32;
+ }
+ leaf out-group {
+ type uint32;
+ }
+ leaf cookie {
+ type uint64;
+ }
+ leaf cookie-mask {
+ type uint64;
+ }
+ uses oxm:match-grouping;
+
+ // OF1.0 structures
+ uses oxm:match-v10-grouping;
+ }
+ }
+ case multipart-request-aggregate-case {
+ container multipart-request-aggregate {
+ leaf table-id {
+ type uint8;
+ }
+ leaf out-port {
+ type uint32;
+ }
+ leaf out-group {
+ type uint32;
+ }
+ leaf cookie {
+ type uint64;
+ }
+ leaf cookie-mask {
+ type uint64;
+ }
+ uses oxm:match-grouping;
+
+ // OF1.0 structures
+ uses oxm:match-v10-grouping;
+ }
+ }
+ case multipart-request-table-case {
+ container multipart-request-table {
+ leaf empty {
+ type empty;
+ }
+ }
+ }
+ case multipart-request-port-stats-case {
+ container multipart-request-port-stats {
+ leaf port-no {
+ type uint32;
+ }
+ }
+ }
+ case multipart-request-queue-case {
+ container multipart-request-queue {
+ leaf port-no {
+ type uint32;
+ }
+ leaf queue-id {
+ type uint32;
+ }
+ }
+ }
+ case multipart-request-group-case {
+ container multipart-request-group {
+ leaf group-id {
+ type oft:group-id;
+ }
+ }
+ }
+ case multipart-request-group-desc-case {
+ container multipart-request-group-desc {
+ leaf empty {
+ type empty;
+ }
+ }
+ }
+ case multipart-request-group-features-case {
+ container multipart-request-group-features {
+ leaf empty {
+ type empty;
+ }
+ }
+ }
+ case multipart-request-meter-case {
+ container multipart-request-meter {
+ leaf meter-id {
+ type oft:meter-id;
+ }
+ }
+ }
+ case multipart-request-meter-config-case {
+ container multipart-request-meter-config {
+ leaf meter-id {
+ type oft:meter-id;
+ }
+ }
+ }
+ case multipart-request-meter-features-case {
+ container multipart-request-meter-features {
+ leaf empty {
+ type empty;
+ }
+ }
+ }
+ case multipart-request-table-features-case {
+ container multipart-request-table-features {
+ list table-features {
+ leaf table-id {
+ type uint8;
+ }
+ leaf name {
+ type string;
+ }
+ leaf metadata-match {
+ type uint64;
+ }
+ leaf metadata-write {
+ type uint64;
+ }
+ leaf config {
+ type oft:table-config;
+ }
+ leaf max-entries {
+ type uint32;
+ }
+ uses table-features-properties-grouping;
+ }
+ }
+ }
+ case multipart-request-port-desc-case {
+ container multipart-request-port-desc {
+ leaf empty {
+ type empty;
+ }
+ }
+ }
+ case multipart-request-experimenter-case {
+ container multipart-request-experimenter {
+ // 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;
leaf flags {
type oft:multipart-request-flags;
}
- leaf body {
- type binary;
+ choice multipart-reply-body {
+ case multipart-reply-desc-case {
+ container multipart-reply-desc {
+ leaf mfr_desc {
+ type string;
+ }
+ leaf hw_desc {
+ type string;
+ }
+ leaf sw_desc {
+ type string;
+ }
+ leaf serial_num {
+ type string;
+ }
+ leaf dp_desc {
+ type string;
+ }
+ }
+ }
+ case multipart-reply-flow-case {
+ container multipart-reply-flow {
+ list flow-stats {
+ leaf table-id {
+ type uint8;
+ }
+ leaf duration-sec {
+ type uint32;
+ }
+ leaf duration-nsec {
+ type uint32;
+ }
+ leaf priority {
+ type uint16;
+ }
+ leaf idle-timeout {
+ type uint16;
+ }
+ leaf hard-timeout {
+ type uint16;
+ }
+ leaf flags {
+ type oft:flow-mod-flags;
+ }
+ leaf cookie {
+ type uint64;
+ }
+ leaf packet-count {
+ type uint64;
+ }
+ leaf byte-count {
+ type uint64;
+ }
+ uses oxm:match-grouping;
+
+ uses ofinstruction:instructions-grouping;
+
+ // OF1.0 structures
+ uses oxm:match-v10-grouping;
+ uses ofaction:actions-grouping;
+ }
+ }
+ }
+ case multipart-reply-aggregate-case {
+ container multipart-reply-aggregate {
+ leaf packet-count {
+ type uint64;
+ }
+ leaf byte-count {
+ type uint64;
+ }
+ leaf flow-count {
+ type uint32;
+ }
+ }
+ }
+ case multipart-reply-table-case {
+ container multipart-reply-table {
+ list table-stats {
+ leaf table-id {
+ type uint8;
+ }
+ leaf active-count {
+ type uint32;
+ }
+ leaf lookup-count {
+ type uint64;
+ }
+ leaf matched-count {
+ type uint64;
+ }
+
+ // OF1.0 structures
+ 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;
+ }
+ }
+ }
+ }
+ case multipart-reply-port-stats-case {
+ container multipart-reply-port-stats {
+ list port-stats {
+ leaf port-no {
+ type uint32;
+ }
+ leaf rx-packets {
+ type uint64;
+ }
+ leaf tx-packets {
+ type uint64;
+ }
+ leaf rx-bytes {
+ type uint64;
+ }
+ leaf tx-bytes {
+ type uint64;
+ }
+ leaf rx-dropped {
+ type uint64;
+ }
+ leaf tx-dropped {
+ type uint64;
+ }
+ leaf rx-errors {
+ type uint64;
+ }
+ leaf tx-errors {
+ type uint64;
+ }
+ leaf rx-frame-err {
+ type uint64;
+ }
+ leaf rx-over-err {
+ type uint64;
+ }
+ leaf rx-crc-err {
+ type uint64;
+ }
+ leaf collisions {
+ type uint64;
+ }
+ leaf duration-sec {
+ type uint32;
+ }
+ leaf duration-nsec {
+ type uint32;
+ }
+ }
+ }
+ }
+ case multipart-reply-queue-case {
+ container multipart-reply-queue {
+ list queue-stats {
+ leaf port-no {
+ type uint32;
+ }
+ leaf queue-id {
+ type uint32;
+ }
+ leaf tx-bytes {
+ type uint64;
+ }
+ leaf tx-packets {
+ type uint64;
+ }
+ leaf tx-errors {
+ type uint64;
+ }
+ leaf duration-sec {
+ type uint32;
+ }
+ leaf duration-nsec {
+ type uint32;
+ }
+ }
+ }
+ }
+ case multipart-reply-group-case {
+ container multipart-reply-group {
+ list group-stats {
+ leaf group-id {
+ type oft:group-id;
+ }
+ leaf ref-count {
+ type uint32;
+ }
+ leaf packet-count {
+ type uint64;
+ }
+ leaf byte-count {
+ type uint64;
+ }
+ leaf duration-sec {
+ type uint32;
+ }
+ leaf duration-nsec {
+ type uint32;
+ }
+ list bucket-stats {
+ leaf packet-count {
+ type uint64;
+ }
+ leaf byte-count {
+ type uint64;
+ }
+ }
+ }
+ }
+ }
+ case multipart-reply-group-desc-case {
+ container multipart-reply-group-desc {
+ list group-desc {
+ leaf type {
+ type oft:group-type;
+ }
+ leaf group-id {
+ type oft:group-id;
+ }
+ uses buckets-grouping;
+ }
+ }
+ }
+ case multipart-reply-group-features-case {
+ container multipart-reply-group-features {
+ leaf types {
+ type oft:group-types;
+ }
+ leaf capabilities {
+ type oft:group-capabilities;
+ }
+ leaf-list max_groups {
+ type uint32;
+ }
+ leaf-list actions-bitmap {
+ type oft:action-type;
+ }
+ }
+ }
+ case multipart-reply-meter-case {
+ container multipart-reply-meter {
+ list meter-stats {
+ leaf meter-id {
+ type oft:meter-id;
+ }
+ leaf flow-count {
+ type uint32;
+ }
+ leaf packet-in-count {
+ type uint64;
+ }
+ leaf byte-in-count {
+ type uint64;
+ }
+ leaf duration-sec {
+ type uint32;
+ }
+ leaf duration-nsec {
+ type uint32;
+ }
+ list meter-band-stats {
+ leaf packet-band-count {
+ type uint64;
+ }
+ leaf byte-band-count {
+ type uint64;
+ }
+ }
+ }
+ }
+ }
+ case multipart-reply-meter-config-case {
+ container multipart-reply-meter-config {
+ list meter-config {
+ leaf flags {
+ type oft:meter-flags;
+ }
+ leaf meter-id {
+ type oft:meter-id;
+ }
+ list bands {
+ uses meter-band-header;
+ }
+ }
+ }
+ }
+ case multipart-reply-meter-features-case {
+ container multipart-reply-meter-features {
+ leaf max-meter {
+ type uint32;
+ }
+ leaf band-types {
+ type oft:meter-band-type-bitmap;
+ }
+ leaf capabilities {
+ type oft:meter-flags;
+ }
+ leaf max-bands {
+ type uint8;
+ }
+ leaf max-color {
+ type uint8;
+ }
+ }
+ }
+ case multipart-reply-table-features-case {
+ container multipart-reply-table-features {
+ list table-features {
+ leaf table-id {
+ type uint8;
+ }
+ leaf name {
+ type string;
+ }
+ leaf metadata-match {
+ type binary;
+ }
+ leaf metadata-write {
+ type binary;
+ }
+ leaf config {
+ type oft:table-config;
+ }
+ leaf max-entries {
+ type uint32;
+ }
+ uses table-features-properties-grouping;
+ }
+ }
+ }
+ case multipart-reply-port-desc-case {
+ container multipart-reply-port-desc {
+ list ports {
+ uses port-grouping;
+ }
+ }
+ }
+ case multipart-reply-experimenter-case {
+ container multipart-reply-experimenter {
+ // 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;
}
}
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;
list queues {
uses packet-queue;
}
- }
+ }
grouping packet-queue {
leaf queue-id {
type oft:queue-id;
leaf port {
type oft:port-number;
}
- list properties {
- uses queue-property-header;
- }
+ uses queue-property-header;
+ }
+ container queue-prop-container {
+ uses queue-property-header;
}
grouping queue-property-header {
- leaf property {
- type oft:queue-property;
+ list queue-property {
+ config false;
+ leaf property {
+ type oft:queue-properties;
+ }
}
}
/* 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;
}
}
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;
}
/* 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;
-
- list packet-in-mask {
- type oft:packet-in-reason;
- }
- list port-status-mask {
- type oft:port-reason;
- }
- list flow-removed-mask {
- type oft:flow-removed-reason;
- }
+ 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;
-
+ uses async-body-grouping;
+ }
+
+ grouping async-body-grouping {
list packet-in-mask {
- type oft:packet-in-reason;
+ leaf-list mask {
+ type oft:packet-in-reason;
+ }
}
list port-status-mask {
- type oft:port-reason;
+ leaf-list mask {
+ type oft:port-reason;
+ }
}
list flow-removed-mask {
- type oft:flow-removed-reason;
+ leaf-list mask {
+ type oft:flow-removed-reason;
+ }
}
- }
+ }
/* 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;
}
leaf flags {
type oft:meter-flags;
- }
+ }
leaf meter-id {
type oft:meter-id;
- }
+ }
list bands {
-
+ uses meter-band-header;
}
- }
+ }
+ container meter-band-container {
+ uses meter-band-header;
+ }
grouping meter-band-header {
+ choice meter-band {
+ case meter-band-drop-case {
+ container meter-band-drop {
+ uses meter-band-commons;
+ }
+ }
+ case meter-band-dscp-remark-case {
+ container meter-band-dscp-remark {
+ uses meter-band-commons;
+ leaf prec-level {
+ type uint8;
+ }
+ }
+ }
+ case meter-band-experimenter-case {
+ container meter-band-experimenter {
+ uses meter-band-commons;
+ }
+ }
+ }
+ }
+
+ grouping meter-band-commons {
leaf type {
type oft:meter-band-type;
}
}
}
-
-
- /* Immutable messages. */
+ /* 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;
}
}
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;
}
/* Switch configuration messages. */
rpc get-features {
- // reference "OFPT_FEATURES_REQUEST message in Openflow Switch 1.3 Spec"
input {
uses features-request;
}
}
rpc get-config {
- // reference "OFPT_GET_CONFIG_REQUEST message in Openflow Switch 1.3 Spec"
input {
uses get-config-request;
}
}
rpc set-config {
- // reference "OFPT_SET_CONFIG message in Openflow Switch 1.3 Spec"
input {
uses set-config;
}
/* 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 */
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 */
/* Multipart messages. */
- //FIXME: Arent this wire protocol specific?
- notification multipart-request-message {
- uses multipart-request;
- // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec"
-
- } /* Controller/switch message */
+ rpc multipart-request {
+ input {
+ uses multipart-request;
+ }
+ }
+
+ /* 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 */
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"
}
}
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 */
/* Asynchronous message configuration. */
- notification get-async-request-message {
- uses get-async-request;
- // reference "OFPT_GET_ASYNC_REQUEST message in Openflow Switch 1.3 Spec"
-
- } /* Controller/switch message */
- notification get-async-reply-message {
- uses get-async-reply;
- // reference "OFPT_GET_ASYNC_REPLY message in Openflow Switch 1.3 Spec"
-
- } /* Controller/switch message */
- notification set-async-message {
- uses set-async;
- // reference "OFPT_SET_ASYNC message in Openflow Switch 1.3 Spec"
+ rpc get-async {
+ input {
+ uses get-async-request;
+ }
+ output {
+ uses get-async-reply;
+ }
+ }
+ /* Controller/switch message */
+ rpc set-async {
+ input {
+ uses set-async;
+ }
- } /* Controller/switch message */
+ }
/* Meters and rate limiters configuration messages. */
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