Deleted Added
sdiff udiff text old ( 281806 ) new ( 289549 )
full compact
1/*
2 * hostapd / VLAN initialization
3 * Copyright 2003, Instant802 Networks, Inc.
4 * Copyright 2005-2006, Devicescape Software, Inc.
5 * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
6 *
7 * This software may be distributed under the terms of the BSD license.
8 * See README for more details.
9 */
10
11#include "utils/includes.h"
12
13#include "utils/common.h"
14#include "hostapd.h"
15#include "ap_config.h"
16#include "ap_drv_ops.h"
17#include "vlan_init.h"
18#include "vlan_util.h"
19
20
21#ifdef CONFIG_FULL_DYNAMIC_VLAN
22
23#include <net/if.h>
24#include <sys/ioctl.h>
25#include <linux/sockios.h>
26#include <linux/if_vlan.h>
27#include <linux/if_bridge.h>
28
29#include "drivers/priv_netlink.h"
30#include "utils/eloop.h"
31
32
33struct full_dynamic_vlan {
34 int s; /* socket on which to listen for new/removed interfaces. */
35};
36
37
38static int ifconfig_helper(const char *if_name, int up)
39{
40 int fd;
41 struct ifreq ifr;
42
43 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
44 wpa_printf(MSG_ERROR, "VLAN: %s: socket(AF_INET,SOCK_STREAM) "
45 "failed: %s", __func__, strerror(errno));

--- 430 unchanged lines hidden (view full) ---

476
477static void vlan_newlink(char *ifname, struct hostapd_data *hapd)
478{
479 char vlan_ifname[IFNAMSIZ];
480 char br_name[IFNAMSIZ];
481 struct hostapd_vlan *vlan = hapd->conf->vlan;
482 char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
483 int vlan_naming = hapd->conf->ssid.vlan_naming;
484
485 wpa_printf(MSG_DEBUG, "VLAN: vlan_newlink(%s)", ifname);
486
487 while (vlan) {
488 if (os_strcmp(ifname, vlan->ifname) == 0) {
489
490 if (hapd->conf->vlan_bridge[0]) {
491 os_snprintf(br_name, sizeof(br_name), "%s%d",
492 hapd->conf->vlan_bridge,
493 vlan->vlan_id);
494 } else if (tagged_interface) {
495 os_snprintf(br_name, sizeof(br_name),
496 "br%s.%d", tagged_interface,
497 vlan->vlan_id);
498 } else {
499 os_snprintf(br_name, sizeof(br_name),
500 "brvlan%d", vlan->vlan_id);
501 }
502
503 if (!br_addbr(br_name))
504 vlan->clean |= DVLAN_CLEAN_BR;
505
506 ifconfig_up(br_name);
507
508 if (tagged_interface) {
509 if (vlan_naming ==
510 DYNAMIC_VLAN_NAMING_WITH_DEVICE)
511 os_snprintf(vlan_ifname,
512 sizeof(vlan_ifname),
513 "%s.%d", tagged_interface,
514 vlan->vlan_id);
515 else
516 os_snprintf(vlan_ifname,
517 sizeof(vlan_ifname),
518 "vlan%d", vlan->vlan_id);
519
520 ifconfig_up(tagged_interface);
521 if (!vlan_add(tagged_interface, vlan->vlan_id,
522 vlan_ifname))
523 vlan->clean |= DVLAN_CLEAN_VLAN;
524
525 if (!br_addif(br_name, vlan_ifname))
526 vlan->clean |= DVLAN_CLEAN_VLAN_PORT;
527
528 ifconfig_up(vlan_ifname);
529 }
530
531 if (!br_addif(br_name, ifname))
532 vlan->clean |= DVLAN_CLEAN_WLAN_PORT;
533
534 ifconfig_up(ifname);
535

--- 6 unchanged lines hidden (view full) ---

542
543static void vlan_dellink(char *ifname, struct hostapd_data *hapd)
544{
545 char vlan_ifname[IFNAMSIZ];
546 char br_name[IFNAMSIZ];
547 struct hostapd_vlan *first, *prev, *vlan = hapd->conf->vlan;
548 char *tagged_interface = hapd->conf->ssid.vlan_tagged_interface;
549 int vlan_naming = hapd->conf->ssid.vlan_naming;
550
551 wpa_printf(MSG_DEBUG, "VLAN: vlan_dellink(%s)", ifname);
552
553 first = prev = vlan;
554
555 while (vlan) {
556 if (os_strcmp(ifname, vlan->ifname) == 0) {
557 if (hapd->conf->vlan_bridge[0]) {
558 os_snprintf(br_name, sizeof(br_name), "%s%d",
559 hapd->conf->vlan_bridge,
560 vlan->vlan_id);
561 } else if (tagged_interface) {
562 os_snprintf(br_name, sizeof(br_name),
563 "br%s.%d", tagged_interface,
564 vlan->vlan_id);

--- 11 unchanged lines hidden (view full) ---

576 os_snprintf(vlan_ifname,
577 sizeof(vlan_ifname),
578 "%s.%d", tagged_interface,
579 vlan->vlan_id);
580 else
581 os_snprintf(vlan_ifname,
582 sizeof(vlan_ifname),
583 "vlan%d", vlan->vlan_id);
584 if (vlan->clean & DVLAN_CLEAN_VLAN_PORT)
585 br_delif(br_name, vlan_ifname);
586 ifconfig_down(vlan_ifname);
587
588 if (vlan->clean & DVLAN_CLEAN_VLAN)
589 vlan_rem(vlan_ifname);
590 }
591
592 if ((vlan->clean & DVLAN_CLEAN_BR) &&
593 br_getnumports(br_name) == 0) {
594 ifconfig_down(br_name);
595 br_delbr(br_name);
596 }
597
598 if (vlan == first) {
599 hapd->conf->vlan = vlan->next;
600 } else {
601 prev->next = vlan->next;
602 }
603 os_free(vlan);
604
605 break;

--- 40 unchanged lines hidden (view full) ---

646
647 }
648
649 attr = RTA_NEXT(attr, attrlen);
650 }
651
652 if (!ifname[0])
653 return;
654
655 wpa_printf(MSG_DEBUG,
656 "VLAN: RTM_%sLINK: ifi_index=%d ifname=%s ifi_family=%d ifi_flags=0x%x (%s%s%s%s)",
657 del ? "DEL" : "NEW",
658 ifi->ifi_index, ifname, ifi->ifi_family, ifi->ifi_flags,
659 (ifi->ifi_flags & IFF_UP) ? "[UP]" : "",
660 (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "",
661 (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "",

--- 111 unchanged lines hidden (view full) ---

773 return;
774 eloop_unregister_read_sock(priv->s);
775 close(priv->s);
776 os_free(priv);
777}
778#endif /* CONFIG_FULL_DYNAMIC_VLAN */
779
780
781int vlan_setup_encryption_dyn(struct hostapd_data *hapd,
782 struct hostapd_ssid *mssid, const char *dyn_vlan)
783{
784 int i;
785
786 if (dyn_vlan == NULL)
787 return 0;
788
789 /* Static WEP keys are set here; IEEE 802.1X and WPA uses their own
790 * functions for setting up dynamic broadcast keys. */
791 for (i = 0; i < 4; i++) {
792 if (mssid->wep.key[i] &&
793 hostapd_drv_set_key(dyn_vlan, hapd, WPA_ALG_WEP, NULL, i,
794 i == mssid->wep.idx, NULL, 0,
795 mssid->wep.key[i], mssid->wep.len[i]))
796 {
797 wpa_printf(MSG_ERROR, "VLAN: Could not set WEP "
798 "encryption for dynamic VLAN");
799 return -1;
800 }
801 }
802
803 return 0;

--- 144 unchanged lines hidden (view full) ---

948
949int vlan_remove_dynamic(struct hostapd_data *hapd, int vlan_id)
950{
951 struct hostapd_vlan *vlan;
952
953 if (vlan_id <= 0 || vlan_id > MAX_VLAN_ID)
954 return 1;
955
956 wpa_printf(MSG_DEBUG, "VLAN: %s(vlan_id=%d)", __func__, vlan_id);
957
958 vlan = hapd->conf->vlan;
959 while (vlan) {
960 if (vlan->vlan_id == vlan_id && vlan->dynamic_vlan > 0) {
961 vlan->dynamic_vlan--;
962 break;
963 }
964 vlan = vlan->next;
965 }
966
967 if (vlan == NULL)
968 return 1;
969
970 if (vlan->dynamic_vlan == 0)
971 hostapd_vlan_if_remove(hapd, vlan->ifname);
972
973 return 0;
974}