net/mlx5: elaborate E-Switch port parameters query
The routine mlx5_port_to_eswitch_info() is elaborated to two ones (get E-Switch port parameters by port and by device pointer) and simplified to returning structure containing all parameters instead of copying. Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com> Acked-by: Matan Azrad <matan@mellanox.com>
This commit is contained in:
parent
d5c06b1b10
commit
09a16bcab7
@ -718,8 +718,8 @@ eth_rx_burst_t mlx5_select_rx_function(struct rte_eth_dev *dev);
|
||||
unsigned int mlx5_dev_to_port_id(const struct rte_device *dev,
|
||||
uint16_t *port_list,
|
||||
unsigned int port_list_n);
|
||||
int mlx5_port_to_eswitch_info(uint16_t port, uint16_t *es_domain_id,
|
||||
uint16_t *es_port_id);
|
||||
struct mlx5_priv *mlx5_port_to_eswitch_info(uint16_t port);
|
||||
struct mlx5_priv *mlx5_dev_to_eswitch_info(struct rte_eth_dev *dev);
|
||||
int mlx5_sysfs_switch_info(unsigned int ifindex,
|
||||
struct mlx5_switch_info *info);
|
||||
void mlx5_sysfs_check_switch_info(bool device_dir,
|
||||
|
@ -1660,7 +1660,7 @@ mlx5_dev_to_port_id(const struct rte_device *dev, uint16_t *port_list,
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the E-Switch domain id this port belongs to.
|
||||
* Get the E-Switch parameters by port id.
|
||||
*
|
||||
* @param[in] port
|
||||
* Device port id.
|
||||
@ -1670,34 +1670,57 @@ mlx5_dev_to_port_id(const struct rte_device *dev, uint16_t *port_list,
|
||||
* The port id of the port in the E-Switch.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, a negative errno value otherwise and rte_errno is set.
|
||||
* pointer to device private data structure containing data needed
|
||||
* on success, NULL otherwise and rte_errno is set.
|
||||
*/
|
||||
int
|
||||
mlx5_port_to_eswitch_info(uint16_t port,
|
||||
uint16_t *es_domain_id, uint16_t *es_port_id)
|
||||
struct mlx5_priv *
|
||||
mlx5_port_to_eswitch_info(uint16_t port)
|
||||
{
|
||||
struct rte_eth_dev *dev;
|
||||
struct mlx5_priv *priv;
|
||||
|
||||
if (port >= RTE_MAX_ETHPORTS) {
|
||||
rte_errno = EINVAL;
|
||||
return -rte_errno;
|
||||
return NULL;
|
||||
}
|
||||
if (!rte_eth_dev_is_valid_port(port)) {
|
||||
rte_errno = ENODEV;
|
||||
return -rte_errno;
|
||||
return NULL;
|
||||
}
|
||||
dev = &rte_eth_devices[port];
|
||||
priv = dev->data->dev_private;
|
||||
if (!(priv->representor || priv->master)) {
|
||||
rte_errno = EINVAL;
|
||||
return -rte_errno;
|
||||
return NULL;
|
||||
}
|
||||
if (es_domain_id)
|
||||
*es_domain_id = priv->domain_id;
|
||||
if (es_port_id)
|
||||
*es_port_id = priv->vport_id;
|
||||
return 0;
|
||||
return priv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the E-Switch parameters by device instance.
|
||||
*
|
||||
* @param[in] port
|
||||
* Device port id.
|
||||
* @param[out] es_domain_id
|
||||
* E-Switch domain id.
|
||||
* @param[out] es_port_id
|
||||
* The port id of the port in the E-Switch.
|
||||
*
|
||||
* @return
|
||||
* pointer to device private data structure containing data needed
|
||||
* on success, NULL otherwise and rte_errno is set.
|
||||
*/
|
||||
struct mlx5_priv *
|
||||
mlx5_dev_to_eswitch_info(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct mlx5_priv *priv;
|
||||
|
||||
priv = dev->data->dev_private;
|
||||
if (!(priv->representor || priv->master)) {
|
||||
rte_errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
return priv;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -813,8 +813,8 @@ flow_dv_validate_item_port_id(struct rte_eth_dev *dev,
|
||||
const struct rte_flow_item_port_id switch_mask = {
|
||||
.id = 0xffffffff,
|
||||
};
|
||||
uint16_t esw_domain_id;
|
||||
uint16_t item_port_esw_domain_id;
|
||||
struct mlx5_priv *esw_priv;
|
||||
struct mlx5_priv *dev_priv;
|
||||
int ret;
|
||||
|
||||
if (!attr->transfer)
|
||||
@ -845,22 +845,20 @@ flow_dv_validate_item_port_id(struct rte_eth_dev *dev,
|
||||
return ret;
|
||||
if (!spec)
|
||||
return 0;
|
||||
ret = mlx5_port_to_eswitch_info(spec->id, &item_port_esw_domain_id,
|
||||
NULL);
|
||||
if (ret)
|
||||
return rte_flow_error_set(error, -ret,
|
||||
esw_priv = mlx5_port_to_eswitch_info(spec->id);
|
||||
if (!esw_priv)
|
||||
return rte_flow_error_set(error, rte_errno,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM_SPEC, spec,
|
||||
"failed to obtain E-Switch info for"
|
||||
" port");
|
||||
ret = mlx5_port_to_eswitch_info(dev->data->port_id,
|
||||
&esw_domain_id, NULL);
|
||||
if (ret < 0)
|
||||
return rte_flow_error_set(error, -ret,
|
||||
dev_priv = mlx5_dev_to_eswitch_info(dev);
|
||||
if (!dev_priv)
|
||||
return rte_flow_error_set(error, rte_errno,
|
||||
RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
|
||||
NULL,
|
||||
"failed to obtain E-Switch info");
|
||||
if (item_port_esw_domain_id != esw_domain_id)
|
||||
return rte_flow_error_set(error, -ret,
|
||||
if (esw_priv->domain_id != dev_priv->domain_id)
|
||||
return rte_flow_error_set(error, EINVAL,
|
||||
RTE_FLOW_ERROR_TYPE_ITEM_SPEC, spec,
|
||||
"cannot match on a port from a"
|
||||
" different E-Switch");
|
||||
@ -2440,10 +2438,9 @@ flow_dv_validate_action_port_id(struct rte_eth_dev *dev,
|
||||
struct rte_flow_error *error)
|
||||
{
|
||||
const struct rte_flow_action_port_id *port_id;
|
||||
struct mlx5_priv *act_priv;
|
||||
struct mlx5_priv *dev_priv;
|
||||
uint16_t port;
|
||||
uint16_t esw_domain_id;
|
||||
uint16_t act_port_domain_id;
|
||||
int ret;
|
||||
|
||||
if (!attr->transfer)
|
||||
return rte_flow_error_set(error, ENOTSUP,
|
||||
@ -2463,24 +2460,23 @@ flow_dv_validate_action_port_id(struct rte_eth_dev *dev,
|
||||
RTE_FLOW_ERROR_TYPE_ACTION, NULL,
|
||||
"can have only one fate actions in"
|
||||
" a flow");
|
||||
ret = mlx5_port_to_eswitch_info(dev->data->port_id,
|
||||
&esw_domain_id, NULL);
|
||||
if (ret < 0)
|
||||
return rte_flow_error_set(error, -ret,
|
||||
dev_priv = mlx5_dev_to_eswitch_info(dev);
|
||||
if (!dev_priv)
|
||||
return rte_flow_error_set(error, rte_errno,
|
||||
RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
|
||||
NULL,
|
||||
"failed to obtain E-Switch info");
|
||||
port_id = action->conf;
|
||||
port = port_id->original ? dev->data->port_id : port_id->id;
|
||||
ret = mlx5_port_to_eswitch_info(port, &act_port_domain_id, NULL);
|
||||
if (ret)
|
||||
act_priv = mlx5_port_to_eswitch_info(port);
|
||||
if (!act_priv)
|
||||
return rte_flow_error_set
|
||||
(error, -ret,
|
||||
(error, rte_errno,
|
||||
RTE_FLOW_ERROR_TYPE_ACTION_CONF, port_id,
|
||||
"failed to obtain E-Switch port id for port");
|
||||
if (act_port_domain_id != esw_domain_id)
|
||||
if (act_priv->domain_id != dev_priv->domain_id)
|
||||
return rte_flow_error_set
|
||||
(error, -ret,
|
||||
(error, EINVAL,
|
||||
RTE_FLOW_ERROR_TYPE_ACTION, NULL,
|
||||
"port does not belong to"
|
||||
" E-Switch being configured");
|
||||
@ -4664,15 +4660,16 @@ flow_dv_translate_item_port_id(struct rte_eth_dev *dev, void *matcher,
|
||||
{
|
||||
const struct rte_flow_item_port_id *pid_m = item ? item->mask : NULL;
|
||||
const struct rte_flow_item_port_id *pid_v = item ? item->spec : NULL;
|
||||
uint16_t mask, val, id;
|
||||
int ret;
|
||||
struct mlx5_priv *priv;
|
||||
uint16_t mask, id;
|
||||
|
||||
mask = pid_m ? pid_m->id : 0xffff;
|
||||
id = pid_v ? pid_v->id : dev->data->port_id;
|
||||
ret = mlx5_port_to_eswitch_info(id, NULL, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
flow_dv_translate_item_source_vport(matcher, key, val, mask);
|
||||
priv = mlx5_port_to_eswitch_info(id);
|
||||
if (!priv)
|
||||
return -rte_errno;
|
||||
flow_dv_translate_item_source_vport(matcher, key,
|
||||
priv->vport_id, mask);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -5105,19 +5102,18 @@ flow_dv_translate_action_port_id(struct rte_eth_dev *dev,
|
||||
struct rte_flow_error *error)
|
||||
{
|
||||
uint32_t port;
|
||||
uint16_t port_id;
|
||||
int ret;
|
||||
struct mlx5_priv *priv;
|
||||
const struct rte_flow_action_port_id *conf =
|
||||
(const struct rte_flow_action_port_id *)action->conf;
|
||||
|
||||
port = conf->original ? dev->data->port_id : conf->id;
|
||||
ret = mlx5_port_to_eswitch_info(port, NULL, &port_id);
|
||||
if (ret)
|
||||
return rte_flow_error_set(error, -ret,
|
||||
priv = mlx5_port_to_eswitch_info(port);
|
||||
if (!priv)
|
||||
return rte_flow_error_set(error, -rte_errno,
|
||||
RTE_FLOW_ERROR_TYPE_ACTION,
|
||||
NULL,
|
||||
"No eswitch info was found for port");
|
||||
*dst_port_id = port_id;
|
||||
*dst_port_id = priv->vport_id;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user