xref: /dpdk/drivers/net/mlx5/mlx5_rxmode.c (revision fd5baf09cdf9170e0f92a112fd0ef19c29649330)
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 void
33 mlx5_promiscuous_enable(struct rte_eth_dev *dev)
34 {
35 	int ret;
36 
37 	dev->data->promiscuous = 1;
38 	if (((struct priv *)dev->data->dev_private)->config.vf)
39 		mlx5_nl_promisc(dev, 1);
40 	ret = mlx5_traffic_restart(dev);
41 	if (ret)
42 		DRV_LOG(ERR, "port %u cannot enable promiscuous mode: %s",
43 			dev->data->port_id, strerror(rte_errno));
44 }
45 
46 /**
47  * DPDK callback to disable promiscuous mode.
48  *
49  * @param dev
50  *   Pointer to Ethernet device structure.
51  */
52 void
53 mlx5_promiscuous_disable(struct rte_eth_dev *dev)
54 {
55 	int ret;
56 
57 	dev->data->promiscuous = 0;
58 	if (((struct priv *)dev->data->dev_private)->config.vf)
59 		mlx5_nl_promisc(dev, 0);
60 	ret = mlx5_traffic_restart(dev);
61 	if (ret)
62 		DRV_LOG(ERR, "port %u cannot disable promiscuous mode: %s",
63 			dev->data->port_id, strerror(rte_errno));
64 }
65 
66 /**
67  * DPDK callback to enable allmulti mode.
68  *
69  * @param dev
70  *   Pointer to Ethernet device structure.
71  */
72 void
73 mlx5_allmulticast_enable(struct rte_eth_dev *dev)
74 {
75 	int ret;
76 
77 	dev->data->all_multicast = 1;
78 	if (((struct priv *)dev->data->dev_private)->config.vf)
79 		mlx5_nl_allmulti(dev, 1);
80 	ret = mlx5_traffic_restart(dev);
81 	if (ret)
82 		DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s",
83 			dev->data->port_id, strerror(rte_errno));
84 }
85 
86 /**
87  * DPDK callback to disable allmulti mode.
88  *
89  * @param dev
90  *   Pointer to Ethernet device structure.
91  */
92 void
93 mlx5_allmulticast_disable(struct rte_eth_dev *dev)
94 {
95 	int ret;
96 
97 	dev->data->all_multicast = 0;
98 	if (((struct priv *)dev->data->dev_private)->config.vf)
99 		mlx5_nl_allmulti(dev, 0);
100 	ret = mlx5_traffic_restart(dev);
101 	if (ret)
102 		DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s",
103 			dev->data->port_id, strerror(rte_errno));
104 }
105