VirtualBox

Ignore:
Timestamp:
Apr 25, 2010 12:37:30 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60575
Message:

VBoxNetFlt/linux: Added VBOXNETFLT_LINUX_NO_XMIT_QUEUE since we can call pfnRecv at interrupt / atomic time now.

Location:
trunk/src/VBox/HostDrivers/VBoxNetFlt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h

    r28667 r28703  
    170170            struct notifier_block Notifier;
    171171            struct packet_type    PacketType;
     172#  ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    172173            struct sk_buff_head   XmitQueue;
    173174            struct work_struct    XmitTask;
     175#  endif
    174176            /** @} */
    175177# elif defined(RT_OS_SOLARIS)
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r28666 r28703  
    2323*   Header Files                                                               *
    2424*******************************************************************************/
     25#define LOG_GROUP LOG_GROUP_NET_FLT_DRV
     26#define VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    2527#include "the-linux-kernel.h"
    2628#include "version-generated.h"
     
    3234#include <linux/ip.h>
    3335
    34 #define LOG_GROUP LOG_GROUP_NET_FLT_DRV
    3536#include <VBox/log.h>
    3637#include <VBox/err.h>
     
    5859*   Defined Constants And Macros                                               *
    5960*******************************************************************************/
    60 #define VBOX_FLT_NB_TO_INST(pNB) ((PVBOXNETFLTINS)((uint8_t *)pNB - RT_OFFSETOF(VBOXNETFLTINS, u.s.Notifier)))
    61 #define VBOX_FLT_PT_TO_INST(pPT) ((PVBOXNETFLTINS)((uint8_t *)pPT - RT_OFFSETOF(VBOXNETFLTINS, u.s.PacketType)))
    62 #define VBOX_FLT_XT_TO_INST(pXT) ((PVBOXNETFLTINS)((uint8_t *)pXT - RT_OFFSETOF(VBOXNETFLTINS, u.s.XmitTask)))
     61#define VBOX_FLT_NB_TO_INST(pNB)    RT_FROM_MEMBER(pNB, VBOXNETFLTINS, u.s.Notifier)
     62#define VBOX_FLT_PT_TO_INST(pPT)    RT_FROM_MEMBER(pPT, VBOXNETFLTINS, u.s.PacketType)
     63#ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
     64# define VBOX_FLT_XT_TO_INST(pXT)   RT_FROM_MEMBER(pXT, VBOXNETFLTINS, u.s.XmitTask)
     65#endif
    6366
    6467#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
     
    121124static int      VBoxNetFltLinuxInit(void);
    122125static void     VBoxNetFltLinuxUnload(void);
     126static void     vboxNetFltLinuxForwardToIntNet(PVBOXNETFLTINS pThis, struct sk_buff *pBuf);
    123127
    124128
     
    760764#endif
    761765
     766#ifdef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
     767    /* Forward it to the internal network. */
     768    vboxNetFltLinuxForwardToIntNet(pThis, pBuf);
     769#else
    762770    /* Add the packet to transmit queue and schedule the bottom half. */
    763771    skb_queue_tail(&pThis->u.s.XmitQueue, pBuf);
     
    765773    Log4(("vboxNetFltLinuxPacketHandler: scheduled work %p for sk_buff %p\n",
    766774          &pThis->u.s.XmitTask, pBuf));
     775#endif
    767776
    768777    /* It does not really matter what we return, it is ignored by the kernel. */
     
    11241133}
    11251134
     1135/**
     1136 *
     1137 * @param   pBuf        The socket buffer.  This is consumed by this function.
     1138 */
    11261139static void vboxNetFltLinuxForwardToIntNet(PVBOXNETFLTINS pThis, struct sk_buff *pBuf)
    11271140{
     
    11931206}
    11941207
     1208#ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    11951209/**
    11961210 * Work queue handler that forwards the socket buffers queued by
     
    11991213 * @param   pWork               The work queue.
    12001214 */
    1201 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
     1215# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
    12021216static void vboxNetFltLinuxXmitTask(struct work_struct *pWork)
    1203 #else
     1217# else
    12041218static void vboxNetFltLinuxXmitTask(void *pWork)
    1205 #endif
     1219# endif
    12061220{
    12071221    PVBOXNETFLTINS  pThis   = VBOX_FLT_XT_TO_INST(pWork);
     
    12351249    }
    12361250}
     1251#endif /* !VBOXNETFLT_LINUX_NO_XMIT_QUEUE */
    12371252
    12381253/**
     
    13981413
    13991414    dev_remove_pack(&pThis->u.s.PacketType);
     1415#ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    14001416    skb_queue_purge(&pThis->u.s.XmitQueue);
     1417#endif
    14011418    Log(("vboxNetFltLinuxUnregisterDevice: this=%p: Packet handler removed, xmit queue purged.\n", pThis));
    14021419    Log(("vboxNetFltLinuxUnregisterDevice: Device %p(%s) released. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
     
    16871704    {
    16881705        dev_remove_pack(&pThis->u.s.PacketType);
     1706#ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    16891707        skb_queue_purge(&pThis->u.s.XmitQueue);
     1708#endif
    16901709        Log(("vboxNetFltOsDeleteInstance: this=%p: Packet handler removed, xmit queue purged.\n", pThis));
    16911710        Log(("vboxNetFltOsDeleteInstance: Device %p(%s) released. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
     
    17311750    pThis->u.s.fPromiscuousSet = false;
    17321751    memset(&pThis->u.s.PacketType, 0, sizeof(pThis->u.s.PacketType));
     1752#ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
    17331753    skb_queue_head_init(&pThis->u.s.XmitQueue);
    1734 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
     1754# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
    17351755    INIT_WORK(&pThis->u.s.XmitTask, vboxNetFltLinuxXmitTask);
    1736 #else
     1756# else
    17371757    INIT_WORK(&pThis->u.s.XmitTask, vboxNetFltLinuxXmitTask, &pThis->u.s.XmitTask);
     1758# endif
    17381759#endif
    17391760
Note: See TracChangeset for help on using the changeset viewer.

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