diff --git a/kernel-src/fs/sockfs.c b/kernel-src/fs/sockfs.c index 6317b689..c35d4b12 100644 --- a/kernel-src/fs/sockfs.c +++ b/kernel-src/fs/sockfs.c @@ -64,6 +64,21 @@ int sockfs_setattr(vnode_t *node, vattr_t *attr, cred_t *cred) { // arg can be in userspace int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result) { switch (request) { + case SIOCSIFADDR: + { + ifreq_t *ifreq = arg; + netdev_t *netdev = netdev_getdev(ifreq->name); + if(netdev) { + sockaddr_t sockaddr; + int e = sock_convertaddress(&sockaddr, &ifreq->addr); + if (e) + return e; + netdev->ip = sockaddr.ipv4addr.addr; + } else { + return ENODEV; + } + break; + } case SIOCGIFHWADDR: { ifreq_t *ifreq = arg; diff --git a/kernel-src/include/kernel/abi.h b/kernel-src/include/kernel/abi.h index 0d48f781..975e847c 100644 --- a/kernel-src/include/kernel/abi.h +++ b/kernel-src/include/kernel/abi.h @@ -130,6 +130,7 @@ typedef struct { #define IFNAMSIZ 16 #define SIOCGIFHWADDR 0x8927 #define SIOCADDRT 0x890b +#define SIOCSIFADDR 0x8916 typedef struct { char name[IFNAMSIZ]; diff --git a/tools/netd/main.c b/tools/netd/main.c index 87d117b3..2d9f6326 100644 --- a/tools/netd/main.c +++ b/tools/netd/main.c @@ -17,6 +17,9 @@ #ifndef SIOCADDRT #define SIOCADDRT 0x890B #endif +#ifndef SIOCSIFADDR + #define SIOCSIFADDR 0x8916 +#endif #define DHCPHDR_TYPE_CLIENT 1 #define DHCPHDR_TYPE_SERVER 2 @@ -406,6 +409,19 @@ static void addroute(char *device, uint32_t addr, uint32_t gateway, uint32_t mas logstrerror("failed to add route"); } +static void setifip(char *device, uint32_t addr) { + // get hardware address of device + struct ifreq buffer = {0}; + strcpy(buffer.ifr_name, device); + + struct sockaddr_in *sockaddr = (struct sockaddr_in *)&buffer.ifr_addr; + sockaddr->sin_family = AF_INET; + sockaddr->sin_addr.s_addr = htonl(addr); + + if (ioctl(sockfd, SIOCSIFADDR, &buffer)) + logstrerror("failed to set device ip address"); +} + int main(int argc, char *argv[]) { name = argv[0]; @@ -469,6 +485,7 @@ int main(int argc, char *argv[]) { addroute(argv[1], 0, offer.router, 0, 1); addroute(argv[1], offer.clientip, 0, offer.netmask, 10); + setifip(argv[1], offer.clientip); return EXIT_SUCCESS; }