Setting of address of WDS remote peer wasn't possible by a WE call. Remote
WDS peer can be understood as a remote AP and SIOCSIWAP/SIOCGIWAP are unused
in WDS mode, so let's use them.

Signed-off-by: Jiri Benc <[EMAIL PROTECTED]>

Index: dscape/net/d80211/ieee80211.c
===================================================================
--- dscape.orig/net/d80211/ieee80211.c  2006-03-06 13:56:48.000000000 +0100
+++ dscape/net/d80211/ieee80211.c       2006-03-06 14:09:53.000000000 +0100
@@ -3944,25 +3944,11 @@ int ieee80211_if_add_wds(struct net_devi
 }
 
 
-int ieee80211_if_update_wds(struct net_device *dev, char *name,
-                           struct ieee80211_if_wds *wds, int locked)
+int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr)
 {
-       struct net_device *wds_dev = NULL;
        struct ieee80211_local *local = dev->priv;
-       struct ieee80211_sub_if_data *sdata = NULL;
+       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        struct sta_info *sta;
-       struct list_head *ptr;
-
-       list_for_each(ptr, &local->sub_if_list) {
-               sdata = list_entry(ptr, struct ieee80211_sub_if_data, list);
-               if (strcmp(name, sdata->dev->name) == 0) {
-                       wds_dev = sdata->dev;
-                       break;
-               }
-       }
-
-       if (wds_dev == NULL || sdata->type != IEEE80211_SUB_IF_TYPE_WDS)
-               return -ENODEV;
 
        /* Remove STA entry for the old peer */
        sta = sta_info_get(local, sdata->u.wds.remote_addr);
@@ -3971,13 +3957,12 @@ int ieee80211_if_update_wds(struct net_d
                sta_info_free(local, sta, 0);
        } else {
                printk(KERN_DEBUG "%s: could not find STA entry for WDS link "
-                      "%s peer " MACSTR "\n",
-                      dev->name, wds_dev->name,
-                      MAC2STR(sdata->u.wds.remote_addr));
+                      "peer " MACSTR "\n",
+                      dev->name, MAC2STR(sdata->u.wds.remote_addr));
        }
 
        /* Update WDS link data */
-        memcpy(&sdata->u.wds, wds, sizeof(struct ieee80211_if_wds));
+       memcpy(&sdata->u.wds.remote_addr, remote_addr, ETH_ALEN);
 
        return 0;
 }
Index: dscape/net/d80211/ieee80211_ioctl.c
===================================================================
--- dscape.orig/net/d80211/ieee80211_ioctl.c    2006-03-06 13:56:48.000000000 
+0100
+++ dscape/net/d80211/ieee80211_ioctl.c 2006-03-06 14:09:53.000000000 +0100
@@ -997,17 +997,27 @@ static int ieee80211_ioctl_update_if(str
         int left = param_len - ((u8 *) pos - (u8 *) param);
 
        if (param->u.if_info.type == HOSTAP_IF_WDS) {
-               struct ieee80211_if_wds iwds;
                struct hostapd_if_wds *wds =
                        (struct hostapd_if_wds *) param->u.if_info.data;
+               struct ieee80211_local *local = dev->priv;
+               struct net_device *wds_dev = NULL;
+               struct ieee80211_sub_if_data *sdata;
 
                if (left < sizeof(struct ieee80211_if_wds))
                        return -EPROTO;
 
-               memcpy(iwds.remote_addr, wds->remote_addr, ETH_ALEN);
+               list_for_each_entry(sdata, &local->sub_if_list, list) {
+                       if (strcmp(param->u.if_info.name,
+                                  sdata->dev->name) == 0) {
+                               wds_dev = sdata->dev;
+                               break;
+                       }
+               }
 
-               return ieee80211_if_update_wds(dev, param->u.if_info.name,
-                                              &iwds, 1);
+               if (wds_dev == NULL || sdata->type != IEEE80211_SUB_IF_TYPE_WDS)
+                       return -ENODEV;
+
+               return ieee80211_if_update_wds(wds_dev, wds->remote_addr);
        } else {
                return -EOPNOTSUPP;
        }
@@ -1842,6 +1852,11 @@ static int ieee80211_ioctl_siwap(struct 
                               "the low-level driver\n", dev->name);
                }
                return ieee80211_sta_set_bssid(dev, (u8 *) &ap_addr->sa_data);
+       } else if (sdata->type == IEEE80211_SUB_IF_TYPE_WDS) {
+               if (memcmp(sdata->u.wds.remote_addr, (u8 *) &ap_addr->sa_data,
+                          ETH_ALEN) != 0)
+                       return 0;
+               return ieee80211_if_update_wds(dev, (u8 *) &ap_addr->sa_data);
        }
 
        return -EOPNOTSUPP;
@@ -1859,6 +1874,10 @@ static int ieee80211_ioctl_giwap(struct 
                ap_addr->sa_family = ARPHRD_ETHER;
                memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN);
                return 0;
+       } else if (sdata->type == IEEE80211_SUB_IF_TYPE_WDS) {
+               ap_addr->sa_family = ARPHRD_ETHER;
+               memcpy(&ap_addr->sa_data, sdata->u.wds.remote_addr, ETH_ALEN);
+               return 0;
        }
 
        return -EOPNOTSUPP;
Index: dscape/net/d80211/ieee80211_i.h
===================================================================
--- dscape.orig/net/d80211/ieee80211_i.h        2006-03-06 13:56:48.000000000 
+0100
+++ dscape/net/d80211/ieee80211_i.h     2006-03-06 14:09:53.000000000 +0100
@@ -517,8 +517,7 @@ int ieee80211_if_remove_wds(struct net_d
 int ieee80211_if_remove_vlan(struct net_device *dev, const char *name, int 
locked);
 int ieee80211_if_remove_ap(struct net_device *dev, const char *name, int 
locked);
 int ieee80211_if_flush(struct net_device *dev, int locked);
-int ieee80211_if_update_wds(struct net_device *dev, char *name,
-                           struct ieee80211_if_wds *wds, int locked);
+int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr);
 
 /* ieee80211_ioctl.c */
 int ieee80211_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to