git: 352837935554 - main - emulators/virtualbox-ose-kmod-legacy: Fix build error since 1500027 (struct ifnet is now hidden)

From: Vladimir Druzenko <vvd_at_FreeBSD.org>
Date: Wed, 25 Dec 2024 09:51:05 UTC
The branch main has been updated by vvd:

URL: https://cgit.FreeBSD.org/ports/commit/?id=3528379355540d3fa2c7c1aee40963742016303a

commit 3528379355540d3fa2c7c1aee40963742016303a
Author:     Vladimir Druzenko <vvd@FreeBSD.org>
AuthorDate: 2024-12-25 09:48:45 +0000
Commit:     Vladimir Druzenko <vvd@FreeBSD.org>
CommitDate: 2024-12-25 09:48:45 +0000

    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
---
 ...Drivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c | 137 ++++++++++++-
 ...Drivers_VBoxNetFlt_freebsd_VBoxNetFlt-freebsd.c | 215 ++++++++++++++++++---
 2 files changed, 326 insertions(+), 26 deletions(-)

diff --git a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c
index 75a18c10f559..c38db5bc24c5 100644
--- a/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c
+++ b/emulators/virtualbox-ose-legacy/files/patch-src-VBox-HostDrivers-VBoxNetAdp-freebsd-VBoxNetAdp-freebsd.c
@@ -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
-@@ -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;
      while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
++#endif
      {
 +#if __FreeBSD_version >= 1100036
 +        if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
 +#else
          ifp->if_opackets++;
 +#endif
++#if __FreeBSD_version >= 1500000
++        m = if_dequeue(ifp);
++#else
          IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
++#endif
          BPF_MTAP(ifp, 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();
diff --git a/emulators/virtualbox-ose-legacy/files/patch-src_VBox_HostDrivers_VBoxNetFlt_freebsd_VBoxNetFlt-freebsd.c b/emulators/virtualbox-ose-legacy/files/patch-src_VBox_HostDrivers_VBoxNetFlt_freebsd_VBoxNetFlt-freebsd.c
index d9d1bfaef91b..5accbdf87224 100644
--- a/emulators/virtualbox-ose-legacy/files/patch-src_VBox_HostDrivers_VBoxNetFlt_freebsd_VBoxNetFlt-freebsd.c
+++ b/emulators/virtualbox-ose-legacy/files/patch-src_VBox_HostDrivers_VBoxNetFlt_freebsd_VBoxNetFlt-freebsd.c
@@ -33,7 +33,28 @@
              break;
  
          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)
          {
@@ -48,7 +69,7 @@
              if (fActive)
                  vboxNetFltRelease(pThis, true /*fBusy*/);
              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);
          _IF_ENQUEUE(&pThis->u.s.inq, m);
          mtx_unlock_spin(&pThis->u.s.inq.ifq_mtx);
@@ -60,7 +81,7 @@
      }
      /*
       * 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);
          _IF_ENQUEUE(&pThis->u.s.outq, m);
          mtx_unlock_spin(&pThis->u.s.outq.ifq_mtx);
@@ -72,16 +93,30 @@
      }
      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;
++#endif
      unsigned int cSegs = 0;
      bool fDropIt = false, fActive;
 +    bool is_vl_tagged = false;
 +    uint16_t vl_tag;
      PINTNETSG pSG;
  
++#if __FreeBSD_version >= 1500000
++    VBOXCURVNET_SET(if_getvnet(ifp));
++#else
      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)
              break;
  
@@ -101,7 +136,7 @@
          for (m0 = m; m0 != NULL; m0 = m0->m_next)
              if (m0->m_len > 0)
                  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);
          fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE);
          RTMemTmpFree(pSG);
@@ -128,8 +163,8 @@
 +
          if (fDropIt)
              m_freem(m);
-         else
-+        {
+-        else
++        else {
 +#if __FreeBSD_version >= 1300049
 +            struct epoch_tracker et;
 +            NET_EPOCH_ENTER(et);
@@ -142,7 +177,28 @@
      }
      vboxNetFltRelease(pThis, true /* fBusy */);
      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)
  {
@@ -150,7 +206,24 @@
      NOREF(pvIfData);
  
      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);
          if (m == NULL)
@@ -167,7 +240,7 @@
  
          m->m_flags |= M_PKTHDR;
          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);
          if (m == NULL)
@@ -184,7 +257,7 @@
          /*
           * Delivering packets to the host will be captured by the
           * 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)
          {
              m_freem(m);
@@ -192,7 +265,7 @@
              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->m_flags |= M_PKTHDR;
          m->m_pkthdr.rcvif = ifp;
@@ -200,7 +273,11 @@
 +        struct epoch_tracker et;
 +        NET_EPOCH_ENTER(et);
 +#endif
++#if __FreeBSD_version >= 1500000
++        if_input(ifp, m);
++#else
          ifp->if_input(ifp, m);
++#endif
 +#if __FreeBSD_version >= 1300049
 +        NET_EPOCH_EXIT(et);
 +#endif
@@ -210,15 +287,20 @@
      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)
  {
 +    IPRT_FREEBSD_SAVE_EFL_AC();
      char nam[NG_NODESIZ];
++#if __FreeBSD_version >= 1500000
++    if_t ifp;
++#else
      struct ifnet *ifp;
++#endif
      node_p node;
-@@ -586,7 +670,10 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi
+ 
+     VBOXCURVNET_SET_FROM_UCRED();
      NOREF(pvContext);
      ifp = ifunit(pThis->szName);
      if (ifp == NULL)
@@ -229,7 +311,19 @@
  
      /* Create a new netgraph node for this instance */
      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*/);
      }
      VBOXCURVNET_RESTORE();
@@ -241,10 +335,22 @@
  bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis)
  {
 +    IPRT_FREEBSD_SAVE_EFL_AC();
++#if __FreeBSD_version >= 1500000
++    if_t ifp, ifp0;
++#else
      struct ifnet *ifp, *ifp0;
++#endif
  
      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;
      }
      VBOXCURVNET_RESTORE();
@@ -252,7 +358,7 @@
  
      if (ifp0 != NULL)
      {
-@@ -664,6 +754,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
+@@ -664,6 +805,7 @@ 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.tskout);
-@@ -676,6 +767,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
+@@ -676,6 +818,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
          ng_rmnode_self(pThis->u.s.node);
      VBOXCURVNET_RESTORE();
      pThis->u.s.node = NULL;
@@ -268,15 +374,51 @@
  }
  
  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)
  {
 +    IPRT_FREEBSD_SAVE_EFL_AC();
++#if __FreeBSD_version >= 1500000
++    if_t ifp;
++#else
      struct ifnet *ifp;
++#endif
      struct ifreq ifreq;
      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,
              sizeof(struct ngm_connect), M_NOWAIT);
          if (msg == NULL)
@@ -285,9 +427,15 @@
              return;
 +        }
          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);
++#endif
          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,
              sizeof(struct ngm_connect), M_NOWAIT);
          if (msg == NULL)
@@ -297,8 +445,27 @@
 +        }
          con = (struct ngm_connect *)msg->data;
          snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:",
++#if __FreeBSD_version >= 1500000
++            if_name(ifp));
++#else
              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,
              sizeof(struct ngm_rmhook), M_NOWAIT);
          if (msg == NULL)
@@ -309,7 +476,7 @@
          rm = (struct ngm_rmhook *)msg->data;
          strlcpy(rm->ourhook, "input", NG_HOOKSIZ);
          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,
              sizeof(struct ngm_rmhook), M_NOWAIT);
          if (msg == NULL)