From patchwork Thu Apr 11 09:47:48 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: michael-dev X-Patchwork-Id: 235661 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from maxx.maxx.shmoo.com (maxx.shmoo.com [205.134.188.171]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "maxx.shmoo.com", Issuer "CA Cert Signing Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 3502A2C00AD for ; Thu, 11 Apr 2013 19:48:42 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id AE2F79D26C; Thu, 11 Apr 2013 05:48:32 -0400 (EDT) X-Virus-Scanned: amavisd-new at maxx.shmoo.com Received: from maxx.maxx.shmoo.com ([127.0.0.1]) by localhost (maxx.shmoo.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4k2NmAR7yaAo; Thu, 11 Apr 2013 05:48:32 -0400 (EDT) Received: from maxx.shmoo.com (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id 7F7D59D231; Thu, 11 Apr 2013 05:48:01 -0400 (EDT) X-Original-To: mailman-post+hostap@maxx.shmoo.com Delivered-To: mailman-post+hostap@maxx.shmoo.com Received: from localhost (localhost [127.0.0.1]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id A5B739D231 for ; Thu, 11 Apr 2013 05:48:00 -0400 (EDT) X-Virus-Scanned: amavisd-new at maxx.shmoo.com Received: from maxx.maxx.shmoo.com ([127.0.0.1]) by localhost (maxx.shmoo.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2NcRM7dCNF6x for ; Thu, 11 Apr 2013 05:47:56 -0400 (EDT) Received: from mail.fem.tu-ilmenau.de (mail.fem.tu-ilmenau.de [141.24.101.79]) by maxx.maxx.shmoo.com (Postfix) with ESMTP id 07DFB9D1DA for ; Thu, 11 Apr 2013 05:47:53 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.fem.tu-ilmenau.de (Postfix) with ESMTP id 8C52E6653; Thu, 11 Apr 2013 11:47:52 +0200 (CEST) X-Virus-Scanned: amavisd-new at fem.tu-ilmenau.de Received: from mail.fem.tu-ilmenau.de ([127.0.0.1]) by localhost (mail.fem.tu-ilmenau.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id BsaVkNCCEXT7; Thu, 11 Apr 2013 11:47:51 +0200 (CEST) Received: from a234.fem.tu-ilmenau.de (unknown [10.42.51.234]) by mail.fem.tu-ilmenau.de (Postfix) with ESMTP; Thu, 11 Apr 2013 11:47:51 +0200 (CEST) Received: by a234.fem.tu-ilmenau.de (Postfix, from userid 1001) id 01DC7D082F; Thu, 11 Apr 2013 11:47:50 +0200 (CEST) From: michael-dev@fami-braun.de To: hostap@lists.shmoo.com Subject: [PATCHv2 6/6] vlan: use untagged/tagged for vlan configuration Date: Thu, 11 Apr 2013 11:47:48 +0200 Message-Id: <1365673668-32577-7-git-send-email-michael-dev@fami-braun.de> X-Mailer: git-send-email 1.8.1.5 In-Reply-To: <1365673668-32577-1-git-send-email-michael-dev@fami-braun.de> References: <1365673668-32577-1-git-send-email-michael-dev@fami-braun.de> Cc: projekt-wlan@fem.tu-ilmenau.de X-BeenThere: hostap@lists.shmoo.com X-Mailman-Version: 2.1.11 Precedence: list List-Id: HostAP Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: hostap-bounces@lists.shmoo.com Errors-To: hostap-bounces@lists.shmoo.com From: Michael Braun Signed-hostap: Michael Braun --- src/ap/vlan_init.c | 190 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 123 insertions(+), 67 deletions(-) diff --git a/src/ap/vlan_init.c b/src/ap/vlan_init.c index 27afbc8..604d52c 100644 --- a/src/ap/vlan_init.c +++ b/src/ap/vlan_init.c @@ -492,55 +492,79 @@ static int vlan_set_name_type(unsigned int name_type) #endif /* CONFIG_VLAN_NETLINK */ -static void vlan_newlink(char *ifname, struct hostapd_data *hapd) +static void vlan_newlink_vlan(struct hostapd_vlan *vlan, struct hostapd_data *hapd, int vlan_id, char* ifname) { char vlan_ifname[IFNAMSIZ]; char br_name[IFNAMSIZ]; - struct hostapd_vlan *vlan = hapd->conf->vlan; char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface; int vlan_naming = hapd->conf->ssid.vlan_naming; - wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname); + os_snprintf(br_name, sizeof(br_name), "brvlan%d", vlan_id); - while (vlan) { - if (os_strcmp(ifname, vlan->ifname) == 0) { + if (!br_addbr(br_name)) + vlan->clean |= DVLAN_CLEAN_BR; - os_snprintf(br_name, sizeof(br_name), "brvlan%d", - vlan->vlan_id); + ifconfig_up(br_name); - if (!br_addbr(br_name)) - vlan->clean |= DVLAN_CLEAN_BR; + if (tagged_interface) { + if (vlan_naming == + DYNAMIC_VLAN_NAMING_WITH_DEVICE) + os_snprintf(vlan_ifname, + sizeof(vlan_ifname), + "%s.%d", tagged_interface, + vlan_id); + else + os_snprintf(vlan_ifname, + sizeof(vlan_ifname), + "vlan%d", vlan_id); - ifconfig_up(br_name); + ifconfig_up(tagged_interface); + if (!vlan_add(tagged_interface, vlan_id, vlan_ifname)) + vlan->clean |= DVLAN_CLEAN_VLAN; - if (tagged_interface) { - if (vlan_naming == - DYNAMIC_VLAN_NAMING_WITH_DEVICE) - os_snprintf(vlan_ifname, - sizeof(vlan_ifname), - "%s.%d", tagged_interface, - vlan->vlan_id); - else - os_snprintf(vlan_ifname, - sizeof(vlan_ifname), - "vlan%d", vlan->vlan_id); + if (!br_addif(br_name, vlan_ifname)) + vlan->clean |= DVLAN_CLEAN_VLAN_PORT; - ifconfig_up(tagged_interface); - if (!vlan_add(tagged_interface, vlan->vlan_id, - vlan_ifname)) - vlan->clean |= DVLAN_CLEAN_VLAN; + ifconfig_up(vlan_ifname); + } - if (!br_addif(br_name, vlan_ifname)) - vlan->clean |= DVLAN_CLEAN_VLAN_PORT; + if (!br_addif(br_name, ifname)) + vlan->clean |= DVLAN_CLEAN_WLAN_PORT; - ifconfig_up(vlan_ifname); - } + ifconfig_up(ifname); +} - if (!br_addif(br_name, ifname)) - vlan->clean |= DVLAN_CLEAN_WLAN_PORT; +static void vlan_newlink(char *ifname, struct hostapd_data *hapd) +{ + struct hostapd_vlan *vlan = hapd->conf->vlan; + #ifdef CONFIG_VLAN_TAGGED + char vlan_ifname[IFNAMSIZ]; + int i; + #endif - ifconfig_up(ifname); + wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname); + while (vlan) { + if (os_strcmp(ifname, vlan->ifname) == 0) { + #ifdef CONFIG_VLAN_TAGGED + if (vlan_mapping.counter < vlan->vlan_id || vlan->vlan_id <= 0) + break; + if (vlan_mapping.vlan[vlan->vlan_id-1].untagged > 0) + vlan_newlink_vlan(vlan, hapd, vlan_mapping.vlan[vlan->vlan_id-1].untagged, ifname); + for (i = 0; i < vlan_mapping.vlan[vlan->vlan_id-1].num_tagged; i++) { + int vlan_id = vlan_mapping.vlan[vlan->vlan_id-1].tagged[i]; + // add tagged interface on wlan + os_snprintf(vlan_ifname, sizeof(vlan_ifname), + "%s.%d", ifname, vlan_id); + vlan_add(ifname, vlan_id, vlan_ifname); + // add this to bridge + vlan_newlink_vlan(vlan, hapd, vlan_id, vlan_ifname); + } + #else + if (MAX_VLAN_ID < vlan->vlan_id || vlan->vlan_id <= 0) + break; + vlan_newlink_vlan(vlan, hapd, vlan->vlan_id, ifname); + #endif break; } vlan = vlan->next; @@ -548,58 +572,84 @@ static void vlan_newlink(char *ifname, struct hostapd_data *hapd) } -static void vlan_dellink(char *ifname, struct hostapd_data *hapd) +static void vlan_dellink_vlan(struct hostapd_vlan *vlan, struct hostapd_data *hapd, int vlan_id, char* ifname) { char vlan_ifname[IFNAMSIZ]; char br_name[IFNAMSIZ]; - struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan; char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface; int vlan_naming = hapd->conf->ssid.vlan_naming; + os_snprintf(br_name, sizeof(br_name), "brvlan%d", vlan_id); + + if (vlan->clean & DVLAN_CLEAN_WLAN_PORT) + br_delif(br_name, ifname); + + if (tagged_interface) { + if (vlan_naming == + DYNAMIC_VLAN_NAMING_WITH_DEVICE) + os_snprintf(vlan_ifname, + sizeof(vlan_ifname), + "%s.%d", tagged_interface, + vlan_id); + else + os_snprintf(vlan_ifname, + sizeof(vlan_ifname), + "vlan%d", vlan_id); + if (vlan->clean & DVLAN_CLEAN_VLAN_PORT) + br_delif(br_name, vlan_ifname); + ifconfig_down(vlan_ifname); + + if (vlan->clean & DVLAN_CLEAN_VLAN) + vlan_rem(vlan_ifname); + } + + if ((vlan->clean & DVLAN_CLEAN_BR) && + br_getnumports(br_name) == 0) { + ifconfig_down(br_name); + br_delbr(br_name); + } + +} + +static void vlan_dellink(char *ifname, struct hostapd_data *hapd) +{ + struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan; + #ifdef CONFIG_VLAN_TAGGED + char vlan_ifname[IFNAMSIZ]; + int i; + #endif + wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname); first = prev = vlan; while (vlan) { if (os_strcmp(ifname, vlan->ifname) == 0) { - os_snprintf(br_name, sizeof(br_name), "brvlan%d", - vlan->vlan_id); - - if (vlan->clean & DVLAN_CLEAN_WLAN_PORT) - br_delif(br_name, vlan->ifname); - - if (tagged_interface) { - if (vlan_naming == - DYNAMIC_VLAN_NAMING_WITH_DEVICE) - os_snprintf(vlan_ifname, - sizeof(vlan_ifname), - "%s.%d", tagged_interface, - vlan->vlan_id); - else - os_snprintf(vlan_ifname, - sizeof(vlan_ifname), - "vlan%d", vlan->vlan_id); - if (vlan->clean & DVLAN_CLEAN_VLAN_PORT) - br_delif(br_name, vlan_ifname); - ifconfig_down(vlan_ifname); - - if (vlan->clean & DVLAN_CLEAN_VLAN) - vlan_rem(vlan_ifname); - } - - if ((vlan->clean & DVLAN_CLEAN_BR) && - br_getnumports(br_name) == 0) { - ifconfig_down(br_name); - br_delbr(br_name); + #ifdef CONFIG_VLAN_TAGGED + if (vlan_mapping.counter < vlan->vlan_id || vlan->vlan_id <= 0) + break; + if (vlan_mapping.vlan[vlan->vlan_id-1].untagged > 0) + vlan_dellink_vlan(vlan, hapd, vlan_mapping.vlan[vlan->vlan_id-1].untagged, ifname); + for (i = 0; i < vlan_mapping.vlan[vlan->vlan_id-1].num_tagged; i++) { + int vlan_id = vlan_mapping.vlan[vlan->vlan_id-1].tagged[i]; + // add tagged interface on wlan + os_snprintf(vlan_ifname, sizeof(vlan_ifname), + "%s.%d", ifname, vlan_id); + vlan_rem(vlan_ifname); + // add this to bridge + vlan_dellink_vlan(vlan, hapd, vlan_id, vlan_ifname); } - + #else + if (MAX_VLAN_ID < vlan->vlan_id || vlan->vlan_id <= 0) + break; + vlan_dellink_vlan(vlan, hapd, vlan->vlan_id, ifname); + #endif if (vlan == first) { hapd->conf->vlan = vlan->next; } else { prev->next = vlan->next; } os_free(vlan); - break; } prev = vlan; @@ -893,9 +943,15 @@ struct hostapd_vlan * vlan_add_dynamic(struct hostapd_data *hapd, struct hostapd_vlan *n; char *ifname, *pos; - if (vlan == NULL || vlan_id <= 0 || vlan_id > MAX_VLAN_ID || - vlan->vlan_id != VLAN_ID_WILDCARD) + if (vlan == NULL || vlan_id <= 0 || vlan->vlan_id != VLAN_ID_WILDCARD) + return NULL; + #ifdef CONFIG_VLAN_TAGGED + if (vlan_mapping.counter < vlan_id) + return NULL; + #else + if (MAX_VLAN_ID < vlan_id) return NULL; + #endif wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d ifname=%s)", __func__, vlan_id, vlan->ifname);