+module opendaylight-flow {
+ namespace "urn:opendaylight:flow:service";
+ prefix flow;
+
+ import yang-ext {prefix ext;}
+ import ietf-inet-types {prefix inet;}
+ import ietf-yang-types {prefix yang;}
+ import opendaylight-inventory {prefix inv;}
+
+ revision "2013-08-19" {
+ description "Initial revision of flow service";
+ }
+
+ /** Base structure **/
+ container flows {
+ list flow {
+ leaf node {
+ type inv:node-id;
+ }
+ container match {
+ // Match is empty
+ leaf input-node-connector {
+ type inv:node-connector-id; //
+ }
+ }
+ list action {
+ key id;
+ leaf id {
+ type string;
+ }
+ choice action {
+
+ }
+ }
+ }
+ }
+
+ /** Matches **/
+ augment "/flows/flow/match" {
+ ext:augment-identifier "ethernet-match";
+ container ethernet-source {
+ description "Ethernet source address.";
+ leaf address {
+ type yang:mac-address;
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ container ethernet-destination {
+ description "Ethernet destination address.";
+ leaf address {
+ type yang:mac-address;
+ }
+ }
+ container ethernet-type {
+ description "Ethernet frame type.";
+ leaf type {
+ type uint16; // Needs to define that as general model
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "vlan-match";
+
+ container vlan-id {
+ description "VLAN id.";
+ leaf vlan-id {
+ type uint16; // TODO: Define proper vlan id type.
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ leaf vlan-pcp {
+ description "VLAN priority.";
+ type uint8; // TODO: Define PCP type
+ }
+
+
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "ip-match";
+
+ leaf ip-protocol {
+ description "IP protocol.";
+ type uint8; // TODO define IP protocol number
+ }
+
+ leaf ip-dscp {
+ description "IP DSCP (6 bits in ToS field).";
+ type inet:dscp; // TODO: Define DSCP type
+ }
+ leaf ip-ecn {
+ description "IP ECN (2 bits in ToS field).";
+ type uint8; // TODO define ECN
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "ipv4-match";
+ leaf ipv4-source {
+ description "IPv4 source address.";
+ type inet:ipv4-prefix;
+ }
+ leaf ipv4-destination {
+ description "IPv4 destination address.";
+ type inet:ipv4-prefix;
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "ipv6-match";
+ leaf ipv6-source {
+ description "IPv6 source address.";
+ type inet:ipv6-prefix;
+ }
+ leaf ipv6-destination {
+ description "IPv6 destination address.";
+ type inet:ipv6-prefix;
+ }
+ }
+
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "udp-match";
+
+ leaf udp-source-port {
+ description "UDP source port.";
+ type inet:port-number;
+ }
+ leaf udp-destination-port {
+ description "UDP destination port.";
+ type inet:port-number;
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "tcp-match";
+ leaf tcp-source-port {
+ description "TCP source port.";
+ type inet:port-number;
+ }
+ leaf tcp-destination-port {
+ description "TCP destination port.";
+ type inet:port-number;
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "sctp-match";
+ leaf sctp-source-port {
+ description "SCTP source port.";
+ type inet:port-number;
+ }
+ leaf sctp-destination-dst {
+ description "SCTP destination port.";
+ type inet:port-number;
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "icmpv4-match";
+ leaf icmpv4-type {
+ description "ICMP type.";
+ type uint8; // Define ICMP Type
+ }
+ description "ICMP code.";
+ leaf icmpv4-code {
+ type uint8; // Define ICMP Code
+ }
+ }
+
+ augment "/flows/flow/match" {
+ ext:augment-identifier "arp-match";
+
+ leaf arp-source-transport-address {
+ description "ARP source IPv4 address.";
+ type inet:ipv4-prefix;
+ }
+
+ leaf arp-target-transport-address {
+ description "ARP target IPv4 address.";
+ type inet:ipv4-prefix;
+ }
+ container arp-source-hardware-address {
+ description "ARP source hardware address.";
+ leaf address {
+ type yang:mac-address;
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ container arp-target-hardware-address {
+ description "ARP target hardware address.";
+ leaf address {
+ type yang:mac-address;
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ }
+
+ /** Actions **/
+ augment "/flows/flow/action/action" {
+ case output-action {
+ leaf output-node-connector {
+ type string;
+ }
+ }
+
+ case controller-action {
+ leaf max-length {
+ type uint16 {
+ range "0..65294";
+ }
+ }
+ }
+
+ case set-queue-action {
+ leaf queue {
+ type string; // TODO: define queues
+ }
+ }
+
+ case pop-mpls-action {
+ container pop-mpls {
+ leaf ethernet-type {
+ type uint16; // TODO: define ethertype type
+ }
+ }
+ }
+
+ case set-mpls-ttl-action {
+ leaf mpls-ttl {
+ type uint8;
+ }
+ }
+
+ case set-nw-ttl-action {
+ leaf nw-ttl {
+ type uint8;
+ }
+ }
+
+ case push-pbb-action {
+
+ }
+
+ case push-mpls-action {
+
+ }
+
+ case push-vlan-action {
+
+ }
+ }
+
+}
\ No newline at end of file