VirtualBox

Ignore:
Timestamp:
Jan 20, 2009 11:13:08 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
41779
Message:

Linux hostif: Fixed the issue with duplicating guest originated packets.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r15979 r16079  
    123123 * The (common) global data.
    124124 */
     125#ifdef RT_ARCH_AMD64
     126/**
     127 * Memory for the executable memory heap (in IPRT).
     128 */
     129extern 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
    125140static VBOXNETFLTGLOBALS g_VBoxNetFltGlobals;
    126141
     
    151166{
    152167    int rc;
    153     Log(("VBoxNetFltLinuxInit\n"));
    154 
    155168    /*
    156169     * Initialize IPRT.
     
    159172    if (RT_SUCCESS(rc))
    160173    {
     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
    161184        /*
    162185         * Initialize the globals and connect to the support driver.
     
    268291
    269292#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)]))
    271294
    272295/**
     
    279302DECLINLINE(bool) vboxNetFltLinuxSkBufIsOur(struct sk_buff *pBuf)
    280303{
    281     return VBOXNETFLT_SKB_CB(pBuf) == VBOXNETFLT_CB_TAG ;
     304    return VBOXNETFLT_SKB_TAG(pBuf) == VBOXNETFLT_CB_TAG ;
    282305}
    283306
     
    333356            VBOX_SKB_RESET_MAC_HDR(pPkt);
    334357        }
    335         VBOXNETFLT_SKB_CB(pPkt) = VBOXNETFLT_CB_TAG;
     358        VBOXNETFLT_SKB_TAG(pPkt) = VBOXNETFLT_CB_TAG;
    336359
    337360        return pPkt;
     
    422445    }
    423446#endif
    424     Log2(("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",
    425448          pSG->cSegsAlloc, pSG->cSegsUsed, skb_shinfo(pBuf)->nr_frags, pBuf->next, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, fSrc));
    426449    for (i = 0; i < pSG->cSegsUsed; i++)
    427         Log2(("vboxNetFltLinuxSkBufToSG:   #%d: cb=%d pv=%p\n",
     450        Log4(("vboxNetFltLinuxSkBufToSG:   #%d: cb=%d pv=%p\n",
    428451              i, pSG->aSegs[i].cb, pSG->aSegs[i].pv));
    429452}
     
    452475    PVBOXNETFLTINS pThis;
    453476    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));
    461479    /*
    462480     * Drop it immediately?
     
    464482    if (!pBuf)
    465483        return 0;
     484   
    466485    pThis = VBOX_FLT_PT_TO_INST(pPacketType);
    467486    pDev = (struct net_device *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pDev);
     
    472491    }
    473492
     493    Log4(("vboxNetFltLinuxPacketHandler: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb));
    474494    if (vboxNetFltLinuxSkBufIsOur(pBuf))
    475495    {
     496        Log2(("vboxNetFltLinuxPacketHandler: got our own sk_buff, drop it.\n"));
    476497        dev_kfree_skb(pBuf);
    477498        return 0;
     
    497518    skb_queue_tail(&pThis->u.s.XmitQueue, pBuf);
    498519    schedule_work(&pThis->u.s.XmitTask);
    499     Log2(("vboxNetFltLinuxPacketHandler: scheduled work %p for sk_buff %p\n",
     520    Log4(("vboxNetFltLinuxPacketHandler: scheduled work %p for sk_buff %p\n",
    500521          &pThis->u.s.XmitTask, pBuf));
    501522    /* It does not really matter what we return, it is ignored by the kernel. */
     
    536557}
    537558
     559#ifndef LOG_ENABLED
     560#define vboxNetFltDumpPacket(a, b, c, d)
     561#else
     562static 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
    538587static int vboxNetFltLinuxForwardSegment(PVBOXNETFLTINS pThis, struct sk_buff *pBuf, uint32_t fSrc)
    539588{
     
    551600
    552601        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);
    559603        pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, pSG, fSrc);
    560         Log2(("VBoxNetFlt: Dropping the sk_buff.\n"));
     604        Log4(("VBoxNetFlt: Dropping the sk_buff.\n"));
    561605        vboxNetFltLinuxFreeSkBuff(pBuf, pSG);
    562606    }
     
    611655    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
    612656
    613     Log2(("vboxNetFltLinuxXmitTask: Got work %p.\n", pWork));
     657    Log4(("vboxNetFltLinuxXmitTask: Got work %p.\n", pWork));
    614658    pThis = VBOX_FLT_XT_TO_INST(pWork);
    615659    /*
     
    805849}
    806850
    807 
    808851int  vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, PINTNETSG pSG, uint32_t fDst)
    809852{
    810     uint8_t *pTmp;
    811853    struct net_device * pDev;
    812854    int err;
     
    814856
    815857    LogFlow(("vboxNetFltPortOsXmit: pThis=%p (%s)\n", pThis, pThis->szName));
    816 
    817     pTmp = pSG->aSegs[0].pv;
    818858
    819859    pDev = vboxNetFltLinuxRetainNetDev(pThis);
     
    828868            if (pBuf)
    829869            {
    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));
    835873                err = dev_queue_xmit(pBuf);
    836874                if (err)
     
    849887            if (pBuf)
    850888            {
    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));
    856892                err = netif_rx_ni(pBuf);
    857893                if (err)
     
    876912    {
    877913        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));
    880916        vboxNetFltLinuxReleaseNetDev(pThis, pDev);
    881917    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette