From 5aca46e22c22efbad73f88292c0ad63adcdb6eb3 Mon Sep 17 00:00:00 2001 From: Matheus Date: Thu, 10 Sep 2026 23:52:48 -0300 Subject: [PATCH] socket: SIOCGIFINDEX --- kernel-src/fs/sockfs.c | 5 +++++ kernel-src/include/kernel/abi.h | 2 ++ kernel-src/include/kernel/net.h | 1 + kernel-src/io/net/netdev.c | 1 + 4 files changed, 9 insertions(+) diff --git a/kernel-src/fs/sockfs.c b/kernel-src/fs/sockfs.c index b8b31a31..16c319f5 100644 --- a/kernel-src/fs/sockfs.c +++ b/kernel-src/fs/sockfs.c @@ -137,6 +137,10 @@ static int handle_ifreq(unsigned long request, ifreq_t *uifreq, cred_t *cred) { int mtu = netdev->mtu; return USERCOPY_POSSIBLY_TO_USER(&uifreq->mtu, &mtu, sizeof(mtu)); } + case SIOCGIFINDEX: { + int ifindex = netdev->ifindex; + return USERCOPY_POSSIBLY_TO_USER(&uifreq->ifindex, &ifindex, sizeof(ifindex)); + } case SIOCGIFFLAGS: { short flags = netdev->flags; return USERCOPY_POSSIBLY_TO_USER(&uifreq->flags, &flags, sizeof(flags)); @@ -152,6 +156,7 @@ int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result, c case SIOCSIFADDR: case SIOCGIFHWADDR: case SIOCGIFMTU: + case SIOCGIFINDEX: case SIOCGIFFLAGS: return handle_ifreq(request, arg, cred); case SIOCADDRT: { diff --git a/kernel-src/include/kernel/abi.h b/kernel-src/include/kernel/abi.h index 7a77f997..ce75fcd4 100644 --- a/kernel-src/include/kernel/abi.h +++ b/kernel-src/include/kernel/abi.h @@ -184,6 +184,7 @@ typedef struct { #define SIOCSIFADDR 0x8916 #define SIOCGIFMTU 0x8921 #define SIOCGIFHWADDR 0x8927 +#define SIOCGIFINDEX 0x8933 #define SIOCADDRT 0x890b #define FIONREAD 0x541B #define FIONBIO 0x5421 @@ -193,6 +194,7 @@ typedef struct { union { abisockaddr_t addr; int mtu; + int ifindex; short flags; }; } ifreq_t; diff --git a/kernel-src/include/kernel/net.h b/kernel-src/include/kernel/net.h index 78a1ec29..957ca342 100644 --- a/kernel-src/include/kernel/net.h +++ b/kernel-src/include/kernel/net.h @@ -37,6 +37,7 @@ typedef struct { typedef struct netdev_t { mac_t mac; + int ifindex; size_t mtu; uint32_t ip; int ipcurrid; // XXX This is defined as something per peer. However, having only one of these *should* work for most cases diff --git a/kernel-src/io/net/netdev.c b/kernel-src/io/net/netdev.c index 41ca7a5e..d8f96117 100644 --- a/kernel-src/io/net/netdev.c +++ b/kernel-src/io/net/netdev.c @@ -264,6 +264,7 @@ int netdev_register(netdev_t *netdev, char *name) { hashtable_remove(&nametable, name, strlen(name)); minors[minor] = netdev; + netdev->ifindex = minor + 1; leave: MUTEX_RELEASE(&tablelock);