Skip to content

Commit

Permalink
mac80211: clean up mesh code
Browse files Browse the repository at this point in the history
Various cleanups, reducing the #ifdef mess and other things.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
jmberg authored and linvjw committed Mar 6, 2008
1 parent f7a9214 commit 902acc7
Show file tree
Hide file tree
Showing 15 changed files with 277 additions and 272 deletions.
8 changes: 8 additions & 0 deletions include/net/mac80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,14 @@ struct ieee80211_vif {
u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
};

static inline bool ieee80211_vif_is_mesh(struct ieee80211_vif *vif)
{
#ifdef CONFIG_MAC80211_MESH
return vif->type == IEEE80211_IF_TYPE_MESH_POINT;
#endif
return false;
}

/**
* struct ieee80211_if_init_conf - initial configuration of an interface
*
Expand Down
32 changes: 9 additions & 23 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
#include "ieee80211_i.h"
#include "cfg.h"
#include "ieee80211_rate.h"
#ifdef CONFIG_MAC80211_MESH
#include "mesh.h"
#endif

#define DEFAULT_RATES 0

Expand Down Expand Up @@ -119,14 +117,10 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
ieee80211_if_reinit(dev);
ieee80211_if_set_type(dev, itype);

#ifdef CONFIG_MAC80211_MESH
if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT &&
params->mesh_id_len) {
sdata->u.sta.mesh_id_len = params->mesh_id_len;
memcpy(sdata->u.sta.mesh_id, params->mesh_id,
params->mesh_id_len);
}
#endif
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
ieee80211_if_sta_set_mesh_id(&sdata->u.sta,
params->mesh_id_len,
params->mesh_id);

if (sdata->vif.type != IEEE80211_IF_TYPE_MNTR || !flags)
return 0;
Expand Down Expand Up @@ -317,9 +311,7 @@ static int ieee80211_config_default_key(struct wiphy *wiphy,

static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
{
#ifdef CONFIG_MAC80211_MESH
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
#endif

sinfo->filled = STATION_INFO_INACTIVE_TIME |
STATION_INFO_RX_BYTES |
Expand All @@ -329,17 +321,17 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
sinfo->rx_bytes = sta->rx_bytes;
sinfo->tx_bytes = sta->tx_bytes;

if (ieee80211_vif_is_mesh(&sdata->vif)) {
#ifdef CONFIG_MAC80211_MESH
if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) {
sinfo->filled |= STATION_INFO_LLID |
STATION_INFO_PLID |
STATION_INFO_PLINK_STATE;

sinfo->llid = le16_to_cpu(sta->llid);
sinfo->plid = le16_to_cpu(sta->plid);
sinfo->plink_state = sta->plink_state;
}
#endif
}
}


Expand Down Expand Up @@ -580,9 +572,7 @@ static void sta_apply_parameters(struct ieee80211_local *local,
u32 rates;
int i, j;
struct ieee80211_supported_band *sband;
#ifdef CONFIG_MAC80211_MESH
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(sta->dev);
#endif

if (params->station_flags & STATION_FLAG_CHANGED) {
sta->flags &= ~WLAN_STA_AUTHORIZED;
Expand Down Expand Up @@ -621,9 +611,7 @@ static void sta_apply_parameters(struct ieee80211_local *local,
sta->supp_rates[local->oper_channel->band] = rates;
}

#ifdef CONFIG_MAC80211_MESH
if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT &&
params->plink_action)
if (ieee80211_vif_is_mesh(&sdata->vif) && params->plink_action) {
switch (params->plink_action) {
case PLINK_ACTION_OPEN:
mesh_plink_open(sta);
Expand All @@ -632,7 +620,7 @@ static void sta_apply_parameters(struct ieee80211_local *local,
mesh_plink_block(sta);
break;
}
#endif
}
}

static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
Expand All @@ -655,11 +643,9 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
} else
sdata = IEEE80211_DEV_TO_SUB_IF(dev);

#ifdef CONFIG_MAC80211_MESH
if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT)
if (ieee80211_vif_is_mesh(&sdata->vif))
sta = mesh_plink_add(mac, DEFAULT_RATES, dev);
else
#endif
sta = sta_info_add(local, dev, mac, GFP_KERNEL);

if (IS_ERR(sta))
Expand Down
9 changes: 2 additions & 7 deletions net/mac80211/ieee80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@

#include "ieee80211_i.h"
#include "ieee80211_rate.h"
#ifdef CONFIG_MAC80211_MESH
#include "mesh.h"
#endif
#include "wep.h"
#include "wme.h"
#include "aes_ccm.h"
Expand Down Expand Up @@ -938,11 +936,9 @@ static int __ieee80211_if_config(struct net_device *dev,
conf.bssid = sdata->u.sta.bssid;
conf.ssid = sdata->u.sta.ssid;
conf.ssid_len = sdata->u.sta.ssid_len;
#ifdef CONFIG_MAC80211_MESH
} else if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) {
} else if (ieee80211_vif_is_mesh(&sdata->vif)) {
conf.beacon = beacon;
ieee80211_start_mesh(dev);
#endif
} else if (sdata->vif.type == IEEE80211_IF_TYPE_AP) {
conf.ssid = sdata->u.ap.ssid;
conf.ssid_len = sdata->u.ap.ssid_len;
Expand Down Expand Up @@ -1824,10 +1820,9 @@ static void __exit ieee80211_exit(void)
rc80211_simple_exit();
rc80211_pid_exit();

#ifdef CONFIG_MAC80211_MESH
if (mesh_allocated)
ieee80211s_stop();
#endif

ieee80211_wme_unregister();
ieee80211_debugfs_netdev_exit();
}
Expand Down
56 changes: 49 additions & 7 deletions net/mac80211/ieee80211_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,8 @@ struct ieee80211_sta_bss {
#ifdef CONFIG_MAC80211_MESH
u8 *mesh_id;
size_t mesh_id_len;
#endif
/* mesh_cfg left out the ifdef to reduce clutter on bss handling */
u8 *mesh_cfg;
#endif
#define IEEE80211_MAX_SUPP_RATES 32
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
size_t supp_rates_len;
Expand All @@ -113,6 +112,30 @@ struct ieee80211_sta_bss {
u8 erp_value;
};

static inline u8 *bss_mesh_cfg(struct ieee80211_sta_bss *bss)
{
#ifdef CONFIG_MAC80211_MESH
return bss->mesh_cfg;
#endif
return NULL;
}

static inline u8 *bss_mesh_id(struct ieee80211_sta_bss *bss)
{
#ifdef CONFIG_MAC80211_MESH
return bss->mesh_id;
#endif
return NULL;
}

static inline u8 bss_mesh_id_len(struct ieee80211_sta_bss *bss)
{
#ifdef CONFIG_MAC80211_MESH
return bss->mesh_id_len;
#endif
return 0;
}


typedef unsigned __bitwise__ ieee80211_tx_result;
#define TX_CONTINUE ((__force ieee80211_tx_result) 0u)
Expand Down Expand Up @@ -233,7 +256,6 @@ struct ieee80211_if_vlan {
struct list_head list;
};

#ifdef CONFIG_MAC80211_MESH
struct mesh_stats {
__u32 fwded_frames; /* Mesh forwarded frames */
__u32 dropped_frames_ttl; /* Not transmitted since mesh_ttl == 0*/
Expand All @@ -249,7 +271,6 @@ struct mesh_preq_queue {
u8 flags;
};


struct mesh_config {
/* Timeouts in ms */
/* Mesh plink management parameters */
Expand All @@ -268,7 +289,7 @@ struct mesh_config {
u32 path_refresh_time;
u16 min_discovery_timeout;
};
#endif


/* flags used in struct ieee80211_if_sta.flags */
#define IEEE80211_STA_SSID_SET BIT(0)
Expand Down Expand Up @@ -361,6 +382,22 @@ struct ieee80211_if_sta {
int num_beacons; /* number of TXed beacon frames by this STA */
};

static inline void ieee80211_if_sta_set_mesh_id(struct ieee80211_if_sta *ifsta,
u8 mesh_id_len, u8 *mesh_id)
{
#ifdef CONFIG_MAC80211_MESH
ifsta->mesh_id_len = mesh_id_len;
memcpy(ifsta->mesh_id, mesh_id, mesh_id_len);
#endif
}

#ifdef CONFIG_MAC80211_MESH
#define IEEE80211_IFSTA_MESH_CTR_INC(sta, name) \
do { (sta)->mshstats.name++; } while (0)
#else
#define IEEE80211_IFSTA_MESH_CTR_INC(sta, name) \
do { } while (0)
#endif

/* flags used in struct ieee80211_sub_if_data.flags */
#define IEEE80211_SDATA_ALLMULTI BIT(0)
Expand Down Expand Up @@ -472,7 +509,7 @@ struct ieee80211_sub_if_data {
struct dentry *dropped_frames_ttl;
struct dentry *dropped_frames_no_route;
struct dentry *estab_plinks;
struct timer_list mesh_path_timer;
struct timer_list mesh_path_timer;
} mesh_stats;

struct dentry *mesh_config_dir;
Expand Down Expand Up @@ -884,12 +921,17 @@ void sta_addba_resp_timer_expired(unsigned long data);
u64 ieee80211_sta_get_rates(struct ieee80211_local *local,
struct ieee802_11_elems *elems,
enum ieee80211_band band);
void ieee80211_start_mesh(struct net_device *dev);
void ieee80211_sta_tx(struct net_device *dev, struct sk_buff *skb,
int encrypt);
void ieee802_11_parse_elems(u8 *start, size_t len,
struct ieee802_11_elems *elems);

#ifdef CONFIG_MAC80211_MESH
void ieee80211_start_mesh(struct net_device *dev);
#else
static inline void ieee80211_start_mesh(struct net_device *dev)
{}
#endif

/* ieee80211_iface.c */
int ieee80211_if_add(struct net_device *dev, const char *name,
Expand Down
66 changes: 11 additions & 55 deletions net/mac80211/ieee80211_iface.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
#include "ieee80211_i.h"
#include "sta_info.h"
#include "debugfs_netdev.h"
#ifdef CONFIG_MAC80211_MESH
#include "mesh.h"
#endif

void ieee80211_if_sdata_init(struct ieee80211_sub_if_data *sdata)
{
Expand Down Expand Up @@ -82,14 +80,11 @@ int ieee80211_if_add(struct net_device *dev, const char *name,
ieee80211_debugfs_add_netdev(sdata);
ieee80211_if_set_type(ndev, type);

#ifdef CONFIG_MAC80211_MESH
if (sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT &&
params && params->mesh_id_len) {
sdata->u.sta.mesh_id_len = params->mesh_id_len;
memcpy(sdata->u.sta.mesh_id, params->mesh_id,
params->mesh_id_len);
}
#endif
if (ieee80211_vif_is_mesh(&sdata->vif) &&
params && params->mesh_id_len)
ieee80211_if_sta_set_mesh_id(&sdata->u.sta,
params->mesh_id_len,
params->mesh_id);

/* we're under RTNL so all this is fine */
if (unlikely(local->reg_state == IEEE80211_DEV_UNREGISTERED)) {
Expand Down Expand Up @@ -170,47 +165,8 @@ void ieee80211_if_set_type(struct net_device *dev, int type)
msdata = IEEE80211_DEV_TO_SUB_IF(sdata->local->mdev);
sdata->bss = &msdata->u.ap;

#ifdef CONFIG_MAC80211_MESH
if (type == IEEE80211_IF_TYPE_MESH_POINT) {
ifsta->mshcfg.dot11MeshRetryTimeout = MESH_RET_T;
ifsta->mshcfg.dot11MeshConfirmTimeout = MESH_CONF_T;
ifsta->mshcfg.dot11MeshHoldingTimeout = MESH_HOLD_T;
ifsta->mshcfg.dot11MeshMaxRetries = MESH_MAX_RETR;
ifsta->mshcfg.dot11MeshTTL = MESH_TTL;
ifsta->mshcfg.auto_open_plinks = true;
ifsta->mshcfg.dot11MeshMaxPeerLinks =
MESH_MAX_ESTAB_PLINKS;
ifsta->mshcfg.dot11MeshHWMPactivePathTimeout =
MESH_PATH_TIMEOUT;
ifsta->mshcfg.dot11MeshHWMPpreqMinInterval =
MESH_PREQ_MIN_INT;
ifsta->mshcfg.dot11MeshHWMPnetDiameterTraversalTime =
MESH_DIAM_TRAVERSAL_TIME;
ifsta->mshcfg.dot11MeshHWMPmaxPREQretries =
MESH_MAX_PREQ_RETRIES;
ifsta->mshcfg.path_refresh_time =
MESH_PATH_REFRESH_TIME;
ifsta->mshcfg.min_discovery_timeout =
MESH_MIN_DISCOVERY_TIMEOUT;
ifsta->accepting_plinks = true;
ifsta->preq_id = 0;
ifsta->dsn = 0;
atomic_set(&ifsta->mpaths, 0);
mesh_rmc_init(dev);
ifsta->last_preq = jiffies;
/* Allocate all mesh structures when creating the first
* mesh interface.
*/
if (!mesh_allocated)
ieee80211s_init();
mesh_ids_set_default(ifsta);
setup_timer(&ifsta->mesh_path_timer,
ieee80211_mesh_path_timer,
(unsigned long) sdata);
INIT_LIST_HEAD(&ifsta->preq_queue.list);
spin_lock_init(&ifsta->mesh_preq_queue_lock);
}
#endif
if (ieee80211_vif_is_mesh(&sdata->vif))
ieee80211_mesh_init_sdata(sdata);
break;
}
case IEEE80211_IF_TYPE_MNTR:
Expand Down Expand Up @@ -240,6 +196,10 @@ void ieee80211_if_reinit(struct net_device *dev)

ieee80211_if_sdata_deinit(sdata);

/* Need to handle mesh specially to allow eliding the function call */
if (ieee80211_vif_is_mesh(&sdata->vif))
mesh_rmc_free(dev);

switch (sdata->vif.type) {
case IEEE80211_IF_TYPE_INVALID:
/* cannot happen */
Expand Down Expand Up @@ -292,10 +252,6 @@ void ieee80211_if_reinit(struct net_device *dev)
}
break;
case IEEE80211_IF_TYPE_MESH_POINT:
#ifdef CONFIG_MAC80211_MESH
mesh_rmc_free(dev);
#endif
/* fall through */
case IEEE80211_IF_TYPE_STA:
case IEEE80211_IF_TYPE_IBSS:
kfree(sdata->u.sta.extra_ie);
Expand Down
Loading

0 comments on commit 902acc7

Please sign in to comment.