--- /dev/null
+module opendaylight-match-types {
+ namespace "urn:opendaylight:model:match:types";
+ prefix "match";
+
+ import ietf-inet-types {prefix inet;}
+ import ietf-yang-types {prefix yang;}
+ import opendaylight-l2-types {prefix l2t;}
+
+ revision "2013-08-19" {
+ description "Initial revision of flow service";
+ }
+
+ grouping "mac-address-filter" {
+ leaf address {
+ mandatory true;
+ type yang:mac-address;
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+
+ /** Match Groupings **/
+ grouping "ethernet-match-fields" {
+ container ethernet-source {
+ description "Ethernet source address.";
+ presence "Match field is active and set";
+ uses mac-address-filter;
+ }
+ container ethernet-destination {
+ description "Ethernet destination address.";
+ presence "Match field is active and set";
+ uses mac-address-filter;
+ }
+ container ethernet-type {
+ description "Ethernet frame type.";
+ presence "Match field is active and set";
+
+ leaf type {
+ mandatory true;
+ type l2t:ether-type; // Needs to define that as general model
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ }
+
+ grouping "vlan-match-fields" {
+ container vlan-id {
+ description "VLAN id.";
+ presence "Match field is active and set";
+
+ leaf vlan-id {
+ mandatory true;
+ type l2t:vlan-id;
+ }
+ leaf mask {
+ type binary;
+ }
+ }
+ leaf vlan-pcp {
+ description "VLAN priority.";
+ type l2t:vlan-pcp;
+ }
+ }
+
+ grouping "ip-match-fields" {
+ leaf ip-protocol {
+ description "IP protocol.";
+ type uint8;
+ }
+
+ leaf ip-dscp {
+ description "IP DSCP (6 bits in ToS field).";
+ type inet:dscp;
+ }
+ leaf ip-ecn {
+ description "IP ECN (2 bits in ToS field).";
+ type uint8;
+ }
+ }
+
+ grouping "ipv4-match-fields" {
+ leaf ipv4-source {
+ description "IPv4 source address.";
+ type inet:ipv4-prefix;
+ }
+ leaf ipv4-destination {
+ description "IPv4 destination address.";
+ type inet:ipv4-prefix;
+ }
+ }
+
+ grouping "ipv6-match-fields" {
+ leaf ipv6-source {
+ description "IPv6 source address.";
+ type inet:ipv6-prefix;
+ }
+ leaf ipv6-destination {
+ description "IPv6 destination address.";
+ type inet:ipv6-prefix;
+ }
+ }
+
+ grouping "udp-match-fields" {
+ leaf udp-source-port {
+ description "UDP source port.";
+ type inet:port-number;
+ }
+ leaf udp-destination-port {
+ description "UDP destination port.";
+ type inet:port-number;
+ }
+ }
+
+ grouping "tcp-match-fields" {
+ leaf tcp-source-port {
+ description "TCP source port.";
+ type inet:port-number;
+ }
+ leaf tcp-destination-port {
+ description "TCP destination port.";
+ type inet:port-number;
+ }
+ }
+
+ grouping "sctp-match-fields" {
+ leaf sctp-source-port {
+ description "SCTP source port.";
+ type inet:port-number;
+ }
+ leaf sctp-destination-port {
+ description "SCTP destination port.";
+ type inet:port-number;
+ }
+ }
+
+ grouping "icmpv4-match-fields" {
+ leaf icmpv4-type {
+ description "ICMP type.";
+ type uint8; // Define ICMP Type
+ }
+ description "ICMP code.";
+ leaf icmpv4-code {
+ type uint8; // Define ICMP Code
+ }
+ }
+
+ grouping "arp-match-fields" {
+ 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.";
+ presence "Match field is active and set";
+ uses mac-address-filter;
+ }
+ container arp-target-hardware-address {
+ description "ARP target hardware address.";
+ presence "Match field is active and set";
+ uses mac-address-filter;
+ }
+ }
+
+ grouping action {
+ choice action {
+ case output-action {
+ leaf-list 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 {
+
+ }
+ }
+ }
+
+
+ grouping match {
+ container "ethernet-match" {
+ uses "ethernet-match-fields";
+ }
+ container "vlan-match" {
+ uses "vlan-match-fields";
+ }
+ container "ip-match" {
+ uses "ip-match-fields";
+ }
+
+ choice layer-3-match {
+ case "ipv4-match" {
+ uses "ipv4-match-fields";
+ }
+ case "ipv6-match" {
+ uses "ipv6-match-fields";
+ }
+ case "arp-match" {
+ uses "arp-match-fields";
+ }
+ }
+
+ choice layer-4-match {
+ case "udp-match" {
+ uses "udp-match-fields";
+ }
+ case "tcp-match" {
+ uses "tcp-match-fields";
+ }
+ case "sctp-match" {
+ uses "sctp-match-fields";
+ }
+ }
+ container "icmpv4-match" {
+ uses "icmpv4-match-fields";
+ }
+ }
+}
\ No newline at end of file