Changeset 16572 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Feb 9, 2009 10:05:27 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 42528
- Location:
- trunk/src/VBox/Devices/Network
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r16566 r16572 43 43 # ifndef RT_OS_WINDOWS 44 44 # include <unistd.h> 45 # include <poll.h> 45 46 # endif 46 47 # include <errno.h> … … 148 149 Log2(("drvNATSend: pvBuf=%p cb=%#x\n%.*Rhxd\n", pvBuf, cb, cb, pvBuf)); 149 150 150 #ifdef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC 151 #ifdef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC 151 152 152 153 PRTREQ pReq = NULL; … … 164 165 165 166 /* @todo: Here we should get mbuf instead temporal buffer */ 166 buf = RTMemAlloc(cb); 167 buf = RTMemAlloc(cb); 167 168 if (buf == NULL) 168 169 { … … 348 349 HANDLE *phEvents; 349 350 unsigned int cBreak = 0; 351 # else 352 struct pollfd *polls; 350 353 # endif 351 354 … … 364 367 while (pThread->enmState == PDMTHREADSTATE_RUNNING) 365 368 { 366 FD_ZERO(&ReadFDs);367 FD_ZERO(&WriteFDs);368 FD_ZERO(&XcptFDs);369 369 nFDs = -1; 370 370 … … 372 372 * To prevent concurent execution of sending/receving threads 373 373 */ 374 slirp_select_fill(pThis->pNATState, &nFDs, &ReadFDs, &WriteFDs, &XcptFDs); 374 # ifndef RT_OS_WINDOWS 375 nFDs = slirp_get_nsock(pThis->pNATState); 376 polls = (struct pollfd *)RTMemAllocZ((2 + nFDs) * sizeof(struct pollfd)); /* allocation for all sockets + ICMP and Management pipe*/ 377 if (polls == NULL) 378 { 379 LogRel(("Can't allocate memory for polling\n")); 380 AssertRelease(polls); 381 } 382 383 slirp_select_fill(pThis->pNATState, &nFDs, &polls[1]); /*don't bother Slirp with knowelege about managemant pipe*/ 375 384 ms = slirp_get_timeout_ms(pThis->pNATState); 376 # ifndef RT_OS_WINDOWS 377 struct timeval tv = { 0, ms*1000 }; 378 FD_SET(pThis->PipeRead, &ReadFDs); 379 nFDs = ((int)pThis->PipeRead < nFDs ? nFDs : pThis->PipeRead); 380 int cChangedFDs = select(nFDs + 1, &ReadFDs, &WriteFDs, &XcptFDs, ms ? &tv : NULL); 385 386 polls[0].fd = pThis->PipeRead; 387 polls[0].events = POLLRDNORM|POLLPRI|POLLRDBAND; /* POLLRDBAND usually doesn't used on Linux but seems used on Solaris */ 388 int cChangedFDs = poll(polls, nFDs + 2, ms ? ms : -1); 381 389 if (cChangedFDs >= 0) 382 390 { 383 slirp_select_poll(pThis->pNATState, & ReadFDs, &WriteFDs, &XcptFDs);384 if ( FD_ISSET(pThis->PipeRead, &ReadFDs))391 slirp_select_poll(pThis->pNATState, &polls[1], nFDs); 392 if (polls[0].revents & (POLLRDNORM|POLLPRI|POLLRDBAND)) 385 393 { 386 394 /* drain the pipe */ … … 392 400 RTReqProcess(pThis->pReqQueue, 0); 393 401 } 402 RTMemFree(polls); 394 403 # else /* RT_OS_WINDOWS */ 404 slirp_select_fill(pThis->pNATState, &nFDs); 405 ms = slirp_get_timeout_ms(pThis->pNATState); 406 struct timeval tv = { 0, ms*1000 }; 395 407 event = WSAWaitForMultipleEvents(nFDs, phEvents, FALSE, ms ? ms : WSA_INFINITE, FALSE); 396 408 if ( (event < WSA_WAIT_EVENT_0 || event > WSA_WAIT_EVENT_0 + nFDs - 1) … … 452 464 453 465 #ifdef VBOX_WITH_SLIRP_MT 454 static DECLCALLBACK(int) drvNATAsyncIoGuest(PPDMDRVINS pDrvIns, PPDMTHREAD pThread) 466 static DECLCALLBACK(int) drvNATAsyncIoGuest(PPDMDRVINS pDrvIns, PPDMTHREAD pThread) 455 467 { 456 468 PDRVNAT pThis = PDMINS_2_DATA(pDrvIns, PDRVNAT); -
trunk/src/VBox/Devices/Network/slirp/libslirp.h
r16563 r16572 16 16 # endif 17 17 # include <sys/select.h> 18 # include <poll.h> 18 19 # include <arpa/inet.h> 19 20 #endif … … 33 34 void slirp_link_down(PNATState); 34 35 36 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) 37 # if defined(RT_OS_WINDOWS) 38 void slirp_select_fill(PNATState pData, int *pndfs); 39 40 void slirp_select_poll(PNATState pData, int fTimeout, int fIcmp); 41 # else /* RT_OS_WINDOWS */ 42 void slirp_select_fill(PNATState pData, int *pnfds, struct pollfd *polls); 43 void slirp_select_poll(PNATState pData, struct pollfd *polls, int ndfs); 44 # endif /* !RT_OS_WINDOWS */ 45 #else /* VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 35 46 void slirp_select_fill(PNATState pData, int *pnfds, 36 47 fd_set *readfds, fd_set *writefds, fd_set *xfds); 37 48 38 #if defined(RT_OS_WINDOWS) && defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) 39 void slirp_select_poll(PNATState pData, int fTimeout, int fIcmp); 40 #else 41 void slirp_select_poll(PNATState pData, fd_set *readfds, fd_set *writefds, fd_set *xfds); 42 #endif 49 void slirp_select_poll(PNATState pData, int *pnfds, 50 fd_set *readfds, fd_set *writefds, fd_set *xfds); 51 #endif /* !VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 43 52 44 53 void slirp_input(PNATState pData, const uint8_t *pkt, int pkt_len); -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r16564 r16572 7 7 #include <VBox/pdmdrv.h> 8 8 #include <iprt/assert.h> 9 #include <poll.h> 9 10 10 11 #if !defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 11 12 12 # define DO_ENGAGE_EVENT1(so, fdset, label) \ 13 # ifndef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC 14 # define DO_ENGAGE_EVENT1(so, fdset, label) \ 13 15 do { \ 14 16 FD_SET((so)->s, (fdset)); \ … … 17 19 18 20 19 # define DO_ENGAGE_EVENT2(so, fdset1, fdset2, label) \21 # define DO_ENGAGE_EVENT2(so, fdset1, fdset2, label) \ 20 22 do { \ 21 23 FD_SET((so)->s, (fdset1)); \ … … 24 26 } while(0) 25 27 26 # define DO_POLL_EVENTS(rc, error, so, events, label) do {} while (0) 27 28 # define DO_CHECK_FD_SET(so, events, fdset) (FD_ISSET((so)->s, (fdset))) 29 30 # define DO_WIN_CHECK_FD_SET(so, events, fdset ) 0 /* specific for Windows Winsock API */ 31 28 # define DO_POLL_EVENTS(rc, error, so, events, label) do {} while (0) 29 30 # define DO_CHECK_FD_SET(so, events, fdset) (FD_ISSET((so)->s, fdset)) 31 # else /* !VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 32 # define DO_ENGAGE_EVENT1(so, fdset, label) \ 33 do { \ 34 polls[poll_index].fd = (so)->s; \ 35 (so)->so_poll_index = poll_index; \ 36 polls[poll_index].events = N_(fdset ## _poll); \ 37 poll_index++; \ 38 } while(0) 39 40 41 # define DO_ENGAGE_EVENT2(so, fdset1, fdset2, label) \ 42 do { \ 43 polls[poll_index].fd = (so)->s; \ 44 (so)->so_poll_index = poll_index; \ 45 polls[poll_index].events = N_(fdset1 ## _poll) | N_(fdset1 ## _poll); \ 46 poll_index++; \ 47 } while(0) 48 49 # define DO_POLL_EVENTS(rc, error, so, events, label) do {} while (0) 50 51 # define DO_CHECK_FD_SET(so, events, fdset) ( ((so)->so_poll_index != -1) \ 52 && ((so)->so_poll_index <= ndfs) \ 53 && ((so)->s == polls[so->so_poll_index].fd) \ 54 && (polls[(so)->so_poll_index].revents \ 55 && N_(fdset ## _poll))) 56 # endif /* VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 57 58 # define DO_WIN_CHECK_FD_SET(so, events, fdset ) 0 /* specific for Windows Winsock API */ 32 59 # ifndef RT_OS_WINDOWS 60 61 # ifndef RT_OS_LINUX 62 # define readfds_poll (POLLRDNORM) 63 # define writefds_poll (POLLWRNORM) 64 # define xfds_poll (POLLRDBAND|POLLWRBAND|POLLPRI) 65 # else 66 # define readfds_poll (POLLIN) 67 # define writefds_poll (POLLOUT) 68 # define xfds_poll (POLLPRI) 69 # endif 70 33 71 # define ICMP_ENGAGE_EVENT(so, fdset) \ 34 72 do { \ 35 73 if (pData->icmp_socket.s != -1) \ 36 DO_ENGAGE_EVENT1((so), (fdset), ICMP); \74 DO_ENGAGE_EVENT1((so), fdset, ICMP); \ 37 75 } while (0) 38 76 # else /* !RT_OS_WINDOWS */ … … 93 131 94 132 #define TCP_ENGAGE_EVENT1(so, fdset) \ 95 DO_ENGAGE_EVENT1((so), (fdset), tcp)133 DO_ENGAGE_EVENT1((so), fdset, tcp) 96 134 97 135 #define TCP_ENGAGE_EVENT2(so, fdset1, fdset2) \ 98 DO_ENGAGE_EVENT2((so), (fdset1), (fdset2), tcp)136 DO_ENGAGE_EVENT2((so), fdset1, fdset2, tcp) 99 137 100 138 #define UDP_ENGAGE_EVENT(so, fdset) \ 101 DO_ENGAGE_EVENT1((so), (fdset), udp)139 DO_ENGAGE_EVENT1((so), fdset, udp) 102 140 103 141 #define POLL_TCP_EVENTS(rc, error, so, events) \ … … 570 608 #endif 571 609 610 #ifndef VBOX_WITH_SIMPLIFIED_SLIRP_SYNC 572 611 void slirp_select_fill(PNATState pData, int *pnfds, 573 612 fd_set *readfds, fd_set *writefds, fd_set *xfds) 613 #else /* !VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 614 # ifdef RT_OS_WINDOWS 615 void slirp_select_fill(PNATState pData, int *pnfds) 616 # else /* RT_OS_WINDOWS */ 617 void slirp_select_fill(PNATState pData, int *pnfds, struct pollfd *polls) 618 # endif /* !RT_OS_WINDOWS */ 619 #endif /* VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 574 620 { 575 621 struct socket *so, *so_next; … … 578 624 int rc; 579 625 int error; 626 #endif 627 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) && !defined(RT_OS_WINDOWS) 628 int poll_index = 0; 580 629 #endif 581 630 int i; … … 725 774 } 726 775 727 #if !defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 776 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) 777 # if defined(RT_OS_WINDOWS) 778 *pnfds = VBOX_EVENT_COUNT; 779 # else /* RT_OS_WINDOWS */ 780 *pnfds = poll_index; 781 # endif /* !RT_OS_WINDOWS */ 782 #else /* VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 728 783 *pnfds = nfds; 729 #else 730 *pnfds = VBOX_EVENT_COUNT; 731 #endif 784 #endif /* !VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 732 785 733 786 STAM_PROFILE_STOP(&pData->StatFill, a); 734 787 } 735 788 736 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 789 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) 790 # if defined(RT_OS_WINDOWS) 737 791 void slirp_select_poll(PNATState pData, int fTimeout, int fIcmp) 738 #else 792 # else /* RT_OS_WINDOWS */ 793 void slirp_select_poll(PNATState pData, struct pollfd *polls, int ndfs) 794 # endif /* !RT_OS_WINDOWS */ 795 #else /* VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 739 796 void slirp_select_poll(PNATState pData, fd_set *readfds, fd_set *writefds, fd_set *xfds) 740 #endif 797 #endif /* !VBOX_WITH_SIMPLIFIED_SLIRP_SYNC */ 741 798 { 742 799 struct socket *so, *so_next; … … 746 803 int rc; 747 804 int error; 805 #endif 806 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) && !defined(RT_OS_WINDOWS) 807 int poll_index = 0; 748 808 #endif 749 809 … … 791 851 sorecvfrom(pData, &pData->icmp_socket); 792 852 #else 793 if (pData->icmp_socket.s != -1 && FD_ISSET(pData->icmp_socket.s, readfds)) 853 if ( (pData->icmp_socket.s != -1) 854 && CHECK_FD_SET(&pData->icmp_socket, ignored, readfds)) 794 855 sorecvfrom(pData, &pData->icmp_socket); 795 856 #endif -
trunk/src/VBox/Devices/Network/slirp/socket.h
r16501 r16572 70 70 RTCRITSECT so_mutex; 71 71 int so_deleted; 72 #endif 73 #if defined(VBOX_WITH_SIMPLIFIED_SLIRP_SYNC) && !defined(RT_OS_WINDOWS) 74 int so_poll_index; 72 75 #endif 73 76 };
Note:
See TracChangeset
for help on using the changeset viewer.