VirtualBox

Changeset 5332 in vbox


Ignore:
Timestamp:
Oct 16, 2007 5:00:04 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
25365
Message:

Make PXE booting in NAT mode work without much hassle.

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r5271 r5332  
    5252    /** NAT state for this instance. */
    5353    PNATState               pNATState;
     54    /** TFTP directory prefix. */
     55    char                    *pszTFTPPrefix;
     56    /** Boot file name to provide in the DHCP server response. */
     57    char                    *pszBootFile;
    5458    /** Flag whether a NAT ping warning has been shown. */
    5559    bool                    fSuppressPingWarning;
     
    409413     * Validate the config.
    410414     */
    411     if (!CFGMR3AreValuesValid(pCfgHandle, "PassDomain\0"))
    412         return PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES, "Unknown NAT configuration option, only supports PassDomain");
     415    if (!CFGMR3AreValuesValid(pCfgHandle, "PassDomain\0TFTPPrefix\0BootFile\0"))
     416        return PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES, N_("Unknown NAT configuration option, only supports PassDomain, TFTPPrefix and BootFile"));
     417
     418    /*
     419     * Init the static parts.
     420     */
     421    pData->pDrvIns                      = pDrvIns;
     422    pData->pNATState                    = NULL;
     423    pData->pszTFTPPrefix                = NULL;
     424    pData->pszBootFile                  = NULL;
     425    /* IBase */
     426    pDrvIns->IBase.pfnQueryInterface    = drvNATQueryInterface;
     427    /* INetwork */
     428    pData->INetworkConnector.pfnSend               = drvNATSend;
     429    pData->INetworkConnector.pfnSetPromiscuousMode = drvNATSetPromiscuousMode;
     430    pData->INetworkConnector.pfnNotifyLinkChanged  = drvNATNotifyLinkChanged;
     431    pData->INetworkConnector.pfnNotifyCanReceive   = drvNATNotifyCanReceive;
    413432
    414433    /*
     
    420439        fPassDomain = true;
    421440    else if (VBOX_FAILURE(rc))
    422         return PDMDrvHlpVMSetError(pData->pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"PassDomain\" boolean returned %Vrc"), pDrvIns->iInstance, rc);
    423 
    424     /*
    425      * Init the static parts.
    426      */
    427     pData->pDrvIns                      = pDrvIns;
    428     pData->pNATState                    = NULL;
    429     /* IBase */
    430     pDrvIns->IBase.pfnQueryInterface    = drvNATQueryInterface;
    431     /* INetwork */
    432     pData->INetworkConnector.pfnSend               = drvNATSend;
    433     pData->INetworkConnector.pfnSetPromiscuousMode = drvNATSetPromiscuousMode;
    434     pData->INetworkConnector.pfnNotifyLinkChanged  = drvNATNotifyLinkChanged;
    435     pData->INetworkConnector.pfnNotifyCanReceive   = drvNATNotifyCanReceive;
     441        return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"PassDomain\" boolean returned %Vrc"), pDrvIns->iInstance, rc);
     442
     443    rc = CFGMR3QueryStringAlloc(pCfgHandle, "TFTPPrefix", &pData->pszTFTPPrefix);
     444    if (VBOX_FAILURE(rc) && rc != VERR_CFGM_VALUE_NOT_FOUND)
     445        return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"TFTPPrefix\" string returned %Vrc"), pDrvIns->iInstance, rc);
     446    rc = CFGMR3QueryStringAlloc(pCfgHandle, "BootFile", &pData->pszBootFile);
     447    if (VBOX_FAILURE(rc) && rc != VERR_CFGM_VALUE_NOT_FOUND)
     448        return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, N_("NAT#%d: configuration query for \"BootFile\" string returned %Vrc"), pDrvIns->iInstance, rc);
    436449
    437450    /*
     
    467480             * Initialize slirp.
    468481             */
    469             rc = slirp_init(&pData->pNATState, &szNetAddr[0], fPassDomain, pData);
     482            rc = slirp_init(&pData->pNATState, &szNetAddr[0], fPassDomain, pData->pszTFTPPrefix, pData->pszBootFile, pData);
    470483            if (VBOX_SUCCESS(rc))
    471484            {
  • trunk/src/VBox/Devices/Network/slirp/bootp.c

    r2938 r5332  
    187187    }
    188188
    189     if (bootp_filename)
     189    if (tftp_prefix && RTDirExists(tftp_prefix) && bootp_filename)
    190190        RTStrPrintf((char*)rbp->bp_file, sizeof(rbp->bp_file), "%s", bootp_filename);
    191191
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r5266 r5332  
    2727#endif
    2828
    29 int slirp_init(PNATState *, const char *, bool, void *);
     29int slirp_init(PNATState *, const char *, bool, const char *, const char *, void *);
    3030void slirp_term(PNATState);
    3131void slirp_link_up(PNATState);
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r3693 r5332  
    169169#endif
    170170
    171 int slirp_init(PNATState *ppData, const char *pszNetAddr, bool fPassDomain, void *pvUser)
     171int slirp_init(PNATState *ppData, const char *pszNetAddr, bool fPassDomain,
     172               const char *pszTFTPPrefix, const char *pszBootFile,
     173               void *pvUser)
    172174{
    173175    int fNATfailed = 0;
     
    182184    pData->cpvHashUsed = 1;
    183185#endif
     186    tftp_prefix = pszTFTPPrefix;
     187    bootp_filename = pszBootFile;
    184188
    185189#ifdef _WIN32
  • trunk/src/VBox/Devices/Network/slirp/slirp.h

    r3693 r5332  
    3232#include <iprt/assert.h>
    3333#include <iprt/string.h>
     34#include <iprt/dir.h>
    3435#include <VBox/types.h>
    3536
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r5171 r5332  
    928928                rc = CFGMR3InsertNode(pLunL0, "Config", &pCfg);                     RC_CHECK();
    929929                /* (Port forwarding goes here.) */
     930
     931                /* Configure TFTP prefix and boot filename. */
     932                hrc = virtualBox->COMGETTER(HomeFolder)(&str);                      H();
     933                STR_CONV();
     934                if (psz && *psz)
     935                {
     936                    char *pszTFTPPrefix = NULL;
     937                    RTStrAPrintf(&pszTFTPPrefix, "%s%c%s", psz, RTPATH_DELIMITER, "TFTP");
     938                    rc = CFGMR3InsertString(pCfg, "TFTPPrefix", pszTFTPPrefix);     RC_CHECK();
     939                    RTStrFree(pszTFTPPrefix);
     940                }
     941                STR_FREE();
     942                hrc = pMachine->COMGETTER(Name)(&str);                              H();
     943                STR_CONV();
     944                char *pszBootFile = NULL;
     945                RTStrAPrintf(&pszBootFile, "%s.pxe", psz);
     946                STR_FREE();
     947                rc = CFGMR3InsertString(pCfg, "BootFile", pszBootFile);             RC_CHECK();
     948                RTStrFree(pszBootFile);
    930949                break;
    931950            }
     
    965984                        if (!tapSetupApp.isEmpty())
    966985                            rc = CFGMR3InsertString(pCfg, "TAPSetupApplication", Utf8Str(tapSetupApp)); RC_CHECK();
    967                        
     986
    968987                        /* TAP terminate application/script */
    969988                        Bstr tapTerminateApp;
     
    971990                        if (!tapTerminateApp.isEmpty())
    972991                            rc = CFGMR3InsertString(pCfg, "TAPTerminateApplication", Utf8Str(tapTerminateApp)); RC_CHECK();
    973                        
     992
    974993                        /* "FileHandle" must NOT be inserted here, it is done in DrvTAP.cpp */
    975994
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