From patchwork Thu Aug 9 09:55:11 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [v2,3/4] use netlink to remove vlan interface Date: Wed, 08 Aug 2012 23:55:11 -0000 From: michael-dev@fami-braun.de X-Patchwork-Id: 176041 Message-Id: <20120809095511.14256.49884.stgit@localhost6.localdomain6> To: hostap@lists.shmoo.com Cc: projekt-wlan@fem.tu-ilmenau.de --- src/ap/vlan_init.c | 35 ----------------------------------- src/ap/vlan_util.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ap/vlan_util.h | 1 + 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/src/ap/vlan_init.c b/src/ap/vlan_init.c index b1e8f42..8f6be69 100644 --- a/src/ap/vlan_init.c +++ b/src/ap/vlan_init.c @@ -336,41 +336,6 @@ static int br_getnumports(const char *br_name) } -static int vlan_rem(const char *if_name) -{ - int fd; - struct vlan_ioctl_args if_request; - - wpa_printf(MSG_DEBUG, "VLAN: vlan_rem(%s)", if_name); - if ((os_strlen(if_name) + 1) > sizeof(if_request.device1)) { - wpa_printf(MSG_ERROR, "VLAN: Interface name too long: '%s'", - if_name); - return -1; - } - - if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) " - "failed: %s", __func__, strerror(errno)); - return -1; - } - - os_memset(&if_request, 0, sizeof(if_request)); - - os_strlcpy(if_request.device1, if_name, sizeof(if_request.device1)); - if_request.cmd = DEL_VLAN_CMD; - - if (ioctl(fd, SIOCSIFVLAN, &if_request) < 0) { - wpa_printf(MSG_ERROR, "VLAN: %s: DEL_VLAN_CMD failed for %s: " - "%s", __func__, if_name, strerror(errno)); - close(fd); - return -1; - } - - close(fd); - return 0; -} - - static void vlan_newlink(char *ifname, struct hostapd_data *hapd) { char vlan_ifname[IFNAMSIZ]; diff --git a/src/ap/vlan_util.c b/src/ap/vlan_util.c index 3c2ccc8..99f1fa2 100644 --- a/src/ap/vlan_util.c +++ b/src/ap/vlan_util.c @@ -126,4 +126,56 @@ vlan_add_error: return ret; } + +int vlan_rem(const char *if_name) +{ + int ret = -1; + struct nl_sock *handle = 0; + struct nl_cache *cache = 0; + struct rtnl_link *link = 0; + + wpa_printf(MSG_DEBUG, "VLAN: vlan_rem(if_name=%s)", + if_name); + + handle = nl_socket_alloc(); + if (!handle) { + wpa_printf(MSG_ERROR, "VLAN: failed to open netlink socket"); + goto vlan_rem_error; + } + + if (nl_connect(handle, NETLINK_ROUTE) < 0) { + wpa_printf(MSG_ERROR, "VLAN: failed to connect to netlink"); + goto vlan_rem_error; + } + + if (rtnl_link_alloc_cache(handle, AF_UNSPEC, &cache) < 0) { + cache = NULL; + wpa_printf(MSG_ERROR, "VLAN: failed to alloc cache"); + goto vlan_rem_error; + } + + if (!(link = rtnl_link_get_by_name(cache, if_name))) { + /* link does not exist */ + wpa_printf(MSG_ERROR, "VLAN: interface %s does not exists", if_name); + goto vlan_rem_error; + } + + if (rtnl_link_delete(handle, link) < 0) { + wpa_printf(MSG_ERROR, "VLAN: failed to remove link %s", if_name); + goto vlan_rem_error; + } + + ret = 0; + +vlan_rem_error: + if (link) + rtnl_link_put(link); + if (cache) + nl_cache_free(cache); + if (handle) + nl_socket_free(handle); + return ret; +} + + #endif diff --git a/src/ap/vlan_util.h b/src/ap/vlan_util.h index 673c546..1a54b1b 100644 --- a/src/ap/vlan_util.h +++ b/src/ap/vlan_util.h @@ -10,5 +10,6 @@ #define VLAN_UTIL_H int vlan_add(const char *if_name, int vid, const char* vlan_if_name); +int vlan_rem(const char *if_name); #endif