Changeset 28037 in vbox
- Timestamp:
- Apr 7, 2010 9:56:45 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 59744
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/intnetinline.h
r28027 r28037 82 82 pSG->GsoCtx.cbMaxSeg= 0; 83 83 pSG->GsoCtx.offHdr1 = 0; 84 pSG->GsoCtx.cbHdr1 = 0;85 84 pSG->GsoCtx.offHdr2 = 0; 86 pSG->GsoCtx.cbHdr2 = 0; 85 pSG->GsoCtx.au8Unused[0] = 0; 86 pSG->GsoCtx.au8Unused[1] = 0; 87 87 #if ARCH_BITS == 64 88 88 pSG->uPadding = 0; … … 120 120 pSG->GsoCtx.cbMaxSeg= pGso->cbMaxSeg; 121 121 pSG->GsoCtx.offHdr1 = pGso->offHdr1; 122 pSG->GsoCtx.cbHdr1 = pGso->cbHdr1;123 122 pSG->GsoCtx.offHdr2 = pGso->offHdr2; 124 pSG->GsoCtx.cbHdr2 = pGso->cbHdr2; 123 pSG->GsoCtx.au8Unused[0] = 0; 124 pSG->GsoCtx.au8Unused[1] = 0; 125 125 #if ARCH_BITS == 64 126 126 pSG->uPadding = 0; -
trunk/include/VBox/pdmnetinline.h
r28028 r28037 52 52 53 53 PDMNETWORKGSOTYPE const enmType = (PDMNETWORKGSOTYPE)pGso->u8Type; 54 if (RT_UNLIKELY( enmType <= PDMNETWORKGSOTYPE_INVALID || enmType >= PDMNETWORKGSOTYPE_END))54 if (RT_UNLIKELY( enmType <= PDMNETWORKGSOTYPE_INVALID || enmType >= PDMNETWORKGSOTYPE_END )) 55 55 return false; 56 56 57 57 /* all types requires both headers. */ 58 if (RT_UNLIKELY(pGso->offHdr1 < sizeof(RTNETETHERHDR))) 59 return false; 60 if (RT_UNLIKELY(pGso->offHdr2 < sizeof(RTNETETHERHDR))) 61 return false; 62 if (RT_UNLIKELY(pGso->offHdr2 < (unsigned)pGso->offHdr1 + pGso->cbHdr1)) 63 return false; 64 if (RT_UNLIKELY(pGso->cbHdrs < (unsigned)pGso->offHdr2 + pGso->cbHdr2)) 58 if (RT_UNLIKELY( pGso->offHdr1 < sizeof(RTNETETHERHDR) )) 59 return false; 60 if (RT_UNLIKELY( pGso->offHdr2 <= pGso->offHdr1 )) 61 return false; 62 if (RT_UNLIKELY( pGso->cbHdrs <= pGso->offHdr2 )) 65 63 return false; 66 64 … … 70 68 case PDMNETWORKGSOTYPE_IPV4_TCP: 71 69 case PDMNETWORKGSOTYPE_IPV4_UDP: 72 if (RT_UNLIKELY(pGso->cbHdr1 < sizeof(RTNETIPV4_MIN_LEN))) 70 if (RT_UNLIKELY( (unsigned)pGso->offHdr2 - pGso->offHdr1 < RTNETIPV4_MIN_LEN )) 71 return false; 72 break; 73 case PDMNETWORKGSOTYPE_IPV6_TCP: 74 case PDMNETWORKGSOTYPE_IPV6_UDP: 75 if (RT_UNLIKELY( (unsigned)pGso->offHdr2 - pGso->offHdr1 < RTNETIPV6_MIN_LEN )) 73 76 return false; 74 77 break; 75 78 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: 76 79 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: 77 if (RT_UNLIKELY(pGso->cbHdr1 < sizeof(RTNETIPV4_MIN_LEN))) 78 return false; 79 if (RT_UNLIKELY(pGso->offHdr1 + pGso->cbHdr1 + RTNETIPV6_MIN_LEN > pGso->offHdr2)) 80 return false; 81 break; 82 case PDMNETWORKGSOTYPE_IPV6_TCP: 83 case PDMNETWORKGSOTYPE_IPV6_UDP: 84 if (RT_UNLIKELY(pGso->cbHdr1 < sizeof(RTNETIPV6_MIN_LEN))) 80 if (RT_UNLIKELY( (unsigned)pGso->offHdr2 - pGso->offHdr1 < RTNETIPV4_MIN_LEN + RTNETIPV6_MIN_LEN )) 85 81 return false; 86 82 break; … … 97 93 case PDMNETWORKGSOTYPE_IPV6_TCP: 98 94 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: 99 if (RT_UNLIKELY( pGso->cbHdr2 < sizeof(RTNETTCP_MIN_LEN)))95 if (RT_UNLIKELY( (unsigned)pGso->cbHdrs - pGso->offHdr2 < RTNETTCP_MIN_LEN )) 100 96 return false; 101 97 break; … … 103 99 case PDMNETWORKGSOTYPE_IPV6_UDP: 104 100 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: 105 if (RT_UNLIKELY( pGso->cbHdr2 < sizeof(RTNETUDP_MIN_LEN)))101 if (RT_UNLIKELY( (unsigned)pGso->cbHdrs - pGso->offHdr2 < RTNETUDP_MIN_LEN )) 106 102 return false; 107 103 break; … … 113 109 114 110 /* There must be at more than one segment. */ 115 if (RT_UNLIKELY( cbFrame <= pGso->cbHdrs))116 return false; 117 if (RT_UNLIKELY( cbFrame - pGso->cbHdrs < pGso->cbMaxSeg))111 if (RT_UNLIKELY( cbFrame <= pGso->cbHdrs )) 112 return false; 113 if (RT_UNLIKELY( cbFrame - pGso->cbHdrs < pGso->cbMaxSeg )) 118 114 return false; 119 115 … … 215 211 { 216 212 PRTNETIPV6 pIpHdr = (PRTNETIPV6)&pbSegHdrs[offIpHdr]; 217 uint 32_t cbPayload = cbHdrs - offIpHdr + sizeof(*pIpHdr) + cbSegPayload;213 uint16_t cbPayload = (uint16_t)(cbHdrs - (offIpHdr + sizeof(RTNETIPV6)) + cbSegPayload); 218 214 pIpHdr->ip6_plen = RT_H2N_U16(cbPayload); 219 cbPayload -= (offPktHdr - offPktHdr - sizeof(*pIpHdr)); 220 return RTNetIPv6PseudoChecksumEx(pIpHdr, bProtocol, (uint16_t)cbPayload); 215 return RTNetIPv6PseudoChecksumEx(pIpHdr, bProtocol, (uint16_t)(cbHdrs - offPktHdr + cbSegPayload)); 221 216 } 222 217 … … 309 304 case PDMNETWORKGSOTYPE_IPV6_TCP: 310 305 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 311 pGso-> cbHdr2, RTNETIPV4_PROT_TCP),306 pGso->offHdr2, RTNETIPV4_PROT_TCP), 312 307 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 313 308 pGso->cbHdrs, iSeg + 1 == cSegs); … … 315 310 case PDMNETWORKGSOTYPE_IPV6_UDP: 316 311 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 317 pGso-> cbHdr2, RTNETIPV4_PROT_UDP),312 pGso->offHdr2, RTNETIPV4_PROT_UDP), 318 313 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs); 319 314 break; … … 321 316 pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs); 322 317 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 323 cbSegPayload, pGso->cbHdrs, pGso-> cbHdr2, RTNETIPV4_PROT_TCP),318 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 324 319 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 325 320 pGso->cbHdrs, iSeg + 1 == cSegs); … … 328 323 pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs); 329 324 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 330 cbSegPayload, pGso->cbHdrs, pGso-> cbHdr2, RTNETIPV4_PROT_UDP),325 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 331 326 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs); 332 327 break; … … 402 397 case PDMNETWORKGSOTYPE_IPV6_TCP: 403 398 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 404 pGso-> cbHdr2, RTNETIPV4_PROT_TCP),399 pGso->offHdr2, RTNETIPV4_PROT_TCP), 405 400 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 406 401 pGso->cbHdrs, iSeg + 1 == cSegs); … … 408 403 case PDMNETWORKGSOTYPE_IPV6_UDP: 409 404 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 410 pGso-> cbHdr2, RTNETIPV4_PROT_UDP),405 pGso->offHdr2, RTNETIPV4_PROT_UDP), 411 406 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs); 412 407 break; … … 414 409 pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs); 415 410 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 416 cbSegPayload, pGso->cbHdrs, pGso-> cbHdr2, RTNETIPV4_PROT_TCP),411 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 417 412 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 418 413 pGso->cbHdrs, iSeg + 1 == cSegs); … … 421 416 pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs); 422 417 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 423 cbSegPayload, pGso->cbHdrs, pGso-> cbHdr2, RTNETIPV4_PROT_UDP),418 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 424 419 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs); 425 420 break; -
trunk/include/VBox/types.h
r28025 r28037 744 744 /** Invalid zero value. */ 745 745 PDMNETWORKGSOTYPE_INVALID = 0, 746 /** TCP/IPv4 . */746 /** TCP/IPv4 - no CWR/ECE encoding. */ 747 747 PDMNETWORKGSOTYPE_IPV4_TCP, 748 /** TCP/IPv6 . */748 /** TCP/IPv6 - no CWR/ECE encoding. */ 749 749 PDMNETWORKGSOTYPE_IPV6_TCP, 750 750 /** UDP/IPv4. */ … … 752 752 /** UDP/IPv6. */ 753 753 PDMNETWORKGSOTYPE_IPV6_UDP, 754 /** TCP/IPv6 over IPv4 tunneling .754 /** TCP/IPv6 over IPv4 tunneling - no CWR/ECE encoding. 755 755 * The header offsets and sizes relates to IPv4 and TCP, the IPv6 header is 756 756 * figured out as needed. … … 788 788 /** Offset of the first header (IPv4 / IPv6). 0 if not not needed. */ 789 789 uint8_t offHdr1; 790 /** The size of the first header (IPv4 / IPv6). 0 if not not needed. */791 uint8_t cbHdr1;792 793 790 /** Offset of the second header (TCP / UDP). 0 if not not needed. */ 794 791 uint8_t offHdr2; 795 /** The size of the second header (TCP / UDP). 0 if not not needed. */796 uint8_t cbHdr2;792 /** Unused. */ 793 uint8_t au8Unused[2]; 797 794 } PDMNETWORKGSO; 798 795 /** Pointer to a GSO context. */ -
trunk/src/VBox/Devices/Network/DevE1000.cpp
r27974 r28037 56 56 #include <VBox/pdmdev.h> 57 57 #include <VBox/pdmnetifs.h> 58 #include <VBox/pdmnetinline.h> 58 59 #include <VBox/tm.h> 59 60 #include <VBox/vm.h> … … 1007 1008 /** TX: Context used for ordinary packets. */ 1008 1009 E1KTXCTX contextNormal; 1010 /** GSO context. u8Type is set to PDMNETWORKGSOTYPE_INVALID when not 1011 * applicable to the current TSE mode. */ 1012 PDMNETWORKGSO GsoCtx; 1009 1013 #if 1 /** @todo bird/buffering: change this to a 240 bytes buffer of the headers when TSE=1. */ 1010 1014 /** TX: Transmit packet buffer. */ … … 2815 2819 2816 2820 2821 /** 2822 * Sets up the GSO context according to the TSE new context descriptor. 2823 * 2824 * @param pGso The GSO context to setup. 2825 * @param pCtx The context descriptor. 2826 */ 2827 DECLINLINE(void) e1kSetupGsoCtx(PPDMNETWORKGSO pGso, E1KTXCTX const *pCtx) 2828 { 2829 pGso->u8Type = PDMNETWORKGSOTYPE_INVALID; 2830 2831 /* 2832 * See if the context descriptor describes something that could be TCP or 2833 * UDP over IPv[46]. 2834 */ 2835 /* Check the header ordering and spacing: 1. Ethernet, 2. IP, 3. TCP/UDP. */ 2836 if (RT_UNLIKELY( pCtx->ip.u8CSS < sizeof(RTNETETHERHDR) )) 2837 return; 2838 if (RT_UNLIKELY( pCtx->tu.u8CSS < (size_t)pCtx->ip.u8CSS + (pCtx->dw2.fIP ? RTNETIPV4_MIN_LEN : RTNETIPV6_MIN_LEN) )) 2839 return; 2840 if (RT_UNLIKELY( pCtx->dw2.fTCP 2841 ? pCtx->dw3.u8HDRLEN < (size_t)pCtx->tu.u8CSS + RTNETTCP_MIN_LEN 2842 : pCtx->dw3.u8HDRLEN != (size_t)pCtx->tu.u8CSS + RTNETUDP_MIN_LEN )) 2843 return; 2844 2845 /* The end of the TCP/UDP checksum should stop at the end of the packet or at least after the headers. */ 2846 if (RT_UNLIKELY( pCtx->tu.u16CSE > 0 && pCtx->tu.u16CSE <= pCtx->dw3.u8HDRLEN )) 2847 return; 2848 2849 /* IPv4 checksum offset. */ 2850 if (RT_UNLIKELY( pCtx->dw2.fIP && pCtx->ip.u8CSO - pCtx->ip.u8CSS != RT_OFFSETOF(RTNETIPV4, ip_sum) )) 2851 return; 2852 2853 /* TCP/UDP checksum offsets. */ 2854 if (RT_UNLIKELY( pCtx->tu.u8CSO - pCtx->tu.u8CSS != ( pCtx->dw2.fTCP 2855 ? RT_OFFSETOF(RTNETTCP, th_sum) 2856 : RT_OFFSETOF(RTNETUDP, uh_sum) ) )) 2857 return; 2858 2859 /* 2860 * We're good for now - we'll do more checks when seeing the data. 2861 * So, figure the type of offloading and setup the context. 2862 */ 2863 if (pCtx->dw2.fIP) 2864 { 2865 if (pCtx->dw2.fTCP) 2866 pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_TCP; 2867 else 2868 pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_UDP; 2869 /** @todo Detect IPv4-IPv6 tunneling (need test setup since linux doesn't do 2870 * this yet it seems)... */ 2871 } 2872 else 2873 { 2874 if (pCtx->dw2.fTCP) 2875 pGso->u8Type = PDMNETWORKGSOTYPE_IPV6_TCP; 2876 else 2877 pGso->u8Type = PDMNETWORKGSOTYPE_IPV6_UDP; 2878 } 2879 pGso->offHdr1 = pCtx->ip.u8CSS; 2880 pGso->offHdr2 = pCtx->tu.u8CSS; 2881 pGso->cbHdrs = pCtx->dw3.u8HDRLEN; 2882 pGso->cbMaxSeg = pCtx->dw3.u16MSS; 2883 Assert(PDMNetGsoIsValid(pGso, sizeof(*pGso), pGso->cbMaxSeg * 5)); 2884 } 2817 2885 2818 2886 /** … … 3238 3306 pState->u32PayRemain = pDesc->context.dw2.u20PAYLEN; 3239 3307 pState->u16HdrRemain = pDesc->context.dw3.u8HDRLEN; 3308 e1kSetupGsoCtx(&pState->GsoCtx, &pDesc->context); 3240 3309 } 3241 3310 else … … 4783 4852 rc = SSMR3GetMem(pSSM, &pState->contextNormal, sizeof(pState->contextNormal)); 4784 4853 AssertRCReturn(rc, rc); 4854 4855 /* derived state */ 4856 e1kSetupGsoCtx(&pState->GsoCtx, &pState->contextTSE); 4857 4785 4858 E1kLog(("%s State has been restored\n", INSTANCE(pState))); 4786 4859 e1kDumpState(pState); -
trunk/src/VBox/Devices/Network/DrvIntNet.cpp
r28025 r28037 518 518 cbFrame, u64Now, u64Now - pThis->u64LastReceiveTS, u64Now - pThis->u64LastTransferTS, cSegs)); 519 519 pThis->u64LastReceiveTS = u64Now; 520 Log2(("drvR3IntNetAsyncIoRun: cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x /%#x Hdr2=%#x/%#x MMS=%#x\n"520 Log2(("drvR3IntNetAsyncIoRun: cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n" 521 521 "%.*Rhxd\n", 522 cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso-> cbHdr1, pGso->offHdr2, pGso->cbHdr2,523 pGso->cbMaxSeg,cbFrame - sizeof(*pGso), pGso + 1));522 cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg, 523 cbFrame - sizeof(*pGso), pGso + 1)); 524 524 } 525 525 #endif … … 541 541 else 542 542 { 543 AssertMsgFailed(("cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x /%#x Hdr2=%#x/%#x MMS=%#x\n",544 cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso-> cbHdr1, pGso->offHdr2, pGso->cbHdr2, pGso->cbMaxSeg));543 AssertMsgFailed(("cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n", 544 cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg)); 545 545 STAM_REL_COUNTER_INC(&pBuf->cStatBadFrames); 546 546 }
Note:
See TracChangeset
for help on using the changeset viewer.