emulators/virtualbox-ose-kmod-legacy: Fix build error since 1500027 (struct ifnet is now hidden)
Based on patch from wulf. PR: 282780 Tested by: groenveld@acm.org
This commit is contained in:
parent
1b244fbbf4
commit
3528379355
@ -1,14 +1,147 @@
|
|||||||
--- src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c.orig 2020-05-13 19:43:54 UTC
|
--- src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c.orig 2020-07-09 16:57:01 UTC
|
||||||
+++ src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
|
+++ src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
|
||||||
@@ -235,7 +235,11 @@ static void VBoxNetAdpFreeBSDNetstart(struct ifnet *if
|
@@ -216,7 +216,11 @@ static void VBoxNetAdpFreeBSDNetinit(void *priv)
|
||||||
|
PVBOXNETADP pThis = priv;
|
||||||
|
struct ifnet *ifp = pThis->u.s.ifp;
|
||||||
|
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0);
|
||||||
|
+#else
|
||||||
|
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -226,21 +230,46 @@ static void VBoxNetAdpFreeBSDNetstart(struct ifnet *if
|
||||||
|
*/
|
||||||
|
static void VBoxNetAdpFreeBSDNetstart(struct ifnet *ifp)
|
||||||
|
{
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ PVBOXNETADP pThis = if_getsoftc(ifp);
|
||||||
|
+#else
|
||||||
|
PVBOXNETADP pThis = ifp->if_softc;
|
||||||
|
+#endif
|
||||||
|
struct mbuf *m;
|
||||||
|
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
|
||||||
|
+#else
|
||||||
|
if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
|
||||||
|
+#endif
|
||||||
|
return;
|
||||||
|
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_setdrvflagbits(ifp, IFF_DRV_OACTIVE, 0);
|
||||||
|
+ while (!if_sendq_empty(ifp))
|
||||||
|
+#else
|
||||||
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
|
||||||
while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
|
while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
|
||||||
|
+#endif
|
||||||
{
|
{
|
||||||
+#if __FreeBSD_version >= 1100036
|
+#if __FreeBSD_version >= 1100036
|
||||||
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
|
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
|
||||||
+#else
|
+#else
|
||||||
ifp->if_opackets++;
|
ifp->if_opackets++;
|
||||||
+#endif
|
+#endif
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ m = if_dequeue(ifp);
|
||||||
|
+#else
|
||||||
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
|
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
|
||||||
|
+#endif
|
||||||
BPF_MTAP(ifp, m);
|
BPF_MTAP(ifp, m);
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
|
}
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_setdrvflagbits(ifp, 0, IFF_DRV_OACTIVE);
|
||||||
|
+#else
|
||||||
|
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -253,6 +282,18 @@ static int VBoxNetAdpFreeBSDNetioctl(struct ifnet *ifp
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case SIOCSIFFLAGS:
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if (if_getflags(ifp) & IFF_UP)
|
||||||
|
+ {
|
||||||
|
+ if (!(if_getdrvflags(ifp) & IFF_DRV_RUNNING))
|
||||||
|
+ if_init(ifp, if_getsoftc(ifp));
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ if (if_getdrvflags(ifp) & IFF_DRV_RUNNING)
|
||||||
|
+ if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
|
||||||
|
+ }
|
||||||
|
+#else
|
||||||
|
if (ifp->if_flags & IFF_UP)
|
||||||
|
{
|
||||||
|
if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
|
||||||
|
@@ -263,6 +304,7 @@ static int VBoxNetAdpFreeBSDNetioctl(struct ifnet *ifp
|
||||||
|
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
|
||||||
|
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
break;
|
||||||
|
case SIOCGIFMEDIA:
|
||||||
|
{
|
||||||
|
@@ -297,7 +339,11 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac
|
||||||
|
|
||||||
|
int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac)
|
||||||
|
{
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp;
|
||||||
|
+#else
|
||||||
|
struct ifnet *ifp;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
VBOXCURVNET_SET_FROM_UCRED();
|
||||||
|
ifp = if_alloc(IFT_ETHER);
|
||||||
|
@@ -305,6 +351,16 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac
|
||||||
|
return VERR_NO_MEMORY;
|
||||||
|
|
||||||
|
if_initname(ifp, VBOXNETADP_NAME, pThis->iUnit);
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_setsoftc(ifp, pThis);
|
||||||
|
+ if_setmtu(ifp, ETHERMTU);
|
||||||
|
+ if_setflagbits(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST, 0);
|
||||||
|
+ if_setioctlfn(ifp, VBoxNetAdpFreeBSDNetioctl);
|
||||||
|
+ if_setstartfn(ifp, VBoxNetAdpFreeBSDNetstart);
|
||||||
|
+ if_setinitfn(ifp, VBoxNetAdpFreeBSDNetinit);
|
||||||
|
+ if_setsendqlen(ifp, IFQ_MAXLEN);
|
||||||
|
+ if_setsendqready(ifp);
|
||||||
|
+#else
|
||||||
|
ifp->if_softc = pThis;
|
||||||
|
ifp->if_mtu = ETHERMTU;
|
||||||
|
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
|
||||||
|
@@ -314,10 +370,17 @@ int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac
|
||||||
|
IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
|
||||||
|
ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
|
||||||
|
IFQ_SET_READY(&ifp->if_snd);
|
||||||
|
+#endif
|
||||||
|
ether_ifattach(ifp, (void *)pMac);
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ (void)if_setbaudrate(ifp, 0);
|
||||||
|
+
|
||||||
|
+ strncpy(pThis->szName, if_name(ifp), VBOXNETADP_MAX_NAME_LEN);
|
||||||
|
+#else
|
||||||
|
ifp->if_baudrate = 0;
|
||||||
|
|
||||||
|
strncpy(pThis->szName, ifp->if_xname, VBOXNETADP_MAX_NAME_LEN);
|
||||||
|
+#endif
|
||||||
|
pThis->u.s.ifp = ifp;
|
||||||
|
VBOXCURVNET_RESTORE();
|
||||||
|
return 0;
|
||||||
|
@@ -328,7 +391,11 @@ void vboxNetAdpOsDestroy(PVBOXNETADP pThis)
|
||||||
|
struct ifnet *ifp;
|
||||||
|
|
||||||
|
ifp = pThis->u.s.ifp;
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
|
+#endif
|
||||||
|
ether_ifdetach(ifp);
|
||||||
|
if_free(ifp);
|
||||||
|
VBOXCURVNET_RESTORE();
|
||||||
|
|||||||
@ -33,7 +33,28 @@
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MOD_UNLOAD:
|
case MOD_UNLOAD:
|
||||||
@@ -361,7 +362,14 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
@@ -334,12 +335,20 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
||||||
|
{
|
||||||
|
const node_p node = NG_HOOK_NODE(hook);
|
||||||
|
PVBOXNETFLTINS pThis = NG_NODE_PRIVATE(node);
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp = pThis->u.s.ifp;
|
||||||
|
+#else
|
||||||
|
struct ifnet *ifp = pThis->u.s.ifp;
|
||||||
|
+#endif
|
||||||
|
struct mbuf *m;
|
||||||
|
struct m_tag *mtag;
|
||||||
|
bool fActive;
|
||||||
|
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
|
+#endif
|
||||||
|
fActive = vboxNetFltTryRetainBusyActive(pThis);
|
||||||
|
|
||||||
|
NGI_GET_M(item, m);
|
||||||
|
@@ -361,7 +370,14 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
||||||
{
|
{
|
||||||
if (mtag != NULL || !fActive)
|
if (mtag != NULL || !fActive)
|
||||||
{
|
{
|
||||||
@ -48,7 +69,7 @@
|
|||||||
if (fActive)
|
if (fActive)
|
||||||
vboxNetFltRelease(pThis, true /*fBusy*/);
|
vboxNetFltRelease(pThis, true /*fBusy*/);
|
||||||
VBOXCURVNET_RESTORE();
|
VBOXCURVNET_RESTORE();
|
||||||
@@ -370,7 +378,11 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
@@ -370,7 +386,11 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
||||||
mtx_lock_spin(&pThis->u.s.inq.ifq_mtx);
|
mtx_lock_spin(&pThis->u.s.inq.ifq_mtx);
|
||||||
_IF_ENQUEUE(&pThis->u.s.inq, m);
|
_IF_ENQUEUE(&pThis->u.s.inq, m);
|
||||||
mtx_unlock_spin(&pThis->u.s.inq.ifq_mtx);
|
mtx_unlock_spin(&pThis->u.s.inq.ifq_mtx);
|
||||||
@ -60,7 +81,7 @@
|
|||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Handle mbufs on the outgoing hook, frames going to the interface
|
* Handle mbufs on the outgoing hook, frames going to the interface
|
||||||
@@ -388,7 +400,11 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
@@ -388,7 +408,11 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i
|
||||||
mtx_lock_spin(&pThis->u.s.outq.ifq_mtx);
|
mtx_lock_spin(&pThis->u.s.outq.ifq_mtx);
|
||||||
_IF_ENQUEUE(&pThis->u.s.outq, m);
|
_IF_ENQUEUE(&pThis->u.s.outq, m);
|
||||||
mtx_unlock_spin(&pThis->u.s.outq.ifq_mtx);
|
mtx_unlock_spin(&pThis->u.s.outq.ifq_mtx);
|
||||||
@ -72,16 +93,30 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -428,6 +444,8 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend
|
@@ -425,12 +449,22 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend
|
||||||
|
{
|
||||||
|
PVBOXNETFLTINS pThis = (PVBOXNETFLTINS)arg;
|
||||||
|
struct mbuf *m, *m0;
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp = pThis->u.s.ifp;
|
||||||
|
+#else
|
||||||
struct ifnet *ifp = pThis->u.s.ifp;
|
struct ifnet *ifp = pThis->u.s.ifp;
|
||||||
|
+#endif
|
||||||
unsigned int cSegs = 0;
|
unsigned int cSegs = 0;
|
||||||
bool fDropIt = false, fActive;
|
bool fDropIt = false, fActive;
|
||||||
+ bool is_vl_tagged = false;
|
+ bool is_vl_tagged = false;
|
||||||
+ uint16_t vl_tag;
|
+ uint16_t vl_tag;
|
||||||
PINTNETSG pSG;
|
PINTNETSG pSG;
|
||||||
|
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
VBOXCURVNET_SET(ifp->if_vnet);
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
@@ -440,6 +458,19 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend
|
+#endif
|
||||||
|
vboxNetFltRetain(pThis, true /* fBusy */);
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
@@ -440,6 +474,19 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -101,7 +136,7 @@
|
|||||||
for (m0 = m; m0 != NULL; m0 = m0->m_next)
|
for (m0 = m; m0 != NULL; m0 = m0->m_next)
|
||||||
if (m0->m_len > 0)
|
if (m0->m_len > 0)
|
||||||
cSegs++;
|
cSegs++;
|
||||||
@@ -454,10 +485,40 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend
|
@@ -454,10 +501,39 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend
|
||||||
vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0);
|
vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0);
|
||||||
fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE);
|
fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE);
|
||||||
RTMemTmpFree(pSG);
|
RTMemTmpFree(pSG);
|
||||||
@ -128,8 +163,8 @@
|
|||||||
+
|
+
|
||||||
if (fDropIt)
|
if (fDropIt)
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
else
|
- else
|
||||||
+ {
|
+ else {
|
||||||
+#if __FreeBSD_version >= 1300049
|
+#if __FreeBSD_version >= 1300049
|
||||||
+ struct epoch_tracker et;
|
+ struct epoch_tracker et;
|
||||||
+ NET_EPOCH_ENTER(et);
|
+ NET_EPOCH_ENTER(et);
|
||||||
@ -142,7 +177,28 @@
|
|||||||
}
|
}
|
||||||
vboxNetFltRelease(pThis, true /* fBusy */);
|
vboxNetFltRelease(pThis, true /* fBusy */);
|
||||||
VBOXCURVNET_RESTORE();
|
VBOXCURVNET_RESTORE();
|
||||||
@@ -513,6 +574,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
@@ -470,12 +546,20 @@ static void vboxNetFltFreeBSDoutput(void *arg, int pen
|
||||||
|
{
|
||||||
|
PVBOXNETFLTINS pThis = (PVBOXNETFLTINS)arg;
|
||||||
|
struct mbuf *m, *m0;
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp = pThis->u.s.ifp;
|
||||||
|
+#else
|
||||||
|
struct ifnet *ifp = pThis->u.s.ifp;
|
||||||
|
+#endif
|
||||||
|
unsigned int cSegs = 0;
|
||||||
|
bool fDropIt = false, fActive;
|
||||||
|
PINTNETSG pSG;
|
||||||
|
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
|
+#endif
|
||||||
|
vboxNetFltRetain(pThis, true /* fBusy */);
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
@@ -513,26 +597,41 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
||||||
*/
|
*/
|
||||||
int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst)
|
int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst)
|
||||||
{
|
{
|
||||||
@ -150,7 +206,24 @@
|
|||||||
NOREF(pvIfData);
|
NOREF(pvIfData);
|
||||||
|
|
||||||
void (*input_f)(struct ifnet *, struct mbuf *);
|
void (*input_f)(struct ifnet *, struct mbuf *);
|
||||||
@@ -529,10 +591,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp;
|
||||||
|
+#else
|
||||||
|
struct ifnet *ifp;
|
||||||
|
+#endif
|
||||||
|
struct mbuf *m;
|
||||||
|
struct m_tag *mtag;
|
||||||
|
bool fActive;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *);
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
if (fDst & INTNETTRUNKDIR_WIRE)
|
||||||
{
|
{
|
||||||
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG);
|
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
@ -167,7 +240,7 @@
|
|||||||
|
|
||||||
m->m_flags |= M_PKTHDR;
|
m->m_flags |= M_PKTHDR;
|
||||||
ether_output_frame(ifp, m);
|
ether_output_frame(ifp, m);
|
||||||
@@ -542,10 +610,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
@@ -542,10 +641,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
||||||
{
|
{
|
||||||
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG);
|
m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG);
|
||||||
if (m == NULL)
|
if (m == NULL)
|
||||||
@ -184,7 +257,7 @@
|
|||||||
/*
|
/*
|
||||||
* Delivering packets to the host will be captured by the
|
* Delivering packets to the host will be captured by the
|
||||||
* input hook. Tag the packet with a mbuf tag so that we
|
* input hook. Tag the packet with a mbuf tag so that we
|
||||||
@@ -556,6 +630,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
@@ -556,6 +661,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
||||||
if (mtag == NULL)
|
if (mtag == NULL)
|
||||||
{
|
{
|
||||||
m_freem(m);
|
m_freem(m);
|
||||||
@ -192,7 +265,7 @@
|
|||||||
return VERR_NO_MEMORY;
|
return VERR_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -563,9 +638,17 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
@@ -563,9 +669,21 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p
|
||||||
m_tag_prepend(m, mtag);
|
m_tag_prepend(m, mtag);
|
||||||
m->m_flags |= M_PKTHDR;
|
m->m_flags |= M_PKTHDR;
|
||||||
m->m_pkthdr.rcvif = ifp;
|
m->m_pkthdr.rcvif = ifp;
|
||||||
@ -200,7 +273,11 @@
|
|||||||
+ struct epoch_tracker et;
|
+ struct epoch_tracker et;
|
||||||
+ NET_EPOCH_ENTER(et);
|
+ NET_EPOCH_ENTER(et);
|
||||||
+#endif
|
+#endif
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_input(ifp, m);
|
||||||
|
+#else
|
||||||
ifp->if_input(ifp, m);
|
ifp->if_input(ifp, m);
|
||||||
|
+#endif
|
||||||
+#if __FreeBSD_version >= 1300049
|
+#if __FreeBSD_version >= 1300049
|
||||||
+ NET_EPOCH_EXIT(et);
|
+ NET_EPOCH_EXIT(et);
|
||||||
+#endif
|
+#endif
|
||||||
@ -210,15 +287,20 @@
|
|||||||
return VINF_SUCCESS;
|
return VINF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,6 +661,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
|
@@ -578,15 +696,23 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
|
||||||
|
|
||||||
int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
|
int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
|
||||||
{
|
{
|
||||||
+ IPRT_FREEBSD_SAVE_EFL_AC();
|
+ IPRT_FREEBSD_SAVE_EFL_AC();
|
||||||
char nam[NG_NODESIZ];
|
char nam[NG_NODESIZ];
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp;
|
||||||
|
+#else
|
||||||
struct ifnet *ifp;
|
struct ifnet *ifp;
|
||||||
|
+#endif
|
||||||
node_p node;
|
node_p node;
|
||||||
@@ -586,7 +670,10 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
|
|
||||||
|
VBOXCURVNET_SET_FROM_UCRED();
|
||||||
NOREF(pvContext);
|
NOREF(pvContext);
|
||||||
ifp = ifunit(pThis->szName);
|
ifp = ifunit(pThis->szName);
|
||||||
if (ifp == NULL)
|
if (ifp == NULL)
|
||||||
@ -229,7 +311,19 @@
|
|||||||
|
|
||||||
/* Create a new netgraph node for this instance */
|
/* Create a new netgraph node for this instance */
|
||||||
if (ng_make_node_common(&ng_vboxnetflt_typestruct, &node) != 0)
|
if (ng_make_node_common(&ng_vboxnetflt_typestruct, &node) != 0)
|
||||||
@@ -630,12 +717,14 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
|
@@ -596,7 +722,11 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
|
||||||
|
|
||||||
|
ASMAtomicUoWritePtr(&pThis->u.s.ifp, ifp);
|
||||||
|
pThis->u.s.node = node;
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ bcopy(if_getlladdr(ifp), &pThis->u.s.MacAddr, ETHER_ADDR_LEN);
|
||||||
|
+#else
|
||||||
|
bcopy(IF_LLADDR(ifp), &pThis->u.s.MacAddr, ETHER_ADDR_LEN);
|
||||||
|
+#endif
|
||||||
|
ASMAtomicUoWriteBool(&pThis->fDisconnectedFromHost, false);
|
||||||
|
|
||||||
|
/* Initialize deferred input queue */
|
||||||
|
@@ -630,16 +760,26 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
|
||||||
vboxNetFltRelease(pThis, true /*fBusy*/);
|
vboxNetFltRelease(pThis, true /*fBusy*/);
|
||||||
}
|
}
|
||||||
VBOXCURVNET_RESTORE();
|
VBOXCURVNET_RESTORE();
|
||||||
@ -241,10 +335,22 @@
|
|||||||
bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis)
|
bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis)
|
||||||
{
|
{
|
||||||
+ IPRT_FREEBSD_SAVE_EFL_AC();
|
+ IPRT_FREEBSD_SAVE_EFL_AC();
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp, ifp0;
|
||||||
|
+#else
|
||||||
struct ifnet *ifp, *ifp0;
|
struct ifnet *ifp, *ifp0;
|
||||||
|
+#endif
|
||||||
|
|
||||||
ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *);
|
ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *);
|
||||||
@@ -652,6 +741,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
|
+#endif
|
||||||
|
/*
|
||||||
|
* Attempt to check if the interface is still there and re-initialize if
|
||||||
|
* something has changed.
|
||||||
|
@@ -652,6 +792,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi
|
||||||
pThis->u.s.node = NULL;
|
pThis->u.s.node = NULL;
|
||||||
}
|
}
|
||||||
VBOXCURVNET_RESTORE();
|
VBOXCURVNET_RESTORE();
|
||||||
@ -252,7 +358,7 @@
|
|||||||
|
|
||||||
if (ifp0 != NULL)
|
if (ifp0 != NULL)
|
||||||
{
|
{
|
||||||
@@ -664,6 +754,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
|
@@ -664,6 +805,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
|
||||||
|
|
||||||
void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
|
void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
|
||||||
{
|
{
|
||||||
@ -260,7 +366,7 @@
|
|||||||
|
|
||||||
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskin);
|
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskin);
|
||||||
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskout);
|
taskqueue_drain(taskqueue_fast, &pThis->u.s.tskout);
|
||||||
@@ -676,6 +767,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
|
@@ -676,6 +818,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
|
||||||
ng_rmnode_self(pThis->u.s.node);
|
ng_rmnode_self(pThis->u.s.node);
|
||||||
VBOXCURVNET_RESTORE();
|
VBOXCURVNET_RESTORE();
|
||||||
pThis->u.s.node = NULL;
|
pThis->u.s.node = NULL;
|
||||||
@ -268,15 +374,51 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis)
|
int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis)
|
||||||
@@ -689,6 +781,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
@@ -689,7 +832,12 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
|
|
||||||
void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
|
void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
|
||||||
{
|
{
|
||||||
+ IPRT_FREEBSD_SAVE_EFL_AC();
|
+ IPRT_FREEBSD_SAVE_EFL_AC();
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_t ifp;
|
||||||
|
+#else
|
||||||
struct ifnet *ifp;
|
struct ifnet *ifp;
|
||||||
|
+#endif
|
||||||
struct ifreq ifreq;
|
struct ifreq ifreq;
|
||||||
int error;
|
int error;
|
||||||
@@ -722,7 +815,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
node_p node;
|
||||||
|
@@ -701,18 +849,30 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
|
Log(("%s: fActive:%d\n", __func__, fActive));
|
||||||
|
|
||||||
|
ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *);
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ VBOXCURVNET_SET(if_getvnet(ifp));
|
||||||
|
+#else
|
||||||
|
VBOXCURVNET_SET(ifp->if_vnet);
|
||||||
|
+#endif
|
||||||
|
node = ASMAtomicUoReadPtrT(&pThis->u.s.node, node_p);
|
||||||
|
|
||||||
|
memset(&ifreq, 0, sizeof(struct ifreq));
|
||||||
|
/* Activate interface */
|
||||||
|
if (fActive)
|
||||||
|
{
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ pThis->u.s.flags = if_getflags(ifp);
|
||||||
|
+#else
|
||||||
|
pThis->u.s.flags = ifp->if_flags;
|
||||||
|
+#endif
|
||||||
|
ifpromisc(ifp, 1);
|
||||||
|
|
||||||
|
/* ng_ether nodes are named after the interface name */
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ snprintf(path, sizeof(path), "%s:", if_name(ifp));
|
||||||
|
+#else
|
||||||
|
snprintf(path, sizeof(path), "%s:", ifp->if_xname);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send a netgraph connect message to the ng_ether node
|
||||||
|
@@ -722,9 +882,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT,
|
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT,
|
||||||
sizeof(struct ngm_connect), M_NOWAIT);
|
sizeof(struct ngm_connect), M_NOWAIT);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
@ -285,9 +427,15 @@
|
|||||||
return;
|
return;
|
||||||
+ }
|
+ }
|
||||||
con = (struct ngm_connect *)msg->data;
|
con = (struct ngm_connect *)msg->data;
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", if_name(ifp));
|
||||||
|
+#else
|
||||||
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", ifp->if_xname);
|
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", ifp->if_xname);
|
||||||
|
+#endif
|
||||||
strlcpy(con->ourhook, "lower", NG_HOOKSIZ);
|
strlcpy(con->ourhook, "lower", NG_HOOKSIZ);
|
||||||
@@ -736,7 +832,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
strlcpy(con->peerhook, "input", NG_HOOKSIZ);
|
||||||
|
NG_SEND_MSG_PATH(error, node, msg, path, 0);
|
||||||
|
@@ -736,10 +903,17 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT,
|
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT,
|
||||||
sizeof(struct ngm_connect), M_NOWAIT);
|
sizeof(struct ngm_connect), M_NOWAIT);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
@ -297,8 +445,27 @@
|
|||||||
+ }
|
+ }
|
||||||
con = (struct ngm_connect *)msg->data;
|
con = (struct ngm_connect *)msg->data;
|
||||||
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:",
|
snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:",
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ if_name(ifp));
|
||||||
|
+#else
|
||||||
ifp->if_xname);
|
ifp->if_xname);
|
||||||
@@ -759,7 +858,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
+#endif
|
||||||
|
strlcpy(con->ourhook, "upper", sizeof(con->ourhook));
|
||||||
|
strlcpy(con->peerhook, "output", sizeof(con->peerhook));
|
||||||
|
NG_SEND_MSG_PATH(error, node, msg, path, 0);
|
||||||
|
@@ -751,7 +925,11 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
|
ifpromisc(ifp, 0);
|
||||||
|
|
||||||
|
/* Disconnect msgs are addressed to ourself */
|
||||||
|
+#if __FreeBSD_version >= 1500000
|
||||||
|
+ snprintf(path, sizeof(path), "vboxnetflt_%s:", if_name(ifp));
|
||||||
|
+#else
|
||||||
|
snprintf(path, sizeof(path), "vboxnetflt_%s:", ifp->if_xname);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send a netgraph message to disconnect our 'input' hook
|
||||||
|
@@ -759,7 +937,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK,
|
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK,
|
||||||
sizeof(struct ngm_rmhook), M_NOWAIT);
|
sizeof(struct ngm_rmhook), M_NOWAIT);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
@ -309,7 +476,7 @@
|
|||||||
rm = (struct ngm_rmhook *)msg->data;
|
rm = (struct ngm_rmhook *)msg->data;
|
||||||
strlcpy(rm->ourhook, "input", NG_HOOKSIZ);
|
strlcpy(rm->ourhook, "input", NG_HOOKSIZ);
|
||||||
NG_SEND_MSG_PATH(error, node, msg, path, 0);
|
NG_SEND_MSG_PATH(error, node, msg, path, 0);
|
||||||
@@ -770,12 +872,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
@@ -770,12 +951,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b
|
||||||
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK,
|
NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK,
|
||||||
sizeof(struct ngm_rmhook), M_NOWAIT);
|
sizeof(struct ngm_rmhook), M_NOWAIT);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user