diff options
-rw-r--r-- | gisi/netlink.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gisi/netlink.c b/gisi/netlink.c index 8fe2de75..0d3e128b 100644 --- a/gisi/netlink.c +++ b/gisi/netlink.c @@ -38,6 +38,9 @@ #endif #include "phonet.h" #include <linux/rtnetlink.h> +#include <sys/ioctl.h> +#include <net/if.h> +#include <errno.h> #include <glib.h> #include "netlink.h" @@ -53,6 +56,19 @@ static inline GIsiModem *make_modem(unsigned idx) return (void *)(uintptr_t)idx; } +static int bring_up(int fd, unsigned ifindex) +{ + struct ifreq req = { .ifr_ifindex = ifindex, }; + + if (ioctl(fd, SIOCGIFINDEX, &req) || + ioctl(fd, SIOCGIFFLAGS, &req)) + return -errno; + req.ifr_flags |= IFF_UP | IFF_RUNNING; + if (ioctl(fd, SIOCSIFFLAGS, &req)) + return -errno; + return 0; +} + /* Parser Netlink messages */ static gboolean g_pn_nl_process(GIOChannel *channel, GIOCondition cond, gpointer data) @@ -113,6 +129,8 @@ static gboolean g_pn_nl_process(GIOChannel *channel, GIOCondition cond, rta = RTA_NEXT(rta, len)) if (rta->rta_type == IFA_LOCAL) memcpy(&addr, RTA_DATA(rta), 1); + if (up) + bring_up(fd, ifa->ifa_index); self->callback(up, addr, make_modem(ifa->ifa_index), self->opaque); } |