| | 1340 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) |
| | 1341 | /** |
| | 1342 | * Helper for detecting TAP devices. |
| | 1343 | */ |
| | 1344 | static bool vboxNetFltIsTapDevice(PVBOXNETFLTINS pThis, struct net_device *pDev) |
| | 1345 | { |
| | 1346 | if (pDev->ethtool_ops && pDev->ethtool_ops->get_drvinfo) |
| | 1347 | { |
| | 1348 | struct ethtool_drvinfo Info; |
| | 1349 | |
| | 1350 | memset(&Info, 0, sizeof(Info)); |
| | 1351 | Info.cmd = ETHTOOL_GDRVINFO; |
| | 1352 | pDev->ethtool_ops->get_drvinfo(pDev, &Info); |
| | 1353 | Log3(("vboxNetFltIsTapDevice: driver=%s version=%s bus_info=%s\n", |
| | 1354 | Info.driver, Info.version, Info.bus_info)); |
| | 1355 | |
| | 1356 | return !strncmp(Info.driver, "tun", 4) |
| | 1357 | && !strncmp(Info.bus_info, "tap", 4); |
| | 1358 | } |
| | 1359 | |
| | 1360 | return false; |
| | 1361 | } |
| | 1362 | |
| | 1363 | /** |
| | 1364 | * Helper for updating the link state of TAP devices. |
| | 1365 | * Only TAP devices are affected. |
| | 1366 | */ |
| | 1367 | static void vboxNetFltSetTapLinkState(PVBOXNETFLTINS pThis, struct net_device *pDev, bool fLinkUp) |
| | 1368 | { |
| | 1369 | if (vboxNetFltIsTapDevice(pThis, pDev)) |
| | 1370 | { |
| | 1371 | Log3(("vboxNetFltSetTapLinkState: bringing %s tap device link state\n", |
| | 1372 | fLinkUp ? "up" : "down")); |
| | 1373 | netif_tx_lock_bh(pDev); |
| | 1374 | if (fLinkUp) |
| | 1375 | netif_carrier_on(pDev); |
| | 1376 | else |
| | 1377 | netif_carrier_off(pDev); |
| | 1378 | netif_tx_unlock_bh(pDev); |
| | 1379 | } |
| | 1380 | } |
| | 1381 | #else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) */ |
| | 1382 | DECLINLINE(void) vboxNetFltSetTapLinkState(PVBOXNETFLTINS pThis, struct net_device *pDev, bool fLinkUp) |
| | 1383 | { |
| | 1384 | /* Nothing to do for pre-2.6.36 kernels. */ |
| | 1385 | } |
| | 1386 | #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) */ |
| | 1387 | |