Changeset 84819 in vbox for trunk/src/VBox/Devices/Network
- Timestamp:
- Jun 12, 2020 8:00:27 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 138625
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevVirtioNet_1_0.cpp
r84806 r84819 55 55 # include <iprt/uuid.h> 56 56 #endif 57 #include "../VirtIO/Virtio _1_0.h"57 #include "../VirtIO/VirtioCore.h" 58 58 59 59 #include "VBoxDD.h" … … 67 67 #define VIRTIONET_PREALLOCATE_RX_SEG_COUNT 32 68 68 69 #define VIRTQNAME( idxVirtq) (pThis->aVirtqs[idxVirtq]->szName)70 #define CBVIRTQNAME( idxVirtq) RTStrNLen(VIRTQNAME(idxVirtq), sizeof(VIRTQNAME(idxVirtq)))69 #define VIRTQNAME(uVirtqNbr) (pThis->aVirtqs[uVirtqNbr]->szName) 70 #define CBVIRTQNAME(uVirtqNbr) RTStrNLen(VIRTQNAME(uVirtqNbr), sizeof(VIRTQNAME(uVirtqNbr))) 71 71 #define FEATURE_ENABLED(feature) RT_BOOL(pThis->fNegotiatedFeatures & VIRTIONET_F_##feature) 72 72 #define FEATURE_DISABLED(feature) (!FEATURE_ENABLED(feature)) 73 73 #define FEATURE_OFFERED(feature) VIRTIONET_HOST_FEATURES_OFFERED & VIRTIONET_F_##feature 74 74 75 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, idxVirtq) \76 (virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq) == 0)75 #define IS_VIRTQ_EMPTY(pDevIns, pVirtio, uVirtqNbr) \ 76 (virtioCoreVirtqAvailCount(pDevIns, pVirtio, uVirtqNbr) == 0) 77 77 78 78 #define SET_LINK_UP(pState) \ … … 227 227 }; 228 228 #pragma pack() 229 typedef virtio_net_pkt_hdr VIRTIONET _PKT_HDR_T, *PVIRTIONET_PKT_HDR_T;230 AssertCompileSize(VIRTIONET _PKT_HDR_T, 12);229 typedef virtio_net_pkt_hdr VIRTIONETPKTHDR, *PVIRTIONETPKTHDR; 230 AssertCompileSize(VIRTIONETPKTHDR, 12); 231 231 232 232 /* Control virtq: Command entry (VirtIO 1.0, 5.1.6.5) */ … … 615 615 * @callback_method_impl{VIRTIOCORER0,pfnVirtqNotified} 616 616 */ 617 static DECLCALLBACK(void) virtioNetVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t idxVirtq)617 static DECLCALLBACK(void) virtioNetVirtqNotified(PPDMDEVINS pDevIns, PVIRTIOCORE pVirtio, uint16_t uVirtqNbr) 618 618 { 619 619 RT_NOREF(pVirtio); 620 620 PVIRTIONET pThis = PDMDEVINS_2_DATA(pDevIns, PVIRTIONET); 621 621 622 PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[idxVirtq];622 PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[uVirtqNbr]; 623 623 PVIRTIONETWORKER pWorker = pVirtq->pWorker; 624 624 … … 627 627 #endif 628 628 629 if (IS_RX_VIRTQ( idxVirtq))630 { 631 uint16_t cBufsAvailable = virtioCoreVirtqAvailCount(pDevIns, pVirtio, idxVirtq);629 if (IS_RX_VIRTQ(uVirtqNbr)) 630 { 631 uint16_t cBufsAvailable = virtioCoreVirtqAvailCount(pDevIns, pVirtio, uVirtqNbr); 632 632 633 633 if (cBufsAvailable) … … 641 641 pThis->szInst, pVirtq->szName)); 642 642 } 643 else if (IS_TX_VIRTQ( idxVirtq) || IS_CTRL_VIRTQ(idxVirtq))643 else if (IS_TX_VIRTQ(uVirtqNbr) || IS_CTRL_VIRTQ(uVirtqNbr)) 644 644 { 645 645 /* Wake queue's worker thread up if sleeping (e.g. a Tx queue, or the control queue */ … … 663 663 } 664 664 else 665 LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pThis->szInst, pVirtq->szName, idxVirtq));665 LogRelFunc(("%s unrecognized queue %s (idx=%d) notified\n", pThis->szInst, pVirtq->szName, uVirtqNbr)); 666 666 } 667 667 … … 769 769 770 770 #ifdef LOG_ENABLED 771 void virtioNetDumpGcPhysRxBuf(PPDMDEVINS pDevIns, PVIRTIONET _PKT_HDR_TpRxPktHdr,771 void virtioNetDumpGcPhysRxBuf(PPDMDEVINS pDevIns, PVIRTIONETPKTHDR pRxPktHdr, 772 772 uint16_t cDescs, uint8_t *pvBuf, uint16_t cb, RTGCPHYS GCPhysRxBuf, uint8_t cbRxBuf) 773 773 { … … 789 789 pRxPktHdr->uChksumStart, pRxPktHdr->uChksumOffset, pRxPktHdr->uNumBuffers)); 790 790 791 virtioCoreHexDump((uint8_t *)pRxPktHdr, sizeof(VIRTIONET _PKT_HDR_T), 0, "Dump of virtual rPktHdr");791 virtioCoreHexDump((uint8_t *)pRxPktHdr, sizeof(VIRTIONETPKTHDR), 0, "Dump of virtual rPktHdr"); 792 792 } 793 793 virtioNetR3PacketDump(pThis, (const uint8_t *)pvBuf, cb, "<-- Incoming"); … … 841 841 pHlp->pfnPrintf(pHlp, "Virtq information:\n\n"); 842 842 843 for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)843 for (int uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++) 844 844 { 845 PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[ idxVirtq];845 PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[uVirtqNbr]; 846 846 847 847 if (pVirtq->fHasWorker) … … 873 873 } 874 874 pHlp->pfnPrintf(pHlp, "\n"); 875 virtioCoreR3VirtqInfo(pDevIns, pHlp, pszArgs, idxVirtq);875 virtioCoreR3VirtqInfo(pDevIns, pHlp, pszArgs, uVirtqNbr); 876 876 pHlp->pfnPrintf(pHlp, " ---------------------------------------------------------------------\n"); 877 877 pHlp->pfnPrintf(pHlp, "\n"); … … 963 963 964 964 } 965 pHlp->pfnPrintf(pHlp, "\n"); 966 virtioCoreR3Info(pDevIns, pHlp, pszArgs); 965 /** @todo implement this 966 * pHlp->pfnPrintf(pHlp, "\n"); 967 * virtioCoreR3Info(pDevIns, pHlp, pszArgs); 968 */ 967 969 pHlp->pfnPrintf(pHlp, "\n"); 968 970 } … … 1139 1141 pHlp->pfnSSMGetU16( pSSM, &pThis->cWorkers); 1140 1142 1141 for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)1142 pHlp->pfnSSMGetBool(pSSM, &pThis->aVirtqs[ idxVirtq].fAttachedToVirtioCore);1143 for (int uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++) 1144 pHlp->pfnSSMGetBool(pSSM, &pThis->aVirtqs[uVirtqNbr].fAttachedToVirtioCore); 1143 1145 1144 1146 int rc; … … 1228 1230 pHlp->pfnSSMPutU16( pSSM, pThis->cWorkers); 1229 1231 1230 for (int idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)1231 pHlp->pfnSSMPutBool(pSSM, pThis->aVirtqs[ idxVirtq].fAttachedToVirtioCore);1232 for (int uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++) 1233 pHlp->pfnSSMPutBool(pSSM, pThis->aVirtqs[uVirtqNbr].fAttachedToVirtioCore); 1232 1234 1233 1235 /* Save config area */ … … 1489 1491 rc = VINF_SUCCESS; 1490 1492 } 1491 virtioCoreVirtq NotifyEnable(&pThis->Virtio, pRxVirtq->idx, rc == VERR_INVALID_STATE /* fEnable */);1493 virtioCoreVirtqEnableNotify(&pThis->Virtio, pRxVirtq->idx, rc == VERR_INVALID_STATE /* fEnable */); 1492 1494 return rc; 1493 1495 } … … 1495 1497 static bool virtioNetR3RxBufsAvail(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETVIRTQ *pRxVirtq) 1496 1498 { 1497 for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)1498 { 1499 PVIRTIONETVIRTQ pThisRxVirtq = &pThis->aVirtqs[RXQIDX( idxVirtqPair)];1499 for (int uVirtqNbrPair = 0; uVirtqNbrPair < pThis->cVirtqPairs; uVirtqNbrPair++) 1500 { 1501 PVIRTIONETVIRTQ pThisRxVirtq = &pThis->aVirtqs[RXQIDX(uVirtqNbrPair)]; 1500 1502 if (RT_SUCCESS(virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pThisRxVirtq))) 1501 1503 { … … 1566 1568 * @param pCtx The context descriptor. 1567 1569 */ 1568 DECLINLINE(PPDMNETWORKGSO) virtioNetR3SetupGsoCtx(PPDMNETWORKGSO pGso, VIRTIONET _PKT_HDR_Tconst *pPktHdr)1570 DECLINLINE(PPDMNETWORKGSO) virtioNetR3SetupGsoCtx(PPDMNETWORKGSO pGso, VIRTIONETPKTHDR const *pPktHdr) 1569 1571 { 1570 1572 pGso->u8Type = PDMNETWORKGSOTYPE_INVALID; … … 1729 1731 1730 1732 static int virtioNetR3CopyRxPktToGuest(PPDMDEVINS pDevIns, PVIRTIONET pThis, const void *pvBuf, size_t cb, 1731 VIRTIONET _PKT_HDR_T*rxPktHdr, uint16_t cSegsAllocated,1733 VIRTIONETPKTHDR *rxPktHdr, uint16_t cSegsAllocated, 1732 1734 PRTSGBUF pVirtSegBufToGuest, PRTSGSEG paVirtSegsToGuest, 1733 1735 PVIRTIONETVIRTQ pRxVirtq) … … 1739 1741 for (cDescs = uOffset = 0; uOffset < cb; ) 1740 1742 { 1741 PVIRT IO_DESC_CHAIN_T pDescChain= NULL;1742 1743 int rc = virtioCoreR3Virtq Get(pDevIns, &pThis->Virtio, pRxVirtq->idx, &pDescChain, true);1743 PVIRTQBUF pVirtqBuf = NULL; 1744 1745 int rc = virtioCoreR3VirtqBufGet(pDevIns, &pThis->Virtio, pRxVirtq->idx, &pVirtqBuf, true); 1744 1746 AssertMsgReturn(rc == VINF_SUCCESS || rc == VERR_NOT_AVAILABLE, ("%Rrc\n", rc), rc); 1745 1747 1746 1748 /** @todo Find a better way to deal with this */ 1747 AssertMsgReturnStmt(rc == VINF_SUCCESS && p DescChain->cbPhysReturn,1749 AssertMsgReturnStmt(rc == VINF_SUCCESS && pVirtqBuf->cbPhysReturn, 1748 1750 ("Not enough Rx buffers in queue to accomodate ethernet packet\n"), 1749 virtioCoreR3 DescChainRelease(&pThis->Virtio, pDescChain),1751 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf), 1750 1752 VERR_INTERNAL_ERROR); 1751 1753 … … 1754 1756 * virtio_net_header.num_buffers, to defer updating (in GCPhys). Re-visit if needed */ 1755 1757 1756 AssertMsgReturnStmt(p DescChain->pSgPhysReturn->paSegs[0].cbSeg >= sizeof(VIRTIONET_PKT_HDR_T),1758 AssertMsgReturnStmt(pVirtqBuf->pSgPhysReturn->paSegs[0].cbSeg >= sizeof(VIRTIONETPKTHDR), 1757 1759 ("Desc chain's first seg has insufficient space for pkt header!\n"), 1758 virtioCoreR3 DescChainRelease(&pThis->Virtio, pDescChain),1760 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf), 1759 1761 VERR_INTERNAL_ERROR); 1760 1762 1761 size_t cbDescChainLeft = p DescChain->cbPhysReturn;1762 uint8_t cbHdr = sizeof(VIRTIONET _PKT_HDR_T);1763 size_t cbDescChainLeft = pVirtqBuf->cbPhysReturn; 1764 uint8_t cbHdr = sizeof(VIRTIONETPKTHDR); 1763 1765 1764 1766 /* Fill the Guest Rx buffer with data received from the interface */ … … 1776 1778 1777 1779 /* Calculate & cache addr of field to update after final value is known, in GCPhys mem */ 1778 GCPhysPktHdrNumBuffers = p DescChain->pSgPhysReturn->paSegs[0].GCPhys1779 + RT_UOFFSETOF(VIRTIONET _PKT_HDR_T, uNumBuffers);1780 GCPhysPktHdrNumBuffers = pVirtqBuf->pSgPhysReturn->paSegs[0].GCPhys 1781 + RT_UOFFSETOF(VIRTIONETPKTHDR, uNumBuffers); 1780 1782 fAddPktHdr = false; 1781 1783 cSegs++; … … 1787 1789 paVirtSegsToGuest = (PRTSGSEG)RTMemRealloc(paVirtSegsToGuest, sizeof(RTSGSEG) * cSegsAllocated); 1788 1790 if (!paVirtSegsToGuest) 1789 virtioCoreR3 DescChainRelease(&pThis->Virtio, pDescChain);1791 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1790 1792 AssertReturn(paVirtSegsToGuest, VERR_NO_MEMORY); 1791 1793 } … … 1802 1804 Log7Func(("Send Rx pkt to guest...\n")); 1803 1805 STAM_PROFILE_START(&pThis->StatReceiveStore, a); 1804 virtioCoreR3Virtq Put(pDevIns, &pThis->Virtio, pRxVirtq->idx,1805 pVirtSegBufToGuest, p DescChain, true /* fFence */);1806 virtioCoreR3VirtqBufPut(pDevIns, &pThis->Virtio, pRxVirtq->idx, 1807 pVirtSegBufToGuest, pVirtqBuf, true /* fFence */); 1806 1808 STAM_PROFILE_STOP(&pThis->StatReceiveStore, a); 1807 1809 … … 1810 1812 } 1811 1813 1812 virtioCoreR3 DescChainRelease(&pThis->Virtio, pDescChain);1814 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 1813 1815 } 1814 1816 … … 1853 1855 1854 1856 LogFunc(("%s (%RTmac) pGso %s\n", pThis->szInst, pvBuf, pGso ? "present" : "not present")); 1855 VIRTIONET _PKT_HDR_TrxPktHdr = { 0 };1857 VIRTIONETPKTHDR rxPktHdr = { 0 }; 1856 1858 1857 1859 if (pGso) … … 1961 1963 selection algorithm feasible or even necessary to prevent starvation? */ 1962 1964 1963 for (int idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++)1964 { 1965 1966 PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX( idxVirtqPair)];1965 for (int uVirtqNbrPair = 0; uVirtqNbrPair < pThis->cVirtqPairs; uVirtqNbrPair++) 1966 { 1967 1968 PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(uVirtqNbrPair)]; 1967 1969 if (RT_SUCCESS(!virtioNetR3CheckRxBufsAvail(pDevIns, pThis, pRxVirtq))) 1968 1970 { … … 1998 2000 1999 2001 /* Read physical bytes from the out segment(s) of descriptor chain */ 2000 static void virtioNetR3PullChain(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRT IO_DESC_CHAIN_T pDescChain, void *pv, size_t cb)2002 static void virtioNetR3PullChain(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTQBUF pVirtqBuf, void *pv, size_t cb) 2001 2003 { 2002 2004 uint8_t *pb = (uint8_t *)pv; 2003 size_t cbLim = RT_MIN(p DescChain->cbPhysSend, cb);2005 size_t cbLim = RT_MIN(pVirtqBuf->cbPhysSend, cb); 2004 2006 while (cbLim) 2005 2007 { 2006 2008 size_t cbSeg = cbLim; 2007 RTGCPHYS GCPhys = virtioCoreSgBufGetNextSegment(p DescChain->pSgPhysSend, &cbSeg);2009 RTGCPHYS GCPhys = virtioCoreSgBufGetNextSegment(pVirtqBuf->pSgPhysSend, &cbSeg); 2008 2010 PDMDevHlpPCIPhysRead(pDevIns, GCPhys, pb, cbSeg); 2009 2011 pb += cbSeg; 2010 2012 cbLim -= cbSeg; 2011 p DescChain->cbPhysSend -= cbSeg;2013 pVirtqBuf->cbPhysSend -= cbSeg; 2012 2014 } 2013 2015 LogFunc(("%s Pulled %d/%d bytes from desc chain (%d bytes left)\n", 2014 pThis->szInst, cb - cbLim, cb, p DescChain->cbPhysSend));2016 pThis->szInst, cb - cbLim, cb, pVirtqBuf->cbPhysSend)); 2015 2017 RT_NOREF(pThis); 2016 2018 } 2017 2019 2018 2020 static uint8_t virtioNetR3CtrlRx(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC, 2019 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRT IO_DESC_CHAIN_T pDescChain)2021 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTQBUF pVirtqBuf) 2020 2022 { 2021 2023 … … 2044 2046 2045 2047 uint8_t fOn, fPromiscChanged = false; 2046 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &fOn, (size_t)RT_MIN(pDescChain->cbPhysSend, sizeof(fOn)));2048 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &fOn, (size_t)RT_MIN(pVirtqBuf->cbPhysSend, sizeof(fOn))); 2047 2049 2048 2050 switch(pCtrlPktHdr->uCmd) … … 2092 2094 2093 2095 static uint8_t virtioNetR3CtrlMac(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC, 2094 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRT IO_DESC_CHAIN_T pDescChain)2096 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTQBUF pVirtqBuf) 2095 2097 { 2096 2098 LogFunc(("%s Processing CTRL MAC command\n", pThis->szInst)); … … 2104 2106 AssertMsgReturn((v), ("DESC chain too small to process CTRL_MAC_TABLE_SET cmd\n"), VIRTIONET_ERROR) 2105 2107 2106 AssertMsgReturn(p DescChain->cbPhysSend >= sizeof(*pCtrlPktHdr),2108 AssertMsgReturn(pVirtqBuf->cbPhysSend >= sizeof(*pCtrlPktHdr), 2107 2109 ("insufficient descriptor space for ctrl pkt hdr"), 2108 2110 VIRTIONET_ERROR); 2109 2111 2110 size_t cbRemaining = p DescChain->cbPhysSend;2112 size_t cbRemaining = pVirtqBuf->cbPhysSend; 2111 2113 switch(pCtrlPktHdr->uCmd) 2112 2114 { … … 2115 2117 /* Set default Rx filter MAC */ 2116 2118 ASSERT_CTRL_ADDR_SET(cbRemaining >= sizeof(VIRTIONET_CTRL_MAC_TABLE_LEN)); 2117 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &pThis->rxFilterMacDefault, sizeof(VIRTIONET_CTRL_MAC_TABLE_LEN));2119 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &pThis->rxFilterMacDefault, sizeof(VIRTIONET_CTRL_MAC_TABLE_LEN)); 2118 2120 break; 2119 2121 } … … 2124 2126 /* Load unicast MAC filter table */ 2125 2127 ASSERT_CTRL_TABLE_SET(cbRemaining >= sizeof(cMacs)); 2126 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &cMacs, sizeof(cMacs));2128 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &cMacs, sizeof(cMacs)); 2127 2129 cbRemaining -= sizeof(cMacs); 2128 2130 Log7Func(("%s Guest provided %d unicast MAC Table entries\n", pThis->szInst, cMacs)); … … 2131 2133 uint32_t cbMacs = cMacs * sizeof(RTMAC); 2132 2134 ASSERT_CTRL_TABLE_SET(cbRemaining >= cbMacs); 2133 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &pThis->aMacUnicastFilter, cbMacs);2135 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &pThis->aMacUnicastFilter, cbMacs); 2134 2136 cbRemaining -= cbMacs; 2135 2137 } … … 2138 2140 /* Load multicast MAC filter table */ 2139 2141 ASSERT_CTRL_TABLE_SET(cbRemaining >= sizeof(cMacs)); 2140 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &cMacs, sizeof(cMacs));2142 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &cMacs, sizeof(cMacs)); 2141 2143 cbRemaining -= sizeof(cMacs); 2142 2144 Log10Func(("%s Guest provided %d multicast MAC Table entries\n", pThis->szInst, cMacs)); … … 2145 2147 uint32_t cbMacs = cMacs * sizeof(RTMAC); 2146 2148 ASSERT_CTRL_TABLE_SET(cbRemaining >= cbMacs); 2147 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &pThis->aMacMulticastFilter, cbMacs);2149 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &pThis->aMacMulticastFilter, cbMacs); 2148 2150 cbRemaining -= cbMacs; 2149 2151 } … … 2165 2167 2166 2168 static uint8_t virtioNetR3CtrlVlan(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC, 2167 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRT IO_DESC_CHAIN_T pDescChain)2169 PVIRTIONET_CTRL_HDR_T pCtrlPktHdr, PVIRTQBUF pVirtqBuf) 2168 2170 { 2169 2171 LogFunc(("%s Processing CTRL VLAN command\n", pThis->szInst)); … … 2172 2174 2173 2175 uint16_t uVlanId; 2174 size_t cbRemaining = p DescChain->cbPhysSend - sizeof(*pCtrlPktHdr);2176 size_t cbRemaining = pVirtqBuf->cbPhysSend - sizeof(*pCtrlPktHdr); 2175 2177 AssertMsgReturn(cbRemaining > sizeof(uVlanId), 2176 2178 ("DESC chain too small for VIRTIO_NET_CTRL_VLAN cmd processing"), VIRTIONET_ERROR); 2177 virtioNetR3PullChain(pDevIns, pThis, p DescChain, &uVlanId, sizeof(uVlanId));2179 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, &uVlanId, sizeof(uVlanId)); 2178 2180 AssertMsgReturn(uVlanId > VIRTIONET_MAX_VLAN_ID, 2179 2181 ("%s VLAN ID out of range (VLAN ID=%u)\n", pThis->szInst, uVlanId), VIRTIONET_ERROR); … … 2194 2196 2195 2197 static void virtioNetR3Ctrl(PPDMDEVINS pDevIns, PVIRTIONET pThis, PVIRTIONETCC pThisCC, 2196 PVIRT IO_DESC_CHAIN_T pDescChain)2198 PVIRTQBUF pVirtqBuf) 2197 2199 { 2198 2200 LogFunc(("%s Received CTRL packet from guest\n", pThis->szInst)); 2199 2201 2200 if (p DescChain->cbPhysSend < 2)2202 if (pVirtqBuf->cbPhysSend < 2) 2201 2203 { 2202 2204 LogFunc(("%s CTRL packet from guest driver incomplete. Skipping ctrl cmd\n", pThis->szInst)); 2203 2205 return; 2204 2206 } 2205 else if (p DescChain->cbPhysReturn < sizeof(VIRTIONET_CTRL_HDR_T_ACK))2207 else if (pVirtqBuf->cbPhysReturn < sizeof(VIRTIONET_CTRL_HDR_T_ACK)) 2206 2208 { 2207 2209 LogFunc(("%s Guest driver didn't allocate memory to receive ctrl pkt ACK. Skipping ctrl cmd\n", pThis->szInst)); … … 2216 2218 AssertPtrReturnVoid(pCtrlPktHdr); 2217 2219 2218 AssertMsgReturnVoid(p DescChain->cbPhysSend >= sizeof(VIRTIONET_CTRL_HDR_T),2220 AssertMsgReturnVoid(pVirtqBuf->cbPhysSend >= sizeof(VIRTIONET_CTRL_HDR_T), 2219 2221 ("DESC chain too small for CTRL pkt header")); 2220 2222 2221 virtioNetR3PullChain(pDevIns, pThis, p DescChain, pCtrlPktHdr,2222 RT_MIN(p DescChain->cbPhysSend, sizeof(VIRTIONET_CTRL_HDR_T)));2223 virtioNetR3PullChain(pDevIns, pThis, pVirtqBuf, pCtrlPktHdr, 2224 RT_MIN(pVirtqBuf->cbPhysSend, sizeof(VIRTIONET_CTRL_HDR_T))); 2223 2225 2224 2226 Log7Func(("%s CTRL COMMAND: class=%d command=%d\n", pThis->szInst, pCtrlPktHdr->uClass, pCtrlPktHdr->uCmd)); … … 2228 2230 { 2229 2231 case VIRTIONET_CTRL_RX: 2230 uAck = virtioNetR3CtrlRx(pDevIns, pThis, pThisCC, pCtrlPktHdr, p DescChain);2232 uAck = virtioNetR3CtrlRx(pDevIns, pThis, pThisCC, pCtrlPktHdr, pVirtqBuf); 2231 2233 break; 2232 2234 case VIRTIONET_CTRL_MAC: 2233 uAck = virtioNetR3CtrlMac(pDevIns, pThis, pThisCC, pCtrlPktHdr, p DescChain);2235 uAck = virtioNetR3CtrlMac(pDevIns, pThis, pThisCC, pCtrlPktHdr, pVirtqBuf); 2234 2236 break; 2235 2237 case VIRTIONET_CTRL_VLAN: 2236 uAck = virtioNetR3CtrlVlan(pDevIns, pThis, pThisCC, pCtrlPktHdr, p DescChain);2238 uAck = virtioNetR3CtrlVlan(pDevIns, pThis, pThisCC, pCtrlPktHdr, pVirtqBuf); 2237 2239 break; 2238 2240 case VIRTIONET_CTRL_ANNOUNCE: … … 2283 2285 RTSgBufInit(pReturnSegBuf, paReturnSegs, cSegs); 2284 2286 2285 virtioCoreR3Virtq Put(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pDescChain, true /* fFence */);2287 virtioCoreR3VirtqBufPut(pDevIns, &pThis->Virtio, CTRLQIDX, pReturnSegBuf, pVirtqBuf, true /* fFence */); 2286 2288 virtioCoreVirtqSync(pDevIns, &pThis->Virtio, CTRLQIDX); 2287 2289 … … 2296 2298 } 2297 2299 2298 static int virtioNetR3ReadHeader(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, PVIRTIONET _PKT_HDR_TpPktHdr, size_t cbFrame)2300 static int virtioNetR3ReadHeader(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, PVIRTIONETPKTHDR pPktHdr, size_t cbFrame) 2299 2301 { 2300 2302 int rc = PDMDevHlpPCIPhysRead(pDevIns, GCPhys, pPktHdr, sizeof(*pPktHdr)); … … 2343 2345 2344 2346 static int virtioNetR3TransmitFrame(PVIRTIONET pThis, PVIRTIONETCC pThisCC, PPDMSCATTERGATHER pSgBuf, 2345 PPDMNETWORKGSO pGso, PVIRTIONET _PKT_HDR_TpPktHdr)2347 PPDMNETWORKGSO pGso, PVIRTIONETPKTHDR pPktHdr) 2346 2348 { 2347 2349 virtioNetR3PacketDump(pThis, (uint8_t *)pSgBuf->aSegs[0].pvSeg, pSgBuf->cbUsed, "--> Outgoing"); … … 2449 2451 2450 2452 int rc; 2451 PVIRT IO_DESC_CHAIN_T pDescChain= NULL;2452 while ((rc = virtioCoreR3Virtq Peek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, &pDescChain)) == VINF_SUCCESS)2453 PVIRTQBUF pVirtqBuf = NULL; 2454 while ((rc = virtioCoreR3VirtqBufPeek(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, &pVirtqBuf)) == VINF_SUCCESS) 2453 2455 { 2454 2456 Log10Func(("%s fetched descriptor chain from %s\n", pThis->szInst, pTxVirtq->szName)); 2455 2457 2456 PVIRTIOSGBUF pSgPhysSend = p DescChain->pSgPhysSend;2458 PVIRTIOSGBUF pSgPhysSend = pVirtqBuf->pSgPhysSend; 2457 2459 PVIRTIOSGSEG paSegsFromGuest = pSgPhysSend->paSegs; 2458 2460 uint32_t cSegsFromGuest = pSgPhysSend->cSegs; 2459 2461 2460 VIRTIONET _PKT_HDR_TPktHdr;2462 VIRTIONETPKTHDR PktHdr; 2461 2463 size_t uSize = 0; 2462 2464 … … 2514 2516 2515 2517 LogFunc((".... Copied %lu bytes to %lu byte guest buffer, residual=%lu\n", 2516 cbTotal, p DescChain->cbPhysSend, pDescChain->cbPhysSend - cbTotal));2518 cbTotal, pVirtqBuf->cbPhysSend, pVirtqBuf->cbPhysSend - cbTotal)); 2517 2519 2518 2520 rc = virtioNetR3TransmitFrame(pThis, pThisCC, pSgBufToPdmLeafDevice, pGso, &PktHdr); … … 2531 2533 Log4Func(("Failed to allocate S/G buffer: size=%u rc=%Rrc\n", uSize, rc)); 2532 2534 /* Stop trying to fetch TX descriptors until we get more bandwidth. */ 2533 virtioCoreR3 DescChainRelease(pVirtio, pDescChain);2535 virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf); 2534 2536 break; 2535 2537 } 2536 2538 2537 2539 /* Remove this descriptor chain from the available ring */ 2538 virtioCoreR3Virtq Skip(pVirtio, pTxVirtq->idx);2540 virtioCoreR3VirtqBufSkip(pVirtio, pTxVirtq->idx); 2539 2541 2540 2542 /* No data to return to guest, but call is needed put elem (e.g. desc chain) on used ring */ 2541 virtioCoreR3Virtq Put(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, NULL, pDescChain, true /* fFence */);2543 virtioCoreR3VirtqBufPut(pVirtio->pDevInsR3, pVirtio, pTxVirtq->idx, NULL, pVirtqBuf, true /* fFence */); 2542 2544 2543 2545 /* Update used ring idx and notify guest that we've transmitted the data it sent */ … … 2545 2547 } 2546 2548 2547 virtioCoreR3 DescChainRelease(pVirtio, pDescChain);2548 p DescChain= NULL;2549 virtioCoreR3VirtqBufRelease(pVirtio, pVirtqBuf); 2550 pVirtqBuf = NULL; 2549 2551 } 2550 2552 virtioNetR3SetWriteLed(pThisCC, false); … … 2792 2794 2793 2795 uint16_t idxWorker = CTRLWIDX + 1; 2794 for (uint16_t idxVirtqPair = 0; idxVirtqPair < pThis->cVirtqPairs; idxVirtqPair++, idxWorker++)2795 { 2796 PVIRTIONETVIRTQ pTxVirtq = &pThis->aVirtqs[TXQIDX( idxVirtqPair)];2797 PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX( idxVirtqPair)];2796 for (uint16_t uVirtqNbrPair = 0; uVirtqNbrPair < pThis->cVirtqPairs; uVirtqNbrPair++, idxWorker++) 2797 { 2798 PVIRTIONETVIRTQ pTxVirtq = &pThis->aVirtqs[TXQIDX(uVirtqNbrPair)]; 2799 PVIRTIONETVIRTQ pRxVirtq = &pThis->aVirtqs[RXQIDX(uVirtqNbrPair)]; 2798 2800 2799 2801 rc = virtioNetR3CreateOneWorkerThread(pDevIns, pThis, idxWorker, &pThis->aWorkers[idxWorker], … … 2825 2827 /** @todo Race w/guest enabling/disabling guest notifications cyclically. 2826 2828 See BugRef #8651, Comment #82 */ 2827 virtioCoreVirtq NotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);2829 virtioCoreVirtqEnableNotify(&pThis->Virtio, pVirtq->idx, true /* fEnable */); 2828 2830 2829 2831 while (pThread->enmState == PDMTHREADSTATE_RUNNING) … … 2857 2859 { 2858 2860 Log10Func(("%s %s worker woken. Fetching desc chain\n", pThis->szInst, pVirtq->szName)); 2859 PVIRT IO_DESC_CHAIN_T pDescChain= NULL;2860 int rc = virtioCoreR3Virtq Get(pDevIns, &pThis->Virtio, pVirtq->idx, &pDescChain, true);2861 PVIRTQBUF pVirtqBuf = NULL; 2862 int rc = virtioCoreR3VirtqBufGet(pDevIns, &pThis->Virtio, pVirtq->idx, &pVirtqBuf, true); 2861 2863 if (rc == VERR_NOT_AVAILABLE) 2862 2864 { … … 2864 2866 continue; 2865 2867 } 2866 virtioNetR3Ctrl(pDevIns, pThis, pThisCC, p DescChain);2867 virtioCoreR3 DescChainRelease(&pThis->Virtio, pDescChain);2868 virtioNetR3Ctrl(pDevIns, pThis, pThisCC, pVirtqBuf); 2869 virtioCoreR3VirtqBufRelease(&pThis->Virtio, pVirtqBuf); 2868 2870 } 2869 2871 else /* Must be Tx queue */ … … 2911 2913 pThisCC->fQuiescing = false; 2912 2914 2913 for (unsigned idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)2915 for (unsigned uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++) 2914 2916 { 2915 PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[ idxVirtq];2916 pVirtq->idx = idxVirtq;2917 PVIRTIONETVIRTQ pVirtq = &pThis->aVirtqs[uVirtqNbr]; 2918 pVirtq->idx = uVirtqNbr; 2917 2919 (void) virtioCoreR3VirtqAttach(&pThis->Virtio, pVirtq->idx, pVirtq->szName); 2918 2920 pVirtq->fAttachedToVirtioCore = true; 2919 2921 if (IS_VIRTQ_EMPTY(pThisCC->pDevIns, &pThis->Virtio, pVirtq->idx)) 2920 virtioCoreVirtq NotifyEnable(&pThis->Virtio, pVirtq->idx, true /* fEnable */);2922 virtioCoreVirtqEnableNotify(&pThis->Virtio, pVirtq->idx, true /* fEnable */); 2921 2923 } 2922 2924 } … … 2944 2946 pThisCC->pDrv->pfnSetPromiscuousMode(pThisCC->pDrv, true); 2945 2947 2946 for (uint16_t idxVirtq = 0; idxVirtq < pThis->cVirtVirtqs; idxVirtq++)2947 pThis->aVirtqs[ idxVirtq].fAttachedToVirtioCore = false;2948 for (uint16_t uVirtqNbr = 0; uVirtqNbr < pThis->cVirtVirtqs; uVirtqNbr++) 2949 pThis->aVirtqs[uVirtqNbr].fAttachedToVirtioCore = false; 2948 2950 } 2949 2951 }
Note:
See TracChangeset
for help on using the changeset viewer.