mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-30 05:58:22 +00:00
wlan: expose scan, scan wait and bss cache get to userspace
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user