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
mlx5_promiscuous_enable(struct rte_eth_dev * dev)26 mlx5_promiscuous_enable(struct rte_eth_dev *dev)
27 {
28 struct mlx5_priv *priv = dev->data->dev_private;
29 int ret;
30
31 dev->data->promiscuous = 1;
32 if (priv->isolated) {
33 DRV_LOG(WARNING,
34 "port %u cannot enable promiscuous mode"
35 " in flow isolation mode",
36 dev->data->port_id);
37 return 0;
38 }
39 if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
40 ret = mlx5_os_set_promisc(dev, 1);
41 if (ret)
42 return ret;
43 }
44 ret = mlx5_traffic_restart(dev);
45 if (ret)
46 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
mlx5_promiscuous_disable(struct rte_eth_dev * dev)66 mlx5_promiscuous_disable(struct rte_eth_dev *dev)
67 {
68 struct mlx5_priv *priv = dev->data->dev_private;
69 int ret;
70
71 dev->data->promiscuous = 0;
72 if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
73 ret = mlx5_os_set_promisc(dev, 0);
74 if (ret)
75 return ret;
76 }
77 ret = mlx5_traffic_restart(dev);
78 if (ret)
79 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
mlx5_allmulticast_enable(struct rte_eth_dev * dev)99 mlx5_allmulticast_enable(struct rte_eth_dev *dev)
100 {
101 struct mlx5_priv *priv = dev->data->dev_private;
102 int ret;
103
104 dev->data->all_multicast = 1;
105 if (priv->isolated) {
106 DRV_LOG(WARNING,
107 "port %u cannot enable allmulticast mode"
108 " in flow isolation mode",
109 dev->data->port_id);
110 return 0;
111 }
112 if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
113 ret = mlx5_os_set_allmulti(dev, 1);
114 if (ret)
115 goto error;
116 }
117 ret = mlx5_traffic_restart(dev);
118 if (ret)
119 DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s",
120 dev->data->port_id, strerror(rte_errno));
121 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
mlx5_allmulticast_disable(struct rte_eth_dev * dev)139 mlx5_allmulticast_disable(struct rte_eth_dev *dev)
140 {
141 struct mlx5_priv *priv = dev->data->dev_private;
142 int ret;
143
144 dev->data->all_multicast = 0;
145 if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
146 ret = mlx5_os_set_allmulti(dev, 0);
147 if (ret)
148 goto error;
149 }
150 ret = mlx5_traffic_restart(dev);
151 if (ret)
152 DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s",
153 dev->data->port_id, strerror(rte_errno));
154 error:
155 /*
156 * rte_eth_allmulticast_disable() rollback
157 * dev->data->all_multicast in the case of failure.
158 */
159 return ret;
160 }
161