[haiku-commits] haiku: hrev56168 - in src: libs/compat/openbsd_wlan/net80211 add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/pci add-ons/kernel/drivers/network/wlan/iaxwifi200/dev/pci libs/compat

  • From: waddlesplash <waddlesplash@xxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 9 Jun 2022 05:45:04 +0000 (UTC)

hrev56168 adds 12 changesets to branch 'master'
old head: 6a9406a1724e6c56c035b5d56456311b9c51eef9
new head: 5a4ad3a00df5c62d521e9b97262ead5f93d91682
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=5a4ad3a00df5+%5E6a9406a1724e

----------------------------------------------------------------------------

8548a4adc63a: freebsd_network: Adaptations in preparation for the OpenBSD layer.
  
  Most of these changes however add things that FreeBSD has (with a few
  exceptions noted in comments) which the OpenBSD shim layer merely needs
  to make use of.
  
  (FreeBSD used to have support for IFF_NEEDSGIANT but removed it. The
  support instated here is very similar to what FreeBSD used to have.)

668a169a62fd: OpenBSD-to-FreeBSD/Haiku compatibility headers.
  
  OpenBSD's and FreeBSD's kernel APIs are very similar, but there are
  still some differences. Fortunately these are small enough that we
  can take care of most of them with a header-only shim layer.
  
  (The files and functions implemented by this commit were implemented
  and tested against the modules and drivers imported and adapted in
  the following commits. Some of this took quite a bit of time to get
  right, especially where the APIs have diverged in very subtle ways.)

04171cfc5c10: openbsd_wlan: Import OpenBSD net80211 layer and base dependencies.
  
  Not yet wired into the build, of course.

d87dd30a38b6: idualwifi7260: Delete FreeBSD driver, import OpenBSD driver.
  
  Again not wired into the build, nor yet modified in any way.

27a20680c566: iaxwifi200: Import ("iwx" from OpenBSD.)
  
  Not yet modified to build nor wired into the build yet.

eb5614660373: openbsd_wlan: Basic adaptations to the net80211 layer.
  
  The stack now compiles and links. Combining this with adaptations to
  the driver gets things to the point where it runs scans, but we do
  not yet implement ioctls so they can be returned to userland.

fba0315889f9: idualwifi7260 & iaxwifi200: Adaptations for FreeBSD/Haiku support.
  
  Mostly a few #ifdefs for the dmamem API, if_alloc, probe, and attach hooks.
  Basically the same changes in both drivers.
  
  The firmware name map is not really needed anymore; the OpenBSD drivers
  have unique firmware names and do not generally use ".ucode" extensions.
  So just use the filenames as-is and drop the map.

bcb089f6c3e9: openbsd_wlan (and FreeBSD ieee80211_ioctl.h): Initial ioctl 
compatibility.
  
   * Introduce IEEE80211_IOCTLS_ABBREVIATED to FreeBSD's ieee80211_ioctl.h,
     so that the FreeBSD header can be included along with the OpenBSD
     net80211 stack without triggering lots of errors, so we can use
     these structs in openbsd_wlan ieee80211_haiku.cpp.
  
   * Implement basic ieee80211req handling machinery. We aren't going
     to handle anything but SIOCG80211 and SIOCS80211 in this method,
     so we can simplify it a bit at the same time.
  
   * Implement IEEE80211_IOC_SCAN_RESULTS to return scan results from
     the OpenBSD WiFi stack in FreeBSD ioctl format.
  
     This change adds two minor "features" (noted with #ifdefs) to the
     OpenBSD net80211 stack: one to specify what node index to return
     when returning known nodes (scan results), as this way we do not
     have to allocate a huge buffer to store the scan results in before
     sending them back to userland, but can instead get and convert
     a single one at a time.
  
     (We store the converted values in kernel mode all at once, though,
      so this is not as efficient as it could be. More improvement possible.)
  
   * Implement IEEE80211_IOC_BSSID and IEEE80211_IOC_SSID while we are at it.
     This actually may make joining open networks possible, but I didn't
     really test it. (They are used with SIOCG80211 to see what network
     the device is currently connecting/connected to.)

7cb5a6d24f9c: NetworkDevice.h: Make it possible to include from _KERNEL_MODE 
and/or non-C++.
  
  This file contains a set of constants and flags which are already passed
  between applications, net_server, and wpa_supplicant to indicate network
  security, connection modes, and a variety of other things.
  
  As the OpenBSD net80211 stack does not need wpa_supplicant for WPA2/PSK,
  it only makes sense that we would pass the same information we pass
  to wpa_supplicant into the stack instead. Rather than expose yet another
  set of constants and flags to userland besides the FreeBSD and these
  Haiku native ones, just make it so this file can be included in the kernel,
  and the constants thus used directly.

2f7936a6832d: openbsd_wlan: Add a Haiku-specific "FreeBSD-style" ioctl for 
joining networks.
  
  In the long run it may make more sense to have Haiku-style ioctls for
  this purpose, but since we are currently coexisting with FreeBSD-style
  ioctls, just add this as another FreeBSD-style ioctl for now (we already
  have two custom ones anyway.)
  
  This ioctl pretty much just consists of the same parameters we pass
  to wpa_supplicant using the Haiku-specific constants already, with one
  notable difference: the PSK must be in proper WPA format, i.e. already
  hashed. Hence we will submit this ioctl, for now, from our own code in
  our wpa_supplicant port.
  
  WPS is not implemented in this commit, but it could be if someone actually
  needs to connect to WPS networks for some reason...
  
  Tested and verified as working along with the wpa_supplicant changes.

ea7c83079088: openbsd_wlan: Implement IEEE80211_IOC_MLME for leaving networks.

5a4ad3a00df5: openbsd_wlan: Print state changes if bootverbose is enabled.
  
  This will make debugging in nightly syslogs a bit easier when things
  do not work as expected.

                              [ Augustin Cavalier <waddlesplash@xxxxxxxxx> ]

----------------------------------------------------------------------------

156 files changed, 66293 insertions(+), 18098 deletions(-)
headers/os/net/NetworkDevice.h                   |    68 +-
src/add-ons/kernel/drivers/network/wlan/Jamfile  |     5 +-
.../drivers/network/wlan/iaxwifi200/Jamfile      |    22 +
.../network/wlan/iaxwifi200/dev/pci/if_iwx.c     | 11211 +++++++++++++++
.../network/wlan/iaxwifi200/dev/pci/if_iwxreg.h  |  7439 ++++++++++
.../network/wlan/iaxwifi200/dev/pci/if_iwxvar.h  |   831 ++
.../drivers/network/wlan/iaxwifi200/glue.c       |    22 +
.../drivers/network/wlan/idualwifi7260/Jamfile   |    34 +-
.../network/wlan/idualwifi7260/dev/iwm/if_iwm.c  |  6694 ---------
.../wlan/idualwifi7260/dev/iwm/if_iwm_7000.c     |   138 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_8000.c     |   103 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_9000.c     |    97 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_9260.c     |    96 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_binding.c  |   254 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_binding.h  |   111 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_config.h   |   159 -
.../idualwifi7260/dev/iwm/if_iwm_constants.h     |   154 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_debug.h    |    62 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_fw.c       |   342 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_fw.h       |   113 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_led.c      |   188 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_led.h      |    99 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.c |   561 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_mac_ctxt.h |   115 -
.../idualwifi7260/dev/iwm/if_iwm_notif_wait.c    |   221 -
.../idualwifi7260/dev/iwm/if_iwm_notif_wait.h    |   138 -
.../idualwifi7260/dev/iwm/if_iwm_pcie_trans.c    |   733 -
.../idualwifi7260/dev/iwm/if_iwm_pcie_trans.h    |   139 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.c |   320 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_phy_ctxt.h |   117 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.c   |   612 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_phy_db.h   |   117 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_power.c    |   489 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_power.h    |   100 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_scan.c     |   919 --
.../wlan/idualwifi7260/dev/iwm/if_iwm_scan.h     |   118 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_sf.c       |   330 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_sf.h       |    82 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_sta.c      |   381 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_sta.h      |   223 -
.../idualwifi7260/dev/iwm/if_iwm_time_event.c    |   429 -
.../idualwifi7260/dev/iwm/if_iwm_time_event.h    |   117 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_util.c     |   532 -
.../wlan/idualwifi7260/dev/iwm/if_iwm_util.h     |   163 -
.../wlan/idualwifi7260/dev/iwm/if_iwmvar.h       |   585 -
.../network/wlan/idualwifi7260/dev/iwm/opt_iwm.h |     0
.../wlan/idualwifi7260/dev/iwm/opt_wlan.h        |     2 -
.../network/wlan/idualwifi7260/dev/pci/if_iwm.c  | 12316 +++++++++++++++++
.../idualwifi7260/dev/{iwm => pci}/if_iwmreg.h   |  3901 +++---
.../wlan/idualwifi7260/dev/pci/if_iwmvar.h       |   697 +
.../drivers/network/wlan/idualwifi7260/glue.c    |    54 +-
src/libs/compat/Jamfile                          |     1 +
src/libs/compat/freebsd_network/Jamfile          |     1 +
src/libs/compat/freebsd_network/bus.cpp          |    25 +-
src/libs/compat/freebsd_network/clock.c          |    10 +
src/libs/compat/freebsd_network/compat/net/if.h  |     1 +
.../compat/freebsd_network/compat/net/if_var.h   |     5 +-
.../compat/freebsd_network/compat/sys/_task.h    |     7 +-
.../compat/freebsd_network/compat/sys/buf_ring.h |     2 +-
.../freebsd_network/compat/sys/haiku-module.h    |     3 +
.../compat/freebsd_network/compat/sys/libkern.h  |     3 +
.../compat/freebsd_network/compat/sys/malloc.h   |     2 +-
.../freebsd_network/compat/sys/mbuf-fbsd.h       |    10 +
.../compat/freebsd_network/compat/sys/mbuf.h     |     6 +
.../compat/freebsd_network/compat/sys/rman.h     |    33 +-
.../compat/freebsd_network/compat/sys/syslog.h   |     4 +-
.../compat/freebsd_network/compat/sys/systm.h    |     7 +-
.../compat/freebsd_network/compat/sys/time.h     |    53 +-
src/libs/compat/freebsd_network/device_hooks.c   |    35 +-
src/libs/compat/freebsd_network/fbsd_time.c      |    81 +-
.../compat/freebsd_network/fbsd_timingsafe.c     |    28 +
src/libs/compat/freebsd_network/if.c             |    45 +-
src/libs/compat/freebsd_network/libkern.cpp      |    10 +-
src/libs/compat/freebsd_network/taskqueue.c      |     7 +
.../freebsd_wlan/net80211/ieee80211_ioctl.h      |    30 +
.../openbsd_network/compat/dev/pci/pcireg.h      |   752 +
.../openbsd_network/compat/dev/pci/pcivar.h      |   115 +
.../compat/openbsd_network/compat/machine/bus.h  |   108 +
src/libs/compat/openbsd_network/compat/net/if.h  |    15 +
.../compat/openbsd_network/compat/net/if_var.h   |    55 +
.../openbsd_network/compat/netinet/if_ether.h    |    25 +
.../compat/netinet/if_ethersubr.h                |    79 +
.../compat/openbsd_network/compat/sys/_null.h    |     1 +
.../compat/openbsd_network/compat/sys/device.h   |    29 +
.../compat/openbsd_network/compat/sys/endian.h   |    25 +
.../compat/openbsd_network/compat/sys/malloc.h   |    19 +
.../openbsd_network/compat/sys/mbuf-obsd.h       |   356 +
.../compat/openbsd_network/compat/sys/mbuf.h     |    58 +
.../compat/openbsd_network/compat/sys/mutex.h    |    40 +
.../compat/openbsd_network/compat/sys/param.h    |    19 +
.../compat/openbsd_network/compat/sys/refcnt.h   |    64 +
.../compat/openbsd_network/compat/sys/rwlock.h   |    76 +
.../compat/openbsd_network/compat/sys/stdint.h   |     1 +
.../compat/openbsd_network/compat/sys/systm.h    |    97 +
.../compat/openbsd_network/compat/sys/task.h     |    66 +
.../compat/openbsd_network/compat/sys/time.h     |    45 +
.../compat/openbsd_network/compat/sys/timeout.h  |    60 +
.../compat/openbsd_network/compat/sys/types.h    |     2 +
.../compat/openbsd_network/compat/sys/ucred.h    |    15 +
[ *** stats truncated: 57 lines dropped *** ]

############################################################################

Commit:      8548a4adc63a7310afc1deb2eb9e037da7d655fb
URL:         https://git.haiku-os.org/haiku/commit/?id=8548a4adc63a
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu May 12 21:50:18 2022 UTC

freebsd_network: Adaptations in preparation for the OpenBSD layer.

Most of these changes however add things that FreeBSD has (with a few
exceptions noted in comments) which the OpenBSD shim layer merely needs
to make use of.

(FreeBSD used to have support for IFF_NEEDSGIANT but removed it. The
support instated here is very similar to what FreeBSD used to have.)

----------------------------------------------------------------------------

diff --git a/src/libs/compat/freebsd_network/Jamfile 
b/src/libs/compat/freebsd_network/Jamfile
index 3686985433..af4b17df51 100644
--- a/src/libs/compat/freebsd_network/Jamfile
+++ b/src/libs/compat/freebsd_network/Jamfile
@@ -25,6 +25,7 @@ KernelStaticLibrary libfreebsd_network.a :
        fbsd_subr_bufring.c
        fbsd_subr_sbuf.c
        fbsd_time.c
+       fbsd_timingsafe.c
        fbsd_usb_error.c
        fbsd_usb_util.c
        fbsd_usb_lookup.c
diff --git a/src/libs/compat/freebsd_network/bus.cpp 
b/src/libs/compat/freebsd_network/bus.cpp
index e6553eb468..08dfa926ec 100644
--- a/src/libs/compat/freebsd_network/bus.cpp
+++ b/src/libs/compat/freebsd_network/bus.cpp
@@ -297,6 +297,23 @@ rman_get_virtual(struct resource *res)
 }
 
 
+bus_addr_t
+rman_get_start(struct resource *res)
+{
+       return res->r_bushandle;
+}
+
+
+bus_size_t
+rman_get_size(struct resource *res)
+{
+       area_info info;
+       if (get_area_info(res->r_mapped_area, &info) != B_OK)
+               return 0;
+       return info.size;
+}
+
+
 //     #pragma mark - Interrupt handling
 
 
@@ -329,7 +346,13 @@ intr_handler(void *data)
                //device_printf(intr->dev, "in soft interrupt handler.\n");
 
                atomic_or(&intr->handling, 1);
+               if ((intr->flags & INTR_MPSAFE) == 0)
+                       mtx_lock(&Giant);
+
                intr->handler(intr->arg);
+
+               if ((intr->flags & INTR_MPSAFE) == 0)
+                       mtx_unlock(&Giant);
                atomic_and(&intr->handling, 0);
                HAIKU_REENABLE_INTERRUPTS(intr->dev);
        }
@@ -355,8 +378,6 @@ int
 bus_setup_intr(device_t dev, struct resource *res, int flags,
        driver_filter_t* filter, driver_intr_t handler, void *arg, void 
**_cookie)
 {
-       /* TODO check MPSAFE etc */
-
        struct internal_intr *intr = (struct internal_intr *)malloc(
                sizeof(struct internal_intr));
        char semName[64];
diff --git a/src/libs/compat/freebsd_network/clock.c 
b/src/libs/compat/freebsd_network/clock.c
index 29ae4107da..0ad0301692 100644
--- a/src/libs/compat/freebsd_network/clock.c
+++ b/src/libs/compat/freebsd_network/clock.c
@@ -5,6 +5,7 @@
 
 #include <OS.h>
 #include <compat/sys/kernel.h>
+#include <compat/sys/time.h>
 
 
 int32_t
@@ -12,3 +13,12 @@ _get_ticks()
 {
        return USEC_2_TICKS(system_time());
 }
+
+
+void
+getmicrouptime(struct timeval *tvp)
+{
+       bigtime_t usecs = system_time();
+       tvp->tv_sec = usecs / 1000000;
+       tvp->tv_usec = usecs % 1000000;
+}
diff --git a/src/libs/compat/freebsd_network/compat/net/if.h 
b/src/libs/compat/freebsd_network/compat/net/if.h
index a495512ec8..7f5aba8508 100644
--- a/src/libs/compat/freebsd_network/compat/net/if.h
+++ b/src/libs/compat/freebsd_network/compat/net/if.h
@@ -70,6 +70,7 @@
 #define        IFF_MONITOR                     0x00400000              /* (n) 
user-requested monitor mode */
 #define        IFF_PPROMISC            0x00800000              /* (n) 
user-requested promisc mode */
 #define        IFF_NOGROUP                     0x01000000              /* (n) 
interface is not part of any groups */
+#define        IFF_NEEDSGIANT          0x02000000              /* (i) hold 
Giant over hook calls (OpenBSD compatibility) */
 
 #define LINK_STATE_UNKNOWN     0
 #define LINK_STATE_DOWN                1
diff --git a/src/libs/compat/freebsd_network/compat/net/if_var.h 
b/src/libs/compat/freebsd_network/compat/net/if_var.h
index fe1a0dcffa..5d880e7f6e 100644
--- a/src/libs/compat/freebsd_network/compat/net/if_var.h
+++ b/src/libs/compat/freebsd_network/compat/net/if_var.h
@@ -258,7 +258,6 @@ struct ifnet {
        void    *if_afdata[AF_MAX];
        int     if_afdata_initialized;
        struct  mtx if_afdata_mtx;
-       struct  task if_starttask;      /* task for IFF_NEEDSGIANT */
        struct  task if_linktask;       /* task for link change events */
        struct  mtx if_addr_mtx;        /* mutex to protect address lists */
 
@@ -752,6 +751,10 @@ int        ifioctl(struct socket *, u_long, caddr_t, 
struct thread *);
 int    ifpromisc(struct ifnet *, int);
 struct ifnet *ifunit(const char *);
 
+/* Haiku extension for OpenBSD compat */
+int if_alloc_inplace(struct ifnet *ifp, u_char type);
+void if_free_inplace(struct ifnet *ifp);
+
 struct ifaddr *ifa_ifwithaddr(struct sockaddr *);
 struct ifaddr *ifa_ifwithbroadaddr(struct sockaddr *);
 struct ifaddr *ifa_ifwithdstaddr(struct sockaddr *);
diff --git a/src/libs/compat/freebsd_network/compat/sys/_task.h 
b/src/libs/compat/freebsd_network/compat/sys/_task.h
index 6ce6c552ff..d50ee8a88f 100644
--- a/src/libs/compat/freebsd_network/compat/sys/_task.h
+++ b/src/libs/compat/freebsd_network/compat/sys/_task.h
@@ -13,12 +13,17 @@
 typedef void (*task_fn_t)(void *context, int pending);
 
 struct task {
+       int ta_pending;
        int ta_priority;
+       int ta_flags;
        task_fn_t ta_handler;
        void *ta_argument;
-       int ta_pending;
 
        struct list_link ta_link;
 };
 
+
+#define TASK_NEEDSGIANT (1 << 0) /* Haiku extension, OpenBSD compatibility */
+
+
 #endif
diff --git a/src/libs/compat/freebsd_network/compat/sys/buf_ring.h 
b/src/libs/compat/freebsd_network/compat/sys/buf_ring.h
index b6c573fe67..bd58b96074 100644
--- a/src/libs/compat/freebsd_network/compat/sys/buf_ring.h
+++ b/src/libs/compat/freebsd_network/compat/sys/buf_ring.h
@@ -269,7 +269,7 @@ buf_ring_advance_sc(struct buf_ring *br)
 static __inline void
 buf_ring_putback_sc(struct buf_ring *br, void *_new)
 {
-       KASSERT(br->br_cons_head != br->br_prod_tail,
+       KASSERT_FREEBSD(br->br_cons_head != br->br_prod_tail,
                ("Buf-Ring has none in putback")) ;
        br->br_ring[br->br_cons_head] = _new;
 }
diff --git a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h 
b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h
index 14f5a6bbeb..7f6164ebca 100644
--- a/src/libs/compat/freebsd_network/compat/sys/haiku-module.h
+++ b/src/libs/compat/freebsd_network/compat/sys/haiku-module.h
@@ -207,8 +207,11 @@ enum {
        FBSD_SWI_TASKQUEUE              = 1 << 2,
        FBSD_THREAD_TASKQUEUE   = 1 << 3,
        FBSD_WLAN_FEATURE               = 1 << 4,
+
        FBSD_WLAN                               = FBSD_WLAN_FEATURE | 
FBSD_TASKQUEUES
                                                                | 
FBSD_THREAD_TASKQUEUE,
+       OBSD_WLAN                               = FBSD_WLAN_FEATURE | 
FBSD_TASKQUEUES
+                                                               | 
FBSD_FAST_TASKQUEUE,
 };
 
 #define HAIKU_DRIVER_REQUIREMENTS(flags) \
diff --git a/src/libs/compat/freebsd_network/compat/sys/libkern.h 
b/src/libs/compat/freebsd_network/compat/sys/libkern.h
index 52aac7a2e3..9517aec378 100644
--- a/src/libs/compat/freebsd_network/compat/sys/libkern.h
+++ b/src/libs/compat/freebsd_network/compat/sys/libkern.h
@@ -16,6 +16,9 @@ extern int random(void);
 u_int read_random(void *, u_int);
 void arc4rand(void *ptr, u_int len, int reseed);
 uint32_t arc4random(void);
+void arc4random_buf(void *ptr, size_t len);
+
+int     timingsafe_bcmp(const void *, const void *, size_t);
 
 static __inline int imax(int a, int b) { return (a > b ? a : b); }
 static __inline int imin(int a, int b) { return (a < b ? a : b); }
diff --git a/src/libs/compat/freebsd_network/compat/sys/malloc.h 
b/src/libs/compat/freebsd_network/compat/sys/malloc.h
index 7d211a758a..c98bc25aa6 100644
--- a/src/libs/compat/freebsd_network/compat/sys/malloc.h
+++ b/src/libs/compat/freebsd_network/compat/sys/malloc.h
@@ -43,7 +43,7 @@ void _kernel_contigfree(void *addr, unsigned long size);
 #define kernel_malloc(size, base, flags) \
        _kernel_malloc(size, flags)
 
-#define kernel_free(ptr, base) \
+#define kernel_free(ptr, tag) \
        _kernel_free(ptr)
 
 #define kernel_contigmalloc(size, type, flags, low, high, alignment, boundary) 
\
diff --git a/src/libs/compat/freebsd_network/compat/sys/mbuf-fbsd.h 
b/src/libs/compat/freebsd_network/compat/sys/mbuf-fbsd.h
index c970bd3ed1..327bf45412 100644
--- a/src/libs/compat/freebsd_network/compat/sys/mbuf-fbsd.h
+++ b/src/libs/compat/freebsd_network/compat/sys/mbuf-fbsd.h
@@ -212,6 +212,16 @@ m_cljset(struct mbuf *m, void *cl, int type)
        m->m_flags |= M_EXT;
 }
 
+/* These are for OpenBSD compatibility. */
+#define        MTAG_ABI_COMPAT         0               /* compatibility ABI */
+
+static __inline struct m_tag *
+m_tag_find(struct mbuf *m, uint16_t type, struct m_tag *start)
+{
+       return (SLIST_EMPTY(&m->m_pkthdr.tags) ? (struct m_tag *)NULL :
+               m_tag_locate(m, MTAG_ABI_COMPAT, type, start));
+}
+
 /* mbufq */
 
 struct mbufq {
diff --git a/src/libs/compat/freebsd_network/compat/sys/mbuf.h 
b/src/libs/compat/freebsd_network/compat/sys/mbuf.h
index 3397297228..0f8aa922d8 100644
--- a/src/libs/compat/freebsd_network/compat/sys/mbuf.h
+++ b/src/libs/compat/freebsd_network/compat/sys/mbuf.h
@@ -215,6 +215,12 @@ struct pkthdr {
        uint8_t         rsstype;                /* hash type */
        uint16_t        tso_segsz;
        uint16_t        ether_vtag;
+
+       /* Layer specific non-persistent local storage for reassembly, etc. */
+       union {
+               uintptr_t       unintptr[1];
+               void*           ptr;
+       } PH_loc;
 };
 
 struct m_tag {
diff --git a/src/libs/compat/freebsd_network/compat/sys/rman.h 
b/src/libs/compat/freebsd_network/compat/sys/rman.h
index b03dd57e67..46fc64293b 100644
--- a/src/libs/compat/freebsd_network/compat/sys/rman.h
+++ b/src/libs/compat/freebsd_network/compat/sys/rman.h
@@ -1,9 +1,3 @@
-/*
- * Copyright 2007, Hugo Santos. All Rights Reserved.
- * Distributed under the terms of the MIT License.
- */
-
-
 /*-
  * Copyright 1998 Massachusetts Institute of Technology
  *
@@ -61,30 +55,7 @@ bus_space_handle_t rman_get_bushandle(struct resource *);
 bus_space_tag_t rman_get_bustag(struct resource *);
 int rman_get_rid(struct resource *);
 void* rman_get_virtual(struct resource *);
+bus_addr_t rman_get_start(struct resource *);
+bus_size_t rman_get_size(struct resource *);
 
-
-static inline u_long
-rman_get_start(struct resource *resourcePointer)
-{
-       return resourcePointer->r_bushandle;
-}
-
-
-static inline uint32_t
-rman_make_alignment_flags(uint32_t size)
-{
-       int i;
-
-       /*
-        * Find the hightest bit set, and add one if more than one bit
-        * set.  We're effectively computing the ceil(log2(size)) here.
-        */
-       for (i = 31; i > 0; i--)
-               if ((1 << i) & size)
-                       break;
-       if (~(1 << i) & size)
-               i++;
-
-       return RF_ALIGNMENT_LOG2(i);
-}
 #endif /* _FBSD_COMPAT_SYS_RMAN_H_ */
diff --git a/src/libs/compat/freebsd_network/compat/sys/syslog.h 
b/src/libs/compat/freebsd_network/compat/sys/syslog.h
index f785d64b35..ec0ccfd7f4 100644
--- a/src/libs/compat/freebsd_network/compat/sys/syslog.h
+++ b/src/libs/compat/freebsd_network/compat/sys/syslog.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2009 Haiku Inc. All rights reserved.
+ * Copyright 2009-2022, Haiku, Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
  */
 #ifndef _FBSD_COMPAT_SYS_SYSLOG_H_
@@ -7,5 +7,7 @@
 
 
 #define LOG_ERR 3 /* error conditions */
+#define        LOG_WARNING     4       /* warning conditions */
+
 
 #endif /* _FBSD_COMPAT_SYS_SYSLOG_H_ */
diff --git a/src/libs/compat/freebsd_network/compat/sys/systm.h 
b/src/libs/compat/freebsd_network/compat/sys/systm.h
index b4d3b113a9..219db6d2ed 100644
--- a/src/libs/compat/freebsd_network/compat/sys/systm.h
+++ b/src/libs/compat/freebsd_network/compat/sys/systm.h
@@ -41,13 +41,14 @@ int printf(const char *format, ...) __printflike(1, 2);
 #endif
 
 #ifdef INVARIANTS
-#define KASSERT(cond,msg) do { \
+#define KASSERT_FREEBSD(cond,msg) do { \
        if (!(cond))                            \
                panic msg;                              \
 } while (0)
+#define KASSERT(cond,msg) KASSERT_FREEBSD(cond,msg)
 #else
-#define KASSERT(exp,msg) do { \
-} while (0)
+#define KASSERT_FREEBSD(exp,msg) do {} while (0)
+#define KASSERT(cond,msg) KASSERT_FREEBSD(cond,msg)
 #endif
 
 #define DELAY(n) \
diff --git a/src/libs/compat/freebsd_network/compat/sys/time.h 
b/src/libs/compat/freebsd_network/compat/sys/time.h
index 14265f44dd..869401926d 100644
--- a/src/libs/compat/freebsd_network/compat/sys/time.h
+++ b/src/libs/compat/freebsd_network/compat/sys/time.h
@@ -1,6 +1,39 @@
 /*
- * Copyright 2020, Haiku, Inc. All rights reserved.
- * All rights reserved. Distributed under the terms of the MIT License.
+ * Copyright 2020-2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1982, 1986, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)time.h      8.5 (Berkeley) 5/4/95
+ * $FreeBSD$
  */
 #ifndef _FBSD_COMPAT_SYS_TIME_H_
 #define _FBSD_COMPAT_SYS_TIME_H_
@@ -21,7 +54,21 @@
 #define time_uptime            USEC_2_TICKS(system_time())
 
 
-int    ppsratecheck(struct timeval*, int*, int);
+/* Operations on timevals. */
+#define        timevalclear(tvp)               ((tvp)->tv_sec = (tvp)->tv_usec 
= 0)
+#define        timevalisset(tvp)               ((tvp)->tv_sec || 
(tvp)->tv_usec)
+#define        timevalcmp(tvp, uvp, cmp)                                       
\
+       (((tvp)->tv_sec == (uvp)->tv_sec) ?                             \
+               ((tvp)->tv_usec cmp (uvp)->tv_usec) :                   \
+               ((tvp)->tv_sec cmp (uvp)->tv_sec))
+
+
+void   getmicrouptime(struct timeval *tvp);
+
+int    ppsratecheck(struct timeval *, int *, int);
+int    ratecheck(struct timeval *, const struct timeval *);
+void   timevaladd(struct timeval *t1, const struct timeval *t2);
+void   timevalsub(struct timeval *t1, const struct timeval *t2);
 
 
 #endif /* _FBSD_COMPAT_SYS_TIME_H_ */
diff --git a/src/libs/compat/freebsd_network/device_hooks.c 
b/src/libs/compat/freebsd_network/device_hooks.c
index 37165fda42..d62097b127 100644
--- a/src/libs/compat/freebsd_network/device_hooks.c
+++ b/src/libs/compat/freebsd_network/device_hooks.c
@@ -49,6 +49,8 @@ compat_open(const char *name, uint32 flags, void **cookie)
                return B_BUSY;
        }
 
+       IFF_LOCKGIANT(ifp);
+
        ifp->if_init(ifp->if_softc);
 
        if (!HAIKU_DRIVER_REQUIRES(FBSD_WLAN_FEATURE)) {
@@ -68,6 +70,8 @@ compat_open(const char *name, uint32 flags, void **cookie)
        ifp->flags &= ~DEVICE_CLOSED;
        ifp->if_ioctl(ifp, SIOCSIFFLAGS, NULL);
 
+       IFF_UNLOCKGIANT(ifp);
+
        *cookie = ifp;
        return B_OK;
 }
@@ -184,7 +188,11 @@ compat_write(void *cookie, off_t position, const void 
*buffer,
        memcpy(mtod(mb, void *), buffer, mb->m_len);
        *numBytes = length;
 
-       return ifp->if_output(ifp, mb, NULL, NULL);
+       IFF_LOCKGIANT(ifp);
+       int result = ifp->if_output(ifp, mb, NULL, NULL);
+       IFF_UNLOCKGIANT(ifp);
+
+       return result;
 }
 
 
@@ -192,6 +200,7 @@ static status_t
 compat_control(void *cookie, uint32 op, void *arg, size_t length)
 {
        struct ifnet *ifp = cookie;
+       status_t status;
 
        //if_printf(ifp, "compat_control(op %lu, %p, [%lu])\n", op,
        //      arg, length);
@@ -228,7 +237,11 @@ compat_control(void *cookie, uint32 op, void *arg, size_t 
length)
                                ifp->if_flags |= IFF_PROMISC;
                        else
                                ifp->if_flags &= ~IFF_PROMISC;
-                       return ifp->if_ioctl(ifp, SIOCSIFFLAGS, NULL);
+
+                       IFF_LOCKGIANT(ifp);
+                       status = ifp->if_ioctl(ifp, SIOCSIFFLAGS, NULL);
+                       IFF_UNLOCKGIANT(ifp);
+                       return status;
                }
 
                case ETHER_GETFRAMESIZE:
@@ -273,10 +286,13 @@ compat_control(void *cookie, uint32 op, void *arg, size_t 
length)
                        if (user_memcpy(LLADDR(&address), arg, ETHER_ADDR_LEN) 
< B_OK)
                                return B_BAD_ADDRESS;
 
+                       IFF_LOCKGIANT(ifp);
                        if (op == ETHER_ADDMULTI)
-                               return if_addmulti(ifp, (struct sockaddr 
*)&address, NULL);
-
-                       return if_delmulti(ifp, (struct sockaddr *)&address);
+                               status = if_addmulti(ifp, (struct sockaddr 
*)&address, NULL);
+                       else
+                               status = if_delmulti(ifp, (struct sockaddr 
*)&address);
+                       IFF_UNLOCKGIANT(ifp);
+                       return status;
                }
 
                case ETHER_GET_LINK_STATE:
@@ -289,7 +305,9 @@ compat_control(void *cookie, uint32 op, void *arg, size_t 
length)
                                return EINVAL;
 
                        memset(&mediareq, 0, sizeof(mediareq));
+                       IFF_LOCKGIANT(ifp);
                        status = ifp->if_ioctl(ifp, SIOCGIFMEDIA, 
(caddr_t)&mediareq);
+                       IFF_UNLOCKGIANT(ifp);
                        if (status < B_OK)
                                return status;
 
@@ -313,7 +331,12 @@ compat_control(void *cookie, uint32 op, void *arg, size_t 
length)
                case SIOCSIFMEDIA:
                case SIOCGIFMEDIA:
                case SIOCSIFMTU:
-                       return ifp->if_ioctl(ifp, op, (caddr_t)arg);
+               {
+                       IFF_LOCKGIANT(ifp);
+                       status = ifp->if_ioctl(ifp, op, (caddr_t)arg);
+                       IFF_UNLOCKGIANT(ifp);
+                       return status;
+               }
        }
 
        return wlan_control(cookie, op, arg, length);
diff --git a/src/libs/compat/freebsd_network/fbsd_time.c 
b/src/libs/compat/freebsd_network/fbsd_time.c
index 7ab8fcae72..2c61e96b0d 100644
--- a/src/libs/compat/freebsd_network/fbsd_time.c
+++ b/src/libs/compat/freebsd_network/fbsd_time.c
@@ -31,6 +31,46 @@
 #include <sys/kernel.h>
 #include <sys/time.h>
 
+/*
+ * ratecheck(): simple time-based rate-limit checking.
+ */
+int
+ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
+{
+       struct timeval tv, delta;
+       int rv = 0;
+
+       getmicrouptime(&tv);            /* NB: 10ms precision */
+       delta = tv;
+       timevalsub(&delta, lasttime);
+
+       /*
+        * check for 0,0 is so that the message will be seen at least once,
+        * even if interval is huge.
+        */
+       if (timevalcmp(&delta, mininterval, >=) ||
+               (lasttime->tv_sec == 0 && lasttime->tv_usec == 0)) {
+               *lasttime = tv;
+               rv = 1;
+       }
+
+       return (rv);
+}
+
+/*
+ * ppsratecheck(): packets (or events) per second limitation.
+ *
+ * Return 0 if the limit is to be enforced (e.g. the caller
+ * should drop a packet because of the rate limitation).
+ *
+ * maxpps of 0 always causes zero to be returned.  maxpps of -1
+ * always causes 1 to be returned; this effectively defeats rate
+ * limiting.
+ *
+ * Note that we maintain the struct timeval for compatibility
+ * with other bsd systems.  We reuse the storage and just monitor
+ * clock ticks for minimal overhead.
+ */
 int
 ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
 {
@@ -48,6 +88,45 @@ ppsratecheck(struct timeval *lasttime, int *curpps, int 
maxpps)
                return (maxpps != 0);
        } else {
                (*curpps)++;            /* NB: ignore potential overflow */
-               return (maxpps < 0 || *curpps < maxpps);
+               return (maxpps < 0 || *curpps <= maxpps);
        }
 }
+
+static void
+timevalfix(struct timeval *t1)
+{
+
+       if (t1->tv_usec < 0) {
+               t1->tv_sec--;
+               t1->tv_usec += 1000000;
+       }
+       if (t1->tv_usec >= 1000000) {
+               t1->tv_sec++;
+               t1->tv_usec -= 1000000;
+       }
+}
+
+/*
+ * Add and subtract routines for timevals.
+ * N.B.: subtract routine doesn't deal with
+ * results which are before the beginning,
+ * it just gets very confused in this case.
+ * Caveat emptor.
+ */
+void
+timevaladd(struct timeval *t1, const struct timeval *t2)
+{
+
+       t1->tv_sec += t2->tv_sec;
+       t1->tv_usec += t2->tv_usec;
+       timevalfix(t1);
+}
+
+void
+timevalsub(struct timeval *t1, const struct timeval *t2)
+{
+
+       t1->tv_sec -= t2->tv_sec;
+       t1->tv_usec -= t2->tv_usec;
+       timevalfix(t1);
+}
diff --git a/src/libs/compat/freebsd_network/fbsd_timingsafe.c 
b/src/libs/compat/freebsd_network/fbsd_timingsafe.c
new file mode 100644
index 0000000000..fd724157f2
--- /dev/null
+++ b/src/libs/compat/freebsd_network/fbsd_timingsafe.c
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2010 Damien Miller.  All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/libkern.h>
+
+int
+timingsafe_bcmp(const void *b1, const void *b2, size_t n)
+{
+       const unsigned char *p1 = b1, *p2 = b2;
+       int ret = 0;
+
+       for (; n > 0; n--)
+               ret |= *p1++ ^ *p2++;
+       return (ret != 0);
+}
diff --git a/src/libs/compat/freebsd_network/if.c 
b/src/libs/compat/freebsd_network/if.c
index 3778c3b0a3..b9f347189f 100644
--- a/src/libs/compat/freebsd_network/if.c
+++ b/src/libs/compat/freebsd_network/if.c
@@ -149,21 +149,17 @@ ifindex_free_locked(u_short idx)
 }
 
 
-struct ifnet *
-if_alloc(u_char type)
+int
+if_alloc_inplace(struct ifnet *ifp, u_char type)
 {
        char semName[64];
        u_short index;
 
-       struct ifnet *ifp = _kernel_malloc(sizeof(struct ifnet), M_ZERO);
-       if (ifp == NULL)
-               return NULL;
-
        snprintf(semName, sizeof(semName), "%s receive", gDriverName);
 
        ifp->receive_sem = create_sem(0, semName);
        if (ifp->receive_sem < B_OK)
-               goto err1;
+               return ifp->receive_sem;
 
        ifp->link_state_sem = -1;
        ifp->open_count = 0;
@@ -188,7 +184,7 @@ if_alloc(u_char type)
        ifnet_setbyindex(ifp->if_index, ifp);
 
        IF_ADDR_LOCK_INIT(ifp);
-       return ifp;
+       return 0;
 
 err3:
        switch (type) {
@@ -200,14 +196,28 @@ err3:
 err2:
        delete_sem(ifp->receive_sem);
 
-err1:
-       _kernel_free(ifp);
-       return NULL;
+       return -1;
+}
+
+
+struct ifnet *
+if_alloc(u_char type)
+{
+       struct ifnet *ifp = _kernel_malloc(sizeof(struct ifnet), M_ZERO);
+       if (ifp == NULL)
+               return NULL;
+
+       if (if_alloc_inplace(ifp, type) != 0) {
+               _kernel_free(ifp);
+               return NULL;
+       }
+
+       return ifp;
 }
 
 
 void
-if_free(struct ifnet *ifp)
+if_free_inplace(struct ifnet *ifp)
 {
        // IEEE80211 devices won't be in this list,
        // so don't try to remove them.
@@ -227,6 +237,13 @@ if_free(struct ifnet *ifp)
 
        delete_sem(ifp->receive_sem);
        ifq_uninit(&ifp->receive_queue);
+}
+
+
+void
+if_free(struct ifnet *ifp)
+{
+       if_free_inplace(ifp);
 
        _kernel_free(ifp);
 }
@@ -397,10 +414,6 @@ if_detach(struct ifnet *ifp)
 void
 if_start(struct ifnet *ifp)
 {
-#ifdef IFF_NEEDSGIANT
-       if (ifp->if_flags & IFF_NEEDSGIANT)
-       panic("freebsd compat.: unsupported giant requirement");
-#endif
        ifp->if_start(ifp);
 }
 
diff --git a/src/libs/compat/freebsd_network/libkern.cpp 
b/src/libs/compat/freebsd_network/libkern.cpp
index adeb122a05..1d6afe8a2e 100644
--- a/src/libs/compat/freebsd_network/libkern.cpp
+++ b/src/libs/compat/freebsd_network/libkern.cpp
@@ -1,6 +1,5 @@
 /*
- * Copyright 2009, Colin Günther, coling@xxxxxx. All rights reserved.
- * Copyright 2018, Haiku, Inc. All rights reserved.
+ * Copyright 2018-2022, Haiku, Inc. All rights reserved.
  * Distributed under the terms of the MIT License.
  */
 
@@ -36,3 +35,10 @@ arc4random(void)
        arc4rand(&ret, sizeof ret, 0);
        return ret;
 }
+
+
+void
+arc4random_buf(void *ptr, size_t len)
+{
+       arc4rand(ptr, len, 0);
+}
diff --git a/src/libs/compat/freebsd_network/taskqueue.c 
b/src/libs/compat/freebsd_network/taskqueue.c
index b6cb0e11cd..7ed80a2b78 100644
--- a/src/libs/compat/freebsd_network/taskqueue.c
+++ b/src/libs/compat/freebsd_network/taskqueue.c
@@ -127,7 +127,13 @@ tq_handle_thread(void *data)
                pending = t->ta_pending;
                t->ta_pending = 0;
 
+               if ((t->ta_flags & TASK_NEEDSGIANT) != 0)
+                       mtx_lock(&Giant);
+
                t->ta_handler(t->ta_argument, pending);
+
+               if ((t->ta_flags & TASK_NEEDSGIANT) != 0)
+                       mtx_unlock(&Giant);
        }
 
        return 0;
@@ -489,6 +495,7 @@ void
 task_init(struct task *task, int prio, task_fn_t handler, void *context)
 {
        task->ta_priority = prio;
+       task->ta_flags = 0;
        task->ta_handler = handler;
        task->ta_argument = context;
        task->ta_pending = 0;

############################################################################

Commit:      668a169a62fd636469cc823ff59966fba60602b5
URL:         https://git.haiku-os.org/haiku/commit/?id=668a169a62fd
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Fri May 13 03:03:47 2022 UTC

OpenBSD-to-FreeBSD/Haiku compatibility headers.

OpenBSD's and FreeBSD's kernel APIs are very similar, but there are
still some differences. Fortunately these are small enough that we
can take care of most of them with a header-only shim layer.

(The files and functions implemented by this commit were implemented
and tested against the modules and drivers imported and adapted in
the following commits. Some of this took quite a bit of time to get
right, especially where the APIs have diverged in very subtle ways.)

----------------------------------------------------------------------------

diff --git a/src/libs/compat/openbsd_network/compat/dev/pci/pcireg.h 
b/src/libs/compat/openbsd_network/compat/dev/pci/pcireg.h
new file mode 100644
index 0000000000..76652e2384
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/dev/pci/pcireg.h
@@ -0,0 +1,752 @@
+/*     $OpenBSD: pcireg.h,v 1.60 2021/12/31 11:24:24 jsg Exp $ */
+/*     $NetBSD: pcireg.h,v 1.26 2000/05/10 16:58:42 thorpej Exp $      */
+
+/*
+ * Copyright (c) 1995, 1996 Christopher G. Demetriou.  All rights reserved.
+ * Copyright (c) 1994, 1996 Charles Hannum.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by Charles Hannum.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _DEV_PCI_PCIREG_H_
+#define        _DEV_PCI_PCIREG_H_
+
+/*
+ * Standardized PCI configuration information
+ *
+ * XXX This is not complete.
+ */
+
+#define        PCI_CONFIG_SPACE_SIZE           0x100
+#define        PCIE_CONFIG_SPACE_SIZE          0x1000
+
+/*
+ * Device identification register; contains a vendor ID and a device ID.
+ */
+#define        PCI_ID_REG                      0x00
+
+typedef u_int16_t pci_vendor_id_t;
+typedef u_int16_t pci_product_id_t;
+
+#define        PCI_VENDOR_SHIFT                        0
+#define        PCI_VENDOR_MASK                         0xffff
+#define        PCI_VENDOR(id) \
+               (((id) >> PCI_VENDOR_SHIFT) & PCI_VENDOR_MASK)
+
+#define        PCI_PRODUCT_SHIFT                       16
+#define        PCI_PRODUCT_MASK                        0xffff
+#define        PCI_PRODUCT(id) \
+               (((id) >> PCI_PRODUCT_SHIFT) & PCI_PRODUCT_MASK)
+
+#define PCI_ID_CODE(vid,pid) \
+       ((((vid) & PCI_VENDOR_MASK) << PCI_VENDOR_SHIFT) | \
+        (((pid) & PCI_PRODUCT_MASK) << PCI_PRODUCT_SHIFT))
+
+/*
+ * Command and status register.
+ */
+#define        PCI_COMMAND_STATUS_REG                  0x04
+
+#define        PCI_COMMAND_IO_ENABLE                   0x00000001
+#define        PCI_COMMAND_MEM_ENABLE                  0x00000002
+#define        PCI_COMMAND_MASTER_ENABLE               0x00000004
+#define        PCI_COMMAND_SPECIAL_ENABLE              0x00000008
+#define        PCI_COMMAND_INVALIDATE_ENABLE           0x00000010
+#define        PCI_COMMAND_PALETTE_ENABLE              0x00000020
+#define        PCI_COMMAND_PARITY_ENABLE               0x00000040
+#define        PCI_COMMAND_STEPPING_ENABLE             0x00000080
+#define        PCI_COMMAND_SERR_ENABLE                 0x00000100
+#define        PCI_COMMAND_BACKTOBACK_ENABLE           0x00000200
+#define PCI_COMMAND_INTERRUPT_DISABLE          0x00000400
+
+#define        PCI_STATUS_CAPLIST_SUPPORT              0x00100000
+#define        PCI_STATUS_66MHZ_SUPPORT                0x00200000
+#define        PCI_STATUS_UDF_SUPPORT                  0x00400000
+#define        PCI_STATUS_BACKTOBACK_SUPPORT           0x00800000
+#define        PCI_STATUS_PARITY_ERROR                 0x01000000
+#define        PCI_STATUS_DEVSEL_FAST                  0x00000000
+#define        PCI_STATUS_DEVSEL_MEDIUM                0x02000000
+#define        PCI_STATUS_DEVSEL_SLOW                  0x04000000
+#define        PCI_STATUS_DEVSEL_MASK                  0x06000000
+#define        PCI_STATUS_TARGET_TARGET_ABORT          0x08000000
+#define        PCI_STATUS_MASTER_TARGET_ABORT          0x10000000
+#define        PCI_STATUS_MASTER_ABORT                 0x20000000
+#define        PCI_STATUS_SPECIAL_ERROR                0x40000000
+#define        PCI_STATUS_PARITY_DETECT                0x80000000
+
+#define        PCI_COMMAND_STATUS_BITS \
+       ("\020\01IO\02MEM\03MASTER\04SPECIAL\05INVALIDATE\06PALETTE\07PARITY"\
+        "\010STEPPING\011SERR\012BACKTOBACK\025CAPLIST\026CLK66\027UDF"\
+        "\030BACK2BACK_STAT\031PARITY_STAT\032DEVSEL_MEDIUM\033DEVSEL_SLOW"\
+        "\034TARGET_TARGET_ABORT\035MASTER_TARGET_ABORT\036MASTER_ABORT"\
+        "\037SPECIAL_ERROR\040PARITY_DETECT")
+/*
+ * PCI Class and Revision Register; defines type and revision of device.
+ */
+#define        PCI_CLASS_REG                   0x08
+
+typedef u_int8_t pci_class_t;
+typedef u_int8_t pci_subclass_t;
+typedef u_int8_t pci_interface_t;
+typedef u_int8_t pci_revision_t;
+
+#define        PCI_CLASS_SHIFT                         24
+#define        PCI_CLASS_MASK                          0xff
+#define        PCI_CLASS(cr) \
+               (((cr) >> PCI_CLASS_SHIFT) & PCI_CLASS_MASK)
+
+#define        PCI_SUBCLASS_SHIFT                      16
+#define        PCI_SUBCLASS_MASK                       0xff
+#define        PCI_SUBCLASS(cr) \
+               (((cr) >> PCI_SUBCLASS_SHIFT) & PCI_SUBCLASS_MASK)
+
+#define        PCI_INTERFACE_SHIFT                     8
+#define        PCI_INTERFACE_MASK                      0xff
+#define        PCI_INTERFACE(cr) \
+               (((cr) >> PCI_INTERFACE_SHIFT) & PCI_INTERFACE_MASK)
+
+#define        PCI_REVISION_SHIFT                      0
+#define        PCI_REVISION_MASK                       0xff
+#define        PCI_REVISION(cr) \
+               (((cr) >> PCI_REVISION_SHIFT) & PCI_REVISION_MASK)
+
+/* base classes */
+#define        PCI_CLASS_PREHISTORIC                   0x00
+#define        PCI_CLASS_MASS_STORAGE                  0x01
+#define        PCI_CLASS_NETWORK                       0x02
+#define        PCI_CLASS_DISPLAY                       0x03
+#define        PCI_CLASS_MULTIMEDIA                    0x04
+#define        PCI_CLASS_MEMORY                        0x05
+#define        PCI_CLASS_BRIDGE                        0x06
+#define        PCI_CLASS_COMMUNICATIONS                0x07
+#define        PCI_CLASS_SYSTEM                        0x08
+#define        PCI_CLASS_INPUT                         0x09
+#define        PCI_CLASS_DOCK                          0x0a
+#define        PCI_CLASS_PROCESSOR                     0x0b
+#define        PCI_CLASS_SERIALBUS                     0x0c
+#define        PCI_CLASS_WIRELESS                      0x0d
+#define        PCI_CLASS_I2O                           0x0e
+#define        PCI_CLASS_SATCOM                        0x0f
+#define        PCI_CLASS_CRYPTO                        0x10
+#define        PCI_CLASS_DASP                          0x11
+#define        PCI_CLASS_ACCELERATOR                   0x12
+#define        PCI_CLASS_INSTRUMENTATION               0x13
+#define        PCI_CLASS_UNDEFINED                     0xff
+
+/* 0x00 prehistoric subclasses */
+#define        PCI_SUBCLASS_PREHISTORIC_MISC           0x00
+#define        PCI_SUBCLASS_PREHISTORIC_VGA            0x01
+
+/* 0x01 mass storage subclasses */
+#define        PCI_SUBCLASS_MASS_STORAGE_SCSI          0x00
+#define        PCI_SUBCLASS_MASS_STORAGE_IDE           0x01
+#define        PCI_SUBCLASS_MASS_STORAGE_FLOPPY        0x02
+#define        PCI_SUBCLASS_MASS_STORAGE_IPI           0x03
+#define        PCI_SUBCLASS_MASS_STORAGE_RAID          0x04
+#define        PCI_SUBCLASS_MASS_STORAGE_ATA           0x05
+#define        PCI_SUBCLASS_MASS_STORAGE_SATA          0x06
+#define         PCI_INTERFACE_SATA_AHCI10              0x01
+#define        PCI_SUBCLASS_MASS_STORAGE_SAS           0x07
+#define        PCI_SUBCLASS_MASS_STORAGE_NVM           0x08
+#define        PCI_SUBCLASS_MASS_STORAGE_UFS           0x09
+#define        PCI_SUBCLASS_MASS_STORAGE_MISC          0x80
+
+/* 0x02 network subclasses */
+#define        PCI_SUBCLASS_NETWORK_ETHERNET           0x00
+#define        PCI_SUBCLASS_NETWORK_TOKENRING          0x01
+#define        PCI_SUBCLASS_NETWORK_FDDI               0x02
+#define        PCI_SUBCLASS_NETWORK_ATM                0x03
+#define        PCI_SUBCLASS_NETWORK_ISDN               0x04
+#define        PCI_SUBCLASS_NETWORK_WORLDFIP           0x05
+#define        PCI_SUBCLASS_NETWORK_PCIMGMULTICOMP     0x06
+#define        PCI_SUBCLASS_NETWORK_INFINIBAND         0x07
+#define        PCI_SUBCLASS_NETWORK_MISC               0x80
+
+/* 0x03 display subclasses */
+#define        PCI_SUBCLASS_DISPLAY_VGA                0x00
+#define        PCI_SUBCLASS_DISPLAY_XGA                0x01
+#define        PCI_SUBCLASS_DISPLAY_3D                 0x02
+#define        PCI_SUBCLASS_DISPLAY_MISC               0x80
+
+/* 0x04 multimedia subclasses */
+#define        PCI_SUBCLASS_MULTIMEDIA_VIDEO           0x00
+#define        PCI_SUBCLASS_MULTIMEDIA_AUDIO           0x01
+#define        PCI_SUBCLASS_MULTIMEDIA_TELEPHONY       0x02
+#define        PCI_SUBCLASS_MULTIMEDIA_HDAUDIO         0x03
+#define        PCI_SUBCLASS_MULTIMEDIA_MISC            0x80
+
+/* 0x05 memory subclasses */
+#define        PCI_SUBCLASS_MEMORY_RAM                 0x00
+#define        PCI_SUBCLASS_MEMORY_FLASH               0x01
+#define        PCI_SUBCLASS_MEMORY_MISC                0x80
+
+/* 0x06 bridge subclasses */
+#define        PCI_SUBCLASS_BRIDGE_HOST                0x00
+#define        PCI_SUBCLASS_BRIDGE_ISA                 0x01
+#define        PCI_SUBCLASS_BRIDGE_EISA                0x02
+#define        PCI_SUBCLASS_BRIDGE_MC                  0x03
+#define        PCI_SUBCLASS_BRIDGE_PCI                 0x04
+#define        PCI_SUBCLASS_BRIDGE_PCMCIA              0x05
+#define        PCI_SUBCLASS_BRIDGE_NUBUS               0x06
+#define        PCI_SUBCLASS_BRIDGE_CARDBUS             0x07
+#define        PCI_SUBCLASS_BRIDGE_RACEWAY             0x08
+#define        PCI_SUBCLASS_BRIDGE_STPCI               0x09
+#define        PCI_SUBCLASS_BRIDGE_INFINIBAND          0x0a
+#define        PCI_SUBCLASS_BRIDGE_AS                  0x0b
+#define        PCI_SUBCLASS_BRIDGE_MISC                0x80
+
+/* 0x07 communications subclasses */
+#define        PCI_SUBCLASS_COMMUNICATIONS_SERIAL      0x00
+#define        PCI_SUBCLASS_COMMUNICATIONS_PARALLEL    0x01
+#define        PCI_SUBCLASS_COMMUNICATIONS_MPSERIAL    0x02
+#define        PCI_SUBCLASS_COMMUNICATIONS_MODEM       0x03
+#define        PCI_SUBCLASS_COMMUNICATIONS_GPIB        0x04
+#define        PCI_SUBCLASS_COMMUNICATIONS_SMARTCARD   0x05
+#define        PCI_SUBCLASS_COMMUNICATIONS_MISC        0x80
+
+/* 0x08 system subclasses */
+#define        PCI_SUBCLASS_SYSTEM_PIC                 0x00
+#define        PCI_SUBCLASS_SYSTEM_DMA                 0x01
+#define        PCI_SUBCLASS_SYSTEM_TIMER               0x02
+#define        PCI_SUBCLASS_SYSTEM_RTC                 0x03
+#define        PCI_SUBCLASS_SYSTEM_PCIHOTPLUG          0x04
+#define        PCI_SUBCLASS_SYSTEM_SDHC                0x05
+#define        PCI_SUBCLASS_SYSTEM_IOMMU               0x06
+#define        PCI_SUBCLASS_SYSTEM_ROOTCOMPEVENT       0x07
+#define        PCI_SUBCLASS_SYSTEM_MISC                0x80
+
+/* 0x09 input subclasses */
+#define        PCI_SUBCLASS_INPUT_KEYBOARD             0x00
+#define        PCI_SUBCLASS_INPUT_DIGITIZER            0x01
+#define        PCI_SUBCLASS_INPUT_MOUSE                0x02
+#define        PCI_SUBCLASS_INPUT_SCANNER              0x03
+#define        PCI_SUBCLASS_INPUT_GAMEPORT             0x04
+#define        PCI_SUBCLASS_INPUT_MISC                 0x80
+
+/* 0x0a dock subclasses */
+#define        PCI_SUBCLASS_DOCK_GENERIC               0x00
+#define        PCI_SUBCLASS_DOCK_MISC                  0x80
+
+/* 0x0b processor subclasses */
+#define        PCI_SUBCLASS_PROCESSOR_386              0x00
+#define        PCI_SUBCLASS_PROCESSOR_486              0x01
+#define        PCI_SUBCLASS_PROCESSOR_PENTIUM          0x02
+#define        PCI_SUBCLASS_PROCESSOR_ALPHA            0x10
+#define        PCI_SUBCLASS_PROCESSOR_POWERPC          0x20
+#define        PCI_SUBCLASS_PROCESSOR_MIPS             0x30
+#define        PCI_SUBCLASS_PROCESSOR_COPROC           0x40
+
+/* 0x0c serial bus subclasses */
+#define        PCI_SUBCLASS_SERIALBUS_FIREWIRE         0x00
+#define        PCI_SUBCLASS_SERIALBUS_ACCESS           0x01
+#define        PCI_SUBCLASS_SERIALBUS_SSA              0x02
+#define        PCI_SUBCLASS_SERIALBUS_USB              0x03
+#define        PCI_SUBCLASS_SERIALBUS_FIBER            0x04
+#define        PCI_SUBCLASS_SERIALBUS_SMBUS            0x05
+#define        PCI_SUBCLASS_SERIALBUS_INFINIBAND       0x06
+#define        PCI_SUBCLASS_SERIALBUS_IPMI             0x07
+#define        PCI_SUBCLASS_SERIALBUS_SERCOS           0x08
+#define        PCI_SUBCLASS_SERIALBUS_CANBUS           0x09
+
+/* 0x0d wireless subclasses */
+#define        PCI_SUBCLASS_WIRELESS_IRDA              0x00
+#define        PCI_SUBCLASS_WIRELESS_CONSUMERIR        0x01
+#define        PCI_SUBCLASS_WIRELESS_RF                0x10
+#define        PCI_SUBCLASS_WIRELESS_BLUETOOTH         0x11
+#define        PCI_SUBCLASS_WIRELESS_BROADBAND         0x12
+#define        PCI_SUBCLASS_WIRELESS_802_11A           0x20
+#define        PCI_SUBCLASS_WIRELESS_802_11B           0x21
+#define        PCI_SUBCLASS_WIRELESS_MISC              0x80
+
+/* 0x0e I2O (Intelligent I/O) subclasses */
+#define        PCI_SUBCLASS_I2O_STANDARD               0x00
+
+/* 0x0f satellite communication subclasses */
+/*     PCI_SUBCLASS_SATCOM_???                 0x00    / * XXX ??? */
+#define        PCI_SUBCLASS_SATCOM_TV                  0x01
+#define        PCI_SUBCLASS_SATCOM_AUDIO               0x02
+#define        PCI_SUBCLASS_SATCOM_VOICE               0x03
+#define        PCI_SUBCLASS_SATCOM_DATA                0x04
+
+/* 0x10 encryption/decryption subclasses */
+#define        PCI_SUBCLASS_CRYPTO_NETCOMP             0x00
+#define        PCI_SUBCLASS_CRYPTO_ENTERTAINMENT       0x10
+#define        PCI_SUBCLASS_CRYPTO_MISC                0x80
+
+/* 0x11 data acquisition and signal processing subclasses */
+#define        PCI_SUBCLASS_DASP_DPIO                  0x00
+#define        PCI_SUBCLASS_DASP_TIMEFREQ              0x01
+#define        PCI_SUBCLASS_DASP_SYNC                  0x10
+#define        PCI_SUBCLASS_DASP_MGMT                  0x20
+#define        PCI_SUBCLASS_DASP_MISC                  0x80
+
+/*
+ * PCI BIST/Header Type/Latency Timer/Cache Line Size Register.
+ */
+#define        PCI_BHLC_REG                    0x0c
+
+#define        PCI_BIST_SHIFT                          24
+#define        PCI_BIST_MASK                           0xff
+#define        PCI_BIST(bhlcr) \
+               (((bhlcr) >> PCI_BIST_SHIFT) & PCI_BIST_MASK)
+
+#define        PCI_HDRTYPE_SHIFT                       16
+#define        PCI_HDRTYPE_MASK                        0xff
+#define        PCI_HDRTYPE(bhlcr) \
+               (((bhlcr) >> PCI_HDRTYPE_SHIFT) & PCI_HDRTYPE_MASK)
+
+#define PCI_HDRTYPE_TYPE(bhlcr) \
+               (PCI_HDRTYPE(bhlcr) & 0x7f)
+#define        PCI_HDRTYPE_MULTIFN(bhlcr) \
+               ((PCI_HDRTYPE(bhlcr) & 0x80) != 0)
+
+#define        PCI_LATTIMER_SHIFT                      8
+#define        PCI_LATTIMER_MASK                       0xff
+#define        PCI_LATTIMER(bhlcr) \
+               (((bhlcr) >> PCI_LATTIMER_SHIFT) & PCI_LATTIMER_MASK)
+
+#define        PCI_CACHELINE_SHIFT                     0
+#define        PCI_CACHELINE_MASK                      0xff
+#define        PCI_CACHELINE(bhlcr) \
+               (((bhlcr) >> PCI_CACHELINE_SHIFT) & PCI_CACHELINE_MASK)
+
+/* config registers for header type 0 devices */
+
+#define PCI_MAPS       0x10
+#define PCI_CARDBUSCIS 0x28
+#define PCI_SUBVEND_0  0x2c
+#define PCI_SUBDEV_0   0x2e
+#define PCI_EXROMADDR_0        0x30
+#define PCI_INTLINE    0x3c
+#define PCI_INTPIN     0x3d
+#define PCI_MINGNT     0x3e
+#define PCI_MAXLAT     0x3f
+
+/* config registers for header type 1 devices */
+
+#define PCI_SECSTAT_1  0 /**/
+
+#define PCI_PRIBUS_1   0x18
+#define PCI_SECBUS_1   0x19
+#define PCI_SUBBUS_1   0x1a
+#define PCI_SECLAT_1   0x1b
+
+#define PCI_IOBASEL_1  0x1c
+#define PCI_IOLIMITL_1 0x1d
+#define PCI_IOBASEH_1  0 /**/
+#define PCI_IOLIMITH_1 0 /**/
+
+#define PCI_MEMBASE_1  0x20
+#define PCI_MEMLIMIT_1 0x22
+
+#define PCI_PMBASEL_1  0x24
+#define PCI_PMLIMITL_1 0x26
+#define PCI_PMBASEH_1  0 /**/
+#define PCI_PMLIMITH_1 0 /**/
+
+#define PCI_BRIDGECTL_1 0 /**/
+
+#define PCI_SUBVEND_1  0x34
+#define PCI_SUBDEV_1   0x36
+#define PCI_EXROMADDR_1        0x38
+
+/* config registers for header type 2 devices */
+
+#define PCI_SECSTAT_2  0x16
+
+#define PCI_PRIBUS_2   0x18
+#define PCI_SECBUS_2   0x19
+#define PCI_SUBBUS_2   0x1a
+#define PCI_SECLAT_2   0x1b
+
+#define PCI_MEMBASE0_2 0x1c
+#define PCI_MEMLIMIT0_2 0x20
+#define PCI_MEMBASE1_2 0x24
+#define PCI_MEMLIMIT1_2 0x28
+#define PCI_IOBASE0_2  0x2c
+#define PCI_IOLIMIT0_2 0x30
+#define PCI_IOBASE1_2  0x34
+#define PCI_IOLIMIT1_2 0x38
+
+#define PCI_BRIDGECTL_2 0x3e
+
+#define PCI_SUBVEND_2  0x40
+#define PCI_SUBDEV_2   0x42
+
+#define PCI_PCCARDIF_2 0x44
+
+/*
+ * Mapping registers
+ */
+#define        PCI_MAPREG_START                0x10
+#define        PCI_MAPREG_END                  0x28
+#define        PCI_MAPREG_PPB_END              0x18
+#define        PCI_MAPREG_PCB_END              0x14
+
+#define        PCI_MAPREG_TYPE(mr)                                             
\
+               ((mr) & PCI_MAPREG_TYPE_MASK)
+#define        PCI_MAPREG_TYPE_MASK                    0x00000001
+
+#define        PCI_MAPREG_TYPE_MEM                     0x00000000
+#define        PCI_MAPREG_TYPE_IO                      0x00000001
+
+#define        PCI_MAPREG_MEM_TYPE(mr)                                         
\
+               ((mr) & PCI_MAPREG_MEM_TYPE_MASK)
+#define        PCI_MAPREG_MEM_TYPE_MASK                0x00000006
+
+#define        PCI_MAPREG_MEM_TYPE_32BIT               0x00000000
+#define        PCI_MAPREG_MEM_TYPE_32BIT_1M            0x00000002
+#define        PCI_MAPREG_MEM_TYPE_64BIT               0x00000004
+
+#define _PCI_MAPREG_TYPEBITS(reg) \
+       (PCI_MAPREG_TYPE(reg) == PCI_MAPREG_TYPE_IO ? \
+       reg & PCI_MAPREG_TYPE_MASK : \
+       reg & (PCI_MAPREG_TYPE_MASK|PCI_MAPREG_MEM_TYPE_MASK))
+
+#define        PCI_MAPREG_MEM_PREFETCHABLE(mr)                                 
\
+               (((mr) & PCI_MAPREG_MEM_PREFETCHABLE_MASK) != 0)
+#define        PCI_MAPREG_MEM_PREFETCHABLE_MASK        0x00000008
+
+#define        PCI_MAPREG_MEM_ADDR(mr)                                         
\
+               ((mr) & PCI_MAPREG_MEM_ADDR_MASK)
+#define        PCI_MAPREG_MEM_SIZE(mr)                                         
\
+               (PCI_MAPREG_MEM_ADDR(mr) & -PCI_MAPREG_MEM_ADDR(mr))
+#define        PCI_MAPREG_MEM_ADDR_MASK                0xfffffff0
+
+#define        PCI_MAPREG_MEM64_ADDR(mr)                                       
\
+               ((mr) & PCI_MAPREG_MEM64_ADDR_MASK)
+#define        PCI_MAPREG_MEM64_SIZE(mr)                                       
\
+               (PCI_MAPREG_MEM64_ADDR(mr) & -PCI_MAPREG_MEM64_ADDR(mr))
+#define        PCI_MAPREG_MEM64_ADDR_MASK              0xfffffffffffffff0ULL
+
+#define        PCI_MAPREG_IO_ADDR(mr)                                          
\
+               ((mr) & PCI_MAPREG_IO_ADDR_MASK)
+#define        PCI_MAPREG_IO_SIZE(mr)                                          
\
+               (PCI_MAPREG_IO_ADDR(mr) & -PCI_MAPREG_IO_ADDR(mr))
+#define        PCI_MAPREG_IO_ADDR_MASK                 0xfffffffe
+
+/*
+ * Cardbus CIS pointer (PCI rev. 2.1)
+ */
+#define PCI_CARDBUS_CIS_REG 0x28
+
+/*
+ * Subsystem identification register; contains a vendor ID and a device ID.
+ * Types/macros for PCI_ID_REG apply.
+ * (PCI rev. 2.1)
+ */
+#define PCI_SUBSYS_ID_REG 0x2c
+
+/*
+ * Expansion ROM Base Address register
+ * (PCI rev. 2.0)
+ */
+#define PCI_ROM_REG 0x30
+
+#define PCI_ROM_ENABLE                 0x00000001
+#define PCI_ROM_ADDR_MASK              0xfffff800
+#define PCI_ROM_ADDR(mr)                                               \
+               ((mr) & PCI_ROM_ADDR_MASK)
+#define PCI_ROM_SIZE(mr)                                               \
+               (PCI_ROM_ADDR(mr) & -PCI_ROM_ADDR(mr))
+
+/*
+ * capabilities link list (PCI rev. 2.2)
+ */
+#define PCI_CAPLISTPTR_REG             0x34    /* header type 0 */
+#define PCI_CARDBUS_CAPLISTPTR_REG     0x14    /* header type 2 */
+#define PCI_CAPLIST_PTR(cpr) ((cpr) & 0xff)
+#define PCI_CAPLIST_NEXT(cr) (((cr) >> 8) & 0xff)
+#define PCI_CAPLIST_CAP(cr) ((cr) & 0xff)
+
+#define PCI_CAP_RESERVED       0x00
+#define PCI_CAP_PWRMGMT                0x01
+#define PCI_CAP_AGP            0x02
+#define PCI_CAP_VPD            0x03
+#define PCI_CAP_SLOTID         0x04
+#define PCI_CAP_MSI            0x05
+#define PCI_CAP_CPCI_HOTSWAP   0x06
+#define PCI_CAP_PCIX           0x07
+#define PCI_CAP_HT             0x08
+#define PCI_CAP_VENDSPEC       0x09
+#define PCI_CAP_DEBUGPORT      0x0a
+#define PCI_CAP_CPCI_RSRCCTL   0x0b
+#define PCI_CAP_HOTPLUG                0x0c
+#define PCI_CAP_AGP8           0x0e
+#define PCI_CAP_SECURE         0x0f
+#define PCI_CAP_PCIEXPRESS             0x10
+#define PCI_CAP_MSIX           0x11
+#define PCI_CAP_SATA           0x12
+
+/*
+ * Vital Product Data; access via capability pointer (PCI rev 2.2).
+ */
+#define        PCI_VPD_ADDRESS_MASK    0x7fff
+#define        PCI_VPD_ADDRESS_SHIFT   16
+#define        PCI_VPD_ADDRESS(ofs)    \
+       (((ofs) & PCI_VPD_ADDRESS_MASK) << PCI_VPD_ADDRESS_SHIFT)
+#define        PCI_VPD_DATAREG(ofs)    ((ofs) + 4)
+#define        PCI_VPD_OPFLAG          0x80000000
+
+/*
+ * Message Signaled Interrupts; access via capability pointer.
+ */
+#define PCI_MSI_MC             0x00
+#define PCI_MSI_MC_C64         0x00800000
+#define PCI_MSI_MC_MME         0x00700000
+#define PCI_MSI_MC_MMC         0x000e0000
+#define PCI_MSI_MC_MSIE                0x00010000
+#define PCI_MSI_MA             0x04
+#define PCI_MSI_MAU32          0x08
+#define PCI_MSI_MD32           0x08
+#define PCI_MSI_MD64           0x0c
+
+/*
+ * Power Management Control Status Register; access via capability pointer.
+ */
+#define PCI_PMCSR              0x04
+#define PCI_PMCSR_STATE_MASK   0x0003
+#define PCI_PMCSR_STATE_D0     0x0000
+#define PCI_PMCSR_STATE_D1     0x0001
+#define PCI_PMCSR_STATE_D2     0x0002
+#define PCI_PMCSR_STATE_D3     0x0003
+#define PCI_PMCSR_PME_STATUS   0x8000
+#define PCI_PMCSR_PME_EN       0x0100
+
+/*
+ * HyperTransport; access via capability pointer.
+ */
+#define PCI_HT_CAP(cr) ((((cr) >> 27) < 0x08) ? \
+       (((cr) >> 27) & 0x1c) : (((cr) >> 27) & 0x1f))
+
+#define PCI_HT_CAP_SLAVE       0x00
+#define PCI_HT_CAP_HOST                0x04
+#define PCI_HT_CAP_INTR                0x10
+#define PCI_HT_CAP_MSI         0x15
+
+#define PCI_HT_MSI_ENABLED     0x00010000
+#define PCI_HT_MSI_FIXED       0x00020000
+
+#define PCI_HT_MSI_FIXED_ADDR  0xfee00000UL
+
+#define PCI_HT_MSI_ADDR                0x04
+#define PCI_HT_MSI_ADDR_HI32   0x08
+
+#define PCI_HT_INTR_DATA       0x04
+
+/*
+ * PCI Express; access via capability pointer.
+ */
+#define PCI_PCIE_XCAP          0x00
+#define PCI_PCIE_XCAP_SI       0x01000000
+#define PCI_PCIE_XCAP_VER(x)   (((x) >> 16) & 0x0f)
+#define PCI_PCIE_DCAP          0x04
+#define PCI_PCIE_DCSR          0x08
+#define PCI_PCIE_DCSR_ERO      0x00000010
+#define PCI_PCIE_DCSR_ENS      0x00000800
+#define PCI_PCIE_DCSR_MPS      0x00007000
+#define PCI_PCIE_DCSR_CEE      0x00010000
+#define PCI_PCIE_DCSR_NFE      0x00020000
+#define PCI_PCIE_DCSR_FEE      0x00040000
+#define PCI_PCIE_DCSR_URE      0x00080000
+#define PCI_PCIE_LCAP          0x0c
+#define PCI_PCIE_LCSR          0x10
+#define PCI_PCIE_LCSR_ASPM_L0S 0x00000001
+#define PCI_PCIE_LCSR_ASPM_L1  0x00000002
+#define PCI_PCIE_LCSR_RL       0x00000020
+#define PCI_PCIE_LCSR_CCC      0x00000040
+#define PCI_PCIE_LCSR_ES       0x00000080
+#define PCI_PCIE_LCSR_ECPM     0x00000100
+#define PCI_PCIE_LCSR_CLS      0x000f0000
+#define PCI_PCIE_LCSR_CLS_2_5  0x00010000
+#define PCI_PCIE_LCSR_CLS_5    0x00020000
+#define PCI_PCIE_LCSR_CLS_8    0x00030000
+#define PCI_PCIE_LCSR_CLS_16   0x00040000
+#define PCI_PCIE_LCSR_CLS_32   0x00050000
+#define PCI_PCIE_LCSR_LT       0x08000000
+#define PCI_PCIE_LCSR_SCC      0x10000000
+#define PCI_PCIE_SLCAP         0x14
+#define PCI_PCIE_SLCAP_ABP     0x00000001
+#define PCI_PCIE_SLCAP_PCP     0x00000002
+#define PCI_PCIE_SLCAP_MSP     0x00000004
+#define PCI_PCIE_SLCAP_AIP     0x00000008
+#define PCI_PCIE_SLCAP_PIP     0x00000010
+#define PCI_PCIE_SLCAP_HPS     0x00000020
+#define PCI_PCIE_SLCAP_HPC     0x00000040
+#define PCI_PCIE_SLCSR         0x18
+#define PCI_PCIE_SLCSR_ABE     0x00000001
+#define PCI_PCIE_SLCSR_PFE     0x00000002
+#define PCI_PCIE_SLCSR_MSE     0x00000004
+#define PCI_PCIE_SLCSR_PDE     0x00000008
+#define PCI_PCIE_SLCSR_CCE     0x00000010
+#define PCI_PCIE_SLCSR_HPE     0x00000020
+#define PCI_PCIE_SLCSR_ABP     0x00010000
+#define PCI_PCIE_SLCSR_PFD     0x00020000
+#define PCI_PCIE_SLCSR_MSC     0x00040000
+#define PCI_PCIE_SLCSR_PDC     0x00080000
+#define PCI_PCIE_SLCSR_CC      0x00100000
+#define PCI_PCIE_SLCSR_MS      0x00200000
+#define PCI_PCIE_SLCSR_PDS     0x00400000
+#define PCI_PCIE_SLCSR_LACS    0x01000000
+#define PCI_PCIE_RCSR          0x1c
+#define PCI_PCIE_DCSR2         0x28
+#define PCI_PCIE_DCSR2_LTREN   0x00000400
+#define PCI_PCIE_LCAP2         0x2c
+#define PCI_PCIE_LCSR2         0x30
+#define PCI_PCIE_LCSR2_TLS     0x0000000f
+#define PCI_PCIE_LCSR2_TLS_2_5 0x00000001
+#define PCI_PCIE_LCSR2_TLS_5   0x00000002
+#define PCI_PCIE_LCSR2_TLS_8   0x00000003
+#define PCI_PCIE_LCSR2_TLS_16  0x00000004
+#define PCI_PCIE_LCSR2_TLS_32  0x00000005
+
+/*
+ * PCI Express; enhanced capabilities
+ */
+#define PCI_PCIE_ECAP          0x100
+#define        PCI_PCIE_ECAP_ID(x)     (((x) & 0x0000ffff))
+#define PCI_PCIE_ECAP_VER(x)   (((x) >> 16) & 0x0f)
+#define        PCI_PCIE_ECAP_NEXT(x)   (((x) >> 20) & 0xffc)
+#define PCI_PCIE_ECAP_LAST     0x0
+
+/*
+ * Extended Message Signaled Interrupts; access via capability pointer.
+ */
+#define PCI_MSIX_MC_MSIXE      0x80000000
+#define PCI_MSIX_MC_FM         0x40000000
+#define PCI_MSIX_MC_TBLSZ_MASK 0x07ff0000
+#define PCI_MSIX_MC_TBLSZ_SHIFT        16
+#define PCI_MSIX_MC_TBLSZ(reg) \
+       (((reg) & PCI_MSIX_MC_TBLSZ_MASK) >> PCI_MSIX_MC_TBLSZ_SHIFT)
+#define PCI_MSIX_TABLE         0x04
+#define  PCI_MSIX_TABLE_BIR    0x00000007
+#define  PCI_MSIX_TABLE_OFF    ~(PCI_MSIX_TABLE_BIR)
+
+#define PCI_MSIX_MA(i)         ((i) * 16 + 0)
+#define PCI_MSIX_MAU32(i)      ((i) * 16 + 4)
+#define PCI_MSIX_MD(i)         ((i) * 16 + 8)
+#define PCI_MSIX_VC(i)         ((i) * 16 + 12)
+#define  PCI_MSIX_VC_MASK      0x00000001
+
+/*
+ * Interrupt Configuration Register; contains interrupt pin and line.
+ */
+#define        PCI_INTERRUPT_REG               0x3c
+
+typedef u_int8_t pci_intr_pin_t;
+typedef u_int8_t pci_intr_line_t;
+
+#define        PCI_INTERRUPT_PIN_SHIFT                 8
+#define        PCI_INTERRUPT_PIN_MASK                  0xff
+#define        PCI_INTERRUPT_PIN(icr) \
+               (((icr) >> PCI_INTERRUPT_PIN_SHIFT) & PCI_INTERRUPT_PIN_MASK)
+
+#define        PCI_INTERRUPT_LINE_SHIFT                0
+#define        PCI_INTERRUPT_LINE_MASK                 0xff
+#define        PCI_INTERRUPT_LINE(icr) \
+               (((icr) >> PCI_INTERRUPT_LINE_SHIFT) & PCI_INTERRUPT_LINE_MASK)
+
+#define        PCI_MIN_GNT_SHIFT                       16
+#define        PCI_MIN_GNT_MASK                        0xff
+#define        PCI_MIN_GNT(icr) \
+               (((icr) >> PCI_MIN_GNT_SHIFT) & PCI_MIN_GNT_MASK)
+
+#define        PCI_MAX_LAT_SHIFT                       24
+#define        PCI_MAX_LAT_MASK                        0xff
+#define        PCI_MAX_LAT(icr) \
+               (((icr) >> PCI_MAX_LAT_SHIFT) & PCI_MAX_LAT_MASK)
+
+#define        PCI_INTERRUPT_PIN_NONE                  0x00
+#define        PCI_INTERRUPT_PIN_A                     0x01
+#define        PCI_INTERRUPT_PIN_B                     0x02
+#define        PCI_INTERRUPT_PIN_C                     0x03
+#define        PCI_INTERRUPT_PIN_D                     0x04
+#define        PCI_INTERRUPT_PIN_MAX                   0x04
+
+/*
+ * Vital Product Data resource tags.
+ */
+struct pci_vpd_smallres {
+       uint8_t         vpdres_byte0;           /* length of data + tag */
+       /* Actual data. */
+} __packed;
+
+struct pci_vpd_largeres {
+       uint8_t         vpdres_byte0;
+       uint8_t         vpdres_len_lsb;         /* length of data only */
+       uint8_t         vpdres_len_msb;
+       /* Actual data. */
+} __packed;
+
+#define        PCI_VPDRES_ISLARGE(x)                   ((x) & 0x80)
+
+#define        PCI_VPDRES_SMALL_LENGTH(x)              ((x) & 0x7)
+#define        PCI_VPDRES_SMALL_NAME(x)                (((x) >> 3) & 0xf)
+
+#define        PCI_VPDRES_LARGE_NAME(x)                ((x) & 0x7f)
+
+#define        PCI_VPDRES_TYPE_COMPATIBLE_DEVICE_ID    0x3     /* small */
+#define        PCI_VPDRES_TYPE_VENDOR_DEFINED          0xe     /* small */
+#define        PCI_VPDRES_TYPE_END_TAG                 0xf     /* small */
+
+#define        PCI_VPDRES_TYPE_IDENTIFIER_STRING       0x02    /* large */
+#define        PCI_VPDRES_TYPE_VPD                     0x10    /* large */
+
+struct pci_vpd {
+       uint8_t         vpd_key0;
+       uint8_t         vpd_key1;
+       uint8_t         vpd_len;                /* length of data only */
+       /* Actual data. */
+} __packed;
+
+/*
+ * Recommended VPD fields:
+ *
+ *     PN              Part number of assembly
+ *     FN              FRU part number
+ *     EC              EC level of assembly
+ *     MN              Manufacture ID
+ *     SN              Serial Number
+ *
+ * Conditionally recommended VPD fields:
+ *
+ *     LI              Load ID
+ *     RL              ROM Level
+ *     RM              Alterable ROM Level
+ *     NA              Network Address
+ *     DD              Device Driver Level
+ *     DG              Diagnostic Level
+ *     LL              Loadable Microcode Level
+ *     VI              Vendor ID/Device ID
+ *     FU              Function Number
+ *     SI              Subsystem Vendor ID/Subsystem ID
+ *
+ * Additional VPD fields:
+ *
+ *     Z0-ZZ           User/Product Specific
+ */
+
+#endif /* _DEV_PCI_PCIREG_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/dev/pci/pcivar.h 
b/src/libs/compat/openbsd_network/compat/dev/pci/pcivar.h
new file mode 100644
index 0000000000..95218d26b7
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/dev/pci/pcivar.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_DEV_PCI_PCIVAR_H_
+#define _OBSD_COMPAT_DEV_PCI_PCIVAR_H_
+
+
+#include_next <dev/pci/pcivar.h>
+#include <sys/rman.h>
+
+
+typedef u_int32_t pcireg_t;
+
+
+struct pci_matchid {
+       pci_vendor_id_t         pm_vid;
+       pci_product_id_t        pm_pid;
+};
+
+typedef struct {
+       int rid;
+} pci_intr_handle_t;
+
+
+#define pci_conf_read(pct, pcitag, reg) \
+       pci_read_config(SC_DEV_FOR_PCI, reg, sizeof(pcireg_t))
+#define pci_conf_write(pct, pcitag, reg, val) \
+       pci_write_config(SC_DEV_FOR_PCI, reg, val, sizeof(pcireg_t))
+#define pci_get_capability(pct, pcitag, capability, offset, value) \
+       pci_get_capability_openbsd(SC_DEV_FOR_PCI, capability, offset, value)
+#define pci_mapreg_type(pct, pcitag, reg) \
+       pci_mapreg_type_openbsd(SC_DEV_FOR_PCI, reg)
+#define pci_mapreg_map(pa, reg, type, flags, tagp, handlep, basep, sizep, 
maxsize) \
+       pci_mapreg_map_openbsd(SC_DEV_FOR_PCI, reg, type, flags, tagp, handlep, 
basep, sizep, maxsize)
+#define pci_intr_establish(pa, ih, level, func, arg, what) \
+       pci_intr_establish_openbsd(SC_DEV_FOR_PCI, ih, level, func, arg, what)
+
+#define pci_intr_string(...) NULL
+
+static int
+pci_get_capability_openbsd(device_t dev, int capability, int* offset, 
pcireg_t* value)
+{
+       int res = pci_find_cap(dev, capability, offset);
+       if (res != 0)
+               return 0;
+
+       if (value)
+               *value = pci_read_config(dev, *offset, sizeof(pcireg_t));
+       return 1;
+}
+
+static pcireg_t
+pci_mapreg_type_openbsd(device_t dev, int reg)
+{
+       return (_PCI_MAPREG_TYPEBITS(pci_read_config(dev, reg, 
sizeof(pcireg_t))));
+}
+
+static int
+pci_mapreg_map_openbsd(device_t dev, int reg, pcireg_t type, int flags,
+       bus_space_tag_t* tagp, bus_space_handle_t* handlep, bus_addr_t* basep,
+       bus_size_t* sizep, bus_size_t maxsize)
+{
+       struct resource* res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, 
&reg, RF_ACTIVE);
+       if (res == NULL)
+               return -1;
+
+       *tagp = rman_get_bustag(res);
+       *handlep = rman_get_bushandle(res);
+       if (basep != NULL)
+               *basep = rman_get_start(res);
+       if (sizep != NULL)
+               *sizep = rman_get_size(res);
+       return 0;
+}
+
+static int
+pci_intr_map_msix(device_t dev, int vec, pci_intr_handle_t* ihp)
+{
+       if (vec != 0)
+               return -1;
+
+       int count = 1;
+       ihp->rid = 1;
+       return pci_alloc_msix(dev, &count);
+}
+
+static int
+pci_intr_map_msi(device_t dev, pci_intr_handle_t* ihp)
+{
+       int count = 1;
+       ihp->rid = 1;
+       return pci_alloc_msi(dev, &count);
+}
+
+static void*
+pci_intr_establish_openbsd(device_t dev, pci_intr_handle_t ih, int level,
+       int(*func)(void*), void* arg, const char* what)
+{
+       struct resource* irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &ih.rid,
+               RF_ACTIVE | (ih.rid != 0 ? 0 : RF_SHAREABLE));
+       if (irq == NULL)
+               return NULL;
+
+       int flags = INTR_TYPE_NET;
+       if ((level & IPL_MPSAFE) != 0)
+               flags |= INTR_MPSAFE;
+
+       void* ihp = NULL;
+       bus_setup_intr(dev, irq, flags, NULL, func, arg, &ihp);
+       return ihp;
+}
+
+
+#endif /* _OBSD_COMPAT_DEV_PCI_PCIVAR_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/machine/bus.h 
b/src/libs/compat/openbsd_network/compat/machine/bus.h
new file mode 100644
index 0000000000..a0a10b1d89
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/machine/bus.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_MACHINE_BUS_H_
+#define _OBSD_COMPAT_MACHINE_BUS_H_
+
+
+#include_next <machine/bus.h>
+#include <sys/bus_dma.h>
+
+
+#define        BUS_DMA_READ            (BUS_DMA_NOWRITE)
+#define        BUS_DMA_WRITE           (0)
+
+struct bus_dmamap_obsd {
+       bus_dma_tag_t _dmat;
+       bus_dmamap_t _dmamp;
+       int _error;
+
+       int dm_nsegs;
+       bus_dma_segment_t dm_segs[];
+};
+typedef struct bus_dmamap_obsd* bus_dmamap_obsd_t;
+#define bus_dmamap_t bus_dmamap_obsd_t
+
+
+static int
+bus_dmamap_create_obsd(bus_dma_tag_t tag, bus_size_t maxsize,
+       int nsegments, bus_size_t maxsegsz, bus_size_t boundary, bus_size_t 
alignment,
+       int flags, bus_dmamap_t* dmamp, int no_alloc_map)
+{
+       *dmamp = calloc(sizeof(struct bus_dmamap_obsd) + 
(sizeof(bus_dma_segment_t) * nsegments), 1);
+       if ((*dmamp) == NULL)
+               return ENOMEM;
+
+       int error = bus_dma_tag_create(tag, alignment, boundary,
+               BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
+               maxsize, nsegments, maxsegsz, flags, NULL, NULL,
+               &(*dmamp)->_dmat);
+       if (error != 0)
+               return error;
+
+       if (!no_alloc_map)
+               error = bus_dmamap_create((*dmamp)->_dmat, flags, 
&(*dmamp)->_dmamp);
+       return error;
+}
+#define bus_dmamap_create(tag, maxsize, nsegments, maxsegsz, boundary, flags, 
dmamp) \
+       bus_dmamap_create_obsd(tag, maxsize, nsegments, maxsegsz, boundary, 1, 
flags, dmamp, 0)
+
+
+static void
+bus_dmamap_destroy_obsd(bus_dma_tag_t tag, bus_dmamap_t dmam)
+{
+       bus_dmamap_destroy(dmam->_dmat, dmam->_dmamp);
+       bus_dma_tag_destroy(dmam->_dmat);
+       _kernel_free(dmam);
+}
+#define bus_dmamap_destroy bus_dmamap_destroy_obsd
+
+
+static void
+bus_dmamap_load_obsd_callback(void* arg, bus_dma_segment_t* segs, int nseg, 
int error)
+{
+       bus_dmamap_t dmam = (bus_dmamap_t)arg;
+       dmam->_error = error;
+       dmam->dm_nsegs = nseg;
+       memcpy(dmam->dm_segs, segs, nseg * sizeof(bus_dma_segment_t));
+}
+
+static int
+bus_dmamap_load_obsd(bus_dma_tag_t tag, bus_dmamap_t dmam, void *buf, 
bus_size_t buflen, struct proc *p, int flags)
+{
+       int error = bus_dmamap_load(dmam->_dmat, dmam->_dmamp, buf, buflen,
+               bus_dmamap_load_obsd_callback, dmam, flags | BUS_DMA_NOWAIT);
+       if (error != 0)
+               return error;
+       return dmam->_error;
+}
+#define bus_dmamap_load bus_dmamap_load_obsd
+
+
+static int
+bus_dmamap_load_mbuf_obsd(bus_dma_tag_t tag, bus_dmamap_t dmam, struct mbuf 
*chain, int flags)
+{
+       return bus_dmamap_load_mbuf_sg(dmam->_dmat, dmam->_dmamp, chain,
+               &dmam->dm_segs, &dmam->dm_nsegs, flags);
+}
+#define bus_dmamap_load_mbuf bus_dmamap_load_mbuf_obsd
+
+
+static void
+bus_dmamap_unload_obsd(bus_dma_tag_t tag, bus_dmamap_t dmam)
+{
+       bus_dmamap_unload(dmam->_dmat, dmam->_dmamp);
+}
+#define bus_dmamap_unload bus_dmamap_unload_obsd
+
+
+static void
+bus_dmamap_sync_obsd(bus_dma_tag_t tag, bus_dmamap_t dmam, int ops)
+{
+       bus_dmamap_sync(dmam->_dmat, dmam->_dmamp, ops);
+}
+#define bus_dmamap_sync(tag, dmam, offset, size, ops) 
bus_dmamap_sync_obsd(tag, dmam, ops)
+
+
+#endif /* _OBSD_COMPAT_MACHINE_BUS_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/net/if.h 
b/src/libs/compat/openbsd_network/compat/net/if.h
new file mode 100644
index 0000000000..ab6385166f
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/net/if.h
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_NET_IF_H_
+#define _OBSD_COMPAT_NET_IF_H_
+
+
+#include_next <net/if.h>
+
+
+#define IFF_RUNNING            IFF_DRV_RUNNING
+
+
+#endif /* _OBSD_COMPAT_NET_IF_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/net/if_var.h 
b/src/libs/compat/openbsd_network/compat/net/if_var.h
new file mode 100644
index 0000000000..c5a7b895b3
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/net/if_var.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_NET_IF_VAR_H_
+#define _OBSD_COMPAT_NET_IF_VAR_H_
+
+
+#include_next <net/if_var.h>
+
+
+static inline int
+if_input_openbsd(if_t ifp, struct mbuf_list* ml)
+{
+       if (ml_empty(ml))
+               return 0;
+
+       struct mbuf* mb = ml->ml_head, *next = NULL;
+       int status = 0;
+       while (mb != NULL) {
+               // if_input takes only the first packet, it ignores 
mb->m_nextpkt.
+               next = mb->m_nextpkt;
+               int status = if_input(ifp, mb);
+               if (status != 0)
+                       break;
+
+               mb = next;
+               next = NULL;
+       }
+
+       if (next != NULL)
+               m_freem(next);
+       ml_init(ml);
+       return status;
+}
+#define if_input if_input_openbsd
+
+
+static int
+ifq_enqueue(struct ifaltq *ifq, struct mbuf *m)
+{
+       IF_ENQUEUE(ifq, m);
+       return 0;
+}
+
+static struct mbuf*
+ifq_dequeue(struct ifaltq *ifq)
+{
+       struct mbuf* m = NULL;
+       IF_DEQUEUE(ifq, m);
+       return m;
+}
+
+
+#endif /* _OBSD_COMPAT_NET_IF_VAR_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/netinet/if_ether.h 
b/src/libs/compat/openbsd_network/compat/netinet/if_ether.h
new file mode 100644
index 0000000000..c790ca596a
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/netinet/if_ether.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_NETINET_IF_ETHER_H_
+#define _OBSD_COMPAT_NETINET_IF_ETHER_H_
+
+
+#include_next <netinet/if_ether.h>
+#include <net/if_arp.h>
+#include <net/ethernet.h>
+
+#include "if_ethersubr.h"
+
+
+static const u_int8_t etheranyaddr[ETHER_ADDR_LEN] =
+       { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+
+#define        ETHER_IS_EQ(a1, a2)     (memcmp((a1), (a2), ETHER_ADDR_LEN) == 
0)
+
+#define ETHERTYPE_EAPOL                ETHERTYPE_PAE
+
+
+#endif /* _OBSD_COMPAT_NETINET_IF_ETHER_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/netinet/if_ethersubr.h 
b/src/libs/compat/openbsd_network/compat/netinet/if_ethersubr.h
new file mode 100644
index 0000000000..f4fefa6bcf
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/netinet/if_ethersubr.h
@@ -0,0 +1,79 @@
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Copyright (c) 1982, 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)if_ethersubr.c      8.1 (Berkeley) 6/10/93
+ * $FreeBSD$
+ */
+
+static inline u_int32_t
+ether_crc32_le_update(u_int32_t crc, const u_int8_t *buf, size_t len)
+{
+       static const u_int32_t crctab[] = {
+               0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac,
+               0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
+               0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c,
+               0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
+       };
+       size_t i;
+
+       for (i = 0; i < len; i++) {
+               crc ^= buf[i];
+               crc = (crc >> 4) ^ crctab[crc & 0xf];
+               crc = (crc >> 4) ^ crctab[crc & 0xf];
+       }
+
+       return (crc);
+}
+
+
+static inline u_int32_t
+ether_crc32_be_update(u_int32_t crc, const u_int8_t *buf, size_t len)
+{
+       static const u_int8_t rev[] = {
+               0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,
+               0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
+       };
+       static const u_int32_t crctab[] = {
+               0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
+               0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
+               0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
+               0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd
+       };
+       size_t i;
+       u_int8_t data;
+
+       for (i = 0; i < len; i++) {
+               data = buf[i];
+               crc = (crc << 4) ^ crctab[(crc >> 28) ^ rev[data & 0xf]];
+               crc = (crc << 4) ^ crctab[(crc >> 28) ^ rev[data >> 4]];
+       }
+
+       return (crc);
+}
diff --git a/src/libs/compat/openbsd_network/compat/sys/_null.h 
b/src/libs/compat/openbsd_network/compat/sys/_null.h
new file mode 100644
index 0000000000..11dd5e6b37
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/_null.h
@@ -0,0 +1 @@
+#include <null.h>
diff --git a/src/libs/compat/openbsd_network/compat/sys/device.h 
b/src/libs/compat/openbsd_network/compat/sys/device.h
new file mode 100644
index 0000000000..fc1ea43d89
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/device.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_SYS_DEVICE_H_
+#define _OBSD_COMPAT_SYS_DEVICE_H_
+
+
+#include <sys/firmware.h>
+
+
+static inline int
+loadfirmware(const char *name, u_char **bufp, size_t *buflen)
+{
+       struct firmware* fw = firmware_get(name);
+       if (fw == NULL)
+               return -1;
+
+       *bufp = fw->data;
+       *buflen = fw->datasize;
+
+       // Caller takes ownership of data.
+       fw->data = NULL;
+       firmware_put(fw, 0);
+       return 0;
+}
+
+
+#endif /* _OBSD_COMPAT_SYS_DEVICE_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/sys/endian.h 
b/src/libs/compat/openbsd_network/compat/sys/endian.h
new file mode 100644
index 0000000000..bdc3a7b8cb
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/endian.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_SYS_ENDIAN_H_
+#define _OBSD_COMPAT_SYS_ENDIAN_H_
+
+
+#include_next <sys/endian.h>
+
+
+/* original BSD names */
+#define betoh16(x)     be16toh(x)
+#define betoh32(x)     be32toh(x)
+#define betoh64(x)     be64toh(x)
+#define letoh16(x)     le16toh(x)
+#define letoh32(x)     le32toh(x)
+#define letoh64(x)     le64toh(x)
+
+#define swap16(x)      bswap16(x)
+#define swap32(x)      bswap32(x)
+#define swap64(x)      bswap64(x)
+
+
+#endif /* _OBSD_COMPAT_SYS_ENDIAN_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/sys/malloc.h 
b/src/libs/compat/openbsd_network/compat/sys/malloc.h
new file mode 100644
index 0000000000..eae11040c1
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/malloc.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_SYS_MALLOC_H_
+#define _OBSD_COMPAT_SYS_MALLOC_H_
+
+
+#include_next <sys/malloc.h>
+
+
+#define malloc(size, base, flags)      kernel_malloc(size, base, flags)
+#define free(addr, type, freedsize) _kernel_free(addr)
+
+
+#define M_CANFAIL (0)
+
+
+#endif /* _OBSD_COMPAT_SYS_MALLOC_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/sys/mbuf-obsd.h 
b/src/libs/compat/openbsd_network/compat/sys/mbuf-obsd.h
new file mode 100644
index 0000000000..3f61fcef2c
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/mbuf-obsd.h
@@ -0,0 +1,356 @@
+/*     $OpenBSD: uipc_mbuf.c,v 1.283 2022/02/22 01:15:01 guenther Exp $        
*/
+/*     $NetBSD: uipc_mbuf.c,v 1.15.4.1 1996/06/13 17:11:44 cgd Exp $   */
+
+/*
+ * Copyright (c) 1982, 1986, 1988, 1991, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94
+ */
+
+/*
+ *     @(#)COPYRIGHT   1.1 (NRL) 17 January 1995
+ *
+ * NRL grants permission for redistribution and use in source and binary
+ * forms, with or without modification, of the software and documentation
+ * created at NRL provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgements:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ *     This product includes software developed at the Information
+ *     Technology Division, US Naval Research Laboratory.
+ * 4. Neither the name of the NRL nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THE SOFTWARE PROVIDED BY NRL IS PROVIDED BY NRL AND CONTRIBUTORS ``AS
+ * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL NRL OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * official policies, either expressed or implied, of the US Naval
+ * Research Laboratory (NRL).
+ */
+
+#define        mq_len(_mq)             ml_len(&(_mq)->mq_list)
+#define        mq_empty(_mq)           ml_empty(&(_mq)->mq_list)
+#define        mq_full(_mq)            (mq_len((_mq)) >= (_mq)->mq_maxlen)
+#define        mq_drops(_mq)           ((_mq)->mq_drops)
+#define        mq_set_maxlen(_mq, _l)  ((_mq)->mq_maxlen = (_l))
+
+static struct mbuf *
+m_dup_pkt(struct mbuf *m0, unsigned int adj, int wait)
+{
+       struct mbuf *m;
+       int len;
+
+       KASSERT(m0->m_flags & M_PKTHDR);
+
+       len = m0->m_pkthdr.len + adj;
+       if (len > MAXMCLBYTES) /* XXX */
+               return (NULL);
+
+       m = m_get(wait, m0->m_type);
+       if (m == NULL)
+               return (NULL);
+
+       if (m_dup_pkthdr(m, m0, wait) != 0)
+               goto fail;
+
+       if (len > MHLEN) {
+               MCLGETL(m, wait, len);
+               if (!ISSET(m->m_flags, M_EXT))
+                       goto fail;
+       }
+
+       m->m_len = m->m_pkthdr.len = len;
+       m_adj(m, adj);
+       m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, caddr_t));
+
+       return (m);
+
+fail:
+       m_freem(m);
+       return (NULL);
+}
+
+
+/*
+ * Compute the amount of space available after the end of data in an mbuf.
+ * Read-only clusters never have space available.
+ */
+static int
+m_trailingspace(struct mbuf *m)
+{
+       if (M_READONLY(m))
+               return 0;
+       KASSERT(M_DATABUF(m) + M_SIZE(m) >= (m->m_data + m->m_len));
+       return M_DATABUF(m) + M_SIZE(m) - (m->m_data + m->m_len);
+}
+
+
+static void
+ml_init(struct mbuf_list *ml)
+{
+       ml->ml_head = ml->ml_tail = NULL;
+       ml->ml_len = 0;
+}
+
+static void
+ml_enqueue(struct mbuf_list *ml, struct mbuf *m)
+{
+       if (ml->ml_tail == NULL)
+               ml->ml_head = ml->ml_tail = m;
+       else {
+               ml->ml_tail->m_nextpkt = m;
+               ml->ml_tail = m;
+       }
+
+       m->m_nextpkt = NULL;
+       ml->ml_len++;
+}
+
+static void
+ml_enlist(struct mbuf_list *mla, struct mbuf_list *mlb)
+{
+       if (!ml_empty(mlb)) {
+               if (ml_empty(mla))
+                       mla->ml_head = mlb->ml_head;
+               else
+                       mla->ml_tail->m_nextpkt = mlb->ml_head;
+               mla->ml_tail = mlb->ml_tail;
+               mla->ml_len += mlb->ml_len;
+
+               ml_init(mlb);
+       }
+}
+
+static struct mbuf *
+ml_dequeue(struct mbuf_list *ml)
+{
+       struct mbuf *m;
+
+       m = ml->ml_head;
+       if (m != NULL) {
+               ml->ml_head = m->m_nextpkt;
+               if (ml->ml_head == NULL)
+                       ml->ml_tail = NULL;
+
+               m->m_nextpkt = NULL;
+               ml->ml_len--;
+       }
+
+       return (m);
+}
+
+static struct mbuf *
+ml_dechain(struct mbuf_list *ml)
+{
+       struct mbuf *m0;
+
+       m0 = ml->ml_head;
+
+       ml_init(ml);
+
+       return (m0);
+}
+
+static unsigned int
+ml_purge(struct mbuf_list *ml)
+{
+       struct mbuf *m, *n;
+       unsigned int len;
+
+       for (m = ml->ml_head; m != NULL; m = n) {
+               n = m->m_nextpkt;
+               m_freem(m);
+       }
+
+       len = ml->ml_len;
+       ml_init(ml);
+
+       return (len);
+}
+
+static unsigned int
+ml_hdatalen(struct mbuf_list *ml)
+{
+       struct mbuf *m;
+
+       m = ml->ml_head;
+       if (m == NULL)
+               return (0);
+
+       KASSERT(ISSET(m->m_flags, M_PKTHDR));
+       return (m->m_pkthdr.len);
+}
+
+
+/*
+ * mbuf queues
+ */
+
+static void
+mq_init(struct mbuf_queue *mq, u_int maxlen, int ipl)
+{
+       mtx_init(&mq->mq_mtx, ipl);
+       ml_init(&mq->mq_list);
+       mq->mq_maxlen = maxlen;
+}
+
+static int
+mq_push(struct mbuf_queue *mq, struct mbuf *m)
+{
+       struct mbuf *dropped = NULL;
+
+       mtx_enter(&mq->mq_mtx);
+       if (mq_len(mq) >= mq->mq_maxlen) {
+               mq->mq_drops++;
+               dropped = ml_dequeue(&mq->mq_list);
+       }
+       ml_enqueue(&mq->mq_list, m);
+       mtx_leave(&mq->mq_mtx);
+
+       if (dropped)
+               m_freem(dropped);
+
+       return (dropped != NULL);
+}
+
+static int
+mq_enqueue(struct mbuf_queue *mq, struct mbuf *m)
+{
+       int dropped = 0;
+
+       mtx_enter(&mq->mq_mtx);
+       if (mq_len(mq) < mq->mq_maxlen)
+               ml_enqueue(&mq->mq_list, m);
+       else {
+               mq->mq_drops++;
+               dropped = 1;
+       }
+       mtx_leave(&mq->mq_mtx);
+
+       if (dropped)
+               m_freem(m);
+
+       return (dropped);
+}
+
+static struct mbuf *
+mq_dequeue(struct mbuf_queue *mq)
+{
+       struct mbuf *m;
+
+       mtx_enter(&mq->mq_mtx);
+       m = ml_dequeue(&mq->mq_list);
+       mtx_leave(&mq->mq_mtx);
+
+       return (m);
+}
+
+static int
+mq_enlist(struct mbuf_queue *mq, struct mbuf_list *ml)
+{
+       struct mbuf *m;
+       int dropped = 0;
+
+       mtx_enter(&mq->mq_mtx);
+       if (mq_len(mq) < mq->mq_maxlen)
+               ml_enlist(&mq->mq_list, ml);
+       else {
+               dropped = ml_len(ml);
+               mq->mq_drops += dropped;
+       }
+       mtx_leave(&mq->mq_mtx);
+
+       if (dropped) {
+               while ((m = ml_dequeue(ml)) != NULL)
+                       m_freem(m);
+       }
+
+       return (dropped);
+}
+
+static void
+mq_delist(struct mbuf_queue *mq, struct mbuf_list *ml)
+{
+       mtx_enter(&mq->mq_mtx);
+       *ml = mq->mq_list;
+       ml_init(&mq->mq_list);
+       mtx_leave(&mq->mq_mtx);
+}
+
+static struct mbuf *
+mq_dechain(struct mbuf_queue *mq)
+{
+       struct mbuf *m0;
+
+       mtx_enter(&mq->mq_mtx);
+       m0 = ml_dechain(&mq->mq_list);
+       mtx_leave(&mq->mq_mtx);
+
+       return (m0);
+}
+
+static unsigned int
+mq_purge(struct mbuf_queue *mq)
+{
+       struct mbuf_list ml;
+
+       mq_delist(mq, &ml);
+
+       return (ml_purge(&ml));
+}
+
+static unsigned int
+mq_hdatalen(struct mbuf_queue *mq)
+{
+       unsigned int hdatalen;
+
+       mtx_enter(&mq->mq_mtx);
+       hdatalen = ml_hdatalen(&mq->mq_list);
+       mtx_leave(&mq->mq_mtx);
+
+       return (hdatalen);
+}
diff --git a/src/libs/compat/openbsd_network/compat/sys/mbuf.h 
b/src/libs/compat/openbsd_network/compat/sys/mbuf.h
new file mode 100644
index 0000000000..207625c9d0
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/mbuf.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_SYS_MBUF_H_
+#define _OBSD_COMPAT_SYS_MBUF_H_
+
+#include <sys/systm.h>
+
+/* FreeBSD KASSERT */
+#undef KASSERT
+#define KASSERT KASSERT_FREEBSD
+
+#include_next <sys/mbuf.h>
+
+/* back to OpenBSD KASSERT */
+#undef KASSERT
+#define KASSERT KASSERT_OPENBSD
+
+#include <sys/mutex.h>
+
+
+#define ph_cookie PH_loc.ptr
+
+#define M_READONLY(m) (0)
+#define M_DATABUF(m)   ((m)->m_flags & M_EXT ? (m)->m_ext.ext_buf : \
+                       (m)->m_flags & M_PKTHDR ? (m)->m_pktdat : (m)->m_dat)
+
+#define MAXMCLBYTES MJUM16BYTES
+
+#define MCLGETL m_cljget
+
+struct mbuf_list {
+       struct mbuf             *ml_head;
+       struct mbuf             *ml_tail;
+       u_int                   ml_len;
+};
+
+#define MBUF_LIST_INITIALIZER() { NULL, NULL, 0 }
+#define        ml_len(_ml)             ((_ml)->ml_len)
+#define        ml_empty(_ml)           ((_ml)->ml_len == 0)
+
+struct mbuf_queue {
+       struct mutex            mq_mtx;
+       struct mbuf_list        mq_list;
+       u_int                   mq_maxlen;
+       u_int                   mq_drops;
+};
+
+
+/* FreeBSD methods not compatible with their OpenBSD counterparts */
+#define m_defrag(mbuf, how) __m_defrag_unimplemented()
+
+
+#include "mbuf-obsd.h"
+
+
+#endif /* _OBSD_COMPAT_SYS_MBUF_H_ */
diff --git a/src/libs/compat/openbsd_network/compat/sys/mutex.h 
b/src/libs/compat/openbsd_network/compat/sys/mutex.h
new file mode 100644
index 0000000000..97fc4f87f6
--- /dev/null
+++ b/src/libs/compat/openbsd_network/compat/sys/mutex.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2022, Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _OBSD_COMPAT_SYS_MUTEX_H_
+#define _OBSD_COMPAT_SYS_MUTEX_H_
+
+

[ *** diff truncated: 537 lines dropped *** ]


############################################################################

Commit:      04171cfc5c10c98b9ba3c7233a271f6165cdd36f
URL:         https://git.haiku-os.org/haiku/commit/?id=04171cfc5c10
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Wed Apr 27 01:02:41 2022 UTC

openbsd_wlan: Import OpenBSD net80211 layer and base dependencies.

Not yet wired into the build, of course.

----------------------------------------------------------------------------

############################################################################

Commit:      d87dd30a38b6352c5a7c77380e9c6e94d3536ea9
URL:         https://git.haiku-os.org/haiku/commit/?id=d87dd30a38b6
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 02:42:34 2022 UTC

idualwifi7260: Delete FreeBSD driver, import OpenBSD driver.

Again not wired into the build, nor yet modified in any way.

----------------------------------------------------------------------------

############################################################################

Commit:      27a20680c56686a6cd34679c5928edf29e29ef95
URL:         https://git.haiku-os.org/haiku/commit/?id=27a20680c566
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Mon Jun  6 20:58:50 2022 UTC

iaxwifi200: Import ("iwx" from OpenBSD.)

Not yet modified to build nor wired into the build yet.

----------------------------------------------------------------------------

############################################################################

Commit:      eb5614660373cb78fade90f545b9e614884b7b0e
URL:         https://git.haiku-os.org/haiku/commit/?id=eb5614660373
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Fri May 13 03:05:26 2022 UTC

openbsd_wlan: Basic adaptations to the net80211 layer.

The stack now compiles and links. Combining this with adaptations to
the driver gets things to the point where it runs scans, but we do
not yet implement ioctls so they can be returned to userland.

----------------------------------------------------------------------------

############################################################################

Commit:      fba0315889f944a23c353aa7e979f21b59a2c741
URL:         https://git.haiku-os.org/haiku/commit/?id=fba0315889f9
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 02:52:31 2022 UTC

idualwifi7260 & iaxwifi200: Adaptations for FreeBSD/Haiku support.

Mostly a few #ifdefs for the dmamem API, if_alloc, probe, and attach hooks.
Basically the same changes in both drivers.

The firmware name map is not really needed anymore; the OpenBSD drivers
have unique firmware names and do not generally use ".ucode" extensions.
So just use the filenames as-is and drop the map.

----------------------------------------------------------------------------

############################################################################

Commit:      bcb089f6c3e917d9c04d6dbae165db13444330e7
URL:         https://git.haiku-os.org/haiku/commit/?id=bcb089f6c3e9
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 03:03:31 2022 UTC

openbsd_wlan (and FreeBSD ieee80211_ioctl.h): Initial ioctl compatibility.

 * Introduce IEEE80211_IOCTLS_ABBREVIATED to FreeBSD's ieee80211_ioctl.h,
   so that the FreeBSD header can be included along with the OpenBSD
   net80211 stack without triggering lots of errors, so we can use
   these structs in openbsd_wlan ieee80211_haiku.cpp.

 * Implement basic ieee80211req handling machinery. We aren't going
   to handle anything but SIOCG80211 and SIOCS80211 in this method,
   so we can simplify it a bit at the same time.

 * Implement IEEE80211_IOC_SCAN_RESULTS to return scan results from
   the OpenBSD WiFi stack in FreeBSD ioctl format.

   This change adds two minor "features" (noted with #ifdefs) to the
   OpenBSD net80211 stack: one to specify what node index to return
   when returning known nodes (scan results), as this way we do not
   have to allocate a huge buffer to store the scan results in before
   sending them back to userland, but can instead get and convert
   a single one at a time.

   (We store the converted values in kernel mode all at once, though,
    so this is not as efficient as it could be. More improvement possible.)

 * Implement IEEE80211_IOC_BSSID and IEEE80211_IOC_SSID while we are at it.
   This actually may make joining open networks possible, but I didn't
   really test it. (They are used with SIOCG80211 to see what network
   the device is currently connecting/connected to.)

----------------------------------------------------------------------------

############################################################################

Commit:      7cb5a6d24f9c5e79117e3be745392d1a73c27cbe
URL:         https://git.haiku-os.org/haiku/commit/?id=7cb5a6d24f9c
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 03:14:01 2022 UTC

NetworkDevice.h: Make it possible to include from _KERNEL_MODE and/or non-C++.

This file contains a set of constants and flags which are already passed
between applications, net_server, and wpa_supplicant to indicate network
security, connection modes, and a variety of other things.

As the OpenBSD net80211 stack does not need wpa_supplicant for WPA2/PSK,
it only makes sense that we would pass the same information we pass
to wpa_supplicant into the stack instead. Rather than expose yet another
set of constants and flags to userland besides the FreeBSD and these
Haiku native ones, just make it so this file can be included in the kernel,
and the constants thus used directly.

----------------------------------------------------------------------------

############################################################################

Commit:      2f7936a6832dbdb1b54c41bc6b448970bb6f3329
URL:         https://git.haiku-os.org/haiku/commit/?id=2f7936a6832d
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 03:14:18 2022 UTC

openbsd_wlan: Add a Haiku-specific "FreeBSD-style" ioctl for joining networks.

In the long run it may make more sense to have Haiku-style ioctls for
this purpose, but since we are currently coexisting with FreeBSD-style
ioctls, just add this as another FreeBSD-style ioctl for now (we already
have two custom ones anyway.)

This ioctl pretty much just consists of the same parameters we pass
to wpa_supplicant using the Haiku-specific constants already, with one
notable difference: the PSK must be in proper WPA format, i.e. already
hashed. Hence we will submit this ioctl, for now, from our own code in
our wpa_supplicant port.

WPS is not implemented in this commit, but it could be if someone actually
needs to connect to WPS networks for some reason...

Tested and verified as working along with the wpa_supplicant changes.

----------------------------------------------------------------------------

############################################################################

Commit:      ea7c83079088ff327413ed4df1035a4ef04a5067
URL:         https://git.haiku-os.org/haiku/commit/?id=ea7c83079088
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 03:40:38 2022 UTC

openbsd_wlan: Implement IEEE80211_IOC_MLME for leaving networks.

----------------------------------------------------------------------------

############################################################################

Revision:    hrev56168
Commit:      5a4ad3a00df5c62d521e9b97262ead5f93d91682
URL:         https://git.haiku-os.org/haiku/commit/?id=5a4ad3a00df5
Author:      Augustin Cavalier <waddlesplash@xxxxxxxxx>
Date:        Thu Jun  9 05:01:28 2022 UTC

openbsd_wlan: Print state changes if bootverbose is enabled.

This will make debugging in nightly syslogs a bit easier when things
do not work as expected.

----------------------------------------------------------------------------



Other related posts:

  • » [haiku-commits] haiku: hrev56168 - in src: libs/compat/openbsd_wlan/net80211 add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/iwm add-ons/kernel/drivers/network/wlan/idualwifi7260/dev/pci add-ons/kernel/drivers/network/wlan/iaxwifi200/dev/pci libs/compat - waddlesplash