VirtualBox

Ignore:
Timestamp:
Nov 10, 2008 8:24:43 PM (16 years ago)
Author:
vboxsync
Message:

NAT: some sync fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/slirp.c

    r14028 r14041  
    347347    int nfds;
    348348    int tmp_time;
    349 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     349#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    350350    int rc;
    351     int chEvents = 1; /*store for send see DrvNAT*/
    352     int cchEvents = 0; /*counter*/
     351    /* Number of valid entries.
     352     * 1st event for drvNATSend() */
     353    int cElements;
     354    int cEvents = 1;
    353355#endif
    354356
     
    366368                               ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *)));
    367369
    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                        
     370#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
     371                /*
     372                 * Make this array static with a fixed maximum
     373                 * 1st event for drvNATSend()
     374                 */
     375                cElements = 1;
     376                for (so = tcb.so_next; so != &tcb; so = so_next, cElements++)
     377                    ;
     378                for (so = udb.so_next; so != &udb; so = so_next, cElements++)
     379                    ;
     380                if (pData->phEvents != NULL)
     381                    free(pData->phEvents);
     382                pData->phEvents = malloc(sizeof(HANDLE) * cElements);
     383#endif
     384
    375385                for (so = tcb.so_next; so != &tcb; so = so_next) {
    376386                        so_next = so->so_next;
     
    393403                         */
    394404                        if (so->so_state & SS_FACCEPTCONN) {
    395 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     405#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    396406                                FD_SET(so->s, readfds);
    397407                                UPD_NFDS(so->s);
     
    399409                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ);
    400410                                AssertRelease(rc != SOCKET_ERROR);
    401                                 pData->phEvents[cchEvents] = so->hNetworkEvent;
     411                                pData->phEvents[cEvents] = so->hNetworkEvent;
     412                                cEvents++;
    402413#endif
    403414                                continue;
     
    408419                         */
    409420                        if (so->so_state & SS_ISFCONNECTING) {
    410 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     421#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    411422                                FD_SET(so->s, writefds);
    412423                                UPD_NFDS(so->s);
     
    414425                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ);
    415426                                AssertRelease(rc != SOCKET_ERROR);
    416                                 pData->phEvents[cchEvents] = so->hNetworkEvent;
     427                                pData->phEvents[cEvents] = so->hNetworkEvent;
     428                                cEvents++;
    417429#endif
    418430                                continue;
     
    424436                         */
    425437                        if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) {
    426 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     438#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    427439                                FD_SET(so->s, writefds);
    428440                                UPD_NFDS(so->s);
     
    430442                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_WRITE);
    431443                                AssertRelease(rc != SOCKET_ERROR);
    432                                 pData->phEvents[cchEvents] = so->hNetworkEvent;
     444                                pData->phEvents[cEvents] = so->hNetworkEvent;
     445                                cEvents++;
    433446#endif
    434447                        }
     
    439452                         */
    440453                        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) 
     454#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    442455                                FD_SET(so->s, readfds);
    443456                                FD_SET(so->s, xfds);
     
    446459                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_OOB|FD_READ);
    447460                                AssertRelease(rc != SOCKET_ERROR);
    448                                 pData->phEvents[cchEvents] = so->hNetworkEvent;
     461                                pData->phEvents[cEvents] = so->hNetworkEvent;
     462                                cEvents++;
    449463#endif
    450464                        }
    451 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    452                         cchEvents++;
    453 #endif
    454465                }
    455466
     
    482493                         */
    483494                        if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) {
    484 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     495#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    485496                                FD_SET(so->s, readfds);
    486497                                UPD_NFDS(so->s);
     
    488499                                rc = WSAEventSelect(so->s, so->hNetworkEvent, FD_READ);
    489500                                AssertRelease(rc != SOCKET_ERROR);
    490                                 pData->phEvents[cchEvents] = so->hNetworkEvent;
     501                                pData->phEvents[cEvents] = so->hNetworkEvent;
     502                                cEvents++;
    491503#endif
    492504                        }
    493 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    494                         cchEvents++;
    495 #endif
    496505                }
    497506        }
     
    530539                }
    531540        }
    532 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     541#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    533542        *pnfds = nfds;
    534543#else
    535         *pnfds = chEvents;
     544        *pnfds = cEvents;
    536545#endif
    537546}
     
    541550    struct socket *so, *so_next;
    542551    int ret;
    543 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     552#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    544553        WSANETWORKEVENTS NetworkEvents;                 
    545554        int rc;
     
    573582                for (so = tcb.so_next; so != &tcb; so = so_next) {
    574583                        so_next = so->so_next;
    575 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     584#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    576585                        rc = WSAEnumNetworkEvents(so->s, so->hNetworkEvent, &NetworkEvents);   
    577586                        AssertRelease(rc != SOCKET_ERROR);
     
    590599                         * test for readfds below if this succeeds
    591600                         */
    592 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     601#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    593602                        if (FD_ISSET(so->s, xfds))
    594603#else
     
    599608                         * Check sockets for reading
    600609                         */
    601 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     610#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    602611                        else if (FD_ISSET(so->s, readfds)) {
    603612#else
     
    609618                                if (so->so_state & SS_FACCEPTCONN) {
    610619                                        tcp_connect(pData, so);
    611 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     620#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    612621                                        WSAResetEvent(so->hNetworkEvent);
    613622#endif
     
    624633                         * Check sockets for writing
    625634                         */
    626 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     635#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    627636                        if (FD_ISSET(so->s, writefds)) {
    628637#else
     
    648657                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
    649658                                  errno == EINPROGRESS || errno == ENOTCONN) {
    650 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     659#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    651660                                        WSAResetEvent(so->hNetworkEvent);
    652661#endif
     
    687696                            if (errno == EAGAIN || errno == EWOULDBLOCK ||
    688697                                errno == EINPROGRESS || errno == ENOTCONN) {
    689 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     698#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    690699                              WSAResetEvent(so->hNetworkEvent);
    691700#endif
     
    703712                              if (errno == EAGAIN || errno == EWOULDBLOCK ||
    704713                                  errno == EINPROGRESS || errno == ENOTCONN) {
    705 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     714#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    706715                                WSAResetEvent(so->hNetworkEvent);
    707716#endif
     
    727736                        so_next = so->so_next;
    728737
    729 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     738#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    730739                        rc = WSAEnumNetworkEvents(so->s, so->hNetworkEvent, &NetworkEvents);   
    731740                        AssertRelease(rc != SOCKET_ERROR);
    732741#endif
    733 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 
     742#if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS)
    734743                        if (so->s != -1 && FD_ISSET(so->s, readfds)) {
    735744#else
     
    737746#endif
    738747                            sorecvfrom(pData, so);
    739 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     748#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    740749                                WSAResetEvent(so->hNetworkEvent);
    741750#endif
     
    918927}
    919928
    920 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 
     929#if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS)
    921930HANDLE *slirp_get_events(PNATState pData)
    922931{
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