VirtualBox

Changeset 16509 in vbox


Ignore:
Timestamp:
Feb 4, 2009 11:26:01 AM (16 years ago)
Author:
vboxsync
Message:

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

Location:
trunk/src/VBox
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp

    r16485 r16509  
    361361                 "                            [-floppy disabled|empty|<uuid>|\n"
    362362                 "                                     <filename>|host:<drive>]\n"
     363#ifdef RT_OS_LINUX
     364                 "                            [-nic<1-N> none|null|nat|hostif|intnet|hostonly]\n"
     365#else /* !RT_OS_LINUX */
    363366                 "                            [-nic<1-N> none|null|nat|hostif|intnet]\n"
     367#endif /* !RT_OS_LINUX */
    364368                 "                            [-nictype<1-N> Am79C970A|Am79C973"
    365369#ifdef VBOX_WITH_E1000
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r16052 r16509  
    699699                        break;
    700700                    }
     701                    case NetworkAttachmentType_HostOnly:
     702                    {
     703                        if (details == VMINFO_MACHINEREADABLE)
     704                        {
     705                            strAttachment = "hostonly";
     706                        }
     707                        else
     708                            strAttachment = "Host-only Network";
     709                        break;
     710                    }
    701711                    default:
    702712                        strAttachment = "unknown";
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp

    r16491 r16509  
    13881388                    CHECK_ERROR_RET(nic, AttachToInternalNetwork(), 1);
    13891389                }
     1390#ifdef RT_OS_LINUX
     1391                else if (strcmp(nics[n], "hostonly") == 0)
     1392                {
     1393                    CHECK_ERROR_RET(nic, COMSETTER(Enabled) (TRUE), 1);
     1394                    CHECK_ERROR_RET(nic, AttachToHostOnlyNetwork(), 1);
     1395                }
     1396#endif /* RT_OS_LINUX */
    13901397                else
    13911398                {
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp

    r16469 r16509  
    34213421    mNetworkAttachmentTypes [KNetworkAttachmentType_Internal] =
    34223422        tr ("Internal Network", "NetworkAttachmentType");
     3423    mNetworkAttachmentTypes [KNetworkAttachmentType_HostOnly] =
     3424        tr ("Host-only Network", "NetworkAttachmentType");
    34233425
    34243426    mClipboardTypes [KClipboardMode_Disabled] =
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxVMSettingsNetwork.cpp

    r16112 r16509  
    143143        case KNetworkAttachmentType_Internal:
    144144            mAdapter.AttachToInternalNetwork();
     145            break;
     146        case KNetworkAttachmentType_HostOnly:
     147            mAdapter.AttachToHostOnlyNetwork();
    145148            break;
    146149        default:
     
    352355    mCbNAType->setItemData (3,
    353356        mCbNAType->itemText(3), Qt::ToolTipRole);
     357#ifdef RT_OS_LINUX
     358    mCbNAType->insertItem (4,
     359        vboxGlobal().toString (KNetworkAttachmentType_HostOnly));
     360    mCbNAType->setItemData (4,
     361        mCbNAType->itemText(4), Qt::ToolTipRole);
     362#endif /* RT_OS_LINUX */
    354363    /* Set the old value */
    355364    mCbNAType->setCurrentIndex (currentAttachment);
  • 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);
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r16246 r16509  
    15981598            }
    15991599
     1600            case NetworkAttachmentType_HostOnly:
     1601            {
     1602                if (fSniffer)
     1603                {
     1604                    rc = CFGMR3InsertNode(pLunL0, "AttachedDriver", &pLunL0);   RC_CHECK();
     1605                }
     1606                else
     1607                {
     1608                    rc = CFGMR3InsertNode(pInst, "LUN#0", &pLunL0);             RC_CHECK();
     1609                }
     1610
     1611                rc = CFGMR3InsertString(pLunL0, "Driver", "IntNet");            RC_CHECK();
     1612                rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg);                 RC_CHECK();
     1613                rc = CFGMR3InsertString(pCfg, "Trunk", "vboxnet0");             RC_CHECK();
     1614                rc = CFGMR3InsertInteger(pCfg, "TrunkType", kIntNetTrunkType_NetFlt); RC_CHECK();
     1615                rc = CFGMR3InsertString(pCfg, "Network", "HostInterfaceNetworking-vboxnet0"); RC_CHECK();
     1616                break;
     1617            }
     1618
    16001619            default:
    16011620                AssertMsgFailed(("should not get here!\n"));
  • trunk/src/VBox/Main/NetworkAdapterImpl.cpp

    r15708 r16509  
    780780}
    781781
     782STDMETHODIMP NetworkAdapter::AttachToHostOnlyNetwork()
     783{
     784    AutoCaller autoCaller (this);
     785    CheckComRCReturnRC (autoCaller.rc());
     786
     787    /* the machine needs to be mutable */
     788    Machine::AutoMutableStateDependency adep (mParent);
     789    CheckComRCReturnRC (adep.rc());
     790
     791    AutoWriteLock alock (this);
     792
     793    /* don't do anything if we're already host interface attached */
     794    if (mData->mAttachmentType != NetworkAttachmentType_HostOnly)
     795    {
     796        mData.backup();
     797
     798        /* first detach the current attachment */
     799        detach();
     800
     801        mData->mAttachmentType = NetworkAttachmentType_HostOnly;
     802
     803        /* leave the lock before informing callbacks */
     804        alock.unlock();
     805
     806        mParent->onNetworkAdapterChange (this);
     807    }
     808
     809    return S_OK;
     810}
     811
    782812STDMETHODIMP NetworkAdapter::Detach()
    783813{
     
    910940    }
    911941    else
     942    if (!(attachmentNode = aAdapterNode.findKey ("HostOnlyNetwork")).isNull())
     943    {
     944        /* Host Interface Networking */
     945        rc = AttachToHostOnlyNetwork();
     946        CheckComRCReturnRC (rc);
     947    }
     948    else
    912949    {
    913950        /* Adapter has no children */
     
    10011038            break;
    10021039        }
     1040        case NetworkAttachmentType_HostOnly:
     1041        {
     1042            Key attachmentNode = aAdapterNode.createKey ("HostOnlyNetwork");
     1043            break;
     1044        }
    10031045        default:
    10041046        {
     
    11531195        {
    11541196            mData->mInternalNetwork.setNull();
     1197            break;
     1198        }
     1199        case NetworkAttachmentType_HostOnly:
     1200        {
    11551201            break;
    11561202        }
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r16503 r16509  
    1022610226  <enum
    1022710227    name="NetworkAttachmentType"
    10228     uuid="8730d899-d036-4925-bc63-e58f3486f4bf"
     10228    uuid="64e770dc-dd1d-4879-9f12-5bd6bc879b78"
    1022910229  >
    1023010230    <desc>
     
    1023810238    <const name="HostInterface"         value="2"/>
    1023910239    <const name="Internal"              value="3"/>
     10240    <const name="HostOnly"              value="4"/>
    1024010241  </enum>
    1024110242
     
    1025910260  <interface
    1026010261     name="INetworkAdapter" extends="$unknown"
    10261      uuid="a876d9b1-68d9-43b1-9c68-ddea0a473663"
     10262     uuid="4a1ee64e-6c5f-47dd-acfa-f834d7cb74fb"
    1026210263     wsmap="managed"
    1026310264     >
     
    1035610357      <desc>
    1035710358        Attach the network adapter to an internal network.
     10359      </desc>
     10360    </method>
     10361
     10362    <method name="attachToHostOnlyNetwork">
     10363      <desc>
     10364        Attach the network adapter to the host-only network.
    1035810365      </desc>
    1035910366    </method>
  • trunk/src/VBox/Main/include/NetworkAdapterImpl.h

    r15708 r16509  
    129129    STDMETHOD(AttachToHostInterface)();
    130130    STDMETHOD(AttachToInternalNetwork)();
     131    STDMETHOD(AttachToHostOnlyNetwork)();
    131132    STDMETHOD(Detach)();
    132133
  • trunk/src/VBox/Main/xml/VirtualBox-settings-common.xsd

    r15968 r16509  
    605605      </xsd:complexType>
    606606    </xsd:element>
     607    <xsd:element name="HostOnlyNetwork">
     608      <xsd:complexType>
     609      </xsd:complexType>
     610    </xsd:element>
    607611  </xsd:choice>
    608612  <xsd:attribute name="type" type="TNetworkAdapterType" default="Am79C970A"/>
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