Changeset 31271 in vbox
- Timestamp:
- Aug 2, 2010 8:31:54 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 64297
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmnetinline.h
r28800 r31271 40 40 41 41 42 /** 43 * Checksum type. 44 */ 45 typedef enum RTNETCSUMTYPE 46 { 47 /** No checksum. */ 48 RTNETCSUMTYPE_NONE = 0, 49 /** Normal TCP checksum. */ 50 RTNETCSUMTYPE_COMPLETE, 51 /** Checksum on pseudo header (used with GSO). */ 52 RTNETCSUMTYPE_PSEUDO, 53 /** The usual 32-bit hack. */ 54 RTNETCSUMTYPE_32_BIT_HACK = 0x7fffffff 55 } RTNETCSUMTYPE; 56 42 57 43 58 /** … … 163 178 * @param cbPayload The amount of payload. 164 179 * @param cbHdrs The size of all the headers. 165 * @param fPayloadChecksum Whether to checksum the payload or not. 180 * @param enmCsumType Whether to checksum the payload, the pseudo 181 * header or nothing. 166 182 * @internal 167 183 */ 168 184 DECLINLINE(void) pdmNetGsoUpdateUdpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offUdpHdr, 169 uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs, bool fPayloadChecksum) 185 uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs, 186 RTNETCSUMTYPE enmCsumType) 170 187 { 171 188 PRTNETUDP pUdpHdr = (PRTNETUDP)&pbSegHdrs[offUdpHdr]; 172 189 pUdpHdr->uh_ulen = cbPayload + cbHdrs - offUdpHdr; 173 pUdpHdr->uh_sum = fPayloadChecksum ? RTNetUDPChecksum(u32PseudoSum, pUdpHdr) : 0; 190 switch (enmCsumType) 191 { 192 case RTNETCSUMTYPE_NONE: 193 pUdpHdr->uh_sum = 0; 194 break; 195 case RTNETCSUMTYPE_COMPLETE: 196 pUdpHdr->uh_sum = RTNetUDPChecksum(u32PseudoSum, pUdpHdr); 197 break; 198 /* @todo: Implement: 199 case RTNETCSUMTYPE_PSEUDO: 200 pUdpHdr->uh_sum = RTNetUDPChecksum(u32PseudoSum, pUdpHdr); 201 break; */ 202 default: 203 Log(("pdmNetGsoUpdateUdpHdr: Invalid checksum type: %d\n", enmCsumType)); 204 break; 205 } 174 206 } 175 207 … … 188 220 * @param cbHdrs The size of all the headers. 189 221 * @param fLastSeg Set if this is the last segment. 190 * @param fPayloadChecksum Whether to checksum the payload or not. 222 * @param enmCsumType Whether to checksum the payload, the pseudo 223 * header or nothing. 191 224 * @internal 192 225 */ 193 226 DECLINLINE(void) pdmNetGsoUpdateTcpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offTcpHdr, 194 227 uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs, 195 bool fLastSeg, bool fPayloadChecksum)228 bool fLastSeg, RTNETCSUMTYPE enmCsumType) 196 229 { 197 230 PRTNETTCP pTcpHdr = (PRTNETTCP)&pbSegHdrs[offTcpHdr]; … … 199 232 if (!fLastSeg) 200 233 pTcpHdr->th_flags &= ~(RTNETTCP_F_FIN | RTNETTCP_F_PSH); 201 pTcpHdr->th_sum = fPayloadChecksum ? RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload) : 0; 234 switch (enmCsumType) 235 { 236 case RTNETCSUMTYPE_NONE: 237 pTcpHdr->th_sum = 0; 238 break; 239 case RTNETCSUMTYPE_COMPLETE: 240 pTcpHdr->th_sum = RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload); 241 break; 242 case RTNETCSUMTYPE_PSEUDO: 243 pTcpHdr->th_sum = ~RTNetIPv4FinalizeChecksum(u32PseudoSum); 244 break; 245 default: 246 Log(("pdmNetGsoUpdateTcpHdr: Invalid checksum type: %d\n", enmCsumType)); 247 break; 248 } 202 249 } 203 250 … … 306 353 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 307 354 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 308 pGso->cbHdrs, iSeg + 1 == cSegs, true);355 pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE); 309 356 break; 310 357 case PDMNETWORKGSOTYPE_IPV4_UDP: 311 358 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 312 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);359 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE); 313 360 break; 314 361 case PDMNETWORKGSOTYPE_IPV6_TCP: … … 316 363 pGso->offHdr2, RTNETIPV4_PROT_TCP), 317 364 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 318 pGso->cbHdrs, iSeg + 1 == cSegs, true);365 pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE); 319 366 break; 320 367 case PDMNETWORKGSOTYPE_IPV6_UDP: 321 368 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 322 369 pGso->offHdr2, RTNETIPV4_PROT_UDP), 323 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);370 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE); 324 371 break; 325 372 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: … … 328 375 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 329 376 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 330 pGso->cbHdrs, iSeg + 1 == cSegs, true);377 pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE); 331 378 break; 332 379 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: … … 334 381 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 335 382 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 336 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);383 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE); 337 384 break; 338 385 case PDMNETWORKGSOTYPE_INVALID: … … 399 446 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 400 447 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 401 pGso->cbHdrs, iSeg + 1 == cSegs, true);448 pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE); 402 449 break; 403 450 case PDMNETWORKGSOTYPE_IPV4_UDP: 404 451 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 405 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);452 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE); 406 453 break; 407 454 case PDMNETWORKGSOTYPE_IPV6_TCP: … … 409 456 pGso->offHdr2, RTNETIPV4_PROT_TCP), 410 457 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 411 pGso->cbHdrs, iSeg + 1 == cSegs, true);458 pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE); 412 459 break; 413 460 case PDMNETWORKGSOTYPE_IPV6_UDP: 414 461 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 415 462 pGso->offHdr2, RTNETIPV4_PROT_UDP), 416 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);463 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE); 417 464 break; 418 465 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: … … 421 468 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 422 469 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 423 pGso->cbHdrs, iSeg + 1 == cSegs, true);470 pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE); 424 471 break; 425 472 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: … … 427 474 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 428 475 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 429 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);476 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE); 430 477 break; 431 478 case PDMNETWORKGSOTYPE_INVALID: … … 446 493 * @param pvFrame The frame to prepare. 447 494 * @param cbFrame The frame size. 448 * @param fPayloadChecksum Whether to checksum payload. 449 */ 450 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, bool fPayloadChecksum) 495 * @param enmCsumType Whether to checksum the payload, the pseudo 496 * header or nothing. 497 */ 498 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, RTNETCSUMTYPE enmCsumType) 451 499 { 452 500 /* … … 471 519 case PDMNETWORKGSOTYPE_IPV4_TCP: 472 520 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame32 - pGso->cbHdrs, 0, pGso->cbHdrs), 473 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);521 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType); 474 522 break; 475 523 case PDMNETWORKGSOTYPE_IPV4_UDP: 476 524 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame32 - pGso->cbHdrs, 0, pGso->cbHdrs), 477 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);525 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType); 478 526 break; 479 527 case PDMNETWORKGSOTYPE_IPV6_TCP: 480 528 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs, 481 529 pGso->offHdr2, RTNETIPV4_PROT_TCP), 482 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);530 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType); 483 531 break; 484 532 case PDMNETWORKGSOTYPE_IPV6_UDP: 485 533 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs, 486 534 pGso->offHdr2, RTNETIPV4_PROT_UDP), 487 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);535 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType); 488 536 break; 489 537 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: … … 491 539 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1), 492 540 cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 493 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);541 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType); 494 542 break; 495 543 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: … … 497 545 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1), 498 546 cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 499 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);547 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType); 500 548 break; 501 549 case PDMNETWORKGSOTYPE_INVALID: -
trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
r30924 r31271 1120 1120 # endif 1121 1121 if (!fDstWire) 1122 PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, false /*fPayloadChecksum*/);1122 PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, RTNETCSUMTYPE_PSEUDO); 1123 1123 } 1124 1124 #endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */ -
trunk/src/VBox/NetworkServices/NetLib/VBoxNetUDP.cpp
r28800 r31271 123 123 */ 124 124 if (pGso) 125 PDMNetGsoPrepForDirectUse(pGso, (void *)pvFrame, cbFrame, false /*fPayloadChecksum*/);125 PDMNetGsoPrepForDirectUse(pGso, (void *)pvFrame, cbFrame, RTNETCSUMTYPE_NONE); 126 126 127 127 /*
Note:
See TracChangeset
for help on using the changeset viewer.