VirtualBox

Ignore:
Timestamp:
Feb 4, 2009 11:26:01 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
42425
Message:

#2954 & #3569: Linux TAP driver is embedded to vboxnetflt. API, VBoxManage and VirtualBox now provide host-only network attachment on Linux.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r16183 r16509  
    158158
    159159
     160/*
     161 * TAP-related part
     162 */
     163
     164#define VBOX_TAP_NAME "vboxnet%d"
     165
     166struct net_device *g_pNetDev;
     167
     168struct VBoxTapPriv
     169{
     170    struct net_device_stats Stats;
     171};
     172typedef struct VBoxTapPriv VBOXTAPPRIV;
     173typedef VBOXTAPPRIV *PVBOXTAPPRIV;
     174
     175static int vboxTapOpen(struct net_device *pNetDev)
     176{
     177    netif_start_queue(pNetDev);
     178    printk("vboxTapOpen returns 0\n");
     179    return 0;
     180}
     181
     182static int vboxTapStop(struct net_device *pNetDev)
     183{
     184    netif_stop_queue(pNetDev);
     185    return 0;
     186}
     187
     188static int vboxTapXmit(struct sk_buff *pSkb, struct net_device *pNetDev)
     189{
     190    PVBOXTAPPRIV pPriv = netdev_priv(pNetDev);
     191
     192    /* Update the stats. */
     193    pPriv->Stats.tx_packets++;
     194    pPriv->Stats.tx_bytes += pSkb->len;
     195    /* Update transmission time stamp. */
     196    pNetDev->trans_start = jiffies;
     197    /* Nothing else to do, just free the sk_buff. */
     198    dev_kfree_skb(pSkb);
     199    return 0;
     200}
     201
     202struct net_device_stats *vboxTapGetStats(struct net_device *pNetDev)
     203{
     204    PVBOXTAPPRIV pPriv = netdev_priv(pNetDev);
     205    return &pPriv->Stats;
     206}
     207
     208static int vboxTapValidateAddr(struct net_device *dev)
     209{
     210    Log(("vboxTapValidateAddr: %02x:%02x:%02x:%02x:%02x:%02x\n",
     211         dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
     212         dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]));
     213    return -EADDRNOTAVAIL;
     214}
     215
     216static void vboxTapNetDevInit(struct net_device *pNetDev)
     217{
     218    PVBOXTAPPRIV pPriv;
     219
     220    ether_setup(pNetDev);
     221    /// @todo Use Sun vendor id
     222    memcpy(pNetDev->dev_addr, "\0vbnet", ETH_ALEN);
     223    Log(("vboxTapNetDevInit: pNetDev->dev_addr = %.6Rhxd\n", pNetDev->dev_addr));
     224    pNetDev->open = vboxTapOpen;
     225    pNetDev->stop = vboxTapStop;
     226    pNetDev->hard_start_xmit = vboxTapXmit;
     227    pNetDev->get_stats = vboxTapGetStats;
     228    //pNetDev->validate_addr = vboxTapValidateAddr;
     229/*    pNetDev-> = vboxTap;
     230    pNetDev-> = vboxTap;
     231    pNetDev-> = vboxTap;
     232    pNetDev-> = vboxTap;
     233    pNetDev-> = vboxTap;*/
     234
     235    pPriv = netdev_priv(pNetDev);
     236    memset(pPriv, 0, sizeof(*pPriv));
     237}
     238
     239static int vboxTapRegisterNetDev(void)
     240{
     241    int rc;
     242    struct net_device *pNetDev;
     243
     244    /* No need for private data. */
     245    pNetDev = alloc_netdev(sizeof(VBOXTAPPRIV), VBOX_TAP_NAME, vboxTapNetDevInit);
     246    if (pNetDev)
     247    {
     248        int err = register_netdev(pNetDev);
     249        if (!err)
     250        {
     251            g_pNetDev = pNetDev;
     252            return VINF_SUCCESS;
     253        }
     254        free_netdev(pNetDev);
     255        rc = RTErrConvertFromErrno(err);
     256    }
     257    return rc;
     258}
     259
     260static int vboxTapUnregisterNetDev(void)
     261{
     262    unregister_netdev(g_pNetDev);
     263    free_netdev(g_pNetDev);
     264    g_pNetDev = NULL;
     265    return VINF_SUCCESS;
     266}
     267
    160268/**
    161269 * Initialize module.
     
    192300        if (RT_SUCCESS(rc))
    193301        {
    194             LogRel(("VBoxNetFlt: Successfully started.\n"));
    195             return 0;
    196         }
    197 
    198         LogRel(("VBoxNetFlt: failed to initialize device extension (rc=%d)\n", rc));
     302            rc = vboxTapRegisterNetDev();
     303            if (RT_SUCCESS(rc))
     304            {
     305                LogRel(("VBoxNetFlt: Successfully started.\n"));
     306                return 0;
     307            }
     308            else
     309                LogRel(("VBoxNetFlt: failed to register device (rc=%d)\n", rc));
     310        }
     311        else
     312            LogRel(("VBoxNetFlt: failed to initialize device extension (rc=%d)\n", rc));
    199313        RTR0Term();
    200314    }
     
    221335     * Undo the work done during start (in reverse order).
    222336     */
     337    rc = vboxTapUnregisterNetDev();
     338    AssertRC(rc);
    223339    rc = vboxNetFltTryDeleteGlobals(&g_VBoxNetFltGlobals);
    224340    AssertRC(rc); NOREF(rc);
Note: See TracChangeset for help on using the changeset viewer.

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