Changeset 12618 in vbox for trunk/src/VBox/HostDrivers/VBoxNetFlt
- Timestamp:
- Sep 21, 2008 11:47:07 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 36894
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
r12606 r12618 604 604 } 605 605 606 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 607 PVBOXNETFLTINS pThis = pState->pCurInstance; 608 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 609 606 610 /* 607 611 * Check VirtualBox stream type. … … 610 614 { 611 615 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed due to undefined VirtualBox open mode.\n")); 616 617 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 612 618 return ENOENT; 613 619 } … … 638 644 { 639 645 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate promiscuous stream data.\n")); 646 647 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 640 648 return ENOMEM; 641 649 } … … 656 664 { 657 665 LogRel((DEVICE_NAME ":VBoxNetFltSolarisModOpen failed to allocate stream data.\n")); 666 667 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 658 668 return ENOMEM; 659 669 } … … 666 676 * the one that we will associate this stream with. 667 677 */ 668 pStream->pThis = p State->pCurInstance;678 pStream->pThis = pThis; 669 679 pStream->Type = pState->CurType; 670 680 switch (pStream->Type) 671 681 { 672 case kIpStream: pState->pCurInstance->u.s.pvIpStream = pStream; break; 673 case kArpStream: pState->pCurInstance->u.s.pvArpStream = pStream; break; 674 case kPromiscStream: pState->pCurInstance->u.s.pvPromiscStream = pStream; break; 675 default: AssertRelease(pStream->Type); break; 682 case kIpStream: ASMAtomicUoWritePtr(&pThis->u.s.pvIpStream, pStream); break; 683 case kArpStream: ASMAtomicUoWritePtr(&pThis->u.s.pvArpStream, pStream); break; 684 case kPromiscStream: ASMAtomicUoWritePtr(&pThis->u.s.pvPromiscStream, pStream); break; 685 default: /* Heh. */ 686 { 687 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 688 AssertRelease(pStream->Type); 689 break; 690 } 676 691 } 677 692 … … 693 708 /* 694 709 * Bind to SAP 0 (DL_ETHER). 695 * Note: We don't support DL_TPR (token passing ring) SAP as that is 696 * unnecessary asynchronous work to get DL_INFO_REQ acknowledgements 697 * and determine SAP based on the Mac Type etc. Besides nobody uses 698 * TPR anymore as far as I know. 710 * Note: We don't support DL_TPR (token passing ring) SAP as that is unnecessary asynchronous 711 * work to get DL_INFO_REQ acknowledgements and determine SAP based on the Mac Type etc. 712 * Besides TPR doesn't really exist anymore practically as far as I know. 699 713 */ 700 714 int rc = vboxNetFltSolarisBindReq(pStream->pReadQueue, 0 /* SAP */); 701 if (RT_UNLIKELY(RT_FAILURE(rc))) 702 { 715 if (RT_LIKELY(RT_SUCCESS(rc))) 716 { 717 /* 718 * Request the physical address (we cache the acknowledgement). 719 */ 720 /** @todo take a look at DLPI notifications additionally for these things. */ 721 rc = vboxNetFltSolarisPhysAddrReq(pStream->pReadQueue); 722 if (RT_LIKELY(RT_SUCCESS(rc))) 723 { 724 /* 725 * Enable raw mode. 726 */ 727 rc = vboxNetFltSolarisSetRawMode(pPromiscStream); 728 if (RT_FAILURE(rc)) 729 LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc)); 730 } 731 else 732 LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc)); 733 } 734 else 703 735 LogRel((DEVICE_NAME ":vboxNetFltSolarisBindReq failed rc=%Vrc.\n", rc)); 736 737 if (RT_FAILURE(rc)) 738 { 739 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 704 740 return EPROTO; 705 }706 707 /*708 * Request the physical address (we cache the acknowledgement).709 */710 /** @todo take a look at DLPI notifications additionally for these things. */711 rc = vboxNetFltSolarisPhysAddrReq(pStream->pReadQueue);712 if (RT_UNLIKELY(RT_FAILURE(rc)))713 {714 LogRel((DEVICE_NAME ":vboxNetFltSolarisPhysAddrReq failed rc=%Vrc.\n", rc));715 return EPROTO;716 }717 718 /*719 * Enable raw mode.720 */721 rc = vboxNetFltSolarisSetRawMode(pPromiscStream);722 if (RT_UNLIKELY(RT_FAILURE(rc)))723 {724 LogRel((DEVICE_NAME ":vboxNetFltSolarisSetRawMode failed rc=%Vrc.\n", rc));725 return EPROTO;726 741 } 727 742 } … … 732 747 LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModOpen returns 0, DevMinor=%d pQueue=%p\n", DevMinor, pStream->pReadQueue)); 733 748 749 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 734 750 return 0; 735 751 } … … 763 779 return ENXIO; 764 780 } 781 782 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 783 PVBOXNETFLTINS pThis = pStream->pThis; 784 RTSpinlockAcquire(pThis->hSpinlock, &Tmp); 765 785 766 786 qprocsoff(pQueue); … … 782 802 case kArpStream: ASMAtomicUoWritePtr(pStream->pThis->u.s.pvArpStream, NULL); break; 783 803 case kPromiscStream: ASMAtomicUoWritePtr(pStream->pThis->u.s.pvPromiscStream, NULL); break; 784 default: AssertRelease(pStream->Type); break; 804 default: /* Heh. */ 805 { 806 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 807 AssertRelease(pStream->Type); 808 break; 809 } 785 810 } 786 811 … … 791 816 NOREF(fOpenMode); 792 817 NOREF(pCred); 818 819 RTSpinlockRelease(pThis->hSpinlock, &Tmp); 793 820 794 821 return 0; … … 2314 2341 fSrc = INTNETTRUNKDIR_HOST; 2315 2342 2316 #if 1 2343 /* 2344 * Afaik; we no longer need to worry about incorrect checksums because we now use 2345 * a dedicated stream and don't intercept packets under IP/ARP which might be doing 2346 * checksum offloading. 2347 */ 2348 #if 0 2317 2349 if (fSrc & INTNETTRUNKDIR_HOST) 2318 2350 { … … 2321 2353 pMsg = pCorrectedMsg; 2322 2354 } 2355 2356 vboxNetFltSolarisAnalyzeMBlk(pMsg); 2323 2357 #endif 2324 2325 vboxNetFltSolarisAnalyzeMBlk(pMsg);2326 2358 2327 2359 /* … … 2433 2465 PRTNETIPV4 pIpHdr = (PRTNETIPV4)pbProtocol; 2434 2466 size_t cbPayload = cbIpPacket - (pIpHdr->ip_hl << 2); 2435 2436 2467 bool fChecksumAdjusted = false; 2437 2438 /* 2439 * Fix up TCP/UDP and IP checksums if they're incomplete/invalid. 2440 */ 2441 if (pIpHdr->ip_p == RTNETIPV4_PROT_TCP) 2468 if (RTNetIPv4IsHdrValid(pIpHdr, cbPayload, cbPayload)) 2442 2469 { 2443 2470 pbProtocol += (pIpHdr->ip_hl << 2); 2444 PRTNETTCP pTcpHdr = (PRTNETTCP)pbProtocol; 2445 uint16_t TcpChecksum = RTNetIPv4TCPChecksum(pIpHdr, pTcpHdr, NULL); 2446 if (pTcpHdr->th_sum != TcpChecksum) 2471 2472 /* 2473 * Fix up TCP/UDP and IP checksums if they're incomplete/invalid. 2474 */ 2475 if (pIpHdr->ip_p == RTNETIPV4_PROT_TCP) 2447 2476 { 2448 pTcpHdr->th_sum = TcpChecksum; 2449 fChecksumAdjusted = true; 2450 LogFlow((DEVICE_NAME ":fixed TCP checksum.\n")); 2477 PRTNETTCP pTcpHdr = (PRTNETTCP)pbProtocol; 2478 uint16_t TcpChecksum = RTNetIPv4TCPChecksum(pIpHdr, pTcpHdr, NULL); 2479 if (pTcpHdr->th_sum != TcpChecksum) 2480 { 2481 pTcpHdr->th_sum = TcpChecksum; 2482 fChecksumAdjusted = true; 2483 LogFlow((DEVICE_NAME ":fixed TCP checksum.\n")); 2484 } 2451 2485 } 2452 2453 uint16_t IpChecksum = RTNetIPv4HdrChecksum(pIpHdr); 2454 if (pIpHdr->ip_sum != IpChecksum) 2486 else if (pIpHdr->ip_p == RTNETIPV4_PROT_UDP) 2455 2487 { 2456 pIpHdr->ip_sum = IpChecksum; 2457 fChecksumAdjusted = true; 2458 LogFlow((DEVICE_NAME ":fixed IP checksum.\n")); 2459 } 2460 } 2461 else if (pIpHdr->ip_p == RTNETIPV4_PROT_UDP) 2462 { 2463 pbProtocol += (pIpHdr->ip_hl << 2); 2464 PRTNETUDP pUdpHdr = (PRTNETUDP)pbProtocol; 2465 uint16_t UdpChecksum = RTNetIPv4UDPChecksum(pIpHdr, pUdpHdr, pUdpHdr + 1); 2466 2467 if (pUdpHdr->uh_sum != UdpChecksum) 2468 { 2469 pUdpHdr->uh_sum = UdpChecksum; 2470 fChecksumAdjusted = true; 2471 LogFlow((DEVICE_NAME ":Fixed UDP checksum.")); 2472 } 2473 2474 uint16_t IpChecksum = RTNetIPv4HdrChecksum(pIpHdr); 2475 if (pIpHdr->ip_sum != IpChecksum) 2476 { 2477 pIpHdr->ip_sum = IpChecksum; 2478 fChecksumAdjusted = true; 2479 LogFlow((DEVICE_NAME ":fixed IP checksum.\n")); 2488 PRTNETUDP pUdpHdr = (PRTNETUDP)pbProtocol; 2489 uint16_t UdpChecksum = RTNetIPv4UDPChecksum(pIpHdr, pUdpHdr, pUdpHdr + 1); 2490 2491 if (pUdpHdr->uh_sum != UdpChecksum) 2492 { 2493 pUdpHdr->uh_sum = UdpChecksum; 2494 fChecksumAdjusted = true; 2495 LogFlow((DEVICE_NAME ":Fixed UDP checksum.")); 2496 } 2480 2497 } 2481 2498 }
Note:
See TracChangeset
for help on using the changeset viewer.