module openflow-provider-config {
    yang-version 1;
    namespace "urn:opendaylight:params:xml:ns:yang:openflow:provider:config";
    prefix "openflow-provider-config";

    description
        "Configuration for an Openflow provider.";

    revision "2016-05-10" {
        description
            "Initial revision";
    }

    typedef non-zero-uint32-type {
        type uint32 {
            range "1..max";
        }
    }

    typedef non-zero-uint16-type {
        type uint16 {
            range "1..max";
        }
    }

    container openflow-provider-config {
        leaf rpc-requests-quota {
            description "Quota for maximum number of RPC requests";
            type non-zero-uint16-type;
            default 20000;
        }

        leaf switch-features-mandatory {
            description "This parameter indicates whether it is mandatory for
                switch to support OF1.3 features : table, flow, meter,group. If this
                is set to true and switch doesn't support these features its
                connection will be denied.";
            type boolean;
            default false;
        }

        leaf global-notification-quota {
            description "Global notification quota";
            type uint32;
            default 64000;
        }

        leaf is-statistics-polling-on {
            description "If enabled, periodic statistics gathering will be
                turned on. If false takes precedence over the per-capability configuration.";
            type boolean;
            default "true";
        }

        leaf is-table-statistics-polling-on {
            description "If enabled, periodic table statistics gathering will be
                turned on";
            type boolean;
            default "true";
        }

        leaf is-flow-statistics-polling-on {
            description "If enabled, periodic flow statistics gathering will be
                turned on";
            type boolean;
            default "true";
        }

        leaf is-group-statistics-polling-on {
            description "If enabled, periodic group statistics gathering will be
                turned on";
            type boolean;
            default "true";
        }

        leaf is-meter-statistics-polling-on {
            description "If enabled, periodic meter statistics gathering will be
                turned on";
            type boolean;
            default "true";
        }

        leaf is-port-statistics-polling-on {
            description "If enabled, periodic port statistics gathering will be
                turned on";
            type boolean;
            default "true";
        }

        leaf is-queue-statistics-polling-on {
            description "If enabled, periodic queue statistics gathering will be
                turned on";
            type boolean;
            default "true";
        }

        leaf is-statistics-rpc-enabled {
            status deprecated;
            description "Expose backward compatible statistics rpcs providing
                result in form of async notification. This is deprecated, use direct
                statistics instead.";
            type boolean;
            default "false";
        }

        leaf barrier-interval-timeout-limit {
            description "Barrier timeout";
            type non-zero-uint32-type;
            default 500;
        }

        leaf barrier-count-limit {
            description "Barrier limit";
            type non-zero-uint16-type;
            default 25600;
        }

        leaf echo-reply-timeout {
            description "How long we should wait for echo reply (value is in
                milliseconds";
            type non-zero-uint32-type;
            default 2000;
        }

        leaf thread-pool-min-threads {
            description "Mininum (starting) number of threads in thread pool";
            type uint16;
            default 1;
        }

        leaf thread-pool-max-threads {
            description "Maximum number of threads in thread pool";
            type non-zero-uint16-type;
            default 32000;
        }

        leaf thread-pool-timeout {
            description "After how much time (in seconds) of inactivity will be
                threads in pool terminated";
            type uint32;
            default 60;
        }

        leaf enable-flow-removed-notification {
            description "Turning on flow removed notification";
            type boolean;
            default "true";
        }

        leaf skip-table-features {
            description "Ability to skip pulling and storing of large table
                features. These features are still available via rpc but if set to
                true then maintenance in DS will be omitted";
            type boolean;
            default "true";
        }

        leaf basic-timer-delay {
            description "Initial delay used in polling the statistics, value is
                in milliseconds";
            type non-zero-uint32-type;
            default 3000;
        }

        leaf maximum-timer-delay {
            description "Maximum timer delay is the wait time to collect next
                statistics used in polling the statistics, value is in
                milliseconds";
            type non-zero-uint32-type;
            default 900000;
        }

        leaf use-single-layer-serialization {
            description "When true, Yang models are serialized and deserialized
                directly to and from format supported by device, so serialization
                and deserialization is faster. Otherwise, models are first
                serialized to Openflow specification models and then to format
                supported by device, and reversed when deserializing.";
            type boolean;
            default "true";
        }

        leaf enable-equal-role {
                description "When true, openflowplugin won't send any specific role
                request down to the switch after plugin internally decides the
                ownership of the device using Entity Ownership Service. In this
                scenario, controller connection for the device will be in equal
                role. The behavior will be same for single node setup and clustered
                setup. In clustered scenario, all the controller will be in equal
                role for the device. In this case device will send all asynchronous
                event messages (e.g packet_in) to all the controllers, but openflowplugin
                will drop these events for the controller instances that is internally
                not owning the device.";
            type boolean;
            default "false";
        }

        leaf device-connection-rate-limit-per-min {
            description "To limit the number of datapath nodes connecting to odl controller
            instance per minute. Default value 0 indicates that the device connection rate
            limiter will be disabled.";
            type uint16;
            default 0;
        }

        leaf device-connection-hold-time-in-seconds {
            description "device connection hold time is the least time delay in seconds a
            device has to maintain between its consecutive connection attempts. If time delay
            between the previous connection and the current connection is within device
            connection hold time, the device will not be allowed to connect to the controller.
            Default value of the device connection hold time is 0 second.";
            type uint16;
            default 0;
        }

        leaf device-datastore-removal-delay {
            description "Delay (in milliseconds) before device is removed from
            the operational data store in the event of device disconnection
            from the controller.";

            type non-zero-uint32-type;
            default 500;
        }
    }
}