wlan: expose scan, scan wait and bss cache get to userspace

This commit is contained in:
Matheus
2026-09-10 12:12:50 -03:00
parent 210104748a
commit 9b0f202bdb
3 changed files with 154 additions and 2 deletions
+56 -2
View File
@@ -6,6 +6,7 @@
#include <logging.h>
#include <kernel/usercopy.h>
#include <kernel/sock.h>
#include <kernel/wlan.h>
static int current_minor;
static netdev_t *minors[64];
@@ -22,13 +23,66 @@ typedef struct {
int mtu;
} net_info_t;
typedef struct {
void *buffer;
size_t buffer_size;
size_t records_returned; // filled in by kernel
} wlan_bss_request_t;
#define NETDEV_IOCTL_GET_INFO 0x1337631
#define NETDEV_IOCTL_WLAN_SCAN 0x8021101
#define NETDEV_IOCTL_WLAN_SCAN_WAIT 0x8021102
#define NETDEV_IOCTL_WLAN_GET_BSS_CACHE 0x8021103
#define NETDEV_IOCTL_WLAN_ASSOCIATE 0x8021104
#define NETDEV_IOCTL_WLAN_ASSOCIATION_WAIT 0x8021105
#define NETDEV_IOCTL_WLAN_DISASSOCIATE 0x8021106
#define NETDEV_IOCTL_WLAN_SET_KEY 0x8021107
#define NETDEV_IOCTL_WLAN_DEL_KEY 0x8021108
int handle_wlan_ioctl(netdev_t *netdev, unsigned long request, void *arg, int *result, cred_t *cred) {
// TODO: make every operation besides get bss cache be privileged
switch (request) {
case NETDEV_IOCTL_WLAN_SCAN:
return wlan_active_scan(netdev);
case NETDEV_IOCTL_WLAN_SCAN_WAIT:
return wlan_wait_for_scan(netdev);
case NETDEV_IOCTL_WLAN_GET_BSS_CACHE: {
wlan_bss_request_t bss_request;
int error = USERCOPY_POSSIBLY_FROM_USER(&bss_request, arg, sizeof(bss_request));
if (error)
return error;
if (IS_USER_ADDRESS(arg) && !IS_USER_ADDRESS(bss_request.buffer))
return EFAULT;
wlan_get_bss_cache(netdev, bss_request.buffer, bss_request.buffer_size, &bss_request.records_returned);
return USERCOPY_POSSIBLY_TO_USER(arg, &bss_request, sizeof(bss_request));
}
case NETDEV_IOCTL_WLAN_ASSOCIATE:
break;
case NETDEV_IOCTL_WLAN_DISASSOCIATE:
break;
case NETDEV_IOCTL_WLAN_SET_KEY:
break;
case NETDEV_IOCTL_WLAN_DEL_KEY:
break;
default:
return ENOTTY;
}
}
static int netdev_ioctl(int minor, unsigned long request, void *arg, int *result, cred_t *cred) {
netdev_t *netdev = minors[minor];
if (netdev == NULL)
return ENODEV;
switch (request) {
case 0x1337631: {
case NETDEV_IOCTL_GET_INFO: {
net_info_t *info = arg;
sockaddr_t addr = {0};
abisockaddr_t abisockaddr;
@@ -77,7 +131,7 @@ static int netdev_ioctl(int minor, unsigned long request, void *arg, int *result
break;
}
default:
return ENOTTY;
return handle_wlan_ioctl(netdev, request, arg, result, cred);
}
return 0;