Expand linux-kpi wireless and networking scaffolding

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-17 00:03:08 +01:00
parent 7126a76f54
commit e2d2fd138c
25 changed files with 1655 additions and 42 deletions
@@ -1,7 +1,7 @@
#ifndef _LINUX_ATOMIC_H
#define _LINUX_ATOMIC_H
#include <linux/types.h>
#include "types.h"
typedef struct {
volatile int counter;
@@ -26,6 +26,8 @@
#define ERANGE 34
#define ENOSYS 38
#define ENODATA 61
#define ENOSPC 28
#define ENOTCONN 107
#define ENOTSUP 95
#define ETIMEDOUT 110
@@ -7,14 +7,21 @@
#define IEEE80211_NUM_ACS 4
struct ieee80211_channel {
u32 band;
u16 center_freq;
u16 hw_value;
u32 flags;
s8 max_power;
s8 max_reg_power;
s8 max_antenna_gain;
bool beacon_found;
};
struct ieee80211_rate {
u32 flags;
u16 bitrate;
u16 hw_value;
u16 hw_value_short;
};
#endif
@@ -14,8 +14,9 @@ extern int irqs_disabled(void);
static inline int in_interrupt(void) { return irqs_disabled(); }
static inline int in_irq(void) { return irqs_disabled(); }
#define disable_irq_nosync(irq) ((void)(irq))
#define enable_irq(irq) ((void)(irq))
extern void disable_irq(unsigned int irq);
extern void disable_irq_nosync(unsigned int irq);
extern void enable_irq(unsigned int irq);
#define IRQF_NO_SUSPEND 0x0000U
#define IRQF_FORCE_RESUME 0x0000U
@@ -1,8 +1,8 @@
#ifndef _LINUX_KERNEL_H
#define _LINUX_KERNEL_H
#include <linux/compiler.h>
#include <linux/types.h>
#include "compiler.h"
#include "types.h"
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>
@@ -20,6 +20,13 @@ struct net_device {
size_t __priv_alloc_align;
};
struct napi_struct {
int (*poll)(struct napi_struct *napi, int budget);
struct net_device *dev;
int state;
int weight;
};
extern struct net_device *alloc_netdev_mqs(size_t sizeof_priv,
const char *name,
unsigned char name_assign_type,
@@ -32,5 +39,13 @@ extern void unregister_netdev(struct net_device *dev);
extern void netif_carrier_on(struct net_device *dev);
extern void netif_carrier_off(struct net_device *dev);
extern int netif_carrier_ok(const struct net_device *dev);
extern void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
int (*poll)(struct napi_struct *napi, int budget), int weight);
extern void napi_schedule(struct napi_struct *napi);
extern int napi_complete_done(struct napi_struct *napi, int work_done);
extern void netif_tx_wake_queue(struct net_device *dev, u16 queue_idx);
extern void netif_tx_stop_queue(struct net_device *dev, u16 queue_idx);
extern void netif_device_attach(struct net_device *dev);
extern void netif_device_detach(struct net_device *dev);
#endif
@@ -9,6 +9,12 @@ enum nl80211_iftype {
NL80211_IFTYPE_MONITOR = 6,
};
enum nl80211_band {
NL80211_BAND_2GHZ = 0,
NL80211_BAND_5GHZ = 1,
NL80211_BAND_6GHZ = 2,
};
enum nl80211_commands {
NL80211_CMD_UNSPEC = 0,
NL80211_CMD_TRIGGER_SCAN = 33,
@@ -23,7 +23,7 @@ struct pci_device_id {
u32 device;
u32 subvendor;
u32 subdevice;
u32 class;
u32 class_code;
u32 class_mask;
unsigned long driver_data;
};
@@ -52,6 +52,12 @@ struct pci_driver {
void (*shutdown)(struct pci_dev *dev);
};
struct msix_entry {
u32 vector;
u16 entry;
u16 _pad;
};
extern int pci_enable_device(struct pci_dev *dev);
extern void pci_disable_device(struct pci_dev *dev);
extern void pci_set_master(struct pci_dev *dev);
@@ -60,6 +66,8 @@ extern void pci_free_irq_vectors(struct pci_dev *dev);
extern int pci_irq_vector(struct pci_dev *dev, unsigned int nr);
extern int pci_enable_msi(struct pci_dev *dev);
extern void pci_disable_msi(struct pci_dev *dev);
extern int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec, int maxvec);
extern void pci_disable_msix(struct pci_dev *dev);
extern void *pci_iomap(struct pci_dev *dev, unsigned int bar, size_t max_len);
extern void pci_iounmap(struct pci_dev *dev, void *addr, size_t size);
@@ -70,6 +78,20 @@ extern int pci_write_config_dword(struct pci_dev *dev, unsigned int offset, u32
extern u64 pci_resource_start(struct pci_dev *dev, unsigned int bar);
extern u64 pci_resource_len(struct pci_dev *dev, unsigned int bar);
extern u64 pci_get_quirk_flags(struct pci_dev *dev);
extern bool pci_has_quirk(struct pci_dev *dev, u64 flag);
#define PCI_QUIRK_NO_MSI (1ULL << 0)
#define PCI_QUIRK_NO_MSIX (1ULL << 1)
#define PCI_QUIRK_FORCE_LEGACY (1ULL << 2)
#define PCI_QUIRK_NO_PM (1ULL << 3)
#define PCI_QUIRK_NO_D3COLD (1ULL << 4)
#define PCI_QUIRK_NO_ASPM (1ULL << 5)
#define PCI_QUIRK_NEED_IOMMU (1ULL << 6)
#define PCI_QUIRK_DMA_32BIT_ONLY (1ULL << 8)
#define PCI_QUIRK_NEED_FIRMWARE (1ULL << 11)
#define PCI_QUIRK_DISABLE_ACCEL (1ULL << 12)
extern int pci_register_driver(struct pci_driver *drv);
extern void pci_unregister_driver(struct pci_driver *drv);
@@ -17,6 +17,7 @@ struct sk_buff_head {
struct sk_buff *next;
struct sk_buff *prev;
u32 qlen;
unsigned char lock;
};
extern struct sk_buff *alloc_skb(unsigned int size, gfp_t gfp_mask);
@@ -32,10 +33,14 @@ extern void skb_queue_head_init(struct sk_buff_head *list);
extern void skb_queue_tail(struct sk_buff_head *list, struct sk_buff *newsk);
extern struct sk_buff *skb_dequeue(struct sk_buff_head *list);
extern void skb_queue_purge(struct sk_buff_head *list);
extern struct sk_buff *skb_peek(const struct sk_buff_head *list);
extern u32 skb_queue_len(const struct sk_buff_head *list);
extern int skb_queue_empty(const struct sk_buff_head *list);
extern struct sk_buff *__netdev_alloc_skb(struct net_device *dev, u32 length, gfp_t gfp_mask);
#define dev_alloc_skb(length) __netdev_alloc_skb(NULL, length, GFP_KERNEL)
extern struct sk_buff *skb_copy(const struct sk_buff *src, gfp_t gfp);
extern struct sk_buff *skb_clone(const struct sk_buff *skb, gfp_t gfp);
extern void skb_set_network_header(struct sk_buff *skb, int offset);
extern void skb_reset_mac_header(struct sk_buff *skb);
#endif
@@ -1,7 +1,7 @@
#ifndef _LINUX_SLAB_H
#define _LINUX_SLAB_H
#include <linux/types.h>
#include "types.h"
#include <stddef.h>
#define GFP_KERNEL 0U
@@ -19,7 +19,11 @@ static inline void init_waitqueue_head(struct wait_queue_head *wq)
do { while (!(condition)) { __asm__ volatile("pause"); } } while(0)
#define wait_event_timeout(wq, condition, timeout) \
({ (void)(wq); (condition) ? 1 : 0; })
({ (void)(wq); unsigned long _deadline = jiffies + (timeout); \
int _ret = 0; \
while (!(_ret = !!(condition)) && time_before(jiffies, _deadline)) { \
__asm__ volatile("pause"); \
} _ret; })
#define wait_event_interruptible(wq, condition) \
({ (void)(wq); (condition) ? 0 : -512; })
@@ -51,6 +51,17 @@ struct key_params {
const u8 *key;
u8 key_len;
u32 cipher;
u8 key_idx;
};
struct cfg80211_bss {
u8 bssid[6];
struct ieee80211_channel *channel;
s16 signal;
u16 capability;
u16 beacon_interval;
const u8 *ies;
size_t ies_len;
};
struct cfg80211_connect_params {
@@ -99,9 +110,11 @@ extern void cfg80211_connect_bss(struct net_device *dev,
u16 status,
gfp_t gfp);
extern void cfg80211_new_sta(struct net_device *dev, const u8 *mac_addr,
struct station_parameters *params, gfp_t gfp);
struct station_parameters *params, gfp_t gfp);
extern void cfg80211_rx_mgmt(struct wireless_dev *wdev, u32 freq, int sig_dbm,
const u8 *buf, size_t len, gfp_t gfp);
const u8 *buf, size_t len, gfp_t gfp);
extern void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
const u8 *buf, size_t len, bool ack, gfp_t gfp);
extern void cfg80211_sched_scan_results(struct wiphy *wiphy, u64 reqid);
extern void cfg80211_ready_on_channel(struct wireless_dev *wdev,
u64 cookie,
@@ -109,5 +122,19 @@ extern void cfg80211_ready_on_channel(struct wireless_dev *wdev,
u32 chan_type,
u32 duration,
gfp_t gfp);
extern u32 ieee80211_channel_to_frequency(u32 chan, u32 band);
extern u32 ieee80211_frequency_to_channel(u32 freq);
extern struct cfg80211_bss *cfg80211_inform_bss(struct wiphy *wiphy,
struct wireless_dev *wdev,
u32 freq,
const u8 *bssid,
u64 tsf,
u16 capability,
u16 beacon_interval,
const u8 *ie,
size_t ielen,
int signal,
gfp_t gfp);
extern void cfg80211_put_bss(struct cfg80211_bss *bss);
#endif
@@ -9,6 +9,7 @@
struct ieee80211_hw {
struct wiphy *wiphy;
const struct ieee80211_ops *ops;
void *priv;
int registered;
u32 extra_tx_headroom;
@@ -32,6 +33,25 @@ struct ieee80211_bss_conf {
bool assoc;
u16 aid;
u16 beacon_int;
u8 bssid[6];
u32 basic_rates;
u8 bandwidth;
struct {
u32 center_freq;
u16 band;
void *channel;
} chandef;
};
struct ieee80211_rx_status {
u16 freq;
u32 band;
s8 signal;
s8 noise;
u8 rate_idx;
u32 flag;
u8 antenna;
u32 rx_flags;
};
enum ieee80211_sta_state {
@@ -62,8 +82,13 @@ struct ieee80211_ops {
int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
struct ieee80211_vif *vif, struct ieee80211_sta *sta,
struct key_params *key);
int (*ampdu_action)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, u16 action, u16 tid, u16 ssn);
void (*sw_scan_start)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, const u8 *mac_addr);
void (*sw_scan_complete)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
u64 (*prepare_multicast)(struct ieee80211_hw *hw, void *mc_list);
void (*configure_filter)(struct ieee80211_hw *hw, u32 changed_flags,
u32 *total_flags, u64 multicast);
int (*sched_scan_start)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, void *req);
void (*sched_scan_stop)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
};
@@ -87,6 +112,11 @@ extern void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted);
extern void ieee80211_connection_loss(struct ieee80211_vif *vif);
extern int ieee80211_start_tx_ba_session(struct ieee80211_sta *sta, u16 tid, u16 timeout);
extern int ieee80211_stop_tx_ba_session(struct ieee80211_sta *sta, u16 tid);
extern int ieee80211_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ieee80211_sta *sta, u32 old_state, u32 new_state);
extern struct ieee80211_sta *ieee80211_find_sta(struct ieee80211_hw *hw, const u8 *addr);
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);
#endif