feat(wlan): DKM wlan driver framework + net connect/disconnect ABI extension

- wlan.drv: multi-vendor PCI probe (class 02:80; Intel AX2xx/Realtek/Atheros ath9k/Broadcom), registers wireless netdev when real hw present (attest net_wlan)
- scan/connect/disconnect: strict panic skeletons (NETWL-E10/E11/E12) until native chip backends (ath9k first, no fw blob) or linuxguest backend land
- net.h/dkm_shared.h: connect/disconnect appended to dkm_net_api + device_desc (ABI-compatible tail append); net.c dispatch with zero-degrade panic
- QEMU (no wlan card): no netdev registered, attest MISSING exempted by FUCK [attest] as designed
This commit is contained in:
Linehu
2026-10-06 12:13:59 +08:00
parent 14015b78a4
commit bd098f51ec
6 changed files with 288 additions and 0 deletions
+5
View File
@@ -107,6 +107,9 @@ struct dkm_net_device_desc {
int (*scan_count)(void *ctx); int (*scan_count)(void *ctx);
int (*scan_result)(void *ctx, u32 n, struct dkm_net_scan_result *out); int (*scan_result)(void *ctx, u32 n, struct dkm_net_scan_result *out);
int (*is_wireless)(void *ctx); int (*is_wireless)(void *ctx);
/* 关联扩展(尾部追加,ABI 兼容;与 UTSM/include/utsm/net.h 布局一致)。 */
int (*connect)(void *ctx, const char *ssid, const char *password);
int (*disconnect)(void *ctx);
}; };
struct dkm_net_stats { struct dkm_net_stats {
@@ -128,6 +131,8 @@ struct dkm_net_api {
int (*scan_count)(u32 index); int (*scan_count)(u32 index);
int (*scan_result)(u32 index, u32 n, struct dkm_net_scan_result *out); int (*scan_result)(u32 index, u32 n, struct dkm_net_scan_result *out);
int (*is_wireless)(u32 index); int (*is_wireless)(u32 index);
int (*connect)(u32 index, const char *ssid, const char *password);
int (*disconnect)(u32 index);
int (*device_stats)(u32 index, struct dkm_net_stats *out); int (*device_stats)(u32 index, struct dkm_net_stats *out);
}; };
+241
View File
@@ -0,0 +1,241 @@
/* DKM WLAN Driver - wireless netdev framework (stage 3, optional)
*
* 阶段 1(本文件现状):
* - PCI 全总线扫描 class 02:80(无线网络控制器),识别常见芯片家族
* (Intel AX2xx/72xx、Realtek RTL8x、Atheros AR9x、Broadcom BCM43xx)。
* - 检测到真实硬件 → 注册 wireless netdev(attest net_wlan → NET-E01 通过)。
* mac 暂为全零:原生芯片后端(NVM/EEPROM 读取)未实现,且数据面回调
* 全部走 panic —— 零 mac 不会泄露到链路上。
* - scan/connect/disconnect 回调 = 严格错误策略 panic 骨架:
* 原生芯片驱动(ath9k/iwlwifi/rtw 路线)与 linuxguest 后端未落地,
* 调用即莲花 panic(NETWL-E10/E11),坐标清晰,不伪装成功。
* - QEMU(无 wlan 卡)不注册任何设备 → attest MISSING 由 FUCK
* [attest] require_net_wlan=0 白名单豁免(设计内,见 CLAUDE.md §3)。
*
* 阶段 2(路线图):芯片家族原生后端逐家实现;linuxguest 后端
* (Linux guest 加载发行驱动 → 扫描/关联状态经共享内存回传)作为
* 芯片覆盖面不足时的兜底数据源。
*/
#include "../dkm_shared.h"
#include "../dkm_instr.h"
static const char *const g_depends[] = {"pci"};
static const char *const g_provides[] = {"wlan"};
__attribute__((visibility("default"), used))
const struct dkm_driver_desc driver_desc = {
.magic=DKM_DRIVER_MAGIC,.abi_version=DKM_ABI_VERSION,
.desc_size=sizeof(struct dkm_driver_desc),
.name="wlan",.version="0.1.0",.vendor="Deshab",
.driver_class=9,.stage=3,.flags=0,.priority=0,
.depends=g_depends,.depends_count=1,
.provides=g_provides,.provides_count=1,.min_kernel_abi=1,
};
/* ---- 已知无线芯片 device ID 表(记录芯片名;原生后端按家族落地) ---- */
struct wlan_device_id {
u16 vendor;
u16 did;
const char *name;
const char *family; /* 目标原生后端:ath9k/iwlwifi/rtw/brcmfmac */
};
static const struct wlan_device_id g_wlan_ids[] = {
/* Intel (8086) — iwlwifi 家族 */
{0x8086, 0x2723, "AX200", "iwlwifi"},
{0x8086, 0x2725, "AX210", "iwlwifi"},
{0x8086, 0x51F1, "AX211", "iwlwifi"},
{0x8086, 0x02F0, "AX201", "iwlwifi"},
{0x8086, 0xA0F0, "AX201-LP", "iwlwifi"},
{0x8086, 0x24FD, "8265", "iwlwifi"},
{0x8086, 0x24F3, "8260", "iwlwifi"},
{0x8086, 0x095A, "7265", "iwlwifi"},
{0x8086, 0x24FB, "3168", "iwlwifi"},
/* Realtek (10EC) — rtw 家族 */
{0x10EC, 0x8852, "RTL8852AE","rtw89"},
{0x10EC, 0xC822, "RTL8822CE","rtw88"},
{0x10EC, 0xC82F, "RTL8822CE","rtw88"},
{0x10EC, 0x8821, "RTL8821AE","rtw88"},
{0x10EC, 0x818B, "RTL8192EE","rtw88"},
/* Atheros (168C) — ath9k 家族(无固件 blob,原生后端首选路线) */
{0x168C, 0x002B, "AR9285", "ath9k"},
{0x168C, 0x002D, "AR9287", "ath9k"},
{0x168C, 0x002E, "AR9287-2", "ath9k"},
{0x168C, 0x0034, "AR9462", "ath9k"},
{0x168C, 0x0036, "AR9565", "ath9k"},
{0x168C, 0x003C, "AR9462-2", "ath9k"},
/* Broadcom (14E4) — brcmfmac 家族 */
{0x14E4, 0x43A0, "BCM4360", "brcmfmac"},
{0x14E4, 0x4365, "BCM43142", "brcmfmac"},
{0x14E4, 0x43B1, "BCM4352", "brcmfmac"},
{0x14E4, 0x43B2, "BCM4352-2","brcmfmac"},
};
/* ---- PCI 访问(与 e1000 相同的 CF8/CFC 端口方式) ---- */
#define PCI_ADDR_PORT 0xCF8u
#define PCI_DATA_PORT 0xCFCu
static inline void outl(u16 port, u32 v) { __asm__ volatile("outl %0,%1"::"a"(v),"Nd"(port)); }
static inline u32 inl(u16 port) { u32 v; __asm__ volatile("inl %1,%0":"=a"(v):"Nd"(port)); return v; }
static u32 pci_read(u8 bus, u8 dev, u8 func, u8 reg) {
u32 addr = (1u << 31) | ((u32)bus << 16) | ((u32)dev << 11)
| ((u32)func << 8) | (reg & 0xFCu);
outl(PCI_ADDR_PORT, addr);
return inl(PCI_DATA_PORT);
}
/* ---- 扫描结果:阶段 1 无数据(scan 回调 panic),仅保留注册骨架 ---- */
static const struct wlan_device_id *g_found; /* 命中的芯片表项 */
static u8 g_found_bus, g_found_dev, g_found_func;
/* ---- 串口直出助手(e1000 同款) ---- */
#define COM1 0x3F8
static void raw_log(const char *s) {
while (*s) {
char c = *s++;
if (c == '\n') {
dkm_serial_wait_tx(COM1);
dkm_outb(COM1, '\r');
}
dkm_serial_wait_tx(COM1);
dkm_outb(COM1, (u8)c);
}
}
static void raw_hex(const char *prefix, u64 v) {
raw_log(prefix);
static const char hx[] = "0123456789abcdef";
char buf[19]; buf[0]='0'; buf[1]='x';
for (int i = 0; i < 16; i++) buf[2+i] = hx[(v >> ((15-i)*4)) & 0xf];
buf[18] = 0;
raw_log(buf);
raw_log("\n");
}
static void zero_bytes(void *p, u64 n) {
u8 *b = (u8 *)p;
while (n--) *b++ = 0;
}
/* ---- 严格错误策略骨架:原生/网守后端未落地,调用即 panic ---- */
static struct dkm_log_api *g_log;
static void wlan_panic(const char *sym, const char *detail) {
g_log->panic(sym);
(void)detail;
for (;;) __asm__ volatile("cli; hlt");
}
static int wlan_scan_start(void *ctx) {
(void)ctx;
wlan_panic("NETWL-E10 WIFI SCAN NOT IMPLEMENTED",
"native chip backend pending (ath9k/iwlwifi/rtw) - linuxguest backend pending");
return -1;
}
static int wlan_scan_count(void *ctx) {
(void)ctx;
wlan_panic("NETWL-E10 WIFI SCAN NOT IMPLEMENTED",
"native chip backend pending");
return 0;
}
static int wlan_scan_result(void *ctx, u32 n, struct dkm_net_scan_result *out) {
(void)ctx; (void)n; (void)out;
wlan_panic("NETWL-E10 WIFI SCAN NOT IMPLEMENTED",
"native chip backend pending");
return -1;
}
static int wlan_connect(void *ctx, const char *ssid, const char *password) {
(void)ctx; (void)ssid; (void)password;
wlan_panic("NETWL-E11 WLAN CONNECT NOT IMPLEMENTED",
"802.11 auth/assoc + WPA handshake pending (native backend)");
return -1;
}
static int wlan_disconnect(void *ctx) {
(void)ctx;
wlan_panic("NETWL-E12 WLAN DISCONNECT NOT IMPLEMENTED",
"native chip backend pending");
return -1;
}
static int wlan_is_wireless(void *ctx) {
(void)ctx;
return 1;
}
__attribute__((visibility("default")))
int driver_init(const struct dkm_kernel_api *api,
struct dkm_driver_handle *handle) {
(void)handle;
if (!api || !api->log) return -1;
g_log = (struct dkm_log_api *)api->log;
dkm_instr_init(api);
g_log->info("[wlan] driver_init entered");
/* PCI 全总线扫描:class 02 subclass 80 = 无线网络控制器。
* 匹配已知 device ID 表记录芯片家族;未匹配但 class 命中的也
* 登记(未知芯片 → 原生后端需新增设备表项)。 */
for (u32 bus = 0; bus < 256; bus++) {
for (u8 dev = 0; dev < 32; dev++) {
u8 func = 0;
u32 vd = pci_read((u8)bus, dev, func, 0x00);
if ((vd & 0xffff) == 0xffff) continue; /* 空设备 */
u32 class_reg = pci_read((u8)bus, dev, func, 0x08);
u8 class_code = (u8)(class_reg >> 24);
u8 subclass = (u8)((class_reg >> 16) & 0xff);
if (class_code != 0x02 || subclass != 0x80) continue; /* 非无线控制器 */
u16 vendor = (u16)(vd & 0xffff);
u16 did = (u16)(vd >> 16);
const struct wlan_device_id *hit = 0;
for (u32 i = 0; i < sizeof(g_wlan_ids)/sizeof(g_wlan_ids[0]); i++) {
if (g_wlan_ids[i].vendor == vendor && g_wlan_ids[i].did == did) {
hit = &g_wlan_ids[i]; break;
}
}
g_found_bus = (u8)bus; g_found_dev = dev; g_found_func = func;
g_log->info("[wlan] wireless controller detected:");
g_log->info(hit ? hit->name : "(unknown chip)");
g_log->info(hit ? hit->family : "unknown-family");
g_found = hit;
/* 多功能设备继续扫 func>0;命中即注册并返回(单 wlan 卡场景) */
if (api->net && api->net->register_device) {
struct dkm_net_device_desc netdev;
zero_bytes(&netdev, sizeof(netdev));
netdev.name = "wlan0";
/* mac 全零:原生芯片后端(NVM/OTP 读取)未实现。
* 数据面回调全 panic —— 零 mac 不会出现在链路上。 */
netdev.flags = 0; /* 无 LINK_UP/TX_READY:后端未落地 */
netdev.ctx = 0;
netdev.scan_start = wlan_scan_start;
netdev.scan_count = wlan_scan_count;
netdev.scan_result = wlan_scan_result;
netdev.is_wireless = wlan_is_wireless;
netdev.connect = wlan_connect;
netdev.disconnect = wlan_disconnect;
int net_index = api->net->register_device(&netdev);
raw_hex("[wlan] wireless netdev registered, index=", (u64)(i32)net_index);
} else {
g_log->warn("[wlan] net API unavailable");
}
return 0;
}
}
g_log->info("[wlan] no wireless controller found (attest: net_wlan exempted)");
return 0;
}
__attribute__((visibility("default")))
int driver_exit(struct dkm_driver_handle *handle) {
(void)handle;
g_found = 0;
return 0;
}
+12
View File
@@ -38,6 +38,12 @@ typedef int (*dkm_net_scan_count_fn)(void *ctx);
typedef int (*dkm_net_scan_result_fn)(void *ctx, u32 n, dkm_net_scan_result *out); typedef int (*dkm_net_scan_result_fn)(void *ctx, u32 n, dkm_net_scan_result *out);
typedef int (*dkm_net_is_wireless_fn)(void *ctx); typedef int (*dkm_net_is_wireless_fn)(void *ctx);
/* 无线关联回调(wlan 驱动填;实施 802.11 认证/关联 + WPA 握手)。
* connect: ssid/password 关联请求,返回 0 = 已关联。
* disconnect: 解除关联。 */
typedef int (*dkm_net_connect_fn)(void *ctx, const char *ssid, const char *password);
typedef int (*dkm_net_disconnect_fn)(void *ctx);
typedef struct dkm_net_device_desc { typedef struct dkm_net_device_desc {
const char *name; const char *name;
u8 mac[6]; u8 mac[6];
@@ -50,6 +56,9 @@ typedef struct dkm_net_device_desc {
dkm_net_scan_count_fn scan_count; dkm_net_scan_count_fn scan_count;
dkm_net_scan_result_fn scan_result; dkm_net_scan_result_fn scan_result;
dkm_net_is_wireless_fn is_wireless; dkm_net_is_wireless_fn is_wireless;
/* 关联扩展(尾部追加,ABI 兼容)。 */
dkm_net_connect_fn connect;
dkm_net_disconnect_fn disconnect;
} dkm_net_device_desc; } dkm_net_device_desc;
typedef struct dkm_net_device_info { typedef struct dkm_net_device_info {
@@ -79,6 +88,9 @@ typedef struct dkm_net_api {
int (*scan_count)(u32 index); int (*scan_count)(u32 index);
int (*scan_result)(u32 index, u32 n, dkm_net_scan_result *out); int (*scan_result)(u32 index, u32 n, dkm_net_scan_result *out);
int (*is_wireless)(u32 index); int (*is_wireless)(u32 index);
/* 无线关联(dispatch 到 wlan 驱动回调;尾部追加,ABI 兼容)。 */
int (*connect)(u32 index, const char *ssid, const char *password);
int (*disconnect)(u32 index);
/* 网络统计查询(返回 0 成功,-1 索引越界)。 */ /* 网络统计查询(返回 0 成功,-1 索引越界)。 */
int (*device_stats)(u32 index, dkm_net_stats *out); int (*device_stats)(u32 index, dkm_net_stats *out);
} dkm_net_api; } dkm_net_api;
+21
View File
@@ -102,6 +102,25 @@ static int net_is_wireless_impl(u32 index) {
return (dev->flags & DKM_NET_F_WIRELESS) ? 1 : 0; return (dev->flags & DKM_NET_F_WIRELESS) ? 1 : 0;
} }
static int net_connect_impl(u32 index, const char *ssid, const char *password) {
if (index >= g_net_device_count) return -2;
const dkm_net_device_desc *dev = &g_net_devices[index];
/* 严格错误策略:无线设备未提供关联回调 = 驱动后端未实现,零降级 panic */
if (!dev->connect)
panic_full("NET-E20 WLAN CONNECT NOT SUPPORTED",
"wireless netdev has no connect backend (native chip driver pending)", 0);
return dev->connect(dev->ctx, ssid, password);
}
static int net_disconnect_impl(u32 index) {
if (index >= g_net_device_count) return -2;
const dkm_net_device_desc *dev = &g_net_devices[index];
if (!dev->disconnect)
panic_full("NET-E21 WLAN DISCONNECT NOT SUPPORTED",
"wireless netdev has no disconnect backend (native chip driver pending)", 0);
return dev->disconnect(dev->ctx);
}
/* 统计查询:返回驱动层累计的收发统计。 /* 统计查询:返回驱动层累计的收发统计。
* 严格错误策略插桩:全零统计占位 = 向上层谎报"网卡零流量", * 严格错误策略插桩:全零统计占位 = 向上层谎报"网卡零流量",
* 零降级 panic(NETST-E01)。驱动层统计区接入(driver_ctx 共享统计) * 零降级 panic(NETST-E01)。驱动层统计区接入(driver_ctx 共享统计)
@@ -127,6 +146,8 @@ static const dkm_net_api g_net_api = {
.scan_count = net_scan_count_impl, .scan_count = net_scan_count_impl,
.scan_result = net_scan_result_impl, .scan_result = net_scan_result_impl,
.is_wireless = net_is_wireless_impl, .is_wireless = net_is_wireless_impl,
.connect = net_connect_impl,
.disconnect = net_disconnect_impl,
.device_stats = net_device_stats_impl .device_stats = net_device_stats_impl
}; };
+8
View File
@@ -179,6 +179,14 @@
"depends": ["pci", "irq"], "depends": ["pci", "irq"],
"provides": ["netdev"] "provides": ["netdev"]
}, },
{
"name": "wlan",
"path": "driver/net/wlan.drv",
"class": "net",
"required": false,
"depends": ["pci"],
"provides": ["wlan"]
},
{ {
"name": "ps2kbd", "name": "ps2kbd",
"path": "driver/input/ps2kbd.drv", "path": "driver/input/ps2kbd.drv",
+1
View File
@@ -1038,6 +1038,7 @@ Write-Host '[build] Building DKM network drivers...'
Build-DkmDriver (Join-Path $Root 'CODE\DKM\e1000\e1000.c') (Join-Path $SystemDir 'driver\net\e1000.drv') Build-DkmDriver (Join-Path $Root 'CODE\DKM\e1000\e1000.c') (Join-Path $SystemDir 'driver\net\e1000.drv')
Build-DkmDriver (Join-Path $Root 'CODE\DKM\virtio_net\virtio_net.c') (Join-Path $SystemDir 'driver\net\virtio_net.drv') Build-DkmDriver (Join-Path $Root 'CODE\DKM\virtio_net\virtio_net.c') (Join-Path $SystemDir 'driver\net\virtio_net.drv')
Build-DkmDriver (Join-Path $Root 'CODE\DKM\ath9k\ath9k.c') (Join-Path $SystemDir 'driver\net\ath9k.drv') Build-DkmDriver (Join-Path $Root 'CODE\DKM\ath9k\ath9k.c') (Join-Path $SystemDir 'driver\net\ath9k.drv')
Build-DkmDriver (Join-Path $Root 'CODE\DKM\wlan\wlan.c') (Join-Path $SystemDir 'driver\net\wlan.drv')
# stage3: input — ps2kbd 注册 IRQ1。 # stage3: input — ps2kbd 注册 IRQ1。
Write-Host '[build] Building DKM input drivers...' Write-Host '[build] Building DKM input drivers...'