mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
netdev: rudimentary getinfo ioctl
This commit is contained in:
@@ -4,23 +4,85 @@
|
|||||||
#include <mutex.h>
|
#include <mutex.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
|
#include <kernel/usercopy.h>
|
||||||
|
#include <kernel/sock.h>
|
||||||
|
|
||||||
|
static int current_minor;
|
||||||
|
static netdev_t *minors[64];
|
||||||
|
|
||||||
HASHTABLE_DEFINE_STATIC(nametable, 10);
|
HASHTABLE_DEFINE_STATIC(nametable, 10);
|
||||||
static MUTEX_DEFINE(tablelock);
|
static MUTEX_DEFINE(tablelock);
|
||||||
|
|
||||||
static devops_t devops = {0};
|
typedef struct {
|
||||||
|
abisockaddr_t addr;
|
||||||
|
abisockaddr_t broadaddr;
|
||||||
|
abisockaddr_t netmask;
|
||||||
|
abisockaddr_t hwaddr;
|
||||||
|
short flags;
|
||||||
|
int mtu;
|
||||||
|
} net_info_t;
|
||||||
|
|
||||||
|
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: {
|
||||||
|
net_info_t *info = arg;
|
||||||
|
sockaddr_t addr = {0};
|
||||||
|
abisockaddr_t abisockaddr;
|
||||||
|
short flags = netdev->flags;
|
||||||
|
int mtu = netdev->mtu;
|
||||||
|
|
||||||
|
addr.ipv4addr.addr = netdev->ip;
|
||||||
|
sock_addrtoabiaddr(SOCKET_TYPE_UDP, &addr, &abisockaddr);
|
||||||
|
int error = USERCOPY_POSSIBLY_TO_USER(&info->addr, &abisockaddr, sizeof(abisockaddr));
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
error = USERCOPY_POSSIBLY_TO_USER(&info->hwaddr, &netdev->mac, sizeof(netdev->mac));
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
error = USERCOPY_POSSIBLY_TO_USER(&info->mtu, &mtu, sizeof(mtu));
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
error = USERCOPY_POSSIBLY_TO_USER(&info->flags, &flags, sizeof(flags));
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
// TODO broadaddr
|
||||||
|
// TODO netmask
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return ENOTTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static devops_t devops = {
|
||||||
|
.ioctl = netdev_ioctl
|
||||||
|
};
|
||||||
|
|
||||||
int netdev_register(netdev_t *netdev, char *name) {
|
int netdev_register(netdev_t *netdev, char *name) {
|
||||||
|
int minor = __atomic_fetch_add(¤t_minor, 1, __ATOMIC_RELAXED);
|
||||||
MUTEX_ACQUIRE(&tablelock);
|
MUTEX_ACQUIRE(&tablelock);
|
||||||
int e = hashtable_set(&nametable, netdev, name, strlen(name), true);
|
int e = hashtable_set(&nametable, netdev, name, strlen(name), true);
|
||||||
if (e)
|
if (e)
|
||||||
goto leave;
|
goto leave;
|
||||||
|
|
||||||
|
|
||||||
e = devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_NET, 0, 0600, NULL);
|
e = devfs_register(&devops, name, V_TYPE_CHDEV, DEV_MAJOR_NET, minor, 0600, NULL);
|
||||||
if (e)
|
if (e)
|
||||||
hashtable_remove(&nametable, name, strlen(name));
|
hashtable_remove(&nametable, name, strlen(name));
|
||||||
|
|
||||||
|
minors[minor] = netdev;
|
||||||
|
|
||||||
leave:
|
leave:
|
||||||
MUTEX_RELEASE(&tablelock);
|
MUTEX_RELEASE(&tablelock);
|
||||||
return e;
|
return e;
|
||||||
|
|||||||
Reference in New Issue
Block a user