VirtualBox

Changeset 18973 in vbox for trunk


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

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Config.kmk

    r18963 r18973  
    487487 VBOX_WITH_NETFLT = 1
    488488 VBOX_SOLARIS_NSL_RESOLVED = 1
    489  if1of ($(KBUILD_TARGET), darwin solaris)
     489 if1of ($(KBUILD_TARGET), darwin solaris linux)
    490490  VBOX_WITH_NETADP = 1
    491491 endif
  • trunk/src/VBox/HostDrivers/Makefile.kmk

    r18059 r18973  
    3535  endif
    3636 endif
    37  if1of ($(KBUILD_TARGET), darwin solaris)
     37 if1of ($(KBUILD_TARGET), darwin solaris linux)
    3838  ifdef VBOX_WITH_NETADP
    3939   include $(PATH_SUB_CURRENT)/VBoxNetAdp/Makefile.kmk
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/Makefile.kmk

    r17256 r18973  
    2424
    2525
    26 if1of ($(KBUILD_TARGET), solaris darwin)
     26if1of ($(KBUILD_TARGET), solaris darwin linux)
    2727#
    2828# VBoxNetAdp - Virtual Network Adapter
     
    3434VBoxNetAdp_INST = $(INST_VBOXNETADP)$(if $(eq $(KBUILD_TARGET),darwin),Contents/MacOS/)
    3535VBoxNetAdp_NAME.solaris     = vboxnet
     36VBoxNetAdp_NAME.linux       = vboxnetadp
     37VBoxNetAdp_NOINST.linux     = true
    3638VBoxNetAdp_DEPS.solaris    += $(VBOX_SVN_REV_KMK)
    3739VBoxNetAdp_DEFS             = IN_RT_R0 VBOX_SVN_REV=$(VBOX_SVN_REV) IN_SUP_STATIC
     40VBoxNetAdp_DEFS.linux       = KBUILD_MODNAME=KBUILD_STR\(vboxnetadp\) KBUILD_BASENAME=KBUILD_STR\(vboxnetadp\) MODULE
    3841VBoxNetAdp_LDFLAGS.darwin   = -v -Wl,-whyload -Wl,-v -Wl,-whatsloaded
    3942VBoxNetAdp_LDFLAGS.solaris += -N misc/gld -N drv/vboxdrv
     43VBoxNetAdp_INCS.linux   := \
     44        $(PATH_ROOT)/src/VBox/Runtime/r0drv/linux
    4045VBoxNetAdp_INCS             = \
    4146        .
     
    4449VBoxNetAdp_SOURCES.solaris  = \
    4550        solaris/VBoxNetAdp-solaris.c
     51VBoxNetAdp_SOURCES.linux   = \
     52        linux/VBoxNetAdp-linux.c \
     53        VBoxNetAdp.c
    4654VBoxNetAdp_SOURCES          =
    4755#VBoxNetAdp_SOURCES          = \
     
    8290endif # darwin
    8391
     92ifeq ($(KBUILD_TARGET),linux)
     93 #
     94 # Install source files for compliation on Linux.
     95 # files_vboxnetadp defines VBOX_VBOXNETADP_SOURCES.
     96 #
     97 include $(PATH_SUB_CURRENT)/linux/files_vboxnetadp
     98 INSTALLS += VBoxNetAdp-src VBoxNetAdp-sh
     99 VBoxNetAdp-src_INST    = bin/src/vboxnetadp/
     100 VBoxNetAdp-src_MODE    = a+r,u+w
     101 VBoxNetAdp-src_SOURCES = $(subst ",,$(VBOX_VBOXNETADP_SOURCES)) #"
     102 VBoxNetAdp-src_SOURCES+= \
     103        $(if $(VBOX_OSE),,\
     104          $(PATH_VBoxNetAdp-src)/dkms.conf) \
     105        $(PATH_VBoxNetAdp-src)/Makefile
     106 VBoxNetAdp-src_CLEAN   = \
     107        $(PATH_VBoxNetAdp-src)/dkms.conf \
     108        $(PATH_VBoxNetAdp-src)/Makefile \
     109        $(PATH_TARGET)/VBoxNetAdp-src-1.dep
     110
     111 VBoxNetAdp-sh_INST    = bin/src/vboxnetadp/
     112 VBoxNetAdp-sh_MODE    = a+rx,u+w
     113 VBoxNetAdp-sh_SOURCES = \
     114        $(PATH_VBoxNetAdp-sh)/build_in_tmp \
     115        $(if $(VBOX_OSE),,\
     116          $(PATH_ROOT)/src/VBox/HostDrivers/linux/do_Module.symvers)
     117 VBoxNetAdp-sh_CLEAN   = $(PATH_VBoxNetAdp-sh)/build_in_tmp
     118
     119
     120includedep $(PATH_TARGET)/VBoxNetAdp-src-1.dep
     121$$(PATH_VBoxNetAdp-src)/Makefile: \
     122                $(PATH_SUB_CURRENT)/linux/Makefile \
     123                $$(if $$(eq $$(VBoxNetAdp/linux/Makefile_VBOX_HARDENED),$$(VBOX_WITH_HARDENING)),,FORCE) \
     124                | $$(dir $$@)
     125ifndef VBOX_WITH_HARDENING
     126        $(QUIET)$(SED) -e "s;-DVBOX_WITH_HARDENING;;g" --output $@ $<
     127else
     128        $(QUIET)$(CP) -f $< $@
     129endif
     130        %$(QUIET2)$(RM) -f -- $(PATH_TARGET)/VBoxNetAdp-src-1.dep
     131        %$(QUIET2)$(APPEND) '$(PATH_TARGET)/VBoxNetAdp-src-1.dep' 'VBoxNetAdp/linux/Makefile_VBOX_HARDENED=$(VBOX_WITH_HARDENING)'
     132
     133## Scripts needed for building the kernel modules
     134
     135$$(PATH_VBoxNetAdp-sh)/build_in_tmp: \
     136                $(PATH_ROOT)/src/VBox/HostDrivers/linux/build_in_tmp \
     137                $(VBOX_VERSION_STAMP) \
     138                | $$(dir $$@)
     139        $(call MSG_TOOL,Creating,,$@)
     140        $(QUIET)$(SED) -e "s;_VERSION_;${VBOX_VERSION_STRING};g; s;_MODULE_;vboxnetadp;g" --output $@ $<
     141        $(QUIET)chmod 0755 $@
     142
     143$$(PATH_VBoxNetAdp-src)/dkms.conf: \
     144                $(PATH_SUB_CURRENT)/linux/dkms.conf \
     145                $(VBOX_VERSION_STAMP) \
     146                | $$(dir $$@)
     147        $(call MSG_TOOL,Creating,,$@)
     148        $(QUIET)$(SED) -e "s;_VERSION_;${VBOX_VERSION_STRING};g" --output $@ $<
     149
     150endif # linux
     151
    84152include $(KBUILD_PATH)/subfooter.kmk
    85153
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c

    r17198 r18973  
    3636#include "VBoxNetAdpInternal.h"
    3737
    38 #include <VBox/sup.h>
    3938#include <VBox/log.h>
    4039#include <VBox/err.h>
     40#include <iprt/string.h>
     41
     42#ifdef VBOXANETADP_DO_NOT_USE_NETFLT
     43
     44#include <VBox/sup.h>
    4145#include <iprt/assert.h>
    42 #include <iprt/string.h>
    4346#include <iprt/spinlock.h>
    4447#include <iprt/uuid.h>
     
    11191122}
    11201123
     1124#else /* !VBOXANETADP_DO_NOT_USE_NETFLT */
     1125
     1126
     1127VBOXNETADP g_aAdapters[VBOXNETADP_MAX_INSTANCES];
     1128
     1129
     1130
     1131/**
     1132 * Generate a suitable MAC address.
     1133 *
     1134 * @param   pThis       The instance.
     1135 * @param   pMac        Where to return the MAC address.
     1136 */
     1137DECLHIDDEN(void) vboxNetAdpComposeMACAddress(PVBOXNETADP pThis, PRTMAC pMac)
     1138{
     1139    /* Use a locally administered version of the OUI we use for the guest NICs. */
     1140    pMac->au8[0] = 0x08 | 2;
     1141    pMac->au8[1] = 0x00;
     1142    pMac->au8[2] = 0x27;
     1143
     1144    pMac->au8[3] = 0; /* pThis->uUnit >> 16; */
     1145    pMac->au8[4] = 0; /* pThis->uUnit >> 8; */
     1146    pMac->au8[5] = pThis->uUnit;
     1147}
     1148
     1149int vboxNetAdpCreate (PVBOXNETADP *ppNew)
     1150{
     1151    int rc;
     1152    unsigned i;
     1153    for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
     1154    {
     1155        PVBOXNETADP pThis = &g_aAdapters[i];
     1156
     1157        if (ASMAtomicCmpXchgU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Transitional, kVBoxNetAdpState_Invalid))
     1158        {
     1159            RTMAC Mac;
     1160            /* Found an empty slot -- use it. */
     1161            Log(("vboxNetAdpCreate: found empty slot: %d\n", i));
     1162            vboxNetAdpComposeMACAddress(pThis, &Mac);
     1163            rc = vboxNetAdpOsCreate(pThis, &Mac);
     1164            Log(("vboxNetAdpCreate: pThis=%p pThis->szName=%p\n", pThis, pThis->szName));
     1165            if (RT_SUCCESS(rc))
     1166            {
     1167                *ppNew = pThis;
     1168                ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Active);
     1169            }
     1170            else
     1171            {
     1172                ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Invalid);
     1173                Log(("vboxNetAdpCreate: vboxNetAdpOsCreate failed with '%Rrc'.\n", rc));
     1174            }
     1175            Log2(("VBoxNetAdpCreate: Created %s\n", g_aAdapters[i].szName));
     1176            for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
     1177                Log2(("VBoxNetAdpCreate: Scanning entry: state=%d name=%s\n", g_aAdapters[i].enmState, g_aAdapters[i].szName));
     1178            return rc;
     1179        }
     1180    }
     1181    Log(("vboxNetAdpCreate: no empty slots!\n"));
     1182
     1183    /* All slots in adapter array are busy. */
     1184    return VERR_OUT_OF_RESOURCES;
     1185}
     1186
     1187int vboxNetAdpDestroy (PVBOXNETADP pThis)
     1188{
     1189    int rc = VINF_SUCCESS;
     1190
     1191    if (!ASMAtomicCmpXchgU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Transitional, kVBoxNetAdpState_Active))
     1192        return VERR_INTNET_FLT_IF_BUSY;
     1193
     1194    vboxNetAdpOsDestroy(pThis);
     1195
     1196    ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Invalid);
     1197
     1198    return rc;
     1199}
     1200
     1201int  vboxNetAdpInit(void)
     1202{
     1203    unsigned i;
     1204    PVBOXNETADP pVboxnet0;
     1205    /*
     1206     * Init common members and call OS-specific init.
     1207     */
     1208    for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
     1209    {
     1210        g_aAdapters[i].enmState = kVBoxNetAdpState_Invalid;
     1211        g_aAdapters[i].uUnit    = i;
     1212        vboxNetAdpOsInit(&g_aAdapters[i]);
     1213    }
     1214
     1215    /* Create vboxnet0 */
     1216    return vboxNetAdpCreate(&pVboxnet0);
     1217}
     1218
     1219/**
     1220 * Finds an adapter by its name.
     1221 *
     1222 * @returns Pointer to the instance by the given name. NULL if not found.
     1223 * @param   pGlobals        The globals.
     1224 * @param   pszName         The name of the instance.
     1225 */
     1226PVBOXNETADP vboxNetAdpFindByName(const char *pszName)
     1227{
     1228    unsigned i;
     1229
     1230    for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
     1231    {
     1232        PVBOXNETADP pThis = &g_aAdapters[i];
     1233        Log2(("VBoxNetAdp: Scanning entry: state=%d name=%s\n", pThis->enmState, pThis->szName));
     1234        if (strncmp(pThis->szName, pszName, VBOXNETADP_MAX_NAME_LEN) == 0)
     1235            if (ASMAtomicReadU32((uint32_t volatile *)&pThis->enmState) == kVBoxNetAdpState_Active)
     1236                return pThis;
     1237    }
     1238    return NULL;
     1239}
     1240
     1241void vboxNetAdpShutdown(void)
     1242{
     1243    unsigned i;
     1244
     1245    /* Remove virtual adapters */
     1246    for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
     1247        vboxNetAdpDestroy(&g_aAdapters[i]);
     1248}
     1249#endif /* !VBOXANETADP_DO_NOT_USE_NETFLT */
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdpInternal.h

    r18863 r18973  
    123123#endif /* !VBOXANETADP_DO_NOT_USE_NETFLT */
    124124    /** Corresponds to the digit at the end of device name. */
    125     uint8_t           uUnit;
     125    uint32_t          uUnit;
    126126
    127127    union
     
    141141            /** Protocol families attached to this adapter. */
    142142            protocol_family_t aAttachedFamilies[VBOXNETADP_MAX_FAMILIES];
     143            /** @} */
     144# elif defined(RT_OS_LINUX)
     145            /** @name Darwin instance data.
     146             * @{ */
     147            /** Pointer to Linux network device structure. */
     148            struct net_device *pNetDev;
     149            /** @} */
    143150# else
    144151# error PORTME
     
    154161# endif
    155162#elif defined(RT_OS_LINUX)
    156         uint8_t abPadding[320];
     163        uint8_t abPadding[64];
    157164#else
    158165        uint8_t abPadding[64];
     
    165172typedef VBOXNETADP *PVBOXNETADP;
    166173
     174DECLHIDDEN(int) vboxNetAdpInit(void);
     175DECLHIDDEN(void) vboxNetAdpShutdown(void);
     176DECLHIDDEN(int) vboxNetAdpCreate (PVBOXNETADP *ppNew);
     177DECLHIDDEN(int) vboxNetAdpDestroy(PVBOXNETADP pThis);
     178DECLHIDDEN(PVBOXNETADP) vboxNetAdpFindByName(const char *pszName);
     179
    167180#ifdef VBOXANETADP_DO_NOT_USE_NETFLT
    168181/**
     
    288301DECLHIDDEN(int) vboxNetAdpOsConnectIt(PVBOXNETADP pThis);
    289302
     303/** @} */
     304#endif /* !VBOXANETADP_DO_NOT_USE_NETFLT */
     305
    290306/**
    291307 * This is called to perform OS-specific structure initializations.
     
    320336DECLHIDDEN(int) vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac);
    321337
    322 /** @} */
    323 #endif /* !VBOXANETADP_DO_NOT_USE_NETFLT */
    324338
    325339
  • 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);
  • trunk/src/VBox/HostDrivers/linux/Makefile

    r15909 r18973  
    3535            cp vboxnetflt/vboxnetflt.ko .; \
    3636        fi
     37        @if [ -d vboxnetadp ]; then \
     38            echo "*** Building 'vboxnetadp' module ***"; \
     39            $(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxnetadp; \
     40            cp vboxnetadp/vboxnetadp.ko .; \
     41        fi
    3742
    3843
     
    4247            $(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxnetflt install; \
    4348        fi
     49        @if [ -d vboxnetadp ]; then \
     50            $(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxnetadp install; \
     51        fi
    4452
    4553clean:
     
    4856            $(MAKE) -C vboxnetflt clean; \
    4957        fi
    50         rm -f vboxdrv.ko vboxnetflt.ko
     58        @if [ -d vboxnetadp ]; then \
     59            $(MAKE) -C vboxnetadp clean; \
     60        fi
     61        rm -f vboxdrv.ko vboxnetflt.ko vboxnetadp.ko
    5162
    5263load:
    53         @for module in vboxnetflt vboxdrv; do \
     64        @for module in vboxnetadp vboxnetflt vboxdrv; do \
    5465                if grep "^$$module " /proc/modules >/dev/null; then \
    5566                        echo "Removing previously installed $$module module"; \
     
    5768                fi; \
    5869        done
    59         @for module in vboxdrv vboxnetflt; do \
     70        @for module in vboxdrv vboxnetflt vboxnetadp; do \
    6071                if test -f $$module.ko; then \
    6172                        echo "Installing $$module module"; \
Note: See TracChangeset for help on using the changeset viewer.

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