module sal-async-config {
    namespace "urn:opendaylight:async-config:service";
    prefix async-config;

    import opendaylight-inventory {prefix inv;revision-date "2013-08-19";}
    import openflow-protocol { prefix ofproto; revision-date "2013-07-31"; }

    description "Asynchronous configuration message.";

    revision "2017-06-19" {
        description "Initial revision of asynchronous configuration service.";
    }

    typedef packet-in-mask {
        type bits {
            bit NO_MATCH;
            bit ACTION;
            bit INVALID_TTL;
        }
    }

    typedef port-status-mask {
        description "Be careful when modifying this configuration, as this can impact lldp-speaker";
        type bits {
            bit ADD;
            bit DELETE;
            bit UPDATE;
        }
    }

    typedef flow-removed-mask {
        description "Be careful when modifying this configuration, as this can impact FRM.";
        type bits {
            bit IDLE_TIMEOUT;
            bit HARD_TIMEOUT;
            bit DELETE;
            bit GROUP_DELETE;
        }
     }

    grouping async-config {
        container packet-in-mask {
            leaf master-mask {
                type packet-in-mask;
            }

            leaf slave-mask {
                type packet-in-mask;
            }
        }

        container port-status-mask {
            leaf master-mask {
                type port-status-mask;
            }

            leaf slave-mask {
                type port-status-mask;
            }
        }

        container flow-removed-mask {
            leaf master-mask {
                type flow-removed-mask;
            }

            leaf slave-mask {
                type flow-removed-mask;
            }
        }
    }

    container async-config-message {
        uses ofproto:ofHeader;
        uses async-config;
    }

    rpc set-async {
        description "Controller to switch message set configuration.";

        input {
            uses "inv:node-context-ref";
            uses async-config;
        }
    }

    rpc get-async {
        description "Controller to switch message get configuration.";

        input {
            uses "inv:node-context-ref";
        }

        output {
            uses async-config;
        }
    }

}