Lines Matching refs:pSG

552  * @param   pSG             The (scatter/)gather list.
554 DECLINLINE(bool) vboxNetFltLinuxIsGso(PINTNETSG pSG)
557 return !((PDMNETWORKGSOTYPE)pSG->GsoCtx.u8Type == PDMNETWORKGSOTYPE_INVALID);
568 * @param pSG The (scatter/)gather list.
570 DECLINLINE(uint32_t) vboxNetFltLinuxFrameSize(PINTNETSG pSG)
574 if (pSG->aSegs[0].cb >= sizeof(RTNETETHERHDR))
575 u16Type = RT_BE2H_U16(((PCRTNETETHERHDR)pSG->aSegs[0].pv)->EtherType);
576 else if (pSG->cbTotal >= sizeof(RTNETETHERHDR))
580 for (i = 0; i < pSG->cSegsUsed; ++i)
582 if (off <= pSG->aSegs[i].cb)
584 if (off + sizeof(uint16_t) <= pSG->aSegs[i].cb)
585 u16Type = RT_BE2H_U16(*(uint16_t *)((uintptr_t)pSG->aSegs[i].pv + off));
586 else if (i + 1 < pSG->cSegsUsed)
587 u16Type = RT_BE2H_U16( ((uint16_t)( ((uint8_t *)pSG->aSegs[i].pv)[off] ) << 8)
588 + *(uint8_t *)pSG->aSegs[i + 1].pv); /* ASSUMES no empty segments! */
592 off -= pSG->aSegs[i].cb;
597 return (vboxNetFltLinuxIsGso(pSG) ? (uint32_t)pSG->GsoCtx.cbMaxSeg + pSG->GsoCtx.cbHdrsTotal : pSG->cbTotal) - cbVlanTag;
607 * @param pSG The (scatter/)gather list.
610 static struct sk_buff *vboxNetFltLinuxSkBufFromSG(PVBOXNETFLTINS pThis, PINTNETSG pSG, bool fDstWire)
616 if (pSG->cbTotal == 0)
621 Log5(("VBoxNetFlt: Packet to %s of %d bytes (frame=%d).\n", fDstWire?"wire":"host", pSG->cbTotal, vboxNetFltLinuxFrameSize(pSG)));
622 if (fDstWire && (vboxNetFltLinuxFrameSize(pSG) > ASMAtomicReadU32(&pThis->u.s.cbMtu) + 14))
628 printk("VBoxNetFlt: Dropped over-sized packet (%d bytes) coming from internal network.\n", vboxNetFltLinuxFrameSize(pSG));
640 pPkt = dev_alloc_skb(pSG->cbTotal + NET_IP_ALIGN);
643 Log(("vboxNetFltLinuxSkBufFromSG: Failed to allocate sk_buff(%u).\n", pSG->cbTotal));
644 pSG->pvUserData = NULL;
654 skb_put(pPkt, pSG->cbTotal);
655 IntNetSgRead(pSG, pPkt->data);
661 switch ((PDMNETWORKGSOTYPE)pSG->GsoCtx.u8Type)
664 AssertMsgFailed(("%u (%s)\n", pSG->GsoCtx.u8Type, PDMNetGsoTypeName((PDMNETWORKGSOTYPE)pSG->GsoCtx.u8Type) ));
684 pShInfo->gso_size = pSG->GsoCtx.cbMaxSeg;
685 pShInfo->gso_segs = PDMNetGsoCalcSegmentCount(&pSG->GsoCtx, pSG->cbTotal);
691 Assert(skb_headlen(pPkt) >= pSG->GsoCtx.cbHdrsTotal);
694 pPkt->csum_start = skb_headroom(pPkt) + pSG->GsoCtx.offHdr2;
700 pPkt->h.raw = pPkt->data + pSG->GsoCtx.offHdr2;
707 PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, PDMNETCSUMTYPE_PSEUDO);
735 * @param pSG The SG.
743 DECLINLINE(void) vboxNetFltLinuxSkBufToSG(PVBOXNETFLTINS pThis, struct sk_buff *pBuf, PINTNETSG pSG,
752 IntNetSgInitTempSegs(pSG, pBuf->len, cSegs, 0 /*cSegsUsed*/);
754 IntNetSgInitTempSegsGso(pSG, pBuf->len, cSegs, 0 /*cSegsUsed*/, pGsoCtx);
757 pSG->aSegs[0].cb = skb_headlen(pBuf);
758 pSG->aSegs[0].pv = pBuf->data;
759 pSG->aSegs[0].Phys = NIL_RTHCPHYS;
764 pSG->aSegs[i+1].cb = pFrag->size;
765 pSG->aSegs[i+1].pv = kmap(pFrag->page);
766 printk("%p = kmap()\n", pSG->aSegs[i+1].pv);
767 pSG->aSegs[i+1].Phys = NIL_RTHCPHYS;
772 pSG->aSegs[0].cb = pBuf->len;
773 pSG->aSegs[0].pv = pBuf->data;
774 pSG->aSegs[0].Phys = NIL_RTHCPHYS;
778 pSG->cSegsUsed = i;
788 if (pSG->cbTotal < 60 && (fSrc & INTNETTRUNKDIR_HOST))
794 pSG->aSegs[i].Phys = NIL_RTHCPHYS;
795 pSG->aSegs[i].pv = (void *)&s_abZero[0];
796 pSG->aSegs[i].cb = 60 - pSG->cbTotal;
797 pSG->cbTotal = 60;
798 pSG->cSegsUsed++;
799 Assert(i + 1 <= pSG->cSegsAlloc)
804 pSG->cSegsAlloc, pSG->cSegsUsed, skb_shinfo(pBuf)->nr_frags, pBuf->next, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, fSrc));
805 for (i = 0; i < pSG->cSegsUsed; i++)
807 i, pSG->aSegs[i].cb, pSG->aSegs[i].pv));
966 static void vboxNetFltLinuxDestroySG(PINTNETSG pSG)
973 printk("kunmap(%p)\n", pSG->aSegs[i+1].pv);
974 kunmap(pSG->aSegs[i+1].pv);
977 NOREF(pSG);
984 static void vboxNetFltDumpPacket(PINTNETSG pSG, bool fEgress, const char *pszWhere, int iIncrement)
992 pExt = pSG->aSegs[0].pv;
997 pInt = pSG->aSegs[0].pv;
1005 pSG->cbTotal, iPacketNo));
1006 if (pSG->cSegsUsed == 1)
1008 Log3(("%.*Rhxd\n", pSG->aSegs[0].cb, pSG->aSegs[0].pv));
1012 for (i = 0, offSeg = 0; i < pSG->cSegsUsed; i++)
1015 i, offSeg, pSG->aSegs[i].cb, pSG->aSegs[i].cb, pSG->aSegs[i].pv));
1016 offSeg += pSG->aSegs[i].cb;
1255 PINTNETSG pSG = (PINTNETSG)alloca(RT_OFFSETOF(INTNETSG, aSegs[cSegs]));
1256 if (RT_LIKELY(pSG))
1258 vboxNetFltLinuxSkBufToSG(pThis, pSkb, pSG, cSegs, fSrc, pGsoCtx);
1260 vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1);
1261 pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, fSrc);
1263 vboxNetFltLinuxDestroySG(pSG);
1299 PINTNETSG pSG = (PINTNETSG)alloca(RT_OFFSETOF(INTNETSG, aSegs[cSegs]));
1300 if (RT_LIKELY(pSG))
1311 vboxNetFltLinuxSkBufToSG(pThis, pBuf, pSG, cSegs, fSrc, NULL /*pGsoCtx*/);
1313 vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1);
1314 pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, fSrc);
1316 vboxNetFltLinuxDestroySG(pSG);
1864 int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst)
1881 struct sk_buff *pBuf = vboxNetFltLinuxSkBufFromSG(pThis, pSG, true);
1884 vboxNetFltDumpPacket(pSG, true, "wire", 1);
1900 struct sk_buff *pBuf = vboxNetFltLinuxSkBufFromSG(pThis, pSG, false);
1903 vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1);