From f43bbe9e895a05a71ebfa5fb676f068621bd5014 Mon Sep 17 00:00:00 2001 From: Vadim Kochan Date: Fri, 17 Apr 2015 22:04:21 +0300 Subject: mac80211: Check existence of generated monX device Fix then case when netsniff-ng fails if there is already an existing monX device while generating one. Signed-off-by: Vadim Kochan Signed-off-by: Tobias Klauser --- dev.c | 15 ++++++++++++--- dev.h | 1 + mac80211.c | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/dev.c b/dev.c index b3249e6..45659a8 100644 --- a/dev.c +++ b/dev.c @@ -13,7 +13,7 @@ #include "link.h" #include "built_in.h" -int device_ifindex(const char *ifname) +int device_ifindex_get(const char *ifname) { int ret, sock, index; struct ifreq ifr; @@ -27,8 +27,8 @@ int device_ifindex(const char *ifname) strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); ret = ioctl(sock, SIOCGIFINDEX, &ifr); - if (unlikely(ret)) - panic("Cannot get ifindex from device!\n"); + if (ret) + return -1; index = ifr.ifr_ifindex; close(sock); @@ -36,6 +36,15 @@ int device_ifindex(const char *ifname) return index; } +int device_ifindex(const char *ifname) +{ + int index = device_ifindex_get(ifname); + if (unlikely(index <= 0)) + panic("Cannot get ifindex from device!\n"); + + return index; +} + int device_type(const char *ifname) { int ret, sock, type; diff --git a/dev.h b/dev.h index 2d5f056..adb1c43 100644 --- a/dev.h +++ b/dev.h @@ -7,6 +7,7 @@ extern size_t device_mtu(const char *ifname); extern int device_address(const char *ifname, int af, struct sockaddr_storage *ss); extern int device_ifindex(const char *ifname); +extern int device_ifindex_get(const char *ifname); extern int device_type(const char *ifname); extern short device_get_flags(const char *ifname); extern void device_set_flags(const char *ifname, const short flags); diff --git a/mac80211.c b/mac80211.c index c089574..09f15b7 100644 --- a/mac80211.c +++ b/mac80211.c @@ -226,6 +226,10 @@ void enter_rfmon_mac80211(const char *device, char **mondev) char mondevice[32]; slprintf(mondevice, sizeof(mondevice), "mon%u", n); + + if (device_ifindex_get(mondevice) > 0) + continue; + ret = nl80211_add_mon_if(&nlstate, device, mondevice); if (ret == 0) { *mondev = xstrdup(mondevice); -- cgit v1.2.3-54-g00ecf