Changeset 14028 in vbox
- Timestamp:
- Nov 10, 2008 5:21:32 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 39084
- Location:
- trunk/src/VBox/Devices/Network
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r13987 r14028 40 40 41 41 #ifdef VBOX_WITH_SIMPLEFIED_SLIRP_SYNC 42 # include <unistd.h> 42 # ifndef RT_OS_WINDOWS 43 # include <unistd.h> 44 # endif 43 45 # include <errno.h> 44 46 # include<iprt/semaphore.h> … … 85 87 RTFILE PipeRead; 86 88 #else 89 /* 1 - for Outher network events, and 0 for sending routine notification*/ 90 HANDLE hNetworkEvent[2]; 87 91 #endif 88 92 /** Send buffer */ … … 113 117 Log2(("drvNATSend: pvBuf=%p cb=%#x\n%.*Rhxd\n", pvBuf, cb, cb, pvBuf)); 114 118 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 119 121 /*notify select to wakeup*/ 120 122 memcpy(pThis->cBuffer,pvBuf, cb); 121 123 pThis->sBufferSize = cb; 124 # ifndef RT_OS_WINDOWS 122 125 int rc = RTFileWrite(pThis->PipeWrite, "1", 2, NULL); 123 126 AssertRC(rc); 127 # else 128 WSASetEvent(pThis->hNetworkEvent[0]); 129 # endif 124 130 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 128 137 Assert(pThis->enmLinkState == PDMNETWORKLINKSTATE_UP); 129 if (pThis->enmLinkState == PDMNETWORKLINKSTATE_UP) {138 if (pThis->enmLinkState == PDMNETWORKLINKSTATE_UP) 130 139 slirp_input(pThis->pNATState, (uint8_t *)pvBuf, cb); 131 } 140 132 141 RTCritSectLeave(&pThis->CritSect); 133 #endif 142 143 #endif /* !VBOX_WITH_SIMPLEFIED_SLIRP_SYNC */ 144 134 145 LogFlow(("drvNATSend: end\n")); 135 146 return VINF_SUCCESS; … … 232 243 int nFDs = -1; 233 244 int rc; 245 # ifdef RT_OS_WINDOWS 246 DWORD event; 247 HANDLE *phEvents; 248 # endif 234 249 const struct timeval TimeWait = { 0, 2000 }; /* 2ms for the fast timer */ 235 250 const struct timeval TimeNoWait = { 0, 0 }; /* return immediately */ … … 256 271 */ 257 272 slirp_select_fill(pThis->pNATState, &nFDs, &ReadFDs, &WriteFDs, &XcptFDs); 273 # ifndef RT_OS_WINDOWS 258 274 struct timeval tv = fWait ? TimeWait : TimeNoWait; 259 275 FD_SET(pThis->PipeRead, &ReadFDs); /* Linux only */ … … 281 297 } 282 298 } 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 */ 283 319 } 284 320 … … 635 671 AssertReleaseRC(rc); 636 672 673 # ifndef RT_OS_WINDOWS 637 674 /* 638 675 * Create the control pipe. 639 * XXX: Linux only640 676 */ 641 677 int fds[2]; … … 648 684 pThis->PipeRead = fds[0]; 649 685 pThis->PipeWrite = fds[1]; 686 # else 687 pThis->hNetworkEvent[0] = WSACreateEvent(); 688 pThis->hNetworkEvent[1] = WSACreateEvent(); 689 # endif 650 690 651 691 rc = PDMDrvHlpPDMThreadCreate(pDrvIns, &pThis->pThread, pThis, drvNATAsyncIoThread, drvNATAsyncIoWakeup, 128 * _1K, RTTHREADTYPE_IO, "NAT"); -
trunk/src/VBox/Devices/Network/slirp/libslirp.h
r13984 r14028 49 49 int guest_port); 50 50 51 51 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 52 HANDLE *slirp_get_events(PNATState pData); 53 #endif 52 54 #ifdef __cplusplus 53 55 } -
trunk/src/VBox/Devices/Network/slirp/slirp.c
r13984 r14028 347 347 int nfds; 348 348 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 349 354 350 355 nfds = *pnfds; … … 361 366 ((struct ipasfrag *)&ipq != u32_to_ptr(pData, ipq.next, struct ipasfrag *))); 362 367 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 363 375 for (so = tcb.so_next; so != &tcb; so = so_next) { 364 376 so_next = so->so_next; … … 381 393 */ 382 394 if (so->so_state & SS_FACCEPTCONN) { 395 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 383 396 FD_SET(so->s, readfds); 384 397 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 385 403 continue; 386 404 } … … 390 408 */ 391 409 if (so->so_state & SS_ISFCONNECTING) { 410 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 392 411 FD_SET(so->s, writefds); 393 412 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 394 418 continue; 395 419 } … … 400 424 */ 401 425 if (CONN_CANFSEND(so) && so->so_rcv.sb_cc) { 426 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 402 427 FD_SET(so->s, writefds); 403 428 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 404 434 } 405 435 … … 409 439 */ 410 440 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) 411 442 FD_SET(so->s, readfds); 412 443 FD_SET(so->s, xfds); 413 444 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 414 450 } 451 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 452 cchEvents++; 453 #endif 415 454 } 416 455 … … 443 482 */ 444 483 if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) { 484 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 445 485 FD_SET(so->s, readfds); 446 486 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 447 492 } 493 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 494 cchEvents++; 495 #endif 448 496 } 449 497 } … … 482 530 } 483 531 } 532 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 484 533 *pnfds = nfds; 534 #else 535 *pnfds = chEvents; 536 #endif 485 537 } 486 538 … … 489 541 struct socket *so, *so_next; 490 542 int ret; 543 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 544 WSANETWORKEVENTS NetworkEvents; 545 int rc; 546 #endif 491 547 492 548 /* Update time */ … … 517 573 for (so = tcb.so_next; so != &tcb; so = so_next) { 518 574 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 519 579 520 580 /* … … 530 590 * test for readfds below if this succeeds 531 591 */ 592 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 532 593 if (FD_ISSET(so->s, xfds)) 594 #else 595 if ((NetworkEvents.lNetworkEvents & FD_OOB) && NetworkEvents.iErrorCode[FD_OOB_BIT] == 0) 596 #endif 533 597 sorecvoob(pData, so); 534 598 /* 535 599 * Check sockets for reading 536 600 */ 601 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 537 602 else if (FD_ISSET(so->s, readfds)) { 603 #else 604 else if ((NetworkEvents.lNetworkEvents & FD_READ) && (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) { 605 #endif 538 606 /* 539 607 * Check for incoming connections … … 541 609 if (so->so_state & SS_FACCEPTCONN) { 542 610 tcp_connect(pData, so); 611 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 612 WSAResetEvent(so->hNetworkEvent); 613 #endif 543 614 continue; 544 615 } /* else */ … … 553 624 * Check sockets for writing 554 625 */ 626 #if !defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) || !defined(RT_OS_WINDOWS) 555 627 if (FD_ISSET(so->s, writefds)) { 628 #else 629 if ((NetworkEvents.lNetworkEvents & FD_WRITE) && (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)) { 630 #endif 556 631 /* 557 632 * Check for non-blocking, still-connecting sockets … … 572 647 /* XXXXX Must fix, zero bytes is a NOP */ 573 648 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 575 653 continue; 654 } 576 655 577 656 /* else failed */ … … 607 686 /* XXX */ 608 687 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 610 692 continue; /* Still connecting, continue */ 693 } 611 694 612 695 /* else failed */ … … 619 702 /* XXX */ 620 703 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 622 708 continue; 709 } 623 710 /* else failed */ 624 711 so->so_state = SS_NOFDREF; … … 640 727 so_next = so->so_next; 641 728 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) 642 734 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 643 738 sorecvfrom(pData, so); 739 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 740 WSAResetEvent(so->hNetworkEvent); 741 #endif 644 742 } 645 743 } … … 819 917 memcpy(client_ethaddr, ethaddr, ETH_ALEN); 820 918 } 919 920 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 921 HANDLE *slirp_get_events(PNATState pData) 922 { 923 return (pData->phEvents); 924 } 925 #endif -
trunk/src/VBox/Devices/Network/slirp/slirp_state.h
r13984 r14028 116 116 struct socket udb; 117 117 struct socket *udp_last_so; 118 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 119 HANDLE *phEvents; 120 #endif 118 121 } NATState; 119 122 -
trunk/src/VBox/Devices/Network/slirp/socket.c
r13984 r14028 60 60 so->so_state = SS_NOFDREF; 61 61 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 62 65 } 63 66 return(so); … … 80 83 81 84 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 82 89 83 90 if(so->so_next && so->so_prev) -
trunk/src/VBox/Devices/Network/slirp/socket.h
r13984 r14028 52 52 struct sbuf so_snd; /* Send buffer */ 53 53 void * extra; /* Extra pointer */ 54 #if defined(VBOX_WITH_SIMPLEFIED_SLIRP_SYNC) && defined(RT_OS_WINDOWS) 55 HANDLE hNetworkEvent; 56 #endif 54 57 }; 55 58
Note:
See TracChangeset
for help on using the changeset viewer.