*/
#include <arpa/inet.h>
-#include <assert.h>
#include <errno.h>
#include <stdalign.h>
#include <stddef.h>
#include <rte_byteorder.h>
#include <rte_errno.h>
-#include <rte_eth_ctrl.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
#include <rte_ether.h>
#include <rte_flow.h>
#include <rte_flow_driver.h>
goto error;
}
flow->allmulti = 1;
- } else if (sum_dst != (UINT8_C(0xff) * ETHER_ADDR_LEN)) {
+ } else if (sum_dst != (UINT8_C(0xff) * RTE_ETHER_ADDR_LEN)) {
msg = "mlx4 does not support matching partial"
" Ethernet fields";
goto error;
flow->promisc = 1;
return 0;
}
- memcpy(eth->val.dst_mac, spec->dst.addr_bytes, ETHER_ADDR_LEN);
- memcpy(eth->mask.dst_mac, mask->dst.addr_bytes, ETHER_ADDR_LEN);
+ memcpy(eth->val.dst_mac, spec->dst.addr_bytes, RTE_ETHER_ADDR_LEN);
+ memcpy(eth->mask.dst_mac, mask->dst.addr_bytes, RTE_ETHER_ADDR_LEN);
/* Remove unwanted bits from values. */
- for (i = 0; i < ETHER_ADDR_LEN; ++i) {
+ for (i = 0; i < RTE_ETHER_ADDR_LEN; ++i)
eth->val.dst_mac[i] &= eth->mask.dst_mac[i];
- }
+
return 0;
error:
return rte_flow_error_set(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM,
mask = item->mask ?
(const uint8_t *)item->mask :
(const uint8_t *)proc->mask_default;
- assert(mask);
+ MLX4_ASSERT(mask);
/*
* Single-pass check to make sure that:
* - Mask is supported, no bits are set outside proc->mask_support.
rss = action->conf;
/* Default RSS configuration if none is provided. */
if (rss->key_len) {
- rss_key = rss->key;
+ rss_key = rss->key ?
+ rss->key : mlx4_rss_hash_key_default;
rss_key_len = rss->key_len;
} else {
rss_key = mlx4_rss_hash_key_default;
struct mlx4_drop *drop = priv->drop;
if (drop) {
- assert(drop->refcnt);
- assert(drop->priv == priv);
+ MLX4_ASSERT(drop->refcnt);
+ MLX4_ASSERT(drop->priv == priv);
++drop->refcnt;
return drop;
}
priv->drop = drop;
return drop;
error:
- if (drop->qp)
- claim_zero(mlx4_glue->destroy_qp(drop->qp));
- if (drop->cq)
- claim_zero(mlx4_glue->destroy_cq(drop->cq));
- if (drop)
+ if (drop) {
+ if (drop->qp)
+ claim_zero(mlx4_glue->destroy_qp(drop->qp));
+ if (drop->cq)
+ claim_zero(mlx4_glue->destroy_cq(drop->cq));
rte_free(drop);
+ }
rte_errno = ENOMEM;
return NULL;
}
static void
mlx4_drop_put(struct mlx4_drop *drop)
{
- assert(drop->refcnt);
+ MLX4_ASSERT(drop->refcnt);
if (--drop->refcnt)
return;
drop->priv->drop = NULL;
mlx4_rss_detach(flow->rss);
return 0;
}
- assert(flow->ibv_attr);
+ MLX4_ASSERT(flow->ibv_attr);
if (!flow->internal &&
!priv->isolated &&
flow->ibv_attr->priority == MLX4_FLOW_PRIORITY_LAST) {
}
qp = priv->drop->qp;
}
- assert(qp);
+ MLX4_ASSERT(qp);
if (flow->ibv_flow)
return 0;
flow->ibv_flow = mlx4_glue->create_flow(qp, flow->ibv_attr);
.type = RTE_FLOW_ACTION_TYPE_END,
},
};
- struct ether_addr *rule_mac = ð_spec.dst;
+ struct rte_ether_addr *rule_mac = ð_spec.dst;
rte_be16_t *rule_vlan =
(ETH_DEV(priv)->data->dev_conf.rxmode.offloads &
DEV_RX_OFFLOAD_VLAN_FILTER) &&
}
}
for (i = 0; i != RTE_DIM(priv->mac) + 1; ++i) {
- const struct ether_addr *mac;
+ const struct rte_ether_addr *mac;
/* Broadcasts are handled by an extra iteration. */
if (i < RTE_DIM(priv->mac))
mac = &priv->mac[i];
else
mac = ð_mask.dst;
- if (is_zero_ether_addr(mac))
+ if (rte_is_zero_ether_addr(mac))
continue;
/* Check if MAC flow rule is already present. */
for (flow = LIST_FIRST(&priv->flows);
if (!flow->mac)
continue;
- assert(flow->ibv_attr->type == IBV_FLOW_ATTR_NORMAL);
- assert(flow->ibv_attr->num_of_specs == 1);
- assert(eth->type == IBV_FLOW_SPEC_ETH);
- assert(flow->rss);
+ MLX4_ASSERT(flow->ibv_attr->type ==
+ IBV_FLOW_ATTR_NORMAL);
+ MLX4_ASSERT(flow->ibv_attr->num_of_specs == 1);
+ MLX4_ASSERT(eth->type == IBV_FLOW_SPEC_ETH);
+ MLX4_ASSERT(flow->rss);
if (rule_vlan &&
(eth->val.vlan_tag != *rule_vlan ||
eth->mask.vlan_tag != RTE_BE16(0x0fff)))
if (flow->promisc)
break;
} else {
- assert(ETH_DEV(priv)->data->all_multicast);
+ MLX4_ASSERT(ETH_DEV(priv)->data->all_multicast);
if (flow->allmulti)
break;
}
}
if (flow && flow->internal) {
- assert(flow->rss);
+ MLX4_ASSERT(flow->rss);
if (flow->rss->queues != queues ||
memcmp(flow->rss->queue_id, action_rss.queue,
queues * sizeof(flow->rss->queue_id[0])))
pattern[1].spec = NULL;
pattern[1].mask = NULL;
} else {
- assert(ETH_DEV(priv)->data->all_multicast);
+ MLX4_ASSERT(ETH_DEV(priv)->data->all_multicast);
pattern[1].spec = ð_allmulti;
pattern[1].mask = ð_allmulti;
}
goto error;
}
}
- assert(flow->promisc || flow->allmulti);
+ MLX4_ASSERT(flow->promisc || flow->allmulti);
flow->select = 1;
}
error:
return ret;
}
if (!priv->started)
- assert(!priv->drop);
+ MLX4_ASSERT(!priv->drop);
return 0;
}
while ((flow = LIST_FIRST(&priv->flows)))
mlx4_flow_destroy(ETH_DEV(priv), flow, NULL);
- assert(LIST_EMPTY(&priv->rss));
+ MLX4_ASSERT(LIST_EMPTY(&priv->rss));
}
static const struct rte_flow_ops mlx4_flow_ops = {
};
/**
- * Manage filter operations.
+ * Get rte_flow callbacks.
*
* @param dev
* Pointer to Ethernet device structure.
- * @param filter_type
- * Filter type.
- * @param filter_op
- * Operation to perform.
- * @param arg
+ * @param ops
* Pointer to operation-specific structure.
*
- * @return
- * 0 on success, negative errno value otherwise and rte_errno is set.
+ * @return 0
*/
int
-mlx4_filter_ctrl(struct rte_eth_dev *dev,
- enum rte_filter_type filter_type,
- enum rte_filter_op filter_op,
- void *arg)
+mlx4_flow_ops_get(struct rte_eth_dev *dev __rte_unused,
+ const struct rte_flow_ops **ops)
{
- switch (filter_type) {
- case RTE_ETH_FILTER_GENERIC:
- if (filter_op != RTE_ETH_FILTER_GET)
- break;
- *(const void **)arg = &mlx4_flow_ops;
- return 0;
- default:
- ERROR("%p: filter type (%d) not supported",
- (void *)dev, filter_type);
- break;
- }
- rte_errno = ENOTSUP;
- return -rte_errno;
+ *ops = &mlx4_flow_ops;
+ return 0;
}