.queue = 0,
                .drop = 0,
        };
+       uint32_t priority_override = 0;
 
-       (void)priv;
        if (attr->group) {
                rte_flow_error_set(error, ENOTSUP,
                                   RTE_FLOW_ERROR_TYPE_ATTR_GROUP,
                                   "groups are not supported");
                return -rte_errno;
        }
-       if (attr->priority) {
+       if (priv->isolated) {
+               priority_override = attr->priority;
+       } else if (attr->priority) {
                rte_flow_error_set(error, ENOTSUP,
                                   RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
                                   NULL,
-                                  "priorities are not supported");
+                                  "priorities are not supported outside"
+                                  " isolated mode");
+               return -rte_errno;
+       }
+       if (attr->priority > MLX4_FLOW_PRIORITY_LAST) {
+               rte_flow_error_set(error, ENOTSUP,
+                                  RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY,
+                                  NULL,
+                                  "maximum priority level is "
+                                  MLX4_STR_EXPAND(MLX4_FLOW_PRIORITY_LAST));
                return -rte_errno;
        }
        if (attr->egress) {
                }
                flow->offset += cur_item->dst_sz;
        }
+       /* Use specified priority level when in isolated mode. */
+       if (priv->isolated && flow->ibv_attr)
+               flow->ibv_attr->priority = priority_override;
        /* Go over actions list */
        for (; actions->type != RTE_FLOW_ACTION_TYPE_END; ++actions) {
                if (actions->type == RTE_FLOW_ACTION_TYPE_VOID) {
 
 #include <rte_flow_driver.h>
 #include <rte_byteorder.h>
 
+/** Last and lowest priority level for a flow rule. */
+#define MLX4_FLOW_PRIORITY_LAST UINT32_C(0xfff)
+
 /** PMD-specific (mlx4) definition of a flow rule handle. */
 struct rte_flow {
        LIST_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
 
        \
        snprintf(name, sizeof(name), __VA_ARGS__)
 
+/** Generate a string out of the provided arguments. */
+#define MLX4_STR(...) # __VA_ARGS__
+
+/** Similar to MLX4_STR() with enclosed macros expanded first. */
+#define MLX4_STR_EXPAND(...) MLX4_STR(__VA_ARGS__)
+
 /* mlx4_utils.c */
 
 int mlx4_fd_set_non_blocking(int fd);