84c8b05269ce1432007a265e00a8dddcdaaf8683
[dpdk.git] / drivers / net / mlx5 / mlx5_rxmode.c
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 /* Verbs header. */
11 /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
12 #ifdef PEDANTIC
13 #pragma GCC diagnostic ignored "-Wpedantic"
14 #endif
15 #include <infiniband/verbs.h>
16 #ifdef PEDANTIC
17 #pragma GCC diagnostic error "-Wpedantic"
18 #endif
19
20 #include <rte_ethdev_driver.h>
21
22 #include "mlx5.h"
23 #include "mlx5_rxtx.h"
24 #include "mlx5_utils.h"
25
26 /**
27  * DPDK callback to enable promiscuous mode.
28  *
29  * @param dev
30  *   Pointer to Ethernet device structure.
31  *
32  * @return
33  *   0 on success, a negative errno value otherwise and rte_errno is set.
34  */
35 int
36 mlx5_promiscuous_enable(struct rte_eth_dev *dev)
37 {
38         struct mlx5_priv *priv = dev->data->dev_private;
39         int ret;
40
41         dev->data->promiscuous = 1;
42         if (priv->isolated) {
43                 DRV_LOG(WARNING,
44                         "port %u cannot enable promiscuous mode"
45                         " in flow isolation mode",
46                         dev->data->port_id);
47                 return 0;
48         }
49         if (priv->config.vf) {
50                 ret = mlx5_nl_promisc(priv->nl_socket_route, mlx5_ifindex(dev),
51                                       1);
52                 if (ret)
53                         return ret;
54         }
55         ret = mlx5_traffic_restart(dev);
56         if (ret)
57                 DRV_LOG(ERR, "port %u cannot enable promiscuous mode: %s",
58                         dev->data->port_id, strerror(rte_errno));
59
60         /*
61          * rte_eth_dev_promiscuous_enable() rollback
62          * dev->data->promiscuous in the case of failure.
63          */
64         return ret;
65 }
66
67 /**
68  * DPDK callback to disable promiscuous mode.
69  *
70  * @param dev
71  *   Pointer to Ethernet device structure.
72  *
73  * @return
74  *   0 on success, a negative errno value otherwise and rte_errno is set.
75  */
76 int
77 mlx5_promiscuous_disable(struct rte_eth_dev *dev)
78 {
79         struct mlx5_priv *priv = dev->data->dev_private;
80         int ret;
81
82         dev->data->promiscuous = 0;
83         if (priv->config.vf) {
84                 ret = mlx5_nl_promisc(priv->nl_socket_route, mlx5_ifindex(dev),
85                                       0);
86                 if (ret)
87                         return ret;
88         }
89         ret = mlx5_traffic_restart(dev);
90         if (ret)
91                 DRV_LOG(ERR, "port %u cannot disable promiscuous mode: %s",
92                         dev->data->port_id, strerror(rte_errno));
93
94         /*
95          * rte_eth_dev_promiscuous_disable() rollback
96          * dev->data->promiscuous in the case of failure.
97          */
98         return ret;
99 }
100
101 /**
102  * DPDK callback to enable allmulti mode.
103  *
104  * @param dev
105  *   Pointer to Ethernet device structure.
106  *
107  * @return
108  *   0 on success, a negative errno value otherwise and rte_errno is set.
109  */
110 int
111 mlx5_allmulticast_enable(struct rte_eth_dev *dev)
112 {
113         struct mlx5_priv *priv = dev->data->dev_private;
114         int ret;
115
116         dev->data->all_multicast = 1;
117         if (priv->isolated) {
118                 DRV_LOG(WARNING,
119                         "port %u cannot enable allmulticast mode"
120                         " in flow isolation mode",
121                         dev->data->port_id);
122                 return 0;
123         }
124         if (priv->config.vf) {
125                 ret = mlx5_nl_allmulti(priv->nl_socket_route, mlx5_ifindex(dev),
126                                        1);
127                 if (ret)
128                         goto error;
129         }
130         ret = mlx5_traffic_restart(dev);
131         if (ret)
132                 DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s",
133                         dev->data->port_id, strerror(rte_errno));
134 error:
135         /*
136          * rte_eth_allmulticast_enable() rollback
137          * dev->data->all_multicast in the case of failure.
138          */
139         return ret;
140 }
141
142 /**
143  * DPDK callback to disable allmulti mode.
144  *
145  * @param dev
146  *   Pointer to Ethernet device structure.
147  *
148  * @return
149  *   0 on success, a negative errno value otherwise and rte_errno is set.
150  */
151 int
152 mlx5_allmulticast_disable(struct rte_eth_dev *dev)
153 {
154         struct mlx5_priv *priv = dev->data->dev_private;
155         int ret;
156
157         dev->data->all_multicast = 0;
158         if (priv->config.vf) {
159                 ret = mlx5_nl_allmulti(priv->nl_socket_route, mlx5_ifindex(dev),
160                                        0);
161                 if (ret)
162                         goto error;
163         }
164         ret = mlx5_traffic_restart(dev);
165         if (ret)
166                 DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s",
167                         dev->data->port_id, strerror(rte_errno));
168 error:
169         /*
170          * rte_eth_allmulticast_disable() rollback
171          * dev->data->all_multicast in the case of failure.
172          */
173         return ret;
174 }