+ /* Adds to 'types' all of the forms of QoS supported by 'netdev', or leaves
+ * it empty if 'netdev' does not support QoS. Any names added to 'types'
+ * should be documented as valid for the "type" column in the "QoS" table
+ * in vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
+ *
+ * Every network device must support disabling QoS with a type of "", but
+ * this function must not add "" to 'types'.
+ *
+ * The caller is responsible for initializing 'types' (e.g. with
+ * sset_init()) before calling this function. The caller retains ownership
+ * of 'types'.
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*get_qos_types)(const struct netdev *netdev, struct sset *types);
+
+ /* Queries 'netdev' for its capabilities regarding the specified 'type' of
+ * QoS. On success, initializes 'caps' with the QoS capabilities.
+ *
+ * Should return EOPNOTSUPP if 'netdev' does not support 'type'. May be
+ * NULL if 'netdev' does not support QoS at all. */
+ int (*get_qos_capabilities)(const struct netdev *netdev,
+ const char *type,
+ struct netdev_qos_capabilities *caps);
+
+ /* Queries 'netdev' about its currently configured form of QoS. If
+ * successful, stores the name of the current form of QoS into '*typep'
+ * and any details of configuration as string key-value pairs in
+ * 'details'.
+ *
+ * A '*typep' of "" indicates that QoS is currently disabled on 'netdev'.
+ *
+ * The caller initializes 'details' before calling this function. The
+ * caller takes ownership of the string key-values pairs added to
+ * 'details'.
+ *
+ * The netdev retains ownership of '*typep'.
+ *
+ * '*typep' will be one of the types returned by netdev_get_qos_types() for
+ * 'netdev'. The contents of 'details' should be documented as valid for
+ * '*typep' in the "other_config" column in the "QoS" table in
+ * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*get_qos)(const struct netdev *netdev,
+ const char **typep, struct smap *details);
+
+ /* Attempts to reconfigure QoS on 'netdev', changing the form of QoS to
+ * 'type' with details of configuration from 'details'.
+ *
+ * On error, the previous QoS configuration is retained.
+ *
+ * When this function changes the type of QoS (not just 'details'), this
+ * also resets all queue configuration for 'netdev' to their defaults
+ * (which depend on the specific type of QoS). Otherwise, the queue
+ * configuration for 'netdev' is unchanged.
+ *
+ * 'type' should be "" (to disable QoS) or one of the types returned by
+ * netdev_get_qos_types() for 'netdev'. The contents of 'details' should
+ * be documented as valid for the given 'type' in the "other_config" column
+ * in the "QoS" table in vswitchd/vswitch.xml (which is built as
+ * ovs-vswitchd.conf.db(8)).
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*set_qos)(struct netdev *netdev,
+ const char *type, const struct smap *details);
+
+ /* Queries 'netdev' for information about the queue numbered 'queue_id'.
+ * If successful, adds that information as string key-value pairs to
+ * 'details'. Returns 0 if successful, otherwise a positive errno value.
+ *
+ * Should return EINVAL if 'queue_id' is greater than or equal to the
+ * number of supported queues (as reported in the 'n_queues' member of
+ * struct netdev_qos_capabilities by 'get_qos_capabilities').
+ *
+ * The caller initializes 'details' before calling this function. The
+ * caller takes ownership of the string key-values pairs added to
+ * 'details'.
+ *
+ * The returned contents of 'details' should be documented as valid for the
+ * given 'type' in the "other_config" column in the "Queue" table in
+ * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
+ */
+ int (*get_queue)(const struct netdev *netdev,
+ unsigned int queue_id, struct smap *details);
+
+ /* Configures the queue numbered 'queue_id' on 'netdev' with the key-value
+ * string pairs in 'details'. The contents of 'details' should be
+ * documented as valid for the given 'type' in the "other_config" column in
+ * the "Queue" table in vswitchd/vswitch.xml (which is built as
+ * ovs-vswitchd.conf.db(8)). Returns 0 if successful, otherwise a positive
+ * errno value. On failure, the given queue's configuration should be
+ * unmodified.
+ *
+ * Should return EINVAL if 'queue_id' is greater than or equal to the
+ * number of supported queues (as reported in the 'n_queues' member of
+ * struct netdev_qos_capabilities by 'get_qos_capabilities'), or if
+ * 'details' is invalid for the type of queue.
+ *
+ * This function does not modify 'details', and the caller retains
+ * ownership of it.
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*set_queue)(struct netdev *netdev,
+ unsigned int queue_id, const struct smap *details);
+
+ /* Attempts to delete the queue numbered 'queue_id' from 'netdev'.
+ *
+ * Should return EINVAL if 'queue_id' is greater than or equal to the
+ * number of supported queues (as reported in the 'n_queues' member of
+ * struct netdev_qos_capabilities by 'get_qos_capabilities'). Should
+ * return EOPNOTSUPP if 'queue_id' is valid but may not be deleted (e.g. if
+ * 'netdev' has a fixed set of queues with the current QoS mode).
+ *
+ * May be NULL if 'netdev' does not support QoS at all, or if all of its
+ * QoS modes have fixed sets of queues. */
+ int (*delete_queue)(struct netdev *netdev, unsigned int queue_id);
+
+ /* Obtains statistics about 'queue_id' on 'netdev'. Fills 'stats' with the
+ * queue's statistics. May set individual members of 'stats' to all-1-bits
+ * if the statistic is unavailable.
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*get_queue_stats)(const struct netdev *netdev, unsigned int queue_id,
+ struct netdev_queue_stats *stats);
+
+ /* Attempts to begin dumping the queues in 'netdev'. On success, returns 0
+ * and initializes '*statep' with any data needed for iteration. On
+ * failure, returns a positive errno value.
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*queue_dump_start)(const struct netdev *netdev, void **statep);
+
+ /* Attempts to retrieve another queue from 'netdev' for 'state', which was
+ * initialized by a successful call to the 'queue_dump_start' function for
+ * 'netdev'. On success, stores a queue ID into '*queue_id' and fills
+ * 'details' with the configuration of the queue with that ID. Returns EOF
+ * if the last queue has been dumped, or a positive errno value on error.
+ * This function will not be called again once it returns nonzero once for
+ * a given iteration (but the 'queue_dump_done' function will be called
+ * afterward).
+ *
+ * The caller initializes and clears 'details' before calling this
+ * function. The caller takes ownership of the string key-values pairs
+ * added to 'details'.
+ *
+ * The returned contents of 'details' should be documented as valid for the
+ * given 'type' in the "other_config" column in the "Queue" table in
+ * vswitchd/vswitch.xml (which is built as ovs-vswitchd.conf.db(8)).
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*queue_dump_next)(const struct netdev *netdev, void *state,
+ unsigned int *queue_id, struct smap *details);
+
+ /* Releases resources from 'netdev' for 'state', which was initialized by a
+ * successful call to the 'queue_dump_start' function for 'netdev'.
+ *
+ * May be NULL if 'netdev' does not support QoS at all. */
+ int (*queue_dump_done)(const struct netdev *netdev, void *state);
+
+ /* Iterates over all of 'netdev''s queues, calling 'cb' with the queue's
+ * ID, its statistics, and the 'aux' specified by the caller. The order of
+ * iteration is unspecified, but (when successful) each queue must be
+ * visited exactly once.
+ *
+ * 'cb' will not modify or free the statistics passed in. */
+ int (*dump_queue_stats)(const struct netdev *netdev,
+ void (*cb)(unsigned int queue_id,
+ struct netdev_queue_stats *,
+ void *aux),
+ void *aux);
+