VirtualBox

Changeset 75512 in vbox for trunk/src


Ignore:
Timestamp:
Nov 16, 2018 11:33:38 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
126670
Message:

Main/DHCPD: bugref:9288 Use new implementation of DHCP server.

Location:
trunk/src/VBox
Files:
13 edited

Legend:

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

    r72826 r75512  
    5252    OP_ADD = 1000,
    5353    OP_REMOVE,
    54     OP_MODIFY
     54    OP_MODIFY,
     55    OP_RESTART
    5556} OPCODE;
    5657
     
    319320
    320321    if(   enmCode != OP_REMOVE
     322       && enmCode != OP_RESTART
    321323       && GlobalDhcpOptions.empty()
    322324       && VmSlot2Options.empty())
     
    374376    }
    375377
    376     if(enmCode != OP_REMOVE)
     378    if (enmCode == OP_RESTART)
     379    {
     380        CHECK_ERROR(svr, Restart());
     381        if(FAILED(rc))
     382            return errorArgument("Failed to restart server");
     383    }
     384    else if (enmCode == OP_REMOVE)
     385    {
     386        CHECK_ERROR(a->virtualBox, RemoveDHCPServer(svr));
     387        if(FAILED(rc))
     388            return errorArgument("Failed to remove server");
     389    }
     390    else
    377391    {
    378392        if (pIp || pNetmask || pLowerIp || pUpperIp)
     
    425439        }
    426440    }
    427     else
    428     {
    429         CHECK_ERROR(a->virtualBox, RemoveDHCPServer(svr));
    430         if(FAILED(rc))
    431             return errorArgument("Failed to remove server");
    432     }
    433441
    434442    return RTEXITCODE_SUCCESS;
     
    448456    else if (strcmp(a->argv[0], "remove") == 0)
    449457        rcExit = handleOp(a, OP_REMOVE, 1);
     458    else if (strcmp(a->argv[0], "restart") == 0)
     459        rcExit = handleOp(a, OP_RESTART, 1);
    450460    else
    451461        rcExit = errorSyntax(USAGE_DHCPSERVER, "Invalid parameter '%s'", Utf8Str(a->argv[0]).c_str());
  • trunk/src/VBox/Main/Makefile.kmk

    r75435 r75512  
    7979        $(if $(VBOX_WITH_HGCM),VBOX_WITH_HGCM,) \
    8080        $(if $(VBOX_WITH_HOSTNETIF_API),VBOX_WITH_HOSTNETIF_API,) \
     81        $(if $(VBOX_WITH_DHCPD),VBOX_WITH_DHCPD,) \
    8182        $(if $(VBOX_WITH_LIVE_MIGRATION),VBOX_WITH_LIVE_MIGRATION,) \
    8283        $(if $(VBOX_WITH_MIDL_PROXY_STUB),VBOX_WITH_MIDL_PROXY_STUB,) \
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r75499 r75512  
    17911791  <interface
    17921792    name="IDHCPServer" extends="$unknown"
    1793     uuid="00c8f974-92c5-44a1-8f3f-702469fdd04b"
     1793    uuid="197717d2-a742-4966-a529-d1467e903feb"
    17941794    wsmap="managed"
    17951795    reservedMethods="2" reservedAttributes="6"
     
    19531953        <result name="E_FAIL">
    19541954          Failed to stop the process.
     1955        </result>
     1956      </desc>
     1957    </method>
     1958
     1959    <method name="restart">
     1960      <desc>
     1961        Restart running DHCP server process.
     1962        <result name="E_FAIL">
     1963          Failed to restart the process.
    19551964        </result>
    19561965      </desc>
  • trunk/src/VBox/Main/include/DHCPServerImpl.h

    r69500 r75512  
    5050    static const std::string kDsrKeyLowerIp;
    5151    static const std::string kDsrKeyUpperIp;
     52    static const std::string kDsrKeyConfig;
    5253};
    5354
     
    125126                  const com::Utf8Str &aTrunkType);
    126127    HRESULT stop();
     128    HRESULT restart();
    127129
    128130    struct Data;
  • trunk/src/VBox/Main/include/NetworkServiceRunner.h

    r69500 r75512  
    3636
    3737    int setOption(const std::string& key, const std::string& val);
     38    void clearOptions();
    3839
    3940    int  start(bool aKillProcOnStop);
  • trunk/src/VBox/Main/src-server/DHCPServerImpl.cpp

    r73003 r75512  
    2525
    2626#include <iprt/asm.h>
     27#include <iprt/file.h>
    2728#include <iprt/net.h>
     29#include <iprt/path.h>
    2830#include <iprt/cpp/utils.h>
     31#include <iprt/cpp/xml.h>
    2932
    3033#include <VBox/com/array.h>
     
    3841const std::string DHCPServerRunner::kDsrKeyLowerIp = "--lower-ip";
    3942const std::string DHCPServerRunner::kDsrKeyUpperIp = "--upper-ip";
     43const std::string DHCPServerRunner::kDsrKeyConfig  = "--config";
    4044
    4145
     
    4549        : enabled(FALSE)
    4650        , router(false)
    47     {}
     51    {
     52        tempConfigFileName[0] = '\0';
     53    }
    4854
    4955    Utf8Str IPAddress;
     
    5763    settings::DhcpOptionMap GlobalDhcpOptions;
    5864    settings::VmSlot2OptionsMap VmSlot2Options;
     65
     66    char tempConfigFileName[RTPATH_MAX];
     67    com::Utf8Str networkName;
     68    com::Utf8Str trunkName;
     69    com::Utf8Str trunkType;
    5970};
    6071
     
    98109    if (autoUninitSpan.uninitDone())
    99110        return;
     111
     112    if (m->dhcp.isRunning())
     113        stop();
    100114
    101115    unconst(mVirtualBox) = NULL;
     
    599613
    600614
     615DECLINLINE(void) addOptionChild(xml::ElementNode *pParent, uint32_t OptCode, const settings::DhcpOptValue &OptValue)
     616{
     617    xml::ElementNode *pOption = pParent->createChild("Option");
     618    pOption->setAttribute("name", OptCode);
     619    pOption->setAttribute("encoding", OptValue.encoding);
     620    pOption->setAttribute("value", OptValue.text.c_str());
     621}
     622
     623
     624HRESULT DHCPServer::restart()
     625{
     626    if (!m->dhcp.isRunning())
     627        return E_FAIL;
     628    /*
     629        * Disabled servers will be brought down, but won't be restarted.
     630        * (see DHCPServer::start)
     631        */
     632    HRESULT hrc = stop();
     633    if (SUCCEEDED(hrc))
     634        hrc = start(m->networkName, m->trunkName, m->trunkType);
     635    return hrc;
     636}
     637
     638
    601639HRESULT DHCPServer::start(const com::Utf8Str &aNetworkName,
    602640                          const com::Utf8Str &aTrunkName,
     
    607645        return S_OK;
    608646
     647    /*
     648     * @todo: the existing code cannot handle concurrent attempts to start DHCP server.
     649     * Note that technically it may receive different parameters from different callers.
     650     */
     651    m->networkName = aNetworkName;
     652    m->trunkName = aTrunkName;
     653    m->trunkType = aTrunkType;
     654
     655    m->dhcp.clearOptions();
     656#ifdef VBOX_WITH_DHCPD
     657    int rc = RTPathTemp(m->tempConfigFileName, sizeof(m->tempConfigFileName));
     658    if (RT_FAILURE(rc))
     659        return E_FAIL;
     660    rc = RTPathAppend(m->tempConfigFileName, sizeof(m->tempConfigFileName), "dhcp-config-XXXXX.xml");
     661    if (RT_FAILURE(rc))
     662    {
     663        m->tempConfigFileName[0] = '\0';
     664        return E_FAIL;
     665    }
     666    rc = RTFileCreateTemp(m->tempConfigFileName, 0600);
     667    if (RT_FAILURE(rc))
     668    {
     669        m->tempConfigFileName[0] = '\0';
     670        return E_FAIL;
     671    }
     672
     673    xml::Document doc;
     674    xml::ElementNode *pElmRoot = doc.createRootElement("DHCPServer");
     675    pElmRoot->setAttribute("networkName", m->networkName.c_str());
     676    if (!m->trunkName.isEmpty())
     677        pElmRoot->setAttribute("trunkName", m->trunkName.c_str());
     678    pElmRoot->setAttribute("trunkType", m->trunkType.c_str());
     679    pElmRoot->setAttribute("IPAddress",  Utf8Str(m->IPAddress).c_str());
     680    pElmRoot->setAttribute("networkMask", Utf8Str(m->GlobalDhcpOptions[DhcpOpt_SubnetMask].text).c_str());
     681    pElmRoot->setAttribute("lowerIP", Utf8Str(m->lowerIP).c_str());
     682    pElmRoot->setAttribute("upperIP", Utf8Str(m->upperIP).c_str());
     683
     684    /* Process global options */
     685    xml::ElementNode *pOptions = pElmRoot->createChild("Options");
     686    // settings::DhcpOptionMap::const_iterator itGlobal;
     687    for (settings::DhcpOptionMap::const_iterator it = m->GlobalDhcpOptions.begin();
     688         it != m->GlobalDhcpOptions.end();
     689         ++it)
     690        addOptionChild(pOptions, (*it).first, (*it).second);
     691
     692    /* Process network-adapter-specific options */
     693    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     694    HRESULT hrc = S_OK;
     695    ComPtr<IMachine> machine;
     696    ComPtr<INetworkAdapter> nic;
     697    settings::VmSlot2OptionsIterator it;
     698    for(it = m->VmSlot2Options.begin(); it != m->VmSlot2Options.end(); ++it)
     699    {
     700        alock.release();
     701        hrc = mVirtualBox->FindMachine(Bstr(it->first.VmName).raw(), machine.asOutParam());
     702        alock.acquire();
     703
     704        if (FAILED(hrc))
     705            continue;
     706
     707        alock.release();
     708        hrc = machine->GetNetworkAdapter(it->first.Slot, nic.asOutParam());
     709        alock.acquire();
     710
     711        if (FAILED(hrc))
     712            continue;
     713
     714        com::Bstr mac;
     715
     716        alock.release();
     717        hrc = nic->COMGETTER(MACAddress)(mac.asOutParam());
     718        alock.acquire();
     719
     720        if (FAILED(hrc)) /* no MAC address ??? */
     721            continue;
     722
     723        /* Convert MAC address from XXXXXXXXXXXX to XX:XX:XX:XX:XX:XX */
     724        Utf8Str strMacWithoutColons(mac);
     725        const char *pszSrc = strMacWithoutColons.c_str();
     726        RTMAC binaryMac;
     727        if (RTStrConvertHexBytes(pszSrc, &binaryMac, sizeof(binaryMac), 0) != VINF_SUCCESS)
     728            continue;
     729        char szMac[18]; /* "XX:XX:XX:XX:XX:XX" */
     730        if (RTStrPrintHexBytes(szMac, sizeof(szMac), &binaryMac, sizeof(binaryMac), RTSTRPRINTHEXBYTES_F_SEP_COLON) != VINF_SUCCESS)
     731            continue;
     732
     733        xml::ElementNode *pMacConfig = pElmRoot->createChild("Config");
     734        pMacConfig->setAttribute("MACAddress", szMac);
     735
     736        com::Utf8Str encodedOption;
     737        settings::DhcpOptionMap &map = i_findOptMapByVmNameSlot(it->first.VmName, it->first.Slot);
     738        settings::DhcpOptionMap::const_iterator itAdapterOption;
     739        for (itAdapterOption = map.begin(); itAdapterOption != map.end(); ++itAdapterOption)
     740            addOptionChild(pMacConfig, (*itAdapterOption).first, (*itAdapterOption).second);
     741    }
     742
     743    xml::XmlFileWriter writer(doc);
     744    writer.write(m->tempConfigFileName, true);
     745
     746    m->dhcp.setOption(DHCPServerRunner::kDsrKeyConfig, m->tempConfigFileName);
     747#else /* !VBOX_WITH_DHCPD */
    609748    /* Commmon Network Settings */
    610749    m->dhcp.setOption(NetworkServiceRunner::kNsrKeyNetwork, aNetworkName.c_str());
     
    628767    m->dhcp.setOption(DHCPServerRunner::kDsrKeyLowerIp, Utf8Str(m->lowerIP).c_str());
    629768    m->dhcp.setOption(DHCPServerRunner::kDsrKeyUpperIp, Utf8Str(m->upperIP).c_str());
     769#endif /* !VBOX_WITH_DHCPD */
    630770
    631771    /* XXX: This parameters Dhcp Server will fetch via API */
     
    637777HRESULT DHCPServer::stop (void)
    638778{
     779#ifdef VBOX_WITH_DHCPD
     780    if (m->tempConfigFileName[0])
     781    {
     782        RTFileDelete(m->tempConfigFileName);
     783        m->tempConfigFileName[0] = 0;
     784    }
     785#endif /* VBOX_WITH_DHCPD */
    639786    return RT_FAILURE(m->dhcp.stop()) ? E_FAIL : S_OK;
    640787}
  • trunk/src/VBox/Main/src-server/NetworkServiceRunner.cpp

    r69500 r75512  
    6666    m->mOptions.insert(std::map<std::string, std::string>::value_type(key, val));
    6767    return VINF_SUCCESS;
     68}
     69
     70
     71void NetworkServiceRunner::clearOptions()
     72{
     73    m->mOptions.clear();
    6874}
    6975
  • trunk/src/VBox/NetworkServices/Dhcpd/Db.cpp

    r73076 r75512  
    291291     */
    292292    const xml::ElementNode *ndTime = ndLease->findChildElement("Time");
    293     if (time == NULL)
     293    if (ndTime == NULL)
    294294        return NULL;
    295295
  • trunk/src/VBox/NetworkServices/Dhcpd/Defs.h

    r70836 r75512  
    2727#include <vector>
    2828
     29#ifdef _MSC_VER
     30# define __func__ __FUNCTION__
     31#endif
     32
    2933typedef std::vector<uint8_t> octets_t;
    3034
     
    3236
    3337class DhcpOption;
    34 typedef std::map<uint8_t, std::shared_ptr<DhcpOption>> optmap_t;
     38typedef std::map<uint8_t, std::shared_ptr<DhcpOption> > optmap_t;
    3539
    3640inline bool operator==(const RTMAC &l, const RTMAC &r)
  • trunk/src/VBox/NetworkServices/Dhcpd/DhcpOptions.cpp

    r71689 r75512  
    3636optmap_t &operator<<(optmap_t &optmap, const std::shared_ptr<DhcpOption> &option)
    3737{
    38     if (option == NULL)
     38    if (option == nullptr)
    3939        return optmap;
    4040
  • trunk/src/VBox/NetworkServices/Dhcpd/Makefile.kmk

    r70836 r75512  
    2929 ifdef VBOX_WITH_HARDENING
    3030  PROGRAMS += VBoxNetDhcpdHardened
    31   VBoxNetDhcpdHardened_TEMPLATE = VBOXR3HARDENEDEXE
    32   VBoxNetDhcpdHardened_NAME     = VBoxNetDhcpd
    33   VBoxNetDhcpdHardened_DEFS     = SERVICE_NAME=\"VBoxNetDhcpd\"
    34   VBoxNetDhcpdHardened_SOURCES  = VBoxNetDhcpdHardened.cpp
    35   VBoxNetDhcpdHardened_SOURCES.win = $(VBoxNetLwipNAT_0_OUTDIR)/VBoxNetDhcpd-icon.rc
    36   VBoxNetDhcpdHardened_LDFLAGS.win = /SUBSYSTEM:windows
     31  DLLS += VBoxNetDhcpd
    3732 else
    3833  PROGRAMS += VBoxNetDhcpd
    3934 endif
    4035
    41  VBoxNetDhcpd_TEMPLATE := $(if-expr defined(VBOX_WITH_HARDENING),VBOXMAINDLL,VBOXMAINCLIENTEXE)
    42  VBoxNetDhcpd_NAME     := VBoxNetDhcpd
     36 VBoxNetDhcpdHardened_TEMPLATE = VBOXR3HARDENEDEXE
     37 VBoxNetDhcpdHardened_NAME     = VBoxNetDHCP
     38 VBoxNetDhcpdHardened_DEFS     = SERVICE_NAME=\"VBoxNetDhcpd\"
     39 VBoxNetDhcpdHardened_SOURCES  = VBoxNetDhcpdHardened.cpp
     40 VBoxNetDhcpdHardened_SOURCES.win = $(VBoxNetDhcpd_0_OUTDIR)/VBoxNetDhcpd-icon.rc
     41 VBoxNetDhcpdHardened_LDFLAGS.win = /SUBSYSTEM:windows
     42
     43 if1of ($(KBUILD_TARGET),win linux solaris)
     44  VBoxNetDhcpd_TEMPLATE := $(if-expr defined(VBOX_WITH_HARDENING),VBoxR3DllDhcpd,VBoxR3ExeDhcpd)
     45 else
     46  VBoxNetDhcpd_TEMPLATE := $(if-expr defined(VBOX_WITH_HARDENING),VBoxR3Dll,VBOXR3EXE)
     47 endif
     48 VBoxNetDhcpd_NAME      = VBoxNetDHCP
    4349 # VBoxNetDhcpd_DEFS      = IPv6
    44  # VBoxNetLwipNAT_DEFS.linux = WITH_VALGRIND
    45  VBoxNetDhcpd_DEFS.win  = VBOX_COM_OUTOFPROC_MODULE _WIN32_WINNT=0x501 # Windows XP
     50 # VBoxNetDhcpd_DEFS.linux = WITH_VALGRIND
     51 #VBoxNetDhcpd_DEFS.win  = VBOX_COM_OUTOFPROC_MODULE _WIN32_WINNT=0x501 # Windows XP
    4652
    4753 # (current dir is for for lwipopts.h)
    4854 VBoxNetDhcpd_INCS += . $(addprefix ../../Devices/Network/lwip-new/,$(LWIP_INCS))
    4955
    50  VBoxNetDhcpd_SOURCES  =
    51  VBoxNetDhcpd_SOURCES += ClientId.cpp
    52  VBoxNetDhcpd_SOURCES += Config.cpp
    53  VBoxNetDhcpd_SOURCES += DHCPD.cpp
    54  VBoxNetDhcpd_SOURCES += Db.cpp
    55  VBoxNetDhcpd_SOURCES += DhcpMessage.cpp
    56  VBoxNetDhcpd_SOURCES += DhcpOptions.cpp
    57  VBoxNetDhcpd_SOURCES += IPv4Pool.cpp
    58  VBoxNetDhcpd_SOURCES += TimeStamp.cpp
    59  VBoxNetDhcpd_SOURCES += VBoxNetDhcpd.cpp
    60  VBoxNetDhcpd_SOURCES += $(addprefix ../../Devices/Network/lwip-new/,$(LWIP_SOURCES))
     56 VBoxNetDhcpd_DEFS    = KBUILD_TYPE=\"$(KBUILD_TYPE)\"
     57 ifneq ($(KBUILD_TARGET),win)
     58  VBoxNetDhcpd_DEFS  += VBOX_WITH_XPCOM
     59  VBoxNetDhcpd_INCS  += $(VBOX_XPCOM_INCS)
     60  VBoxNetDhcpd_CXXFLAGS += -std=c++11
     61 endif
     62 VBoxNetDhcpd_SOURCES = ../../Main/glue/VBoxLogRelCreate.cpp \
     63                        ../../Main/glue/GetVBoxUserHomeDirectory.cpp \
     64                        ClientId.cpp \
     65                        Config.cpp \
     66                        DHCPD.cpp \
     67                        Db.cpp \
     68                        DhcpMessage.cpp \
     69                        DhcpOptions.cpp \
     70                        IPv4Pool.cpp \
     71                        TimeStamp.cpp \
     72                        VBoxNetDhcpd.cpp \
     73                        $(addprefix ../../Devices/Network/lwip-new/,$(LWIP_SOURCES))
    6174
    62  VBoxNetLwipNAT_LIBS = $(LIB_RUNTIME)
     75 VBoxNetDhcpd_LIBS = $(LIB_RUNTIME)
    6376
    64  VBoxNetLwipNAT_LIBS.solaris += socket nsl
    65  VBoxNetLwipNAT_LDFLAGS.win = /SUBSYSTEM:windows
     77 VBoxNetDhcpd_LIBS.solaris += socket nsl
     78 VBoxNetDhcpd_LDFLAGS.win = /SUBSYSTEM:windows
    6679
    6780 ifeq ($(KBUILD_TARGET),win)
  • trunk/src/VBox/NetworkServices/Dhcpd/VBoxNetDhcpd.cpp

    r71689 r75512  
    5252#include <memory>
    5353
     54#ifdef RT_OS_WINDOWS /* WinMain */
     55#undef htonl
     56#undef ntohl
     57# include <iprt/win/windows.h>
     58#endif
    5459
    5560struct delete_pbuf
     
    448453                                                     i, cSegs,
    449454                                                     &cbSegFrame);
    450                 ifInput(pvSegFrame, cbFrame);
     455                ifInput(pvSegFrame, (uint32_t)cbFrame);
    451456            }
    452457        }
     
    738743
    739744    unique_ptr_pbuf q ( pbuf_alloc(PBUF_RAW, (u16_t)data.size(), PBUF_RAM) );
    740     if (q == NULL)
    741         return;
    742 
    743     error = pbuf_take(q.get(), &data.front(), data.size());
     745    if (q == nullptr)
     746        return;
     747
     748    error = pbuf_take(q.get(), &data.front(), (u16_t)data.size());
    744749    if (error != ERR_OK)
    745750        return;
  • trunk/src/VBox/NetworkServices/Makefile.kmk

    r69111 r75512  
    2222ifdef VBOX_WITH_MAIN
    2323 # Include sub-makefiles.
    24  include $(PATH_SUB_CURRENT)/DHCP/Makefile.kmk
     24 ifndef VBOX_WITH_DHCPD
     25  include $(PATH_SUB_CURRENT)/DHCP/Makefile.kmk
     26 else
     27  include $(PATH_SUB_CURRENT)/Dhcpd/Makefile.kmk
     28 endif
    2529 ifdef VBOX_WITH_NAT_SERVICE
    2630  include $(PATH_SUB_CURRENT)/NAT/Makefile.kmk
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