/*
 * 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-augments {
    namespace "urn:opendaylight:openflow:augments";
    prefix "aug";

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

    import openflow-types {prefix oft;}
    import openflow-protocol {prefix ofproto;}
    import openflow-action {prefix ofaction;}
    import openflow-instruction {prefix ofinstruction;}
    import openflow-extensible-match {prefix oxm;}

    revision "2015-02-25" {
        description "#NOT_PUBLISHED# OpenFlow 1.3 - augments model.
                    Please visit
                    https://wiki.opendaylight.org/view/File:OpenFlow_Protocol_Library_-_Project_documentation.pdf
                     - Augmentation Tables chapter";
    }

// OFP_MATCH AUGMENTS
     augment "/oxm:oxm-container/oxm:match-entry-value" {
         ext:augment-identifier "experimenter-id-match-entry";
         case experimenter-id-case {
             container experimenter {
                 leaf experimenter {
                     type oft:experimenter-id;
                 }
             }
         }
     }

// OFP_ACTION AUGMENTS
     augment "/ofaction:action-container/ofaction:action-choice" {
         ext:augment-identifier "experimenter-id-action";
         case experimenter-id-case {
             container experimenter {
                 leaf experimenter {
                     type oft:experimenter-id;
                 }
                 leaf sub-type {
                     type identityref {
                         base ofaction:experimenter-action-sub-type;
                     }
                 }
             }
         }
     }

// OFP_TABLE_FEATURES_PROPERTIES AUGMENTS
     augment "/ofproto:table-features-properties-container/ofproto:table-feature-properties" {
         ext:augment-identifier "instruction-related-table-feature-property";
         uses ofinstruction:instructions-grouping;
     }
     augment "/ofproto:table-features-properties-container/ofproto:table-feature-properties" {
         ext:augment-identifier "next-table-related-table-feature-property";
         list next-table-ids {
             config false;
             leaf table-id {
                 type uint8;
             }
         }
     }
     augment "/ofproto:table-features-properties-container/ofproto:table-feature-properties" {
         ext:augment-identifier "action-related-table-feature-property";
         uses ofaction:actions-grouping;
     }
     augment "/ofproto:table-features-properties-container/ofproto:table-feature-properties" {
         ext:augment-identifier "oxm-related-table-feature-property";
         uses oxm:match-entries-grouping;
     }
     augment "/ofproto:table-features-properties-container/ofproto:table-feature-properties" {
         ext:augment-identifier "experimenter-id-table-feature-property";
         leaf experimenter {
             type oft:experimenter-id;
         }
         leaf exp-type {
             type uint32;
         }
     }

// OFP_INSTRUCTION AUGMENTS
     augment "/ofinstruction:instruction-container/ofinstruction:instruction-choice" {
         case experimenter-id-case {
             container experimenter {
                 leaf experimenter-id {
                     type oft:experimenter-id;
                 }
             }
         }
     }

// OFP_QUEUE_PROP AUGMENTS
     augment "/ofproto:queue-prop-container/ofproto:queue-property" {
         ext:augment-identifier "rate-queue-property";
         leaf rate {
             type uint16;
         }
     }
     augment "/ofproto:queue-prop-container/ofproto:queue-property" {
         ext:augment-identifier "experimenter-id-queue-property";
         leaf experimenter {
             type oft:experimenter-id;
         }
     }

// OFP_ERROR_AUGMENTS (only experimenter till OpenFlow v1.3)
     augment "/ofproto:error-message" {
         ext:augment-identifier "experimenter-id-error";
         leaf experimenter {
             type oft:experimenter-id;
         }
     }

// OFP_METER_BAND AUGMENTS
     augment "/ofproto:meter-band-container/ofproto:meter-band/ofproto:meter-band-experimenter-case/ofproto:meter-band-experimenter" {
         ext:augment-identifier "experimenter-id-meter-band";
         leaf experimenter {
             type oft:experimenter-id;
         }
         leaf sub-type {
             type identityref {
                 base oft:experimenter-meter-band-sub-type;
             }
         }
     }
}