VirtualBox

Changeset 14028 in vbox


Ignore:
Timestamp:
Nov 10, 2008 5:21:32 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
39084
Message:

commit current NAT state (not yet working)

Location:
trunk/src/VBox/Devices/Network
Files:
6 edited

Legend:

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

    r13987 r14028  
    4040
    4141#ifdef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
    42 # include <unistd.h>
     42# ifndef RT_OS_WINDOWS
     43#  include <unistd.h>
     44# endif
    4345# include <errno.h>
    4446# include<iprt/semaphore.h>
     
    8587    RTFILE                  PipeRead;
    8688#else
     89    /* 1 - for Outher network events, and 0 for sending routine notification*/
     90    HANDLE                  hNetworkEvent[2];
    8791#endif
    8892    /** Send buffer */
     
    113117    Log2(("drvNATSend: pvBuf=%p cb=%#x\n%.*Rhxd\n", pvBuf, cb, cb, pvBuf));
    114118
    115 #ifndef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
    116     int rc = RTCritSectEnter(&pThis->CritSect);
    117     AssertReleaseRC(rc);
    118 #else
     119#ifdef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
     120
    119121    /*notify select to wakeup*/
    120122    memcpy(pThis->cBuffer,pvBuf, cb);
    121123    pThis->sBufferSize = cb;
     124# ifndef RT_OS_WINDOWS
    122125    int rc = RTFileWrite(pThis->PipeWrite, "1", 2, NULL);
    123126    AssertRC(rc);
     127# else
     128    WSASetEvent(pThis->hNetworkEvent[0]);
     129# endif
    124130    RTSemEventWait(pThis->semSndMutex, RT_INDEFINITE_WAIT);
    125 #endif
    126 
    127 #ifndef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC
     131
     132#else /* ! VBOX_WITH_SIMPLEFIED_SLIRP_SYNC */
     133
     134    int rc = RTCritSectEnter(&pThis->CritSect);
     135    AssertReleaseRC(rc);
     136
    128137    Assert(pThis->enmLinkState == PDMNETWORKLINKSTATE_UP);
    129     if (pThis->enmLinkState == PDMNETWORKLINKSTATE_UP) {
     138    if (pThis->enmLinkState == PDMNETWORKLINKSTATE_UP)
    130139        slirp_input(pThis->pNATState, (uint8_t *)pvBuf, cb);
    131     }
     140
    132141    RTCritSectLeave(&pThis->CritSect);
    133 #endif
     142
     143#endif /* !VBOX_WITH_SIMPLEFIED_SLIRP_SYNC */
     144
    134145    LogFlow(("drvNATSend: end\n"));
    135146    return VINF_SUCCESS;
     
    232243    int     nFDs = -1;
    233244    int     rc;
     245# ifdef RT_OS_WINDOWS
     246    DWORD   event;
     247    HANDLE  *phEvents;
     248# endif
    234249    const struct timeval TimeWait   = { 0, 2000 }; /* 2ms for the fast timer */
    235250    const struct timeval TimeNoWait = { 0,    0 }; /* return immediately */
     
    256271         */
    257272        slirp_select_fill(pThis->pNATState, &nFDs, &ReadFDs, &WriteFDs, &XcptFDs);
     273# ifndef RT_OS_WINDOWS
    258274        struct timeval tv = fWait ? TimeWait : TimeNoWait;
    259275        FD_SET(pThis->PipeRead, &ReadFDs); /* Linux only */
     
    281297            }
    282298        }
     299# else /* RT_OS_WINDOWS */
     300        phEvents = slirp_get_events(pThis->pNATState);
     301        phEvents[0] = pThis->hNetworkEvent[0];
     302        event = WSAWaitForMultipleEvents(cFDs, phEvents, FALSE, 2, FALSE);
     303        AssertRelease(event != WSA_WAIT_FAILED);
     304
     305        /*
     306         * see WSAWaitForMultipleEvents documentation: return value is a minimal index in array
     307         */
     308        if ((event - WSA_WAIT_EVENT_0) > 1)
     309            slirp_select_poll(pThis->pNATState, &ReadFDs, &WriteFDs, &XcptFDs);
     310
     311        if ((event - WSA_WAIT_EVENT_0) == 0)
     312        {
     313            slirp_input(pThis->pNATState, (uint8_t *)pThis->cBuffer, pThis->sBufferSize);
     314            WSAResetEvent(pThis->hNetworkEvent[0]);
     315            RTSemEventSignal(pThis->semSndMutex);
     316        }
     317        WSAResetEvent(pThis->hNetworkEvent[0]);
     318# endif /* RT_OS_WINDOWS */
    283319    }
    284320
     
    635671            AssertReleaseRC(rc);
    636672
     673# ifndef RT_OS_WINDOWS
    637674            /*
    638675             * Create the control pipe.
    639              * XXX: Linux only
    640676             */
    641677            int fds[2];
     
    648684            pThis->PipeRead = fds[0];
    649685            pThis->PipeWrite = fds[1];
     686# else
     687            pThis->hNetworkEvent[0] = WSACreateEvent();
     688            pThis->hNetworkEvent[1] = WSACreateEvent();
     689# endif
    650690
    651691            rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pThread, pThis, drvNATAsyncIoThread, drvNATAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "NAT");
  • trunk/src/VBox/Devices/Network/slirp/libslirp.h

    r13984 r14028  
    4949                   int guest_port);
    5050
    51 
     51#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     52HANDLE *slirp_get_events(PNATState pData);
     53#endif
    5254#ifdef __cplusplus
    5355}
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r13984 r14028  
    347347    int nfds;
    348348    int tmp_time;
     349#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     350    int rc;
     351    int chEvents = 1; /*store for send see DrvNAT*/
     352    int cchEvents = 0; /*counter*/
     353#endif
    349354
    350355    nfds = *pnfds;
     
    361366                               ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *)));
    362367
     368#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     369                for (so = tcb.so_next; so != &tcb; so = so_next, chEvents++);
     370                for (so = udb.so_next; so != &udb; so = so_next, chEvents++);
     371                if (pData->phEvents != NULL) free(pData->phEvents);
     372                pData->phEvents = malloc(sizeof(HANDLE) * chEvents);
     373#endif
     374                       
    363375                for (so = tcb.so_next; so != &tcb; so = so_next) {
    364376                        so_next = so->so_next;
     
    381393                         */
    382394                        if (so->so_state & SS_FACCEPTCONN) {
     395#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    383396                                FD_SET(so->s, readfds);
    384397                                UPD_NFDS(so->s);
     398#else
     399                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ);
     400                                AssertRelease(rc != SOCKET_ERROR);
     401                                pData->phEvents[cchEvents] = so->hNetworkEvent;
     402#endif
    385403                                continue;
    386404                        }
     
    390408                         */
    391409                        if (so->so_state & SS_ISFCONNECTING) {
     410#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    392411                                FD_SET(so->s, writefds);
    393412                                UPD_NFDS(so->s);
     413#else
     414                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ);
     415                                AssertRelease(rc != SOCKET_ERROR);
     416                                pData->phEvents[cchEvents] = so->hNetworkEvent;
     417#endif
    394418                                continue;
    395419                        }
     
    400424                         */
    401425                        if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) {
     426#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    402427                                FD_SET(so->s, writefds);
    403428                                UPD_NFDS(so->s);
     429#else
     430                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_WRITE);
     431                                AssertRelease(rc != SOCKET_ERROR);
     432                                pData->phEvents[cchEvents] = so->hNetworkEvent;
     433#endif
    404434                        }
    405435
     
    409439                         */
    410440                        if (CONN_CANFRCV(so) && (so->so_snd.sb_cc < (so->so_snd.sb_datalen/2))) {
     441#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    411442                                FD_SET(so->s, readfds);
    412443                                FD_SET(so->s, xfds);
    413444                                UPD_NFDS(so->s);
     445#else
     446                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_OOB|FD_READ);
     447                                AssertRelease(rc != SOCKET_ERROR);
     448                                pData->phEvents[cchEvents] = so->hNetworkEvent;
     449#endif
    414450                        }
     451#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     452                        cchEvents++;
     453#endif
    415454                }
    416455
     
    443482                         */
    444483                        if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) {
     484#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    445485                                FD_SET(so->s, readfds);
    446486                                UPD_NFDS(so->s);
     487#else
     488                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ);
     489                                AssertRelease(rc != SOCKET_ERROR);
     490                                pData->phEvents[cchEvents] = so->hNetworkEvent;
     491#endif
    447492                        }
     493#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     494                        cchEvents++;
     495#endif
    448496                }
    449497        }
     
    482530                }
    483531        }
     532#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    484533        *pnfds = nfds;
     534#else
     535        *pnfds = chEvents;
     536#endif
    485537}
    486538
     
    489541    struct socket *so, *so_next;
    490542    int ret;
     543#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     544        WSANETWORKEVENTS NetworkEvents;                 
     545        int rc;
     546#endif
    491547
    492548        /* Update time */
     
    517573                for (so = tcb.so_next; so != &tcb; so = so_next) {
    518574                        so_next = so->so_next;
     575#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     576                        rc = WSAEnumNetworkEvents(so->s, so->hNetworkEvent, &NetworkEvents);   
     577                        AssertRelease(rc != SOCKET_ERROR);
     578#endif
    519579
    520580                        /*
     
    530590                         * test for readfds below if this succeeds
    531591                         */
     592#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    532593                        if (FD_ISSET(so->s, xfds))
     594#else
     595                        if ((NetworkEvents.lNetworkEvents & FD_OOB) && NetworkEvents.iErrorCode[FD_OOB_BIT] == 0)
     596#endif
    533597                           sorecvoob(pData, so);
    534598                        /*
    535599                         * Check sockets for reading
    536600                         */
     601#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    537602                        else if (FD_ISSET(so->s, readfds)) {
     603#else
     604                        else if ((NetworkEvents.lNetworkEvents & FD_READ) && (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) {
     605#endif
    538606                                /*
    539607                                 * Check for incoming connections
     
    541609                                if (so->so_state & SS_FACCEPTCONN) {
    542610                                        tcp_connect(pData, so);
     611#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     612                                        WSAResetEvent(so->hNetworkEvent);
     613#endif
    543614                                        continue;
    544615                                } /* else */
     
    553624                         * Check sockets for writing
    554625                         */
     626#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    555627                        if (FD_ISSET(so->s, writefds)) {
     628#else
     629                        if ((NetworkEvents.lNetworkEvents & FD_WRITE) && (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)) {
     630#endif
    556631                          /*
    557632                           * Check for non-blocking, still-connecting sockets
     
    572647                              /* XXXXX Must fix, zero bytes is a NOP */
    573648                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
    574                                   errno == EINPROGRESS || errno == ENOTCONN)
     649                                  errno == EINPROGRESS || errno == ENOTCONN) {
     650#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     651                                        WSAResetEvent(so->hNetworkEvent);
     652#endif
    575653                                continue;
     654                              }
    576655
    577656                              /* else failed */
     
    607686                            /* XXX */
    608687                            if (errno == EAGAIN || errno == EWOULDBLOCK ||
    609                                 errno == EINPROGRESS || errno == ENOTCONN)
     688                                errno == EINPROGRESS || errno == ENOTCONN) {
     689#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     690                              WSAResetEvent(so->hNetworkEvent);
     691#endif
    610692                              continue; /* Still connecting, continue */
     693                            }
    611694
    612695                            /* else failed */
     
    619702                              /* XXX */
    620703                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
    621                                   errno == EINPROGRESS || errno == ENOTCONN)
     704                                  errno == EINPROGRESS || errno == ENOTCONN) {
     705#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     706                                WSAResetEvent(so->hNetworkEvent);
     707#endif
    622708                                continue;
     709                                }
    623710                              /* else failed */
    624711                              so->so_state = SS_NOFDREF;
     
    640727                        so_next = so->so_next;
    641728
     729#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     730                        rc = WSAEnumNetworkEvents(so->s, so->hNetworkEvent, &NetworkEvents);   
     731                        AssertRelease(rc != SOCKET_ERROR);
     732#endif
     733#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    642734                        if (so->s != -1 && FD_ISSET(so->s, readfds)) {
     735#else
     736                        if ((NetworkEvents.lNetworkEvents & FD_READ) && (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) {
     737#endif
    643738                            sorecvfrom(pData, so);
     739#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     740                                WSAResetEvent(so->hNetworkEvent);
     741#endif
    644742                        }
    645743                }
     
    819917    memcpy(client_ethaddr, ethaddr, ETH_ALEN);
    820918}
     919
     920#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     921HANDLE *slirp_get_events(PNATState pData)
     922{
     923        return (pData->phEvents);
     924}
     925#endif
  • trunk/src/VBox/Devices/Network/slirp/slirp_state.h

    r13984 r14028  
    116116    struct socket udb;
    117117    struct socket *udp_last_so;
     118#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     119    HANDLE *phEvents;
     120#endif
    118121} NATState;
    119122
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r13984 r14028  
    6060    so->so_state = SS_NOFDREF;
    6161    so->s = -1;
     62#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     63    WSACreateEvent(so->hNetworkEvent); /*XXX: NOT correct place*/
     64#endif
    6265  }
    6366  return(so);
     
    8083
    8184  m_free(pData, so->so_m);
     85
     86#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     87    WSACloseEvent(so->hNetworkEvent); /*XXX: NOT correct place*/
     88#endif
    8289
    8390  if(so->so_next && so->so_prev)
  • trunk/src/VBox/Devices/Network/slirp/socket.h

    r13984 r14028  
    5252  struct sbuf so_snd;           /* Send buffer */
    5353  void * extra;                 /* Extra pointer */
     54#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     55  HANDLE hNetworkEvent;
     56#endif
    5457};
    5558
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