summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gisi/netlink.c18
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);
}