]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Add bridge handling for WDS STA interfaces
authorFelix Fietkau <nbd@openwrt.org>
Tue, 9 Nov 2010 14:12:42 +0000 (16:12 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 9 Nov 2010 14:12:42 +0000 (16:12 +0200)
By default, add them to the configured bridge of the AP interface
(if present), but allow the user to specify a separate bridge.

hostapd/config_file.c
hostapd/hostapd.conf
src/ap/ap_config.h
src/ap/ap_drv_ops.c
src/drivers/driver.h
src/drivers/driver_nl80211.c

index ac69f24372e38bacb6cf36de3699847a60f63e75..c2083f676b47198977424d7210f63d56bcd529c0 100644 (file)
@@ -1208,6 +1208,9 @@ struct hostapd_config * hostapd_config_read(const char *fname)
                                   sizeof(conf->bss[0].iface));
                } else if (os_strcmp(buf, "bridge") == 0) {
                        os_strlcpy(bss->bridge, pos, sizeof(bss->bridge));
+               } else if (os_strcmp(buf, "wds_bridge") == 0) {
+                       os_strlcpy(bss->wds_bridge, pos,
+                                  sizeof(bss->wds_bridge));
                } else if (os_strcmp(buf, "driver") == 0) {
                        int j;
                        /* clear to get error below if setting is invalid */
index a9cd02386fcac03d359951d21ca67a657fb54ccf..afeb20657bc2c1437fa172ba4720398394396fd8 100644 (file)
@@ -352,6 +352,11 @@ wmm_ac_vo_acm=0
 # bridging to be used.
 #wds_sta=1
 
+# If bridge parameter is set, the WDS STA interface will be added to the same
+# bridge by default. This can be overridden with the wds_bridge parameter to
+# use a separate bridge.
+#wds_bridge=wds-br0
+
 ##### IEEE 802.11n related configuration ######################################
 
 # ieee80211n: Whether IEEE 802.11n (HT) is enabled
index fd2abcef1952c11d1c88f1f353dffa66667b02e1..be2e33465e04966563b1434dac0dfe145c941f53 100644 (file)
@@ -148,6 +148,7 @@ struct hostapd_wmm_ac_params {
 struct hostapd_bss_config {
        char iface[IFNAMSIZ + 1];
        char bridge[IFNAMSIZ + 1];
+       char wds_bridge[IFNAMSIZ + 1];
 
        enum hostapd_logger_level logger_syslog_level, logger_stdout_level;
 
index 3fd276142db34ff33693f51826f3ddff6b357375..001c4c79914664b100a22fb03f1cd31ee2634398 100644 (file)
@@ -366,9 +366,15 @@ static int hostapd_vlan_if_remove(struct hostapd_data *hapd,
 static int hostapd_set_wds_sta(struct hostapd_data *hapd, const u8 *addr,
                               int aid, int val)
 {
+       const char *bridge = NULL;
+
        if (hapd->driver == NULL || hapd->driver->set_wds_sta == NULL)
                return 0;
-       return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val);
+       if (hapd->conf->wds_bridge[0])
+               bridge = hapd->conf->wds_bridge;
+       else if (hapd->conf->bridge[0])
+               bridge = hapd->conf->bridge;
+       return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val, bridge);
 }
 
 
index e0ee183c83e3e7652cc2343c3e909fff2029a9be..da2daaf734d1a0ca01a388b68181cff3df9d95cd 100644 (file)
@@ -1698,9 +1698,12 @@ struct wpa_driver_ops {
         * @addr: MAC address of the associated station
         * @aid: Association ID
         * @val: 1 = bind to 4-address WDS; 0 = unbind
+        * @bridge_ifname: Bridge interface to use for the WDS station or %NULL
+        *      to indicate that bridge is not to be used
         * Returns: 0 on success, -1 on failure
         */
-       int (*set_wds_sta)(void *priv, const u8 *addr, int aid, int val);
+       int (*set_wds_sta)(void *priv, const u8 *addr, int aid, int val,
+                          const char *bridge_ifname);
 
        /**
         * send_action - Transmit an Action frame
index 0f2408b5ebbe1bcafc488e9c79be9e807ce7adf6..24fd887051d763a07e861911dad2ed2a13d71358 100644 (file)
@@ -4977,7 +4977,8 @@ static int i802_set_sta_vlan(void *priv, const u8 *addr,
 }
 
 
-static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val)
+static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val,
+                            const char *bridge_ifname)
 {
        struct i802_bss *bss = priv;
        struct wpa_driver_nl80211_data *drv = bss->drv;
@@ -4987,10 +4988,16 @@ static int i802_set_wds_sta(void *priv, const u8 *addr, int aid, int val)
        wpa_printf(MSG_DEBUG, "nl80211: Set WDS STA addr=" MACSTR
                   " aid=%d val=%d name=%s", MAC2STR(addr), aid, val, name);
        if (val) {
-               if (!if_nametoindex(name) &&
-                   nl80211_create_iface(drv, name, NL80211_IFTYPE_AP_VLAN,
-                                        NULL, 1) < 0)
-                       return -1;
+               if (!if_nametoindex(name)) {
+                       if (nl80211_create_iface(drv, name,
+                                                NL80211_IFTYPE_AP_VLAN,
+                                                NULL, 1) < 0)
+                               return -1;
+                       if (bridge_ifname &&
+                           linux_br_add_if(drv->ioctl_sock, bridge_ifname,
+                                           name) < 0)
+                               return -1;
+               }
                linux_set_iface_flags(drv->ioctl_sock, name, 1);
                return i802_set_sta_vlan(priv, addr, name, 0);
        } else {