Changeset 28156 in vbox for trunk/include/VBox
- Timestamp:
- Apr 10, 2010 1:14:10 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmnetinline.h
r28153 r28156 158 158 * @param cbPayload The amount of payload. 159 159 * @param cbHdrs The size of all the headers. 160 * @param fPayloadChecksum Whether to checksum the payload or not. 160 161 * @internal 161 162 */ 162 163 DECLINLINE(void) pdmNetGsoUpdateUdpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offUdpHdr, 163 uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs )164 uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs, bool fPayloadChecksum) 164 165 { 165 166 PRTNETUDP pUdpHdr = (PRTNETUDP)&pbSegHdrs[offUdpHdr]; 166 167 pUdpHdr->uh_ulen = cbPayload + cbHdrs - offUdpHdr; 167 pUdpHdr->uh_sum = RTNetUDPChecksum(u32PseudoSum, pUdpHdr);168 pUdpHdr->uh_sum = fPayloadChecksum ? RTNetUDPChecksum(u32PseudoSum, pUdpHdr) : 0; 168 169 } 169 170 … … 182 183 * @param cbHdrs The size of all the headers. 183 184 * @param fLastSeg Set if this is the last segment. 185 * @param fPayloadChecksum Whether to checksum the payload or not. 184 186 * @internal 185 187 */ 186 188 DECLINLINE(void) pdmNetGsoUpdateTcpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offTcpHdr, 187 uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs, bool fLastSeg) 189 uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs, 190 bool fLastSeg, bool fPayloadChecksum) 188 191 { 189 192 PRTNETTCP pTcpHdr = (PRTNETTCP)&pbSegHdrs[offTcpHdr]; … … 191 194 if (!fLastSeg) 192 195 pTcpHdr->th_flags &= ~(RTNETTCP_F_FIN | RTNETTCP_F_PSH); 193 pTcpHdr->th_sum = RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload);196 pTcpHdr->th_sum = fPayloadChecksum ? RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload) : 0; 194 197 } 195 198 … … 298 301 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 299 302 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 300 pGso->cbHdrs, iSeg + 1 == cSegs );303 pGso->cbHdrs, iSeg + 1 == cSegs, true); 301 304 break; 302 305 case PDMNETWORKGSOTYPE_IPV4_UDP: 303 306 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 304 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs );307 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true); 305 308 break; 306 309 case PDMNETWORKGSOTYPE_IPV6_TCP: … … 308 311 pGso->offHdr2, RTNETIPV4_PROT_TCP), 309 312 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 310 pGso->cbHdrs, iSeg + 1 == cSegs );313 pGso->cbHdrs, iSeg + 1 == cSegs, true); 311 314 break; 312 315 case PDMNETWORKGSOTYPE_IPV6_UDP: 313 316 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 314 317 pGso->offHdr2, RTNETIPV4_PROT_UDP), 315 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs );318 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true); 316 319 break; 317 320 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: … … 320 323 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 321 324 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 322 pGso->cbHdrs, iSeg + 1 == cSegs );325 pGso->cbHdrs, iSeg + 1 == cSegs, true); 323 326 break; 324 327 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: … … 326 329 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 327 330 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 328 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs );331 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true); 329 332 break; 330 333 case PDMNETWORKGSOTYPE_INVALID: … … 391 394 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 392 395 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 393 pGso->cbHdrs, iSeg + 1 == cSegs );396 pGso->cbHdrs, iSeg + 1 == cSegs, true); 394 397 break; 395 398 case PDMNETWORKGSOTYPE_IPV4_UDP: 396 399 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs), 397 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs );400 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true); 398 401 break; 399 402 case PDMNETWORKGSOTYPE_IPV6_TCP: … … 401 404 pGso->offHdr2, RTNETIPV4_PROT_TCP), 402 405 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 403 pGso->cbHdrs, iSeg + 1 == cSegs );406 pGso->cbHdrs, iSeg + 1 == cSegs, true); 404 407 break; 405 408 case PDMNETWORKGSOTYPE_IPV6_UDP: 406 409 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs, 407 410 pGso->offHdr2, RTNETIPV4_PROT_UDP), 408 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs );411 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true); 409 412 break; 410 413 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: … … 413 416 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 414 417 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg, 415 pGso->cbHdrs, iSeg + 1 == cSegs );418 pGso->cbHdrs, iSeg + 1 == cSegs, true); 416 419 break; 417 420 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: … … 419 422 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1), 420 423 cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 421 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs );424 pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true); 422 425 break; 423 426 case PDMNETWORKGSOTYPE_INVALID: … … 432 435 433 436 434 435 436 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, 437 bool fHeaderChecskum, bool fPayloadChecksum) 438 { 439 /** @todo Need to implement this eventually, not important yet as it's only use 440 * by DHCP where GSO isn't normally used. */ 437 /** 438 * Prepares the GSO frame for direct use without any segmenting. 439 * 440 * @param pGso The GSO context. 441 * @param pvFrame The frame to prepare. 442 * @param cbFrame The frame size. 443 * @param fPayloadChecksum Whether to checksum payload. 444 */ 445 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, bool fPayloadChecksum) 446 { 447 /* 448 * Figure out where the payload is and where the header starts before we 449 * do the protocol bits. 450 */ 451 uint8_t * const pbHdrs = (uint8_t *)pvFrame; 452 uint8_t * const pbPayload = pbHdrs + pGso->cbHdrs; 453 size_t const cbPayload = cbFrame - pGso->cbHdrs; 454 455 /* 456 * Check assumptions (doing it after declaring the variables because of C). 457 */ 458 Assert(PDMNetGsoIsValid(pGso, sizeof(*pGso), cbFrame)); 459 460 /* 461 * Get down to busienss. 462 */ 463 switch ((PDMNETWORKGSOTYPE)pGso->u8Type) 464 { 465 case PDMNETWORKGSOTYPE_IPV4_TCP: 466 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame - pGso->cbHdrs, 0, pGso->cbHdrs), 467 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum); 468 break; 469 case PDMNETWORKGSOTYPE_IPV4_UDP: 470 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame - pGso->cbHdrs, 0, pGso->cbHdrs), 471 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum); 472 break; 473 case PDMNETWORKGSOTYPE_IPV6_TCP: 474 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs, 475 pGso->offHdr2, RTNETIPV4_PROT_TCP), 476 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum); 477 break; 478 case PDMNETWORKGSOTYPE_IPV6_UDP: 479 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs, 480 pGso->offHdr2, RTNETIPV4_PROT_UDP), 481 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum); 482 break; 483 case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP: 484 pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbPayload, 0, pGso->cbHdrs); 485 pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1), 486 cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP), 487 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum); 488 break; 489 case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP: 490 pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbPayload, 0, pGso->cbHdrs); 491 pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1), 492 cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP), 493 pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum); 494 break; 495 case PDMNETWORKGSOTYPE_INVALID: 496 case PDMNETWORKGSOTYPE_END: 497 /* no default! wnat gcc warnings. */ 498 break; 499 } 441 500 } 442 501
Note:
See TracChangeset
for help on using the changeset viewer.