VirtualBox

Changeset 49824 in vbox


Ignore:
Timestamp:
Dec 9, 2013 8:59:41 AM (11 years ago)
Author:
vboxsync
Message:

VBoxNetDHCP: exposed fetchAndUpdateDnsInfo() used in listener(not commited yet) and in initialization. Note: scoped out flush and update configuration amnager's cache will be used for auto-syncronization between updates and requests processing in later commits.

Location:
trunk/src/VBox/NetworkServices/DHCP
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/DHCP/Makefile.kmk

    r49563 r49824  
    4949        ../NetLib/VBoxNetUDP.cpp \
    5050        ../NetLib/VBoxNetARP.cpp \
    51         ../NetLib/VBoxNetBaseService.cpp
     51        ../NetLib/VBoxNetBaseService.cpp \
     52        ../NetLib/ComHostUtils.cpp
    5253VBoxNetDHCP_LIBS = \
    5354        $(LIB_RUNTIME)
  • trunk/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp

    r49735 r49824  
    6464
    6565#include "../NetLib/VBoxNetBaseService.h"
     66#include "../NetLib/utils.h"
    6667
    6768#ifdef RT_OS_WINDOWS /* WinMain */
     
    109110    int initNoMain();
    110111    int initWithMain();
     112    int fetchAndUpdateDnsInfo();
    111113
    112114protected:
     
    503505    confManager->addToAddressList(RTNET_DHCP_OPT_ROUTERS, gateway);
    504506
    505     unsigned int i;
    506     unsigned int count_strs;
    507     com::SafeArray<BSTR> strs;
    508     std::map<RTNETADDRIPV4, uint32_t> MapIp4Addr2Off;
    509 
    510     hrc = m_NATNetwork->COMGETTER(LocalMappings)(ComSafeArrayAsOutParam(strs));
    511     if (   SUCCEEDED(hrc)
    512            && (count_strs = strs.size()))
    513     {
    514         for (i = 0; i < count_strs; ++i)
    515         {
    516             char szAddr[17];
    517             RTNETADDRIPV4 ip4addr;
    518             char *pszTerm;
    519             uint32_t u32Off;
    520             com::Utf8Str strLo2Off(strs[i]);
    521             const char *pszLo2Off = strLo2Off.c_str();
    522 
    523             RT_ZERO(szAddr);
    524 
    525             pszTerm = RTStrStr(pszLo2Off, "=");
    526 
    527             if (   pszTerm
    528                    && (pszTerm - pszLo2Off) <= INET_ADDRSTRLEN)
    529             {
    530                 memcpy(szAddr, pszLo2Off, (pszTerm - pszLo2Off));
    531                 int rc = RTNetStrToIPv4Addr(szAddr, &ip4addr);
    532                 if (RT_SUCCESS(rc))
    533                 {
    534                     u32Off = RTStrToUInt32(pszTerm + 1);
    535                     if (u32Off != 0)
    536                         MapIp4Addr2Off.insert(
    537                           std::map<RTNETADDRIPV4,uint32_t>::value_type(ip4addr, u32Off));
    538                 }
    539             }
    540         }
    541     }
    542 
    543 
    544     RTNETADDRIPV4 address = getIpv4Address();
    545     RTNETADDRIPV4 netmask = getIpv4Netmask();
    546     strs.setNull();
    547     ComPtr<IHost> host;
    548     if (SUCCEEDED(virtualbox->COMGETTER(Host)(host.asOutParam())))
    549     {
    550         if (SUCCEEDED(host->COMGETTER(NameServers)(ComSafeArrayAsOutParam(strs))))
    551         {
    552             RTNETADDRIPV4 addr;
    553 
    554             confManager->flushAddressList(RTNET_DHCP_OPT_DNS);
    555             int rc;
    556             for (i = 0; i < strs.size(); ++i)
    557             {
    558                 rc = RTNetStrToIPv4Addr(com::Utf8Str(strs[i]).c_str(), &addr);
    559                 if (RT_SUCCESS(rc))
    560                 {
    561                     if (addr.au8[0] == 127)
    562                     {
    563                         if (MapIp4Addr2Off[addr] != 0)
    564                         {
    565                             addr.u = RT_H2N_U32(RT_N2H_U32(address.u & netmask.u)
    566                                                 + MapIp4Addr2Off[addr]);
    567                         }
    568                         else
    569                             continue;
    570                     }
    571 
    572                     confManager->addToAddressList(RTNET_DHCP_OPT_DNS, addr);
    573                 }
    574             }
    575         }
    576 
    577         strs.setNull();
    578 #if 0
    579         if (SUCCEEDED(host->COMGETTER(SearchStrings)(ComSafeArrayAsOutParam(strs))))
    580         {
    581             /* XXX: todo. */;
    582         }
    583         strs.setNull();
    584 #endif
    585         com::Bstr domain;
    586         if (SUCCEEDED(host->COMGETTER(DomainName)(domain.asOutParam())))
    587             confManager->setString(RTNET_DHCP_OPT_DOMAIN_NAME, std::string(com::Utf8Str(domain).c_str()));
    588     }
     507    int rc = fetchAndUpdateDnsInfo();
     508    AssertMsgRCReturn(rc, ("Wasn't able to fetch Dns info"), rc);
    589509
    590510    com::Bstr strUpperIp, strLowerIp;
     
    602522    RTNetStrToIPv4Addr(com::Utf8Str(strLowerIp).c_str(), &LowerAddress);
    603523
    604     RTNETADDRIPV4 networkId;
    605     networkId.u = address.u & netmask.u;
     524    RTNETADDRIPV4 address = getIpv4Address();
     525    RTNETADDRIPV4 netmask = getIpv4Netmask();
     526
     527    RTNETADDRIPV4 networkId = networkid(address, netmask);
    606528    std::string name = std::string("default");
    607529
     
    618540    confManager->loadFromFile(strXmlLeaseFile);
    619541
     542    return VINF_SUCCESS;
     543}
     544
     545
     546int VBoxNetDhcp::fetchAndUpdateDnsInfo()
     547{
     548    ComHostPtr host;
     549    if (SUCCEEDED(virtualbox->COMGETTER(Host)(host.asOutParam())))
     550    {
     551        AddressToOffsetMapping mapIp4Addr2Off;
     552        int rc = localMappings(m_NATNetwork, mapIp4Addr2Off);
     553        /* XXX: here could be several cases: 1. COM error, 2. not found (empty) 3. ? */
     554        AssertMsgRCReturn(rc, ("Can't fetch local mappings"), rc);
     555
     556        RTNETADDRIPV4 address = getIpv4Address();
     557        RTNETADDRIPV4 netmask = getIpv4Netmask();
     558
     559        AddressList nameservers;
     560        rc = hostDnsServers(host, networkid(address, netmask), mapIp4Addr2Off, nameservers);
     561        AssertMsgRCReturn(rc, ("Debug me!!!"), rc);
     562        /* XXX: Search strings */
     563
     564        std::string domain;
     565        rc = hostDnsDomain(host, domain);
     566        AssertMsgRCReturn(rc, ("Debug me!!"), rc);
     567
     568        {
     569            ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
     570            confManager->flushAddressList(RTNET_DHCP_OPT_DNS);
     571
     572            for (AddressList::iterator it = nameservers.begin(); it != nameservers.end(); ++it)
     573                confManager->addToAddressList(RTNET_DHCP_OPT_DNS, *it);
     574           
     575            confManager->setString(RTNET_DHCP_OPT_DOMAIN_NAME, domain);
     576        }
     577    }
     578   
    620579    return VINF_SUCCESS;
    621580}
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