1340
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
1342
* Helper for detecting TAP devices.
1344
static bool vboxNetFltIsTapDevice(PVBOXNETFLTINS pThis, struct net_device *pDev)
1346
if (pDev->ethtool_ops && pDev->ethtool_ops->get_drvinfo)
1348
struct ethtool_drvinfo Info;
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));
1356
return !strncmp(Info.driver, "tun", 4)
1357
&& !strncmp(Info.bus_info, "tap", 4);
1364
* Helper for updating the link state of TAP devices.
1365
* Only TAP devices are affected.
1367
static void vboxNetFltSetTapLinkState(PVBOXNETFLTINS pThis, struct net_device *pDev, bool fLinkUp)
1369
if (vboxNetFltIsTapDevice(pThis, pDev))
1371
Log3(("vboxNetFltSetTapLinkState: bringing %s tap device link state\n",
1372
fLinkUp ? "up" : "down"));
1373
netif_tx_lock_bh(pDev);
1375
netif_carrier_on(pDev);
1377
netif_carrier_off(pDev);
1378
netif_tx_unlock_bh(pDev);
1381
#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) */
1382
DECLINLINE(void) vboxNetFltSetTapLinkState(PVBOXNETFLTINS pThis, struct net_device *pDev, bool fLinkUp)
1384
/* Nothing to do for pre-2.6.36 kernels. */
1386
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) */
1341
1389
* Internal worker for vboxNetFltLinuxNotifierCallback.
1429
* If attaching to TAP interface we need to bring the link state up
1430
* starting from 2.6.36 kernel.
1432
vboxNetFltSetTapLinkState(pThis, pDev, true);
1381
1435
* Set indicators that require the spinlock. Be abit paranoid about racing
1382
1436
* the device notification handle.