From 46abc404a2ebffa8a09c58da7d34110fda165a24 Mon Sep 17 00:00:00 2001 From: vasilito Date: Mon, 3 Aug 2026 16:28:40 +0300 Subject: [PATCH] libinput, linux-kpi, iwlwifi: remove a shadowing header, add missing prototypes Three defects that were latent until GCC 14+ made implicit declarations and pointer-type mismatches errors. None was a missing implementation -- in every case the code existed and only the declaration was wrong. libinput Carried its own bundled libudev.h that shadowed the real one from the libudev recipe, which it already declares as a dependency. The bundled copy lacked udev_device_get_sysattr_value(), so udev/libinput-device- group.c got an implicit declaration and then an int-to-pointer assignment. The real header is a strict superset -- nothing is declared in the bundled copy that the real one lacks -- so the bundled file is dead code that shadows a real implementation, which LOCAL-FORK-SUPREMACY-POLICY.md Rule 4 requires removing. linux-kpi ieee80211_register_rx_handler() is fully implemented in src/rust_impl/mac80211.rs as #[no_mangle] extern "C", and ieee80211_rx_drain()'s own doc comment refers to it, but it was never declared in c_headers/net/mac80211.h. Declared it. redbear-iwlwifi - rb_iwlwifi_bridge_register_rx() is used ~1800 lines before its definition with no forward declaration. Added one at file scope. - bridge_rx_callback was declared here as taking void *hw, while its Rust definition in src/bridge/callback.rs takes *mut Ieee80211Hw and linux-kpi's RxCallback type expects struct ieee80211_hw *. The C declaration was simply wrong; corrected to match the implementation. All three cook clean. --- .../source/src/c_headers/net/mac80211.h | 7 ++ .../redbear-iwlwifi/source/src/linux_port.c | 12 +++- local/recipes/libs/libinput/source/libudev.h | 65 ------------------- 3 files changed, 18 insertions(+), 66 deletions(-) delete mode 100644 local/recipes/libs/libinput/source/libudev.h diff --git a/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h b/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h index 84c6083f17..23983c0e74 100644 --- a/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h +++ b/local/recipes/drivers/linux-kpi/source/src/c_headers/net/mac80211.h @@ -289,6 +289,13 @@ extern struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_hw *hw, const u extern void ieee80211_beacon_loss(struct ieee80211_vif *vif); extern void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb); extern size_t ieee80211_rx_drain(struct ieee80211_hw *hw); +/* Implemented in src/rust_impl/mac80211.rs (#[no_mangle] extern "C"). + Registers a per-hw callback that ieee80211_rx_drain() delivers frames to + instead of logging and freeing them. The declaration was missing, so C + callers got an implicit declaration -- fatal from GCC 14 on. */ +extern void ieee80211_register_rx_handler(struct ieee80211_hw *hw, + void (*callback)(struct ieee80211_hw *hw, + struct sk_buff *skb)); extern void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb); extern void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue); extern void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue); diff --git a/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c b/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c index 27c0d04629..6e93083348 100644 --- a/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c +++ b/local/recipes/drivers/redbear-iwlwifi/source/src/linux_port.c @@ -30,6 +30,11 @@ #include #include + +/* Defined further down in this file; declared here because the first use + precedes the definition by ~1800 lines and an implicit declaration is + an error from GCC 14 on. */ +void rb_iwlwifi_bridge_register_rx(struct ieee80211_hw *hw); // Known gaps vs Linux 7.1 iwlwifi (drivers/net/wireless/intel/iwlwifi/): // Mini-MVM present (linux_mvm.c) — RW descriptor parsing, signal extraction, // firmware TLV metadata, Minstrel rate adaptation, thermal management @@ -2684,7 +2689,12 @@ int rb_iwlwifi_register_mac80211(struct pci_dev *dev, char *out, unsigned long o /* ── Bridge registration and TX submission ──────────────────── */ /* Rust callback: bridge/src/callback.rs */ -extern void bridge_rx_callback(void *hw, struct sk_buff *skb); +/* Implemented in src/bridge/callback.rs as + unsafe extern "C" fn bridge_rx_callback(*mut Ieee80211Hw, *mut SkBuff) + The first parameter was declared `void *` here, which does not match the + RxCallback type ieee80211_register_rx_handler() takes; GCC 14+ rejects the + mismatch outright rather than warning. */ +extern void bridge_rx_callback(struct ieee80211_hw *hw, struct sk_buff *skb); /* Last registered hw (for TX submission from Rust). */ static struct ieee80211_hw *rb_iwlwifi_bridge_hw; diff --git a/local/recipes/libs/libinput/source/libudev.h b/local/recipes/libs/libinput/source/libudev.h deleted file mode 100644 index cee240d800..0000000000 --- a/local/recipes/libs/libinput/source/libudev.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef LIBINPUT_LIBUDEV_SHIM_H -#define LIBINPUT_LIBUDEV_SHIM_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct udev; -struct udev_device; -struct udev_enumerate; -struct udev_list_entry; -struct udev_monitor; - -struct udev *udev_new(void); -struct udev *udev_ref(struct udev *udev); -struct udev *udev_unref(struct udev *udev); - -struct udev *udev_device_get_udev(struct udev_device *udev_device); -struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum); -struct udev_device *udev_device_new_from_syspath(struct udev *udev, const char *syspath); -struct udev_device *udev_device_ref(struct udev_device *udev_device); -struct udev_device *udev_device_unref(struct udev_device *udev_device); -const char *udev_device_get_action(struct udev_device *udev_device); -const char *udev_device_get_devnode(struct udev_device *udev_device); -int udev_device_get_is_initialized(struct udev_device *udev_device); -struct udev_device *udev_device_get_parent(struct udev_device *udev_device); -struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device, - const char *subsystem, - const char *devtype); -struct udev_list_entry *udev_device_get_properties_list_entry(struct udev_device *udev_device); -const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key); -const char *udev_device_get_sysname(struct udev_device *udev_device); -const char *udev_device_get_syspath(struct udev_device *udev_device); - -struct udev_enumerate *udev_enumerate_new(struct udev *udev); -struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate); -int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, - const char *subsystem); -struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate); -int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate); - -const char *udev_list_entry_get_name(struct udev_list_entry *list_entry); -struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry); -const char *udev_list_entry_get_value(struct udev_list_entry *list_entry); - -#define udev_list_entry_foreach(list_entry, first_entry) \ - for ((list_entry) = (first_entry); (list_entry) != NULL; \ - (list_entry) = udev_list_entry_get_next(list_entry)) - -struct udev_monitor *udev_monitor_new_from_netlink(struct udev *udev, const char *name); -struct udev_monitor *udev_monitor_unref(struct udev_monitor *udev_monitor); -int udev_monitor_enable_receiving(struct udev_monitor *udev_monitor); -int udev_monitor_filter_add_match_subsystem_devtype(struct udev_monitor *udev_monitor, - const char *subsystem, - const char *devtype); -int udev_monitor_get_fd(struct udev_monitor *udev_monitor); -struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monitor); - -#ifdef __cplusplus -} -#endif - -#endif