Lines Matching refs:pSG

485  * @param   pSG         The SG list to write to.
490 static bool intnetR0SgWritePartSlow(PCINTNETSG pSG, uint32_t off, uint32_t cb, void const *pvBuf)
492 if (RT_UNLIKELY(off + cb > pSG->cbTotal))
498 unsigned const cSegs = pSG->cSegsUsed; Assert(cSegs == pSG->cSegsUsed);
500 while (off > pSG->aSegs[iSeg].cb)
502 off -= pSG->aSegs[iSeg++].cb;
509 uint32_t cbCanCopy = pSG->aSegs[iSeg].cb - off;
511 memcpy((uint8_t *)pSG->aSegs[iSeg].pv + off, pvBuf, cb);
515 memcpy((uint8_t *)pSG->aSegs[iSeg].pv + off, pvBuf, cbCanCopy);
525 cbCanCopy = RT_MIN(cb, pSG->aSegs[iSeg].cb);
526 memcpy(pSG->aSegs[iSeg].pv, pvBuf, cbCanCopy);
540 * @param pSG The SG list to write to.
545 DECLINLINE(bool) intnetR0SgWritePart(PCINTNETSG pSG, uint32_t off, uint32_t cb, void const *pvBuf)
550 if (RT_LIKELY( pSG->cSegsUsed == 1
551 || pSG->aSegs[0].cb >= off + cb))
553 Assert(pSG->cbTotal == pSG->aSegs[0].cb);
554 memcpy((uint8_t *)pSG->aSegs[0].pv + off, pvBuf, cb);
557 return intnetR0SgWritePartSlow(pSG, off, cb, pvBuf);
565 * @param pSG The SG list to read.
568 DECLINLINE(uint8_t) intnetR0SgReadByte(PCINTNETSG pSG, uint32_t off)
570 if (RT_LIKELY(pSG->aSegs[0].cb > off))
571 return ((uint8_t const *)pSG->aSegs[0].pv)[off];
573 off -= pSG->aSegs[0].cb;
574 unsigned const cSegs = pSG->cSegsUsed; Assert(cSegs == pSG->cSegsUsed);
577 if (pSG->aSegs[iSeg].cb > off)
578 return ((uint8_t const *)pSG->aSegs[iSeg].pv)[off];
579 off -= pSG->aSegs[iSeg].cb;
590 * @param pSG The SG list to read.
595 static bool intnetR0SgReadPartSlow(PCINTNETSG pSG, uint32_t off, uint32_t cb, void *pvBuf)
597 if (RT_UNLIKELY(off + cb > pSG->cbTotal))
603 unsigned const cSegs = pSG->cSegsUsed; Assert(cSegs == pSG->cSegsUsed);
605 while (off > pSG->aSegs[iSeg].cb)
607 off -= pSG->aSegs[iSeg++].cb;
614 uint32_t cbCanCopy = pSG->aSegs[iSeg].cb - off;
616 memcpy(pvBuf, (uint8_t const *)pSG->aSegs[iSeg].pv + off, cb);
620 memcpy(pvBuf, (uint8_t const *)pSG->aSegs[iSeg].pv + off, cbCanCopy);
630 cbCanCopy = RT_MIN(cb, pSG->aSegs[iSeg].cb);
631 memcpy(pvBuf, (uint8_t const *)pSG->aSegs[iSeg].pv, cbCanCopy);
645 * @param pSG The SG list to read.
650 DECLINLINE(bool) intnetR0SgReadPart(PCINTNETSG pSG, uint32_t off, uint32_t cb, void *pvBuf)
655 if (RT_LIKELY( pSG->cSegsUsed == 1
656 || pSG->aSegs[0].cb >= off + cb))
658 Assert(pSG->cbTotal == pSG->aSegs[0].cb);
659 memcpy(pvBuf, (uint8_t const *)pSG->aSegs[0].pv + off, cb);
662 return intnetR0SgReadPartSlow(pSG, off, cb, pvBuf);
2197 * @param pSG The gather list for the frame.
2199 static void intnetR0TrunkIfSnoopDhcp(PINTNETNETWORK pNetwork, PCINTNETSG pSG)
2205 PCRTNETIPV4 pIpHdr = (PCRTNETIPV4)((PCRTNETETHERHDR)pSG->aSegs[0].pv + 1);
2206 uint32_t cbPacket = pSG->cbTotal - sizeof(RTNETETHERHDR);
2207 if (pSG->cSegsUsed > 1)
2211 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR), cbPacket, pNetwork->pbTmp))
2213 //pSG->fFlags |= INTNETSG_FLAGS_PKT_CP_IN_TMP;
2220 if (!RTNetIPv4IsHdrValid(pIpHdr, cbPacket, pSG->cbTotal - sizeof(RTNETETHERHDR), true /*fChecksum*/))
2243 * @param pSG The gather list for the frame.
2245 static void intnetR0TrunkIfSnoopArp(PINTNETNETWORK pNetwork, PCINTNETSG pSG)
2250 if (RT_UNLIKELY(pSG->cbTotal < sizeof(RTNETETHERHDR) + sizeof(RTNETARPIPV4)))
2256 uint32_t cbPacket = RT_MIN(pSG->cbTotal, sizeof(RTNETARPIPV4));
2257 PCRTNETARPIPV4 pArpIPv4 = (PCRTNETARPIPV4)((uintptr_t)pSG->aSegs[0].pv + sizeof(RTNETETHERHDR));
2258 if ( pSG->cSegsUsed != 1
2259 && pSG->aSegs[0].cb < cbPacket)
2261 if ( (pSG->fFlags & (INTNETSG_FLAGS_ARP_IPV4 | INTNETSG_FLAGS_PKT_CP_IN_TMP))
2263 && !intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR), cbPacket, pNetwork->pbTmp))
2311 * @param pSG The SG list for the frame.
2314 static void intnetR0TrunkIfSnoopAddr(PINTNETNETWORK pNetwork, PCINTNETSG pSG, uint16_t EtherType)
2323 Assert(pSG->cbTotal >= sizeof(RTNETETHERHDR) + RTNETIPV4_MIN_LEN + RTNETUDP_MIN_LEN + RTNETBOOTP_DHCP_MIN_LEN);
2324 if (pSG->aSegs[0].cb >= sizeof(RTNETETHERHDR) + RTNETIPV4_MIN_LEN)
2327 PCRTNETIPV4 pIpHdr = (PCRTNETIPV4)((uint8_t const *)pSG->aSegs[0].pv + sizeof(RTNETETHERHDR));
2337 if ( intnetR0SgReadByte(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV4, ip_p))
2342 b = intnetR0SgReadByte(pSG, sizeof(RTNETETHERHDR) + 0); /* (IPv4 first byte, a bitfield) */
2349 if (pSG->aSegs[0].cb >= sizeof(RTNETETHERHDR) + cbIpHdr + RTNETUDP_MIN_LEN)
2351 PCRTNETUDP pUdpHdr = (PCRTNETUDP)((uint8_t const *)pSG->aSegs[0].pv + sizeof(RTNETETHERHDR) + cbIpHdr);
2361 b = intnetR0SgReadByte(pSG, sizeof(RTNETETHERHDR) + cbIpHdr + RT_OFFSETOF(RTNETUDP, uh_sport) + 1);
2366 b = intnetR0SgReadByte(pSG, sizeof(RTNETETHERHDR) + cbIpHdr + RT_OFFSETOF(RTNETUDP, uh_sport));
2371 b = intnetR0SgReadByte(pSG, sizeof(RTNETETHERHDR) + cbIpHdr + RT_OFFSETOF(RTNETUDP, uh_dport) + 1);
2377 b = intnetR0SgReadByte(pSG, sizeof(RTNETETHERHDR) + cbIpHdr + RT_OFFSETOF(RTNETUDP, uh_dport));
2381 intnetR0TrunkIfSnoopDhcp(pNetwork, pSG);
2386 intnetR0TrunkIfSnoopArp(pNetwork, pSG);
2604 * @param pSG The gather list.
2607 static int intnetR0RingWriteFrame(PINTNETRINGBUF pRingBuf, PCINTNETSG pSG, PCRTMAC pNewDstMac)
2612 if (pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID)
2613 rc = IntNetRingAllocateFrame(pRingBuf, pSG->cbTotal, &pHdr, &pvDst);
2615 rc = IntNetRingAllocateGsoFrame(pRingBuf, pSG->cbTotal, &pSG->GsoCtx, &pHdr, &pvDst);
2618 IntNetSgRead(pSG, pvDst);
2634 * @param pSG The gather buffer which data is being sent to the interface.
2637 static void intnetR0IfSend(PINTNETIF pIf, PINTNETIF pIfSender, PINTNETSG pSG, PCRTMAC pNewDstMac)
2643 int rc = intnetR0RingWriteFrame(&pIf->pIntBuf->Recv, pSG, pNewDstMac);
2652 Log(("intnetR0IfSend: overflow cb=%d hIf=%RX32\n", pSG->cbTotal, pIf->hIf));
2670 rc = intnetR0RingWriteFrame(&pIf->pIntBuf->Recv, pSG, pNewDstMac);
2697 * @param pSG Pointer to the gather list.
2700 static int intnetR0TrunkIfSendGsoFallback(PINTNETTRUNKIF pThis, PINTNETIF pIfSender, PINTNETSG pSG, uint32_t fDst)
2707 Assert(PDMNetGsoIsValid(&pSG->GsoCtx, sizeof(pSG->GsoCtx), pSG->cbTotal));
2708 AssertReturn(pSG->cSegsUsed == 1, VERR_INTERNAL_ERROR_4);
2724 uint32_t const cSegs = PDMNetGsoCalcSegmentCount(&pSG->GsoCtx, pSG->cbTotal);
2728 uint32_t offSegPayload = PDMNetGsoCarveSegment(&pSG->GsoCtx, (uint8_t *)pSG->aSegs[0].pv, pSG->cbTotal, iSeg, cSegs,
2736 u.SG.aSegs[1].pv = (uint8_t *)pSG->aSegs[0].pv + offSegPayload;
2752 * @param pSG The scatter / gather buffer.
2755 DECLINLINE(bool) intnetR0TrunkIfCanHandleGsoFrame(PINTNETTRUNKIF pThis, PINTNETSG pSG, uint32_t fDst)
2757 uint8_t u8Type = pSG->GsoCtx.u8Type;
2913 * @param pSG Pointer to the gather list.
2916 uint32_t fDst, PINTNETSG pSG)
2924 AssertPtr(pSG);
2944 Assert(pSG->fFlags & INTNETSG_FLAGS_TEMP); /* make sure copy is forced */
2945 intnetR0TrunkIfSend(pThis, pNetwork, pIfSender, INTNETTRUNKDIR_HOST, pSG);
2953 AssertReturnVoid(pSG->cSegsUsed == 1);
2954 AssertReturnVoid(pSG->cbTotal >= sizeof(RTNETETHERHDR));
2956 PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pSG->aSegs[0].pv;
2963 if (pSG->fFlags & INTNETSG_FLAGS_ARP_IPV4)
2986 intnetR0TrunkSharedMacEditIPv6FromIntNet(pThis, pIfSender, pEthHdr, pSG->cbTotal);
2998 if ( pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID
2999 || intnetR0TrunkIfCanHandleGsoFrame(pThis, pSG, fDst) )
3000 rc = pThis->pIfPort->pfnXmit(pThis->pIfPort, pIfSender->pvIfData, pSG, fDst);
3002 rc = intnetR0TrunkIfSendGsoFallback(pThis, pIfSender, pSG, fDst);
3018 * @returns true broadcast (pEthHdr & pSG are modified), false if not.
3020 * @param pSG Pointer to the gather list for the frame. The
3026 static bool intnetR0NetworkSharedMacDetectAndFixBroadcast(PINTNETNETWORK pNetwork, PINTNETSG pSG, PRTNETETHERHDR pEthHdr)
3035 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETARPHDR, ar_oper),
3054 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV4, ip_dst),
3084 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV6, ip6_dst),
3107 intnetR0SgWritePart(pSG, RT_OFFSETOF(RTNETETHERHDR, DstMac), sizeof(pEthHdr->DstMac), &pEthHdr->DstMac);
3117 * @param pSG Pointer to the gather list for the frame.
3120 static void intnetR0NetworkSnoopNAFromWire(PINTNETNETWORK pNetwork, PINTNETSG pSG, PRTNETETHERHDR pEthHdr)
3128 if (RT_UNLIKELY(pSG->cbTotal < sizeof(RTNETETHERHDR) + sizeof(RTNETIPV6) +
3131 PRTNETIPV6 pIPv6 = (PRTNETIPV6)((uint8_t *)pSG->aSegs[0].pv + sizeof(RTNETETHERHDR));
3132 if ( pSG->cSegsUsed != 1
3133 && pSG->aSegs[0].cb < sizeof(RTNETETHERHDR) + sizeof(RTNETIPV6) +
3137 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR), sizeof(RTNETIPV6)
3140 pSG->fFlags |= INTNETSG_FLAGS_PKT_CP_IN_TMP;
3168 * @param pSG Pointer to the gather list for the frame.
3173 static void intnetR0NetworkEditArpFromWire(PINTNETNETWORK pNetwork, PINTNETSG pSG, PRTNETETHERHDR pEthHdr)
3179 if (RT_UNLIKELY(pSG->cbTotal < sizeof(RTNETETHERHDR) + sizeof(RTNETARPIPV4)))
3181 PRTNETARPIPV4 pArpIPv4 = (PRTNETARPIPV4)((uint8_t *)pSG->aSegs[0].pv + sizeof(RTNETETHERHDR));
3182 if ( pSG->cSegsUsed != 1
3183 && pSG->aSegs[0].cb < sizeof(RTNETETHERHDR) + sizeof(RTNETARPIPV4))
3186 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR), sizeof(RTNETARPIPV4), pNetwork->pbTmp))
3188 pSG->fFlags |= INTNETSG_FLAGS_PKT_CP_IN_TMP;
3209 pSG->fFlags |= INTNETSG_FLAGS_ARP_IPV4;
3235 if ((void *)pEthHdr != pSG->aSegs[0].pv)
3236 intnetR0SgWritePart(pSG, RT_OFFSETOF(RTNETETHERHDR, DstMac), sizeof(RTMAC), &pIf->MacAddr);
3241 if (pSG->fFlags & INTNETSG_FLAGS_PKT_CP_IN_TMP)
3242 intnetR0SgWritePart(pSG, sizeof(RTNETETHERHDR), sizeof(PRTNETARPIPV4), pArpIPv4);
3252 * @param pSG Pointer to the gather list for the frame.
3257 static void intnetR0NetworkEditDhcpFromIntNet(PINTNETNETWORK pNetwork, PINTNETSG pSG, PRTNETETHERHDR pEthHdr)
3265 if (RT_UNLIKELY(pSG->cbTotal < sizeof(RTNETETHERHDR) + RTNETIPV4_MIN_LEN + RTNETUDP_MIN_LEN + RTNETBOOTP_DHCP_MIN_LEN))
3271 PCRTNETIPV4 pIpHdr = (PCRTNETIPV4)((PCRTNETETHERHDR)pSG->aSegs[0].pv + 1);
3272 uint32_t cbPacket = pSG->cbTotal - sizeof(RTNETETHERHDR);
3273 if (pSG->cSegsUsed > 1)
3277 if (!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR), cbPacket, pNetwork->pbTmp))
3279 //pSG->fFlags |= INTNETSG_FLAGS_PKT_CP_IN_TMP;
3286 if (!RTNetIPv4IsHdrValid(pIpHdr, cbPacket, pSG->cbTotal - sizeof(RTNETETHERHDR), true /*fCheckSum*/))
3333 intnetR0SgWritePart(pSG, (uintptr_t)&pDhcp->bp_flags - (uintptr_t)pIpHdr + sizeof(RTNETETHERHDR), sizeof(uFlags), &uFlags);
3340 intnetR0SgWritePart(pSG, (uintptr_t)&pUdpHdr->uh_sum - (uintptr_t)pIpHdr + sizeof(RTNETETHERHDR), sizeof(pUdpHdr->uh_sum), &uChecksum);
3353 intnetR0SgWritePart(pSG, sizeof(RTNETETHERHDR) + 1, sizeof(uZero), &uZero);
3363 intnetR0SgWritePart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV4, ip_sum),
3457 * @param pSG Pointer to the gather list.
3463 PINTNETSG pSG, PRTNETETHERHDR pEthHdr,
3484 && pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID)
3485 intnetR0NetworkSnoopNAFromWire(pNetwork, pSG, pEthHdr);
3494 && pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID)
3495 intnetR0NetworkEditArpFromWire(pNetwork, pSG, pEthHdr);
3504 && pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID)
3505 intnetR0NetworkEditDhcpFromIntNet(pNetwork, pSG, pEthHdr);
3515 && pSG->cbTotal >= sizeof(RTNETETHERHDR) + RTNETIPV4_MIN_LEN + RTNETUDP_MIN_LEN + RTNETBOOTP_DHCP_MIN_LEN
3516 && pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID )
3517 || (pSG->fFlags & INTNETSG_FLAGS_ARP_IPV4) )
3518 intnetR0TrunkIfSnoopAddr(pNetwork, pSG, EtherType);
3520 if (pSG->fFlags & INTNETSG_FLAGS_ARP_IPV4)
3521 intnetR0TrunkIfSnoopArp(pNetwork, pSG);
3540 * @param pSG Pointer to the gather list.
3544 static INTNETSWDECISION intnetR0NetworkSharedMacFixAndSwitchUnicast(PINTNETNETWORK pNetwork, PINTNETSG pSG,
3556 if (RT_UNLIKELY(!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV4, ip_dst), sizeof(Addr.IPv4), &Addr)))
3558 Log(("intnetshareduni: failed to read ip_dst! cbTotal=%#x\n", pSG->cbTotal));
3567 if (RT_UNLIKELY(!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPV6, ip6_dst), sizeof(Addr.IPv6), &Addr)))
3569 Log(("intnetshareduni: failed to read ip6_dst! cbTotal=%#x\n", pSG->cbTotal));
3579 if (RT_UNLIKELY(!intnetR0SgReadPart(pSG, sizeof(RTNETETHERHDR) + RT_OFFSETOF(RTNETIPX, ipx_dstnet), sizeof(Addr.IPX), &Addr)))
3581 Log(("intnetshareduni: failed to read ipx_dstnet! cbTotal=%#x\n", pSG->cbTotal));
3596 return intnetR0NetworkSharedMacFixAndSwitchBroadcast(pNetwork, INTNETTRUNKDIR_WIRE, NULL, pSG, pEthHdr, pDstTab);
3620 && pSG->cbTotal >= sizeof(RTNETETHERHDR) + RTNETIPV4_MIN_LEN + RTNETUDP_MIN_LEN + RTNETBOOTP_DHCP_MIN_LEN
3621 && pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID)
3622 intnetR0TrunkIfSnoopAddr(pNetwork, pSG, RT_BE2H_U16(pEthHdr->EtherType));
3665 * @param pSG The frame to send.
3669 static void intnetR0NetworkDeliver(PINTNETNETWORK pNetwork, PINTNETDSTTAB pDstTab, PINTNETSG pSG, PINTNETIF pIfSender)
3679 intnetR0IfSend(pIf, pIfSender, pSG,
3703 intnetR0TrunkIfSend(pTrunk, pNetwork, pIfSender, pDstTab->fTrunkDst, pSG);
3724 * @param pSG Pointer to the gather list.
3728 PINTNETSG pSG, PINTNETDSTTAB pDstTab)
3737 AssertPtr(pSG);
3738 Assert(pSG->cSegsUsed >= 1);
3739 Assert(pSG->cSegsUsed <= pSG->cSegsAlloc);
3740 if (pSG->cbTotal < sizeof(RTNETETHERHDR))
3747 if (pSG->aSegs[0].cb >= sizeof(EthHdr))
3748 EthHdr = *(PCRTNETETHERHDR)pSG->aSegs[0].pv;
3749 else if (!intnetR0SgReadPart(pSG, 0, sizeof(EthHdr), &EthHdr))
3758 &EthHdr.DstMac, &EthHdr.SrcMac, RT_BE2H_U16(EthHdr.EtherType), fSrc, pSG->cbTotal));
3792 enmSwDecision = intnetR0NetworkSharedMacFixAndSwitchBroadcast(pNetwork, fSrc, pIfSender, pSG, &EthHdr, pDstTab);
3795 if (intnetR0NetworkSharedMacDetectAndFixBroadcast(pNetwork, pSG, &EthHdr))
3796 enmSwDecision = intnetR0NetworkSharedMacFixAndSwitchBroadcast(pNetwork, fSrc, pIfSender, pSG, &EthHdr, pDstTab);
3798 enmSwDecision = intnetR0NetworkSharedMacFixAndSwitchUnicast(pNetwork, pSG, &EthHdr, pDstTab);
3814 intnetR0NetworkDeliver(pNetwork, pDstTab, pSG, pIfSender);
5205 static DECLCALLBACK(bool) intnetR0TrunkIfPortRecv(PINTNETTRUNKSWPORT pSwitchPort, void *pvIf, PINTNETSG pSG, uint32_t fSrc)
5210 AssertPtr(pSG);
5280 INTNETSWDECISION enmSwDecision = intnetR0NetworkSend(pNetwork, NULL, fSrc, pSG, pDstTab);
5281 AssertMsg(enmSwDecision != INTNETSWDECISION_BAD_CONTEXT, ("fSrc=%#x fTrunkDst=%#x hdr=%.14Rhxs\n", fSrc, pDstTab->fTrunkDst, pSG->aSegs[0].pv));
5321 static DECLCALLBACK(void) intnetR0TrunkIfPortSGRetain(PINTNETTRUNKSWPORT pSwitchPort, PINTNETSG pSG)
5329 AssertPtr(pSG);
5330 Assert(pSG->cUsers > 0 && pSG->cUsers < 256);
5333 ++pSG->cUsers;
5338 static DECLCALLBACK(void) intnetR0TrunkIfPortSGRelease(PINTNETTRUNKSWPORT pSwitchPort, PINTNETSG pSG)
5346 AssertPtr(pSG);
5347 Assert(pSG->cUsers > 0);
5352 if (!--pSG->cUsers)