VirtualBox

Ignore:
Timestamp:
Apr 17, 2009 6:59:16 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
46057
Message:

#2954: Dynamic add/remove for virtual adapters. Moved all adapter-related code to vboxnetadp.ko

File:
1 edited

Legend:

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

    r18706 r18973  
    2828#include <linux/etherdevice.h>
    2929#include <linux/rtnetlink.h>
     30#include <linux/miscdevice.h>
    3031
    3132#define LOG_GROUP LOG_GROUP_NET_FLT_DRV
     
    157158static VBOXNETFLTGLOBALS g_VBoxNetFltGlobals;
    158159
    159 
    160 /*
    161  * NetAdp-related part
    162  */
    163 
    164 #define VBOX_NETADP_NAME "vboxnet%d"
    165 
    166 struct net_device *g_pNetDev;
    167 
    168 struct VBoxNetAdpPriv
    169 {
    170     struct net_device_stats Stats;
    171 };
    172 typedef struct VBoxNetAdpPriv VBOXNETADPPRIV;
    173 typedef VBOXNETADPPRIV *PVBOXNETADPPRIV;
    174 
    175 static int vboxNetAdpOpen(struct net_device *pNetDev)
    176 {
    177     netif_start_queue(pNetDev);
    178     printk("vboxNetAdpOpen returns 0\n");
    179     return 0;
    180 }
    181 
    182 static int vboxNetAdpStop(struct net_device *pNetDev)
    183 {
    184     netif_stop_queue(pNetDev);
    185     return 0;
    186 }
    187 
    188 static int vboxNetAdpXmit(struct sk_buff *pSkb, struct net_device *pNetDev)
    189 {
    190     PVBOXNETADPPRIV 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 
    202 struct net_device_stats *vboxNetAdpGetStats(struct net_device *pNetDev)
    203 {
    204     PVBOXNETADPPRIV pPriv = netdev_priv(pNetDev);
    205     return &pPriv->Stats;
    206 }
    207 
    208 /* Currently not referenced in vboxNetAdpNetDevInit
    209 static int vboxNetAdpValidateAddr(struct net_device *dev)
    210 {
    211     Log(("vboxNetAdpValidateAddr: %02x:%02x:%02x:%02x:%02x:%02x\n",
    212          dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
    213          dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]));
    214     return -EADDRNOTAVAIL;
    215 } */
    216 
    217 static void vboxNetAdpNetDevInit(struct net_device *pNetDev)
    218 {
    219     PVBOXNETADPPRIV pPriv;
    220 
    221     ether_setup(pNetDev);
    222     /// @todo Use Sun vendor id
    223     memcpy(pNetDev->dev_addr, "\0vbnet", ETH_ALEN);
    224     Log(("vboxNetAdpNetDevInit: pNetDev->dev_addr = %.6Rhxd\n", pNetDev->dev_addr));
    225     pNetDev->open = vboxNetAdpOpen;
    226     pNetDev->stop = vboxNetAdpStop;
    227     pNetDev->hard_start_xmit = vboxNetAdpXmit;
    228     pNetDev->get_stats = vboxNetAdpGetStats;
    229     //pNetDev->validate_addr = vboxNetAdpValidateAddr;
    230 /*    pNetDev-> = vboxNetAdp;
    231     pNetDev-> = vboxNetAdp;
    232     pNetDev-> = vboxNetAdp;
    233     pNetDev-> = vboxNetAdp;
    234     pNetDev-> = vboxNetAdp;*/
    235 
    236     pPriv = netdev_priv(pNetDev);
    237     memset(pPriv, 0, sizeof(*pPriv));
    238 }
    239 
    240 static int vboxNetAdpRegisterNetDev(void)
    241 {
    242     int rc = VINF_SUCCESS;
    243     struct net_device *pNetDev;
    244 
    245     /* No need for private data. */
    246     pNetDev = alloc_netdev(sizeof(VBOXNETADPPRIV), VBOX_NETADP_NAME, vboxNetAdpNetDevInit);
    247     if (pNetDev)
    248     {
    249         int err = register_netdev(pNetDev);
    250         if (!err)
    251         {
    252             g_pNetDev = pNetDev;
    253             return VINF_SUCCESS;
    254         }
    255         free_netdev(pNetDev);
    256         rc = RTErrConvertFromErrno(err);
    257     }
    258     return rc;
    259 }
    260 
    261 static int vboxNetAdpUnregisterNetDev(void)
    262 {
    263     unregister_netdev(g_pNetDev);
    264     free_netdev(g_pNetDev);
    265     g_pNetDev = NULL;
    266     return VINF_SUCCESS;
    267 }
    268 
    269160/**
    270161 * Initialize module.
     
    301192        if (RT_SUCCESS(rc))
    302193        {
    303             rc = vboxNetAdpRegisterNetDev();
    304             if (RT_SUCCESS(rc))
    305             {
    306                 LogRel(("VBoxNetFlt: Successfully started.\n"));
    307                 return 0;
    308             }
    309             else
    310                 LogRel(("VBoxNetFlt: failed to register device (rc=%d)\n", rc));
     194            LogRel(("VBoxNetFlt: Successfully started.\n"));
     195            return 0;
    311196        }
    312197        else
     
    336221     * Undo the work done during start (in reverse order).
    337222     */
    338     rc = vboxNetAdpUnregisterNetDev();
    339     AssertRC(rc);
    340223    rc = vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltGlobals);
    341224    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