VirtualBox

Changeset 11170 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Aug 6, 2008 1:45:50 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
34164
Message:

Hooks to FreeBSD's NAT engine was introduced

File:
1 edited

Legend:

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

    r11157 r11170  
    2828#define __STDC_LIMIT_MACROS
    2929#define __STDC_CONSTANT_MACROS
     30#ifndef VBOX_NAT_SOURCES
    3031#include "Network/slirp/libslirp.h"
     32#else
     33#include <sys/types.h>
     34#include <sys/socket.h>
     35
     36#include <netinet/in.h>
     37
     38#include <errno.h>
     39
     40#include <unistd.h>
     41
     42#include <fcntl.h>
     43
     44#include <string.h>
     45
     46#include "Network/nat/nat.h"
     47#endif
    3148#include <VBox/pdmdrv.h>
    3249#include <iprt/assert.h>
     
    6077    PDMNETWORKLINKSTATE     enmLinkState;
    6178    /** NAT state for this instance. */
     79#ifndef VBOX_NAT_SOURCES
    6280    PNATState               pNATState;
     81#endif
    6382    /** TFTP directory prefix. */
    6483    char                    *pszTFTPPrefix;
     
    82101
    83102
     103/*******************************************************************************
     104*   Internal Functions                                                         *
     105*******************************************************************************/
     106
     107
     108#ifdef VBOX_NAT_SOURCES
     109/*
     110 * Sends data to guest called from NAT glue code
     111 */
     112static DECLCALLBACK(void) drvNATOutput(const void * data, const uint8_t *msg, size_t size)
     113{
     114        PDRVNAT pData = (PDRVNAT)(void *)data;
     115        LogFlow(("output: pvBuf=%p cb=%#x\n", msg, size));
     116        int rc =  pData->pPort->pfnWaitReceiveAvail(pData->pPort, 0);
     117        if (RT_SUCCESS(rc))
     118                pData->pPort->pfnReceive(pData->pPort, msg, size);
     119        LogFlow(("output: exit\n"));
     120}
     121
     122#endif
     123
    84124/**
    85125 * Send data to the network.
     
    104144
    105145    Assert(pData->enmLinkState == PDMNETWORKLINKSTATE_UP);
    106     if (pData->enmLinkState == PDMNETWORKLINKSTATE_UP)
     146    if (pData->enmLinkState == PDMNETWORKLINKSTATE_UP) {
     147#ifndef VBOX_NAT_SOURCES
    107148        slirp_input(pData->pNATState, (uint8_t *)pvBuf, cb);
     149#else
     150                ether_chk(pData, pvBuf, cb);
     151#endif
     152        }
    108153    RTCritSectLeave(&pData->CritSect);
    109154    LogFlow(("drvNATSend: end\n"));
     
    150195        case PDMNETWORKLINKSTATE_UP:
    151196            LogRel(("NAT: link up\n"));
     197#ifndef VBOX_NAT_SOURCES
    152198            slirp_link_up(pData->pNATState);
     199#endif
    153200            break;
    154201
     
    156203        case PDMNETWORKLINKSTATE_DOWN_RESUME:
    157204            LogRel(("NAT: link down\n"));
     205#ifndef VBOX_NAT_SOURCES
    158206            slirp_link_down(pData->pNATState);
     207#endif
    159208            break;
    160209
     
    183232    AssertReleaseRC(rc);
    184233
     234#ifndef VBOX_NAT_SOURCES
    185235    slirp_select_fill(pData->pNATState, &cFDs, &ReadFDs, &WriteFDs, &XcptFDs);
     236#else
     237        nat_select_fill(NULL, &cFDs, &ReadFDs, &WriteFDs, &XcptFDs);
     238#endif
    186239
    187240    struct timeval tv = {0, 0}; /* no wait */
    188241    int cReadFDs = select(cFDs + 1, &ReadFDs, &WriteFDs, &XcptFDs, &tv);
     242#ifndef VBOX_NAT_SOURCES
    189243    if (cReadFDs >= 0)
    190244        slirp_select_poll(pData->pNATState, &ReadFDs, &WriteFDs, &XcptFDs);
     245#else
     246    if (cReadFDs >= 0) {
     247                nat_select_poll(pData, &ReadFDs, &WriteFDs, &XcptFDs);
     248        }
     249#endif
    191250
    192251    RTCritSectLeave(&pData->CritSect);
    193252}
    194253
    195 
     254#ifndef VBOX_NAT_SOURCES
    196255/**
    197256 * Function called by slirp to check if it's possible to feed incoming data to the network port.
     
    237296    LogFlow(("slirp_output END %x %d\n", pu8Buf, cb));
    238297}
     298#endif
    239299
    240300/**
     
    279339    int rc = RTCritSectEnter(&pData->CritSect);
    280340    AssertReleaseRC(rc);
     341#ifndef VBOX_NAT_SOURCES
    281342    slirp_term(pData->pNATState);
    282343    pData->pNATState = NULL;
     344#endif
    283345    RTCritSectLeave(&pData->CritSect);
    284346
     
    295357static int drvNATConstructRedir(unsigned iInstance, PDRVNAT pData, PCFGMNODE pCfgHandle, RTIPV4ADDR Network)
    296358{
     359#ifndef VBOX_NAT_SOURCES
    297360    /*
    298361     * Enumerate redirections.
     
    361424            return PDMDrvHlpVMSetError(pData->pDrvIns, VERR_NAT_REDIR_SETUP, RT_SRC_POS, N_("NAT#%d: configuration error: failed to set up redirection of %d to %s:%d. Probably a conflict with existing services or other rules"), iInstance, iHostPort, szGuestIP, iGuestPort);
    362425    } /* for each redir rule */
     426#endif
    363427
    364428    return VINF_SUCCESS;
     
    370434static void drvNATSetMac(PDRVNAT pData)
    371435{
     436#ifndef VBOX_NAT_SOURCES
    372437    if (pData->pConfig)
    373438    {
     
    376441        slirp_set_ethaddr(pData->pNATState, Mac.au8);
    377442    }
     443#endif
    378444}
    379445
     
    429495     */
    430496    pData->pDrvIns                      = pDrvIns;
     497#ifndef VBOX_NAT_SOURCES
    431498    pData->pNATState                    = NULL;
     499#endif
    432500    pData->pszTFTPPrefix                = NULL;
    433501    pData->pszBootFile                  = NULL;
     
    502570        {
    503571#endif
     572#ifndef VBOX_NAT_SOURCES
    504573            /*
    505574             * Initialize slirp.
     
    539608              AssertMsgFailed(("Add error message for rc=%d (%Vrc)\n", rc, rc));
    540609            }
     610#else
     611        pDrvIns->pDrvHlp->pfnPDMPollerRegister(pDrvIns, drvNATPoller);
     612        pData->enmLinkState = PDMNETWORKLINKSTATE_UP;
     613        mbuf_init(NULL);
     614        struct nat_output_callbacks cb;
     615        cb.noc_guest_out = drvNATOutput;
     616#if 0
     617        cb.noc_host_udp_out = host_udp_out;
     618        cb.noc_host_udp_in = host_udp_in;
     619#endif
     620        nat_init(&cb);
     621        ipfw_nat_init();
     622#endif
    541623#if 0
    542624            g_fThreadTerm = true;
     
    548630    }
    549631#endif
     632#ifndef VBOX_NAT_SOURCES
    550633    RTCritSectDelete(&pData->CritSect);
     634#endif
    551635    return rc;
    552636}
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