Changeset 31764 in vbox
- Timestamp:
- Aug 18, 2010 2:00:39 PM (14 years ago)
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevVirtioNet.cpp
r31755 r31764 130 130 #endif 131 131 132 /** transmit buffer */133 R3PTRTYPE(uint8_t*) pTxBuf;134 132 /**< Link Up(/Restore) Timer. */ 135 133 PTMTIMERR3 pLinkUpTimer; … … 962 960 else 963 961 { 962 unsigned int uSize = 0; 964 963 STAM_PROFILE_ADV_START(&pState->StatTransmit, a); 965 /* Assemble a complete frame. */ 966 for (unsigned int i = 1; i < elem.nOut && uOffset < VNET_MAX_FRAME_SIZE; i++) 967 { 968 unsigned int uSize = elem.aSegsOut[i].cb; 969 if (uSize > VNET_MAX_FRAME_SIZE - uOffset) 970 { 971 Log(("%s vnetQueueTransmit: Packet is too big (>64k), truncating...\n", INSTANCE(pState))); 972 uSize = VNET_MAX_FRAME_SIZE - uOffset; 973 } 974 PDMDevHlpPhysRead(pState->VPCI.CTX_SUFF(pDevIns), elem.aSegsOut[i].addr, 975 pState->pTxBuf + uOffset, uSize); 976 uOffset += uSize; 977 } 964 /* Compute total frame size. */ 965 for (unsigned int i = 1; i < elem.nOut; i++) 966 uSize += elem.aSegsOut[i].cb; 967 Assert(uSize <= VNET_MAX_FRAME_SIZE); 978 968 if (pState->pDrv) 979 969 { … … 986 976 STAM_REL_COUNTER_INC(&pState->StatTransmitPackets); 987 977 988 vnetPacketDump(pState, pState->pTxBuf, uOffset, "--> Outgoing");989 990 978 STAM_PROFILE_START(&pState->StatTransmitSend, a); 991 979 992 980 pGso = vnetSetupGsoCtx(&Gso, &Hdr); 993 if (pGso)994 STAM_REL_COUNTER_INC(&pState->StatTransmitGSO);995 else if (Hdr.u8Flags & VNETHDR_F_NEEDS_CSUM)996 {997 STAM_REL_COUNTER_INC(&pState->StatTransmitCSum);998 /*999 * This is not GSO frame but checksum offloading is requested.1000 */1001 vnetCompleteChecksum(pState->pTxBuf, uOffset, Hdr.u16CSumStart, Hdr.u16CSumOffset);1002 }1003 981 /** @todo Optimize away the extra copying! (lazy bird) */ 1004 982 PPDMSCATTERGATHER pSgBuf; 1005 int rc = pState->pDrv->pfnAllocBuf(pState->pDrv, u Offset, pGso, &pSgBuf);983 int rc = pState->pDrv->pfnAllocBuf(pState->pDrv, uSize, pGso, &pSgBuf); 1006 984 if (RT_SUCCESS(rc)) 1007 985 { 1008 986 Assert(pSgBuf->cSegs == 1); 1009 memcpy(pSgBuf->aSegs[0].pvSeg, pState->pTxBuf, uOffset); 1010 pSgBuf->cbUsed = uOffset; 987 /* Assemble a complete frame. */ 988 for (unsigned int i = 1; i < elem.nOut; i++) 989 PDMDevHlpPhysRead(pState->VPCI.CTX_SUFF(pDevIns), elem.aSegsOut[i].addr, 990 ((uint8_t*)pSgBuf->aSegs[0].pvSeg) + uOffset, 991 elem.aSegsOut[i].cb); 992 pSgBuf->cbUsed = uSize; 993 vnetPacketDump(pState, (uint8_t*)pSgBuf->aSegs[0].pvSeg, uSize, "--> Outgoing"); 994 if (pGso) 995 STAM_REL_COUNTER_INC(&pState->StatTransmitGSO); 996 else if (Hdr.u8Flags & VNETHDR_F_NEEDS_CSUM) 997 { 998 STAM_REL_COUNTER_INC(&pState->StatTransmitCSum); 999 /* 1000 * This is not GSO frame but checksum offloading is requested. 1001 */ 1002 vnetCompleteChecksum((uint8_t*)pSgBuf->aSegs[0].pvSeg, uSize, 1003 Hdr.u16CSumStart, Hdr.u16CSumOffset); 1004 } 1005 1011 1006 rc = pState->pDrv->pfnSendBuf(pState->pDrv, pSgBuf, false); 1012 1007 } 1008 else 1009 LogRel(("virtio-net: failed to allocate SG buffer: size=%u rc=%Rrc\n", uSize, rc)); 1013 1010 1014 1011 STAM_PROFILE_STOP(&pState->StatTransmitSend, a); … … 1756 1753 } 1757 1754 1758 if (pState->pTxBuf)1759 {1760 RTMemFree(pState->pTxBuf);1761 pState->pTxBuf = NULL;1762 }1763 1755 // if (PDMCritSectIsInitialized(&pState->csRx)) 1764 1756 // PDMR3CritSectDelete(&pState->csRx); … … 1822 1814 pState->INetworkConfig.pfnGetLinkState = vnetGetLinkState; 1823 1815 pState->INetworkConfig.pfnSetLinkState = vnetSetLinkState; 1824 1825 pState->pTxBuf = (uint8_t *)RTMemAllocZ(VNET_MAX_FRAME_SIZE);1826 AssertMsgReturn(pState->pTxBuf,1827 ("Cannot allocate TX buffer for virtio-net device\n"), VERR_NO_MEMORY);1828 1816 1829 1817 /* Initialize critical section. */ -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp
r30850 r31764 1378 1378 GEN_CHECK_OFF(VNETSTATE, pCanRxQueueR0); 1379 1379 GEN_CHECK_OFF(VNETSTATE, pCanRxQueueRC); 1380 GEN_CHECK_OFF(VNETSTATE, pTxBuf);1381 1380 GEN_CHECK_OFF(VNETSTATE, pLinkUpTimer); 1382 1381 # ifdef VNET_TX_DELAY
Note:
See TracChangeset
for help on using the changeset viewer.