1 /*- 2 * BSD LICENSE 3 * 4 * Copyright 2015 6WIND S.A. 5 * Copyright 2015 Mellanox. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of 6WIND S.A. nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include <stddef.h> 35 #include <errno.h> 36 #include <string.h> 37 38 /* Verbs header. */ 39 /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */ 40 #ifdef PEDANTIC 41 #pragma GCC diagnostic ignored "-Wpedantic" 42 #endif 43 #include <infiniband/verbs.h> 44 #ifdef PEDANTIC 45 #pragma GCC diagnostic error "-Wpedantic" 46 #endif 47 48 #include <rte_ethdev.h> 49 50 #include "mlx5.h" 51 #include "mlx5_rxtx.h" 52 #include "mlx5_utils.h" 53 54 /** 55 * DPDK callback to enable promiscuous mode. 56 * 57 * @param dev 58 * Pointer to Ethernet device structure. 59 */ 60 void 61 mlx5_promiscuous_enable(struct rte_eth_dev *dev) 62 { 63 struct priv *priv = dev->data->dev_private; 64 int ret; 65 66 dev->data->promiscuous = 1; 67 if (priv->isolated) { 68 DRV_LOG(WARNING, 69 "port %u cannot enable promiscuous mode" 70 " in flow isolation mode", 71 dev->data->port_id); 72 return; 73 } 74 ret = mlx5_traffic_restart(dev); 75 if (ret) 76 DRV_LOG(ERR, "port %u cannot enable promiscuous mode: %s", 77 dev->data->port_id, strerror(rte_errno)); 78 } 79 80 /** 81 * DPDK callback to disable promiscuous mode. 82 * 83 * @param dev 84 * Pointer to Ethernet device structure. 85 */ 86 void 87 mlx5_promiscuous_disable(struct rte_eth_dev *dev) 88 { 89 int ret; 90 91 dev->data->promiscuous = 0; 92 ret = mlx5_traffic_restart(dev); 93 if (ret) 94 DRV_LOG(ERR, "port %u cannot disable promiscuous mode: %s", 95 dev->data->port_id, strerror(rte_errno)); 96 } 97 98 /** 99 * DPDK callback to enable allmulti mode. 100 * 101 * @param dev 102 * Pointer to Ethernet device structure. 103 */ 104 void 105 mlx5_allmulticast_enable(struct rte_eth_dev *dev) 106 { 107 struct priv *priv = dev->data->dev_private; 108 int ret; 109 110 dev->data->all_multicast = 1; 111 if (priv->isolated) { 112 DRV_LOG(WARNING, 113 "port %u cannot enable allmulticast mode" 114 " in flow isolation mode", 115 dev->data->port_id); 116 return; 117 } 118 ret = mlx5_traffic_restart(dev); 119 if (ret) 120 DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s", 121 dev->data->port_id, strerror(rte_errno)); 122 } 123 124 /** 125 * DPDK callback to disable allmulti mode. 126 * 127 * @param dev 128 * Pointer to Ethernet device structure. 129 */ 130 void 131 mlx5_allmulticast_disable(struct rte_eth_dev *dev) 132 { 133 int ret; 134 135 dev->data->all_multicast = 0; 136 ret = mlx5_traffic_restart(dev); 137 if (ret) 138 DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s", 139 dev->data->port_id, strerror(rte_errno)); 140 } 141