Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright 2015 6WIND S.A. 3 : : * Copyright 2015 Mellanox Technologies, Ltd 4 : : */ 5 : : 6 : : #include <stddef.h> 7 : : #include <errno.h> 8 : : #include <string.h> 9 : : 10 : : #include <ethdev_driver.h> 11 : : 12 : : #include <mlx5_glue.h> 13 : : #include "mlx5.h" 14 : : #include "mlx5_utils.h" 15 : : 16 : : /** 17 : : * DPDK callback to enable promiscuous mode. 18 : : * 19 : : * @param dev 20 : : * Pointer to Ethernet device structure. 21 : : * 22 : : * @return 23 : : * 0 on success, a negative errno value otherwise and rte_errno is set. 24 : : */ 25 : : int 26 : 0 : mlx5_promiscuous_enable(struct rte_eth_dev *dev) 27 : : { 28 : 0 : struct mlx5_priv *priv = dev->data->dev_private; 29 : : int ret; 30 : : 31 : 0 : dev->data->promiscuous = 1; 32 [ # # ]: 0 : if (priv->isolated) { 33 : 0 : DRV_LOG(WARNING, 34 : : "port %u cannot enable promiscuous mode" 35 : : " in flow isolation mode", 36 : : dev->data->port_id); 37 : 0 : return 0; 38 : : } 39 [ # # ]: 0 : if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) { 40 : 0 : ret = mlx5_os_set_promisc(dev, 1); 41 [ # # ]: 0 : if (ret) 42 : : return ret; 43 : : } 44 : 0 : ret = mlx5_traffic_restart(dev); 45 [ # # ]: 0 : if (ret) 46 : 0 : DRV_LOG(ERR, "port %u cannot enable promiscuous mode: %s", 47 : : dev->data->port_id, strerror(rte_errno)); 48 : : 49 : : /* 50 : : * rte_eth_dev_promiscuous_enable() rollback 51 : : * dev->data->promiscuous in the case of failure. 52 : : */ 53 : : return ret; 54 : : } 55 : : 56 : : /** 57 : : * DPDK callback to disable promiscuous mode. 58 : : * 59 : : * @param dev 60 : : * Pointer to Ethernet device structure. 61 : : * 62 : : * @return 63 : : * 0 on success, a negative errno value otherwise and rte_errno is set. 64 : : */ 65 : : int 66 : 0 : mlx5_promiscuous_disable(struct rte_eth_dev *dev) 67 : : { 68 : 0 : struct mlx5_priv *priv = dev->data->dev_private; 69 : : int ret; 70 : : 71 : 0 : dev->data->promiscuous = 0; 72 [ # # ]: 0 : if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) { 73 : 0 : ret = mlx5_os_set_promisc(dev, 0); 74 [ # # ]: 0 : if (ret) 75 : : return ret; 76 : : } 77 : 0 : ret = mlx5_traffic_restart(dev); 78 [ # # ]: 0 : if (ret) 79 : 0 : DRV_LOG(ERR, "port %u cannot disable promiscuous mode: %s", 80 : : dev->data->port_id, strerror(rte_errno)); 81 : : 82 : : /* 83 : : * rte_eth_dev_promiscuous_disable() rollback 84 : : * dev->data->promiscuous in the case of failure. 85 : : */ 86 : : return ret; 87 : : } 88 : : 89 : : /** 90 : : * DPDK callback to enable allmulti mode. 91 : : * 92 : : * @param dev 93 : : * Pointer to Ethernet device structure. 94 : : * 95 : : * @return 96 : : * 0 on success, a negative errno value otherwise and rte_errno is set. 97 : : */ 98 : : int 99 : 0 : mlx5_allmulticast_enable(struct rte_eth_dev *dev) 100 : : { 101 : 0 : struct mlx5_priv *priv = dev->data->dev_private; 102 : : int ret; 103 : : 104 : 0 : dev->data->all_multicast = 1; 105 [ # # ]: 0 : if (priv->isolated) { 106 : 0 : DRV_LOG(WARNING, 107 : : "port %u cannot enable allmulticast mode" 108 : : " in flow isolation mode", 109 : : dev->data->port_id); 110 : 0 : return 0; 111 : : } 112 [ # # ]: 0 : if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) { 113 : 0 : ret = mlx5_os_set_allmulti(dev, 1); 114 [ # # ]: 0 : if (ret) 115 : 0 : goto error; 116 : : } 117 : 0 : ret = mlx5_traffic_restart(dev); 118 [ # # ]: 0 : if (ret) 119 : 0 : DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s", 120 : : dev->data->port_id, strerror(rte_errno)); 121 : 0 : error: 122 : : /* 123 : : * rte_eth_allmulticast_enable() rollback 124 : : * dev->data->all_multicast in the case of failure. 125 : : */ 126 : : return ret; 127 : : } 128 : : 129 : : /** 130 : : * DPDK callback to disable allmulti mode. 131 : : * 132 : : * @param dev 133 : : * Pointer to Ethernet device structure. 134 : : * 135 : : * @return 136 : : * 0 on success, a negative errno value otherwise and rte_errno is set. 137 : : */ 138 : : int 139 : 0 : mlx5_allmulticast_disable(struct rte_eth_dev *dev) 140 : : { 141 : 0 : struct mlx5_priv *priv = dev->data->dev_private; 142 : : int ret; 143 : : 144 : 0 : dev->data->all_multicast = 0; 145 [ # # ]: 0 : if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) { 146 : 0 : ret = mlx5_os_set_allmulti(dev, 0); 147 [ # # ]: 0 : if (ret) 148 : 0 : goto error; 149 : : } 150 : 0 : ret = mlx5_traffic_restart(dev); 151 [ # # ]: 0 : if (ret) 152 : 0 : DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s", 153 : : dev->data->port_id, strerror(rte_errno)); 154 : 0 : error: 155 : : /* 156 : : * rte_eth_allmulticast_disable() rollback 157 : : * dev->data->all_multicast in the case of failure. 158 : : */ 159 : 0 : return ret; 160 : : }