MCPcopy Create free account
hub / github.com/F-Stack/f-stack / tap_mac_set

Function tap_mac_set

dpdk/drivers/net/tap/rte_eth_tap.c:1371–1431  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1369}
1370
1371static int
1372tap_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 }

Callers

nothing calls this directly

Calls 6

rte_is_zero_ether_addrFunction · 0.85
tap_ioctlFunction · 0.85
rte_is_same_ether_addrFunction · 0.85
tap_flow_implicit_createFunction · 0.85
rte_memcpyFunction · 0.50

Tested by

no test coverage detected