| 1369 | } |
| 1370 | |
| 1371 | static int |
| 1372 | tap_mac_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) |
| 1373 | { |
| 1374 | struct pmd_internals *pmd = dev->data->dev_private; |
| 1375 | enum ioctl_mode mode = LOCAL_ONLY; |
| 1376 | struct ifreq ifr; |
| 1377 | int ret; |
| 1378 | |
| 1379 | if (pmd->type == ETH_TUNTAP_TYPE_TUN) { |
| 1380 | TAP_LOG(ERR, "%s: can't MAC address for TUN", |
| 1381 | dev->device->name); |
| 1382 | return -ENOTSUP; |
| 1383 | } |
| 1384 | |
| 1385 | if (rte_is_zero_ether_addr(mac_addr)) { |
| 1386 | TAP_LOG(ERR, "%s: can't set an empty MAC address", |
| 1387 | dev->device->name); |
| 1388 | return -EINVAL; |
| 1389 | } |
| 1390 | /* Check the actual current MAC address on the tap netdevice */ |
| 1391 | ret = tap_ioctl(pmd, SIOCGIFHWADDR, &ifr, 0, LOCAL_ONLY); |
| 1392 | if (ret < 0) |
| 1393 | return ret; |
| 1394 | if (rte_is_same_ether_addr( |
| 1395 | (struct rte_ether_addr *)&ifr.ifr_hwaddr.sa_data, |
| 1396 | mac_addr)) |
| 1397 | return 0; |
| 1398 | /* Check the current MAC address on the remote */ |
| 1399 | ret = tap_ioctl(pmd, SIOCGIFHWADDR, &ifr, 0, REMOTE_ONLY); |
| 1400 | if (ret < 0) |
| 1401 | return ret; |
| 1402 | if (!rte_is_same_ether_addr( |
| 1403 | (struct rte_ether_addr *)&ifr.ifr_hwaddr.sa_data, |
| 1404 | mac_addr)) |
| 1405 | mode = LOCAL_AND_REMOTE; |
| 1406 | ifr.ifr_hwaddr.sa_family = AF_LOCAL; |
| 1407 | rte_memcpy(ifr.ifr_hwaddr.sa_data, mac_addr, RTE_ETHER_ADDR_LEN); |
| 1408 | ret = tap_ioctl(pmd, SIOCSIFHWADDR, &ifr, 1, mode); |
| 1409 | if (ret < 0) |
| 1410 | return ret; |
| 1411 | rte_memcpy(&pmd->eth_addr, mac_addr, RTE_ETHER_ADDR_LEN); |
| 1412 | if (pmd->remote_if_index && !pmd->flow_isolate) { |
| 1413 | /* Replace MAC redirection rule after a MAC change */ |
| 1414 | ret = tap_flow_implicit_destroy(pmd, TAP_REMOTE_LOCAL_MAC); |
| 1415 | if (ret < 0) { |
| 1416 | TAP_LOG(ERR, |
| 1417 | "%s: Couldn't delete MAC redirection rule", |
| 1418 | dev->device->name); |
| 1419 | return ret; |
| 1420 | } |
| 1421 | ret = tap_flow_implicit_create(pmd, TAP_REMOTE_LOCAL_MAC); |
| 1422 | if (ret < 0) { |
| 1423 | TAP_LOG(ERR, |
| 1424 | "%s: Couldn't add MAC redirection rule", |
| 1425 | dev->device->name); |
| 1426 | return ret; |
| 1427 | } |
| 1428 | } |
nothing calls this directly
no test coverage detected