| 156 | } |
| 157 | |
| 158 | static int |
| 159 | fs_eth_dev_create(struct rte_vdev_device *vdev) |
| 160 | { |
| 161 | struct rte_eth_dev *dev; |
| 162 | struct rte_ether_addr *mac; |
| 163 | struct fs_priv *priv; |
| 164 | struct sub_device *sdev; |
| 165 | const char *params; |
| 166 | unsigned int socket_id; |
| 167 | uint8_t i; |
| 168 | int ret; |
| 169 | |
| 170 | dev = NULL; |
| 171 | priv = NULL; |
| 172 | socket_id = rte_socket_id(); |
| 173 | INFO("Creating fail-safe device on NUMA socket %u", socket_id); |
| 174 | params = rte_vdev_device_args(vdev); |
| 175 | if (params == NULL) { |
| 176 | ERROR("This PMD requires sub-devices, none provided"); |
| 177 | return -1; |
| 178 | } |
| 179 | dev = rte_eth_vdev_allocate(vdev, sizeof(*priv)); |
| 180 | if (dev == NULL) { |
| 181 | ERROR("Unable to allocate rte_eth_dev"); |
| 182 | return -1; |
| 183 | } |
| 184 | priv = PRIV(dev); |
| 185 | priv->data = dev->data; |
| 186 | priv->rxp = FS_RX_PROXY_INIT; |
| 187 | dev->dev_ops = &failsafe_ops; |
| 188 | dev->data->mac_addrs = &PRIV(dev)->mac_addrs[0]; |
| 189 | dev->data->dev_link = eth_link; |
| 190 | PRIV(dev)->nb_mac_addr = 1; |
| 191 | TAILQ_INIT(&PRIV(dev)->flow_list); |
| 192 | dev->rx_pkt_burst = (eth_rx_burst_t)&failsafe_rx_burst; |
| 193 | dev->tx_pkt_burst = (eth_tx_burst_t)&failsafe_tx_burst; |
| 194 | ret = fs_sub_device_alloc(dev, params); |
| 195 | if (ret) { |
| 196 | ERROR("Could not allocate sub_devices"); |
| 197 | goto free_dev; |
| 198 | } |
| 199 | ret = failsafe_args_parse(dev, params); |
| 200 | if (ret) |
| 201 | goto free_subs; |
| 202 | ret = rte_eth_dev_owner_new(&priv->my_owner.id); |
| 203 | if (ret) { |
| 204 | ERROR("Failed to get unique owner identifier"); |
| 205 | goto free_args; |
| 206 | } |
| 207 | snprintf(priv->my_owner.name, sizeof(priv->my_owner.name), |
| 208 | FAILSAFE_OWNER_NAME); |
| 209 | DEBUG("Failsafe port %u owner info: %s_%016"PRIX64, dev->data->port_id, |
| 210 | priv->my_owner.name, priv->my_owner.id); |
| 211 | ret = rte_eth_dev_callback_register(RTE_ETH_ALL, RTE_ETH_EVENT_NEW, |
| 212 | failsafe_eth_new_event_callback, |
| 213 | dev); |
| 214 | if (ret) { |
| 215 | ERROR("Failed to register NEW callback"); |
no test coverage detected