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,
®, 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.
----------------------------------------------------------------------------