From c19b7f59f3508668e55fc1332e61bb98b84174ef Mon Sep 17 00:00:00 2001 From: Johnny Mnemonic Date: Wed, 12 Feb 2025 21:55:22 +0100 Subject: [PATCH] src/netdev.c: bring up network interface for Ski before use * otherwise Ski crashes on first console input (w/PF_INET) or * the selected interface cannot be used inside Ski (w/AF_PACKET). --- src/netdev.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/netdev.c b/src/netdev.c index 04183f2..f7cd89d 100644 --- a/src/netdev.c +++ b/src/netdev.c @@ -151,6 +151,47 @@ find_eth (int fd) return NULL; } +/* + * taken and adapted from + * https://github.com/torvalds/linux/blob/v3.10/Documentation/networking/ifenslave.c + */ +static +int +set_if_up (char *ifname) +{ + int skfd = -1; /* AF_INET socket for ioctl() calls.*/ + int saved_errno; + + struct ifreq ifr; + int res = 0; + + ifr.ifr_flags = IFF_UP; + strncpy(ifr.ifr_name, ifname, IFNAMSIZ); + + /* Open a basic socket */ + if ((skfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("set_if_up: socket() failed\n"); + res = 1; + goto out; + } + + res = ioctl(skfd, SIOCSIFFLAGS, &ifr); + if (res < 0) { + saved_errno = errno; + cmdwPrint("Host interface '%s': Error: SIOCSIFFLAGS failed: %s\n", + ifname, strerror(saved_errno)); + } else { + cmdwPrint("Host interface '%s': flags set to %04X.\n", ifname, IFF_UP); + } + + out: + if (skfd >= 0) { + close(skfd); + } + + return res; +} + int netdev_open (char *name, unsigned char *macaddr) { @@ -183,6 +224,11 @@ netdev_open (char *name, unsigned char *macaddr) return -1; } + /* + * Make sure the selected interface is up, before using it. + */ + set_if_up (name); + r = bind (fd, (struct sockaddr *)&sa_ll, sizeof (sa_ll)); if (r) { cmdwPrint("Cannot bind (disabling network): make sure %s exists\n", name);