.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);