Changeset 16079 in vbox for trunk/src/VBox/HostDrivers/VBoxNetFlt/linux
- Timestamp:
- Jan 20, 2009 11:13:08 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 41779
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
r15979 r16079 123 123 * The (common) global data. 124 124 */ 125 #ifdef RT_ARCH_AMD64 126 /** 127 * Memory for the executable memory heap (in IPRT). 128 */ 129 extern uint8_t g_abExecMemory[1572864]; /* 1.5 MB */ 130 __asm__(".section execmemory, \"awx\", @progbits\n\t" 131 ".align 32\n\t" 132 ".globl g_abExecMemory\n" 133 "g_abExecMemory:\n\t" 134 ".zero 1572864\n\t" 135 ".type g_abExecMemory, @object\n\t" 136 ".size g_abExecMemory, 1572864\n\t" 137 ".text\n\t"); 138 #endif 139 125 140 static VBOXNETFLTGLOBALS g_VBoxNetFltGlobals; 126 141 … … 151 166 { 152 167 int rc; 153 Log(("VBoxNetFltLinuxInit\n"));154 155 168 /* 156 169 * Initialize IPRT. … … 159 172 if (RT_SUCCESS(rc)) 160 173 { 174 #ifdef RT_ARCH_AMD64 175 rc = RTR0MemExecDonate(&g_abExecMemory[0], sizeof(g_abExecMemory)); 176 printk("VBoxNetFlt: dbg - g_abExecMemory=%p\n", (void *)&g_abExecMemory[0]); 177 if (RT_FAILURE(rc)) 178 { 179 printk("VBoxNetFlt: failed to donate exec memory, no logging will be available.\n"); 180 } 181 #endif 182 Log(("VBoxNetFltLinuxInit\n")); 183 161 184 /* 162 185 * Initialize the globals and connect to the support driver. … … 268 291 269 292 #define VBOXNETFLT_CB_TAG 0xA1C9D7C3 270 #define VBOXNETFLT_SKB_ CB(skb) (*(uint32_t*)&((skb)->cb[0]))293 #define VBOXNETFLT_SKB_TAG(skb) (*(uint32_t*)&((skb)->cb[sizeof((skb)->cb)-sizeof(uint32_t)])) 271 294 272 295 /** … … 279 302 DECLINLINE(bool) vboxNetFltLinuxSkBufIsOur(struct sk_buff *pBuf) 280 303 { 281 return VBOXNETFLT_SKB_ CB(pBuf) == VBOXNETFLT_CB_TAG ;304 return VBOXNETFLT_SKB_TAG(pBuf) == VBOXNETFLT_CB_TAG ; 282 305 } 283 306 … … 333 356 VBOX_SKB_RESET_MAC_HDR(pPkt); 334 357 } 335 VBOXNETFLT_SKB_ CB(pPkt) = VBOXNETFLT_CB_TAG;358 VBOXNETFLT_SKB_TAG(pPkt) = VBOXNETFLT_CB_TAG; 336 359 337 360 return pPkt; … … 422 445 } 423 446 #endif 424 Log 2(("vboxNetFltLinuxSkBufToSG: allocated=%d, segments=%d frags=%d next=%p frag_list=%p pkt_type=%x fSrc=%x\n",447 Log4(("vboxNetFltLinuxSkBufToSG: allocated=%d, segments=%d frags=%d next=%p frag_list=%p pkt_type=%x fSrc=%x\n", 425 448 pSG->cSegsAlloc, pSG->cSegsUsed, skb_shinfo(pBuf)->nr_frags, pBuf->next, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, fSrc)); 426 449 for (i = 0; i < pSG->cSegsUsed; i++) 427 Log 2(("vboxNetFltLinuxSkBufToSG: #%d: cb=%d pv=%p\n",450 Log4(("vboxNetFltLinuxSkBufToSG: #%d: cb=%d pv=%p\n", 428 451 i, pSG->aSegs[i].cb, pSG->aSegs[i].pv)); 429 452 } … … 452 475 PVBOXNETFLTINS pThis; 453 476 struct net_device *pDev; 454 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 14) 455 Log2(("vboxNetFltLinuxPacketHandler: pBuf=%p pSkbDev=%p pPacketType=%p pOrigDev=%p\n", 456 pBuf, pSkbDev, pPacketType, pOrigDev)); 457 #else 458 Log2(("vboxNetFltLinuxPacketHandler: pBuf=%p pSkbDev=%p pPacketType=%p\n", 459 pBuf, pSkbDev, pPacketType)); 460 #endif 477 LogFlow(("vboxNetFltLinuxPacketHandler: pBuf=%p pSkbDev=%p pPacketType=%p\n", 478 pBuf, pSkbDev, pPacketType)); 461 479 /* 462 480 * Drop it immediately? … … 464 482 if (!pBuf) 465 483 return 0; 484 466 485 pThis = VBOX_FLT_PT_TO_INST(pPacketType); 467 486 pDev = (struct net_device *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pDev); … … 472 491 } 473 492 493 Log4(("vboxNetFltLinuxPacketHandler: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); 474 494 if (vboxNetFltLinuxSkBufIsOur(pBuf)) 475 495 { 496 Log2(("vboxNetFltLinuxPacketHandler: got our own sk_buff, drop it.\n")); 476 497 dev_kfree_skb(pBuf); 477 498 return 0; … … 497 518 skb_queue_tail(&pThis->u.s.XmitQueue, pBuf); 498 519 schedule_work(&pThis->u.s.XmitTask); 499 Log 2(("vboxNetFltLinuxPacketHandler: scheduled work %p for sk_buff %p\n",520 Log4(("vboxNetFltLinuxPacketHandler: scheduled work %p for sk_buff %p\n", 500 521 &pThis->u.s.XmitTask, pBuf)); 501 522 /* It does not really matter what we return, it is ignored by the kernel. */ … … 536 557 } 537 558 559 #ifndef LOG_ENABLED 560 #define vboxNetFltDumpPacket(a, b, c, d) 561 #else 562 static void vboxNetFltDumpPacket(PINTNETSG pSG, bool fEgress, const char *pszWhere, int iIncrement) 563 { 564 uint8_t *pInt, *pExt; 565 static int iPacketNo = 1; 566 iPacketNo += iIncrement; 567 if (fEgress) 568 { 569 pExt = pSG->aSegs[0].pv; 570 pInt = pExt + 6; 571 } 572 else 573 { 574 pInt = pSG->aSegs[0].pv; 575 pExt = pInt + 6; 576 } 577 Log(("VBoxNetFlt: (int)%02x:%02x:%02x:%02x:%02x:%02x" 578 " %s (%s)%02x:%02x:%02x:%02x:%02x:%02x (%u bytes) packet #%u\n", 579 pInt[0], pInt[1], pInt[2], pInt[3], pInt[4], pInt[5], 580 fEgress ? "-->" : "<--", pszWhere, 581 pExt[0], pExt[1], pExt[2], pExt[3], pExt[4], pExt[5], 582 pSG->cbTotal, iPacketNo)); 583 Log3(("%.*Rhxd\n", pSG->aSegs[0].cb, pSG->aSegs[0].pv)); 584 } 585 #endif 586 538 587 static int vboxNetFltLinuxForwardSegment(PVBOXNETFLTINS pThis, struct sk_buff *pBuf, uint32_t fSrc) 539 588 { … … 551 600 552 601 pTmp = pSG->aSegs[0].pv; 553 Log(("VBoxNetFlt: (int)%02x:%02x:%02x:%02x:%02x:%02x" 554 " <-- (%s)%02x:%02x:%02x:%02x:%02x:%02x (%u bytes)\n", 555 pTmp[0], pTmp[1], pTmp[2], pTmp[3], pTmp[4], pTmp[5], 556 (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 557 pTmp[6], pTmp[7], pTmp[8], pTmp[9], pTmp[10], pTmp[11], 558 pSG->cbTotal)); 602 vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1); 559 603 pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, pSG, fSrc); 560 Log 2(("VBoxNetFlt: Dropping the sk_buff.\n"));604 Log4(("VBoxNetFlt: Dropping the sk_buff.\n")); 561 605 vboxNetFltLinuxFreeSkBuff(pBuf, pSG); 562 606 } … … 611 655 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 612 656 613 Log 2(("vboxNetFltLinuxXmitTask: Got work %p.\n", pWork));657 Log4(("vboxNetFltLinuxXmitTask: Got work %p.\n", pWork)); 614 658 pThis = VBOX_FLT_XT_TO_INST(pWork); 615 659 /* … … 805 849 } 806 850 807 808 851 int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, PINTNETSG pSG, uint32_t fDst) 809 852 { 810 uint8_t *pTmp;811 853 struct net_device * pDev; 812 854 int err; … … 814 856 815 857 LogFlow(("vboxNetFltPortOsXmit: pThis=%p (%s)\n", pThis, pThis->szName)); 816 817 pTmp = pSG->aSegs[0].pv;818 858 819 859 pDev = vboxNetFltLinuxRetainNetDev(pThis); … … 828 868 if (pBuf) 829 869 { 830 Log(("VBoxNetFlt: (int)%02x:%02x:%02x:%02x:%02x:%02x" 831 " --> (wire)%02x:%02x:%02x:%02x:%02x:%02x (%u bytes)\n", 832 pTmp[6], pTmp[7], pTmp[8], pTmp[9], pTmp[10], pTmp[11], 833 pTmp[0], pTmp[1], pTmp[2], pTmp[3], pTmp[4], pTmp[5], 834 pSG->cbTotal)); 870 vboxNetFltDumpPacket(pSG, true, "wire", 1); 871 Log4(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); 872 Log4(("vboxNetFltPortOsXmit: dev_queue_xmit(%p)\n", pBuf)); 835 873 err = dev_queue_xmit(pBuf); 836 874 if (err) … … 849 887 if (pBuf) 850 888 { 851 Log(("VBoxNetFlt: (int)%02x:%02x:%02x:%02x:%02x:%02x" 852 " --> (host)%02x:%02x:%02x:%02x:%02x:%02x (%u bytes)\n", 853 pTmp[6], pTmp[7], pTmp[8], pTmp[9], pTmp[10], pTmp[11], 854 pTmp[0], pTmp[1], pTmp[2], pTmp[3], pTmp[4], pTmp[5], 855 pSG->cbTotal)); 889 vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1); 890 Log4(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); 891 Log4(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf)); 856 892 err = netif_rx_ni(pBuf); 857 893 if (err) … … 876 912 { 877 913 fRc = !!(pDev->promiscuity - (ASMAtomicUoReadBool(&pThis->u.s.fPromiscuousSet) & 1)); 878 Log (("vboxNetFltPortOsIsPromiscuous: returns %d, pDev->promiscuity=%d, fPromiscuousSet=%d\n",879 fRc, pDev->promiscuity, pThis->u.s.fPromiscuousSet));914 LogFlow(("vboxNetFltPortOsIsPromiscuous: returns %d, pDev->promiscuity=%d, fPromiscuousSet=%d\n", 915 fRc, pDev->promiscuity, pThis->u.s.fPromiscuousSet)); 880 916 vboxNetFltLinuxReleaseNetDev(pThis, pDev); 881 917 }
Note:
See TracChangeset
for help on using the changeset viewer.