Lines 1-10
Link Here
|
1 |
/* $Id: VBoxNetFlt-linux.c 150609 2022-03-21 21:07:44Z vgalitsy $ */ |
1 |
/* $Id$ */ |
2 |
/** @file |
2 |
/** @file |
3 |
* VBoxNetFlt - Network Filter Driver (Host), Linux Specific Code. |
3 |
* VBoxNetFlt - Network Filter Driver (Host), Linux Specific Code. |
4 |
*/ |
4 |
*/ |
5 |
/* |
5 |
/* |
6 |
* Copyright (C) 2006-2020 Oracle Corporation |
6 |
* Copyright (C) 2006-2022 Oracle Corporation |
7 |
* |
7 |
* |
8 |
* This file is part of VirtualBox Open Source Edition (OSE), as |
8 |
* This file is part of VirtualBox Open Source Edition (OSE), as |
9 |
* available from http://www.virtualbox.org. This file is free software; |
9 |
* available from http://www.virtualbox.org. This file is free software; |
Lines 402-412
static int vboxNetFltLinuxStartXmitFilte
Link Here
|
402 |
* to be production quality code, we would have to be much more |
402 |
* to be production quality code, we would have to be much more |
403 |
* careful here and avoid the race. |
403 |
* careful here and avoid the race. |
404 |
*/ |
404 |
*/ |
405 |
if ( !VALID_PTR(pOverride) |
405 |
if ( !RT_VALID_PTR(pOverride) |
406 |
|| pOverride->u32Magic != VBOXNETDEVICEOPSOVERRIDE_MAGIC |
406 |
|| pOverride->u32Magic != VBOXNETDEVICEOPSOVERRIDE_MAGIC |
407 |
# if RTLNX_VER_MIN(2,6,29) |
407 |
# if RTLNX_VER_MIN(2,6,29) |
408 |
|| !VALID_PTR(pOverride->pOrgOps) |
408 |
|| !RT_VALID_PTR(pOverride->pOrgOps) |
409 |
# endif /* RTLNX_VER_MIN(2,6,29) */ |
409 |
# endif |
410 |
) |
410 |
) |
411 |
{ |
411 |
{ |
412 |
printk("vboxNetFltLinuxStartXmitFilter: bad override %p\n", pOverride); |
412 |
printk("vboxNetFltLinuxStartXmitFilter: bad override %p\n", pOverride); |
Lines 426-434
static int vboxNetFltLinuxStartXmitFilte
Link Here
|
426 |
cbHdrs = RT_MIN(cbHdrs, sizeof(abHdrBuf)); |
426 |
cbHdrs = RT_MIN(cbHdrs, sizeof(abHdrBuf)); |
427 |
pEtherHdr = (PCRTNETETHERHDR)skb_header_pointer(pSkb, 0, cbHdrs, &abHdrBuf[0]); |
427 |
pEtherHdr = (PCRTNETETHERHDR)skb_header_pointer(pSkb, 0, cbHdrs, &abHdrBuf[0]); |
428 |
if ( pEtherHdr |
428 |
if ( pEtherHdr |
429 |
&& VALID_PTR(pOverride->pVBoxNetFlt) |
429 |
&& RT_VALID_PTR(pOverride->pVBoxNetFlt) |
430 |
&& (pSwitchPort = pOverride->pVBoxNetFlt->pSwitchPort) != NULL |
430 |
&& (pSwitchPort = pOverride->pVBoxNetFlt->pSwitchPort) != NULL |
431 |
&& VALID_PTR(pSwitchPort) |
431 |
&& RT_VALID_PTR(pSwitchPort) |
432 |
&& cbHdrs >= 6) |
432 |
&& cbHdrs >= 6) |
433 |
{ |
433 |
{ |
434 |
INTNETSWDECISION enmDecision; |
434 |
INTNETSWDECISION enmDecision; |
Lines 457-463
static int vboxNetFltLinuxStartXmitFilte
Link Here
|
457 |
PVBOXNETDEVICEOPSOVERRIDE pOverride; |
457 |
PVBOXNETDEVICEOPSOVERRIDE pOverride; |
458 |
|
458 |
|
459 |
/* Cancel override if ethtool_ops is missing (host-only case, @bugref{5712}) */ |
459 |
/* Cancel override if ethtool_ops is missing (host-only case, @bugref{5712}) */ |
460 |
if (!VALID_PTR(pDev->OVR_OPS)) |
460 |
if (!RT_VALID_PTR(pDev->OVR_OPS)) |
461 |
return; |
461 |
return; |
462 |
pOverride = RTMemAlloc(sizeof(*pOverride)); |
462 |
pOverride = RTMemAlloc(sizeof(*pOverride)); |
463 |
if (!pOverride) |
463 |
if (!pOverride) |
Lines 497-507
static void vboxNetFltLinuxHookDev(PVBOX
Link Here
|
497 |
if (!pDev) |
497 |
if (!pDev) |
498 |
pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); |
498 |
pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); |
499 |
if (VALID_PTR(pDev)) |
499 |
if (RT_VALID_PTR(pDev)) |
500 |
{ |
500 |
{ |
501 |
pOverride = (PVBOXNETDEVICEOPSOVERRIDE)pDev->OVR_OPS; |
501 |
pOverride = (PVBOXNETDEVICEOPSOVERRIDE)pDev->OVR_OPS; |
502 |
if ( VALID_PTR(pOverride) |
502 |
if ( RT_VALID_PTR(pOverride) |
503 |
&& pOverride->u32Magic == VBOXNETDEVICEOPSOVERRIDE_MAGIC |
503 |
&& pOverride->u32Magic == VBOXNETDEVICEOPSOVERRIDE_MAGIC |
504 |
&& VALID_PTR(pOverride->pOrgOps) |
504 |
&& RT_VALID_PTR(pOverride->pOrgOps) |
505 |
) |
505 |
) |
506 |
{ |
506 |
{ |
507 |
# if RTLNX_VER_MAX(2,6,29) |
507 |
# if RTLNX_VER_MAX(2,6,29) |
Lines 1531-1537
static void vboxNetFltLinuxForwardToIntN
Link Here
|
1531 |
skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size, |
1531 |
skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size, |
1532 |
skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type, |
1532 |
skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type, |
1533 |
skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, pBuf->ip_summed)); |
1533 |
skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, pBuf->ip_summed)); |
1534 |
#ifndef VBOXNETFLT_SG_SUPPORT |
|
|
1535 |
if (RT_LIKELY(fSrc & INTNETTRUNKDIR_HOST)) |
1534 |
if (RT_LIKELY(fSrc & INTNETTRUNKDIR_HOST)) |
1536 |
{ |
1535 |
{ |
1537 |
/* |
1536 |
/* |
Lines 1545-1551
static void vboxNetFltLinuxForwardToIntN
Link Here
|
1545 |
pBuf->mac_len = pBuf->nh.raw - pBuf->data; |
1544 |
pBuf->mac_len = pBuf->nh.raw - pBuf->data; |
1546 |
# endif |
1545 |
# endif |
1547 |
} |
1546 |
} |
1548 |
#endif /* !VBOXNETFLT_SG_SUPPORT */ |
|
|
1549 |
# ifdef VBOXNETFLT_WITH_GSO_RECV |
1547 |
# ifdef VBOXNETFLT_WITH_GSO_RECV |
1550 |
if ( (skb_shinfo(pBuf)->gso_type & (SKB_GSO_TCPV6 | SKB_GSO_TCPV4)) |
1548 |
if ( (skb_shinfo(pBuf)->gso_type & (SKB_GSO_TCPV6 | SKB_GSO_TCPV4)) |
1551 |
&& vboxNetFltLinuxCanForwardAsGso(pThis, pBuf, fSrc, &GsoCtx) ) |
1549 |
&& vboxNetFltLinuxCanForwardAsGso(pThis, pBuf, fSrc, &GsoCtx) ) |
Lines 1698-1704
static void vboxNetFltLinuxXmitTask(void
Link Here
|
1698 |
*/ |
1696 |
*/ |
1699 |
static void vboxNetFltLinuxReportNicGsoCapabilities(PVBOXNETFLTINS pThis) |
1697 |
static void vboxNetFltLinuxReportNicGsoCapabilities(PVBOXNETFLTINS pThis) |
1700 |
{ |
1698 |
{ |
1701 |
#ifdef VBOXNETFLT_WITH_GSO_XMIT_WIRE |
1699 |
#if defined(VBOXNETFLT_WITH_GSO_XMIT_WIRE) || defined(VBOXNETFLT_WITH_GSO_XMIT_HOST) |
1702 |
if (vboxNetFltTryRetainBusyNotDisconnected(pThis)) |
1700 |
if (vboxNetFltTryRetainBusyNotDisconnected(pThis)) |
1703 |
{ |
1701 |
{ |
1704 |
struct net_device *pDev; |
1702 |
struct net_device *pDev; |
Lines 1724-1730
static void vboxNetFltLinuxReportNicGsoC
Link Here
|
1724 |
fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP); |
1722 |
fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP); |
1725 |
if (fFeatures & NETIF_F_TSO6) |
1723 |
if (fFeatures & NETIF_F_TSO6) |
1726 |
fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP); |
1724 |
fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP); |
1727 |
Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s%s%s\n", |
1725 |
Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s\n", |
1728 |
(fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)) ? "tso " : "", |
1726 |
(fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)) ? "tso " : "", |
1729 |
(fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)) ? "tso6 " : "")); |
1727 |
(fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)) ? "tso6 " : "")); |
1730 |
pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, fGsoCapabilites, INTNETTRUNKDIR_WIRE); |
1728 |
pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, fGsoCapabilites, INTNETTRUNKDIR_WIRE); |
Lines 1732-1738
static void vboxNetFltLinuxReportNicGsoC
Link Here
|
1732 |
|
1730 |
|
1733 |
vboxNetFltRelease(pThis, true /*fBusy*/); |
1731 |
vboxNetFltRelease(pThis, true /*fBusy*/); |
1734 |
} |
1732 |
} |
1735 |
#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE */ |
1733 |
#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */ |
1736 |
} |
1734 |
} |
1737 |
/** |
1735 |
/** |
Lines 2311-2317
int vboxNetFltPortOsXmit(PVBOXNETFLTINS
Link Here
|
2311 |
vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1); |
2309 |
vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1); |
2312 |
Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); |
2310 |
Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); |
2313 |
Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf)); |
2311 |
Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf)); |
|
|
2312 |
#if RTLNX_VER_MIN(5,18,0) |
2313 |
local_bh_disable(); |
2314 |
err = netif_rx(pBuf); |
2315 |
local_bh_enable(); |
2316 |
#else |
2314 |
err = netif_rx_ni(pBuf); |
2317 |
err = netif_rx_ni(pBuf); |
|
|
2318 |
#endif |
2315 |
if (err) |
2319 |
if (err) |
2316 |
rc = RTErrConvertFromErrno(err); |
2320 |
rc = RTErrConvertFromErrno(err); |
2317 |
} |
2321 |
} |