VirtualBox

Ticket #7649: netflt_tap.patch

File netflt_tap.patch, 2.3 KB (added by Aleksey Ilyushin, 14 years ago)
  • src/vboxhost/vboxnetflt/linux/VBoxNetFlt-linux.c

    old new  
    13371337    return fRc;
    13381338}
    13391339
     1340#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
     1341/**
     1342 * Helper for detecting TAP devices.
     1343 */
     1344static 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 */
     1367static 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) */
     1382DECLINLINE(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
    13401388/**
    13411389 * Internal worker for vboxNetFltLinuxNotifierCallback.
    13421390 *
     
    13781426#endif
    13791427
    13801428    /*
     1429     * If attaching to TAP interface we need to bring the link state up
     1430     * starting from 2.6.36 kernel.
     1431     */
     1432    vboxNetFltSetTapLinkState(pThis, pDev, true);
     1433
     1434    /*
    13811435     * Set indicators that require the spinlock. Be abit paranoid about racing
    13821436     * the device notification handle.
    13831437     */
     
    17411795
    17421796    if (fRegistered)
    17431797    {
     1798        vboxNetFltSetTapLinkState(pThis, pDev, false);
     1799
    17441800#ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    17451801        skb_queue_purge(&pThis->u.s.XmitQueue);
    17461802#endif

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy