/*
 * 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-action {
    namespace "urn:opendaylight:openflow:common:action";
    prefix "ofaction";

    import ietf-inet-types {prefix inet;}
    import ietf-yang-types {prefix yang;}

    import openflow-types { prefix oft; }
    import openflow-extensible-match { prefix oxm;}

    revision "2015-02-03" {
        description "#NOT_PUBLISHED# OpenFlow 1.3 - action model";
    }

    identity experimenter-action-sub-type {
        description "The base identity for vendor's actions.";
    }

    container action-container {
        uses action-grouping;
    }

    grouping actions-grouping {
        list action {
            uses action-grouping;
            leaf experimenter-id {
                type oft:experimenter-id;
            }
        }
    }

    grouping action-grouping {
        choice action-choice {
            case output-action-case {
                container output-action {
                    leaf port {
                        type oft:port-number;
                    }
                    leaf max-length {
                        type uint16;
                    }
                }
            }
            case copy-ttl-out-case {
                // empty action
            }
            case copy-ttl-in-case {
                // empty action
            }
            case set-mpls-ttl-case {
                container set-mpls-ttl-action {
                    leaf mpls-ttl {
                        type uint8;
                    }
                }
            }
            case dec-mpls-ttl-case {
                // empty action
            }
            case push-vlan-case {
                container push-vlan-action {
                    leaf ethertype {
                        type oft:ether-type;
                    }
                }
            }
            case pop-vlan-case {
                // empty action
            }
            case push-mpls-case {
                container push-mpls-action {
                    leaf ethertype {
                        type oft:ether-type;
                    }
                }
            }
            case pop-mpls-case {
                container pop-mpls-action {
                    leaf ethertype {
                        type oft:ether-type;
                    }
                }
            }
            case set-queue-case {
                container set-queue-action {
                    leaf queue-id {
                        type uint32;
                    }
                }
            }
            case group-case {
                container group-action {
                    leaf group-id {
                        type uint32;
                    }
                }
            }
            case set-nw-ttl-case {
                container set-nw-ttl-action {
                    leaf nw-ttl {
                        type uint8;
                    }
                }
            }
            case dec-nw-ttl-case {
                // empty action
            }
            case set-field-case {
                container set-field-action {
                    uses oxm:match-entries-grouping;
                }
            }
            case push-pbb-case {
                container push-pbb-action {
                    leaf ethertype {
                        type oft:ether-type;
                    }
                }
            }
            case pop-pbb-case {
                // empty action
            }
        // OF1.0 structures
            case set-vlan-vid-case {
                container set-vlan-vid-action {
                    leaf vlan-vid {
                        type uint16;
                    }
                }
            }
            case set-vlan-pcp-case {
                container set-vlan-pcp-action {
                    leaf vlan-pcp {
                        type uint8;
                    }
                }
            }
            case strip-vlan-case {
                // empty action
            }
            case set-dl-src-case {
                container set-dl-src-action {
                    leaf dl-src-address {
                        type yang:mac-address;
                    }
                }
            }
            case set-dl-dst-case {
                container set-dl-dst-action {
                    leaf dl-dst-address {
                        type yang:mac-address;
                    }
                }
            }
            case set-nw-src-case {
                container set-nw-src-action {
                    leaf ip-address {
                        type inet:ipv4-address;
                    }
                }
            }
            case set-nw-dst-case {
                container set-nw-dst-action {
                    leaf ip-address {
                        type inet:ipv4-address;
                    }
                }
            }
            case set-nw-tos-case {
                container set-nw-tos-action {
                    leaf nw-tos {
                        type uint8;
                    }
                }
            }
            case set-tp-src-case {
                container set-tp-src-action {
                    leaf port {
                        type oft:port-number;
                    }
                }
            }
            case set-tp-dst-case {
                container set-tp-dst-action {
                    leaf port {
                        type oft:port-number;
                    }
                }
            }
            case enqueue-case {
                container enqueue-action {
                    leaf port {
                        type oft:port-number;
                    }
                    leaf queue-id {
                        type oft:queue-id;
                    }
                }
            }
        }
    }

}