Changeset 88553 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Apr 15, 2021 5:12:28 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 143843
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DrvNAT.cpp
r85121 r88553 439 439 uint8_t const *pbFrame = (uint8_t const *)pSgBuf->aSegs[0].pvSeg; 440 440 PCPDMNETWORKGSO pGso = (PCPDMNETWORKGSO)pSgBuf->pvUser; 441 uint32_t const cSegs = PDMNetGsoCalcSegmentCount(pGso, pSgBuf->cbUsed); Assert(cSegs > 1);442 for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)441 /* Do not attempt to segment frames with invalid GSO parameters. */ 442 if (PDMNetGsoIsValid(pGso, sizeof(*pGso), pSgBuf->cbUsed)) 443 443 { 444 size_t cbSeg; 445 void *pvSeg; 446 m = slirp_ext_m_get(pThis->pNATState, pGso->cbHdrsTotal + pGso->cbMaxSeg, &pvSeg, &cbSeg); 447 if (!m) 448 break; 444 uint32_t const cSegs = PDMNetGsoCalcSegmentCount(pGso, pSgBuf->cbUsed); Assert(cSegs > 1); 445 for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++) 446 { 447 size_t cbSeg; 448 void *pvSeg; 449 m = slirp_ext_m_get(pThis->pNATState, pGso->cbHdrsTotal + pGso->cbMaxSeg, &pvSeg, &cbSeg); 450 if (!m) 451 break; 449 452 450 453 #if 1 451 uint32_t cbPayload, cbHdrs;452 uint32_t offPayload = PDMNetGsoCarveSegment(pGso, pbFrame, pSgBuf->cbUsed,453 iSeg, cSegs, (uint8_t *)pvSeg, &cbHdrs, &cbPayload);454 memcpy((uint8_t *)pvSeg + cbHdrs, pbFrame + offPayload, cbPayload);455 456 slirp_input(pThis->pNATState, m, cbPayload + cbHdrs);454 uint32_t cbPayload, cbHdrs; 455 uint32_t offPayload = PDMNetGsoCarveSegment(pGso, pbFrame, pSgBuf->cbUsed, 456 iSeg, cSegs, (uint8_t *)pvSeg, &cbHdrs, &cbPayload); 457 memcpy((uint8_t *)pvSeg + cbHdrs, pbFrame + offPayload, cbPayload); 458 459 slirp_input(pThis->pNATState, m, cbPayload + cbHdrs); 457 460 #else 458 uint32_t cbSegFrame; 459 void *pvSegFrame = PDMNetGsoCarveSegmentQD(pGso, (uint8_t *)pbFrame, pSgBuf->cbUsed, abHdrScratch, 460 iSeg, cSegs, &cbSegFrame); 461 memcpy((uint8_t *)pvSeg, pvSegFrame, cbSegFrame); 462 463 slirp_input(pThis->pNATState, m, cbSegFrame); 464 #endif 461 uint32_t cbSegFrame; 462 void *pvSegFrame = PDMNetGsoCarveSegmentQD(pGso, (uint8_t *)pbFrame, pSgBuf->cbUsed, abHdrScratch, 463 iSeg, cSegs, &cbSegFrame); 464 memcpy((uint8_t *)pvSeg, pvSegFrame, cbSegFrame); 465 466 slirp_input(pThis->pNATState, m, cbSegFrame); 467 #endif 468 } 465 469 } 466 470 }
Note:
See TracChangeset
for help on using the changeset viewer.