diff options
Diffstat (limited to 'net/mac80211/ieee80211_sta.c')
-rw-r--r-- | net/mac80211/ieee80211_sta.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 927ffbfe8582..110eaf3ab58c 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/rtnetlink.h> | 27 | #include <linux/rtnetlink.h> |
28 | #include <net/iw_handler.h> | 28 | #include <net/iw_handler.h> |
29 | #include <asm/types.h> | 29 | #include <asm/types.h> |
30 | #include <asm/unaligned.h> | ||
30 | 31 | ||
31 | #include <net/mac80211.h> | 32 | #include <net/mac80211.h> |
32 | #include "ieee80211_i.h" | 33 | #include "ieee80211_i.h" |
@@ -2123,6 +2124,11 @@ ieee80211_rx_bss_get(struct net_device *dev, u8 *bssid, int freq, | |||
2123 | } | 2124 | } |
2124 | 2125 | ||
2125 | #ifdef CONFIG_MAC80211_MESH | 2126 | #ifdef CONFIG_MAC80211_MESH |
2127 | static inline u32 bss_mesh_cfg_get(u8 *mesh_cfg, u8 offset) | ||
2128 | { | ||
2129 | return be32_to_cpu(get_unaligned((__be32 *) (mesh_cfg + offset))); | ||
2130 | } | ||
2131 | |||
2126 | static struct ieee80211_sta_bss * | 2132 | static struct ieee80211_sta_bss * |
2127 | ieee80211_rx_mesh_bss_get(struct net_device *dev, u8 *mesh_id, int mesh_id_len, | 2133 | ieee80211_rx_mesh_bss_get(struct net_device *dev, u8 *mesh_id, int mesh_id_len, |
2128 | u8 *mesh_cfg, int freq) | 2134 | u8 *mesh_cfg, int freq) |
@@ -2162,7 +2168,7 @@ ieee80211_rx_mesh_bss_add(struct net_device *dev, u8 *mesh_id, int mesh_id_len, | |||
2162 | if (!bss) | 2168 | if (!bss) |
2163 | return NULL; | 2169 | return NULL; |
2164 | 2170 | ||
2165 | bss->mesh_cfg = kmalloc(MESH_CFG_CMP_LEN, GFP_ATOMIC); | 2171 | bss->mesh_cfg = kmalloc(sizeof(struct bss_mesh_config), GFP_ATOMIC); |
2166 | if (!bss->mesh_cfg) { | 2172 | if (!bss->mesh_cfg) { |
2167 | kfree(bss); | 2173 | kfree(bss); |
2168 | return NULL; | 2174 | return NULL; |
@@ -2180,7 +2186,12 @@ ieee80211_rx_mesh_bss_add(struct net_device *dev, u8 *mesh_id, int mesh_id_len, | |||
2180 | 2186 | ||
2181 | atomic_inc(&bss->users); | 2187 | atomic_inc(&bss->users); |
2182 | atomic_inc(&bss->users); | 2188 | atomic_inc(&bss->users); |
2183 | memcpy(bss->mesh_cfg, mesh_cfg, MESH_CFG_CMP_LEN); | 2189 | bss->mesh_cfg->mesh_version = mesh_cfg[0]; |
2190 | bss->mesh_cfg->path_proto_id = bss_mesh_cfg_get(mesh_cfg, PP_OFFSET); | ||
2191 | bss->mesh_cfg->path_metric_id = bss_mesh_cfg_get(mesh_cfg, PM_OFFSET); | ||
2192 | bss->mesh_cfg->cong_control_id = bss_mesh_cfg_get(mesh_cfg, CC_OFFSET); | ||
2193 | bss->mesh_cfg->channel_precedence = bss_mesh_cfg_get(mesh_cfg, | ||
2194 | CP_OFFSET); | ||
2184 | bss->mesh_id_len = mesh_id_len; | 2195 | bss->mesh_id_len = mesh_id_len; |
2185 | bss->freq = freq; | 2196 | bss->freq = freq; |
2186 | spin_lock_bh(&local->sta_bss_lock); | 2197 | spin_lock_bh(&local->sta_bss_lock); |
@@ -4057,36 +4068,33 @@ ieee80211_sta_scan_result(struct net_device *dev, | |||
4057 | 4068 | ||
4058 | if (bss_mesh_cfg(bss)) { | 4069 | if (bss_mesh_cfg(bss)) { |
4059 | char *buf; | 4070 | char *buf; |
4060 | u8 *cfg = bss_mesh_cfg(bss); | 4071 | struct bss_mesh_config *cfg = bss_mesh_cfg(bss); |
4061 | buf = kmalloc(50, GFP_ATOMIC); | 4072 | buf = kmalloc(50, GFP_ATOMIC); |
4062 | if (buf) { | 4073 | if (buf) { |
4063 | memset(&iwe, 0, sizeof(iwe)); | 4074 | memset(&iwe, 0, sizeof(iwe)); |
4064 | iwe.cmd = IWEVCUSTOM; | 4075 | iwe.cmd = IWEVCUSTOM; |
4065 | sprintf(buf, "Mesh network (version %d)", cfg[0]); | 4076 | sprintf(buf, "Mesh network (version %d)", |
4077 | cfg->mesh_version); | ||
4066 | iwe.u.data.length = strlen(buf); | 4078 | iwe.u.data.length = strlen(buf); |
4067 | current_ev = iwe_stream_add_point(current_ev, end_buf, | 4079 | current_ev = iwe_stream_add_point(current_ev, end_buf, |
4068 | &iwe, buf); | 4080 | &iwe, buf); |
4069 | sprintf(buf, "Path Selection Protocol ID: " | 4081 | sprintf(buf, "Path Selection Protocol ID: " |
4070 | "0x%02X%02X%02X%02X", cfg[1], cfg[2], cfg[3], | 4082 | "0x%08X", cfg->path_proto_id); |
4071 | cfg[4]); | ||
4072 | iwe.u.data.length = strlen(buf); | 4083 | iwe.u.data.length = strlen(buf); |
4073 | current_ev = iwe_stream_add_point(current_ev, end_buf, | 4084 | current_ev = iwe_stream_add_point(current_ev, end_buf, |
4074 | &iwe, buf); | 4085 | &iwe, buf); |
4075 | sprintf(buf, "Path Selection Metric ID: " | 4086 | sprintf(buf, "Path Selection Metric ID: " |
4076 | "0x%02X%02X%02X%02X", cfg[5], cfg[6], cfg[7], | 4087 | "0x%08X", cfg->path_metric_id); |
4077 | cfg[8]); | ||
4078 | iwe.u.data.length = strlen(buf); | 4088 | iwe.u.data.length = strlen(buf); |
4079 | current_ev = iwe_stream_add_point(current_ev, end_buf, | 4089 | current_ev = iwe_stream_add_point(current_ev, end_buf, |
4080 | &iwe, buf); | 4090 | &iwe, buf); |
4081 | sprintf(buf, "Congestion Control Mode ID: " | 4091 | sprintf(buf, "Congestion Control Mode ID: " |
4082 | "0x%02X%02X%02X%02X", cfg[9], cfg[10], | 4092 | "0x%08X", cfg->cong_control_id); |
4083 | cfg[11], cfg[12]); | ||
4084 | iwe.u.data.length = strlen(buf); | 4093 | iwe.u.data.length = strlen(buf); |
4085 | current_ev = iwe_stream_add_point(current_ev, end_buf, | 4094 | current_ev = iwe_stream_add_point(current_ev, end_buf, |
4086 | &iwe, buf); | 4095 | &iwe, buf); |
4087 | sprintf(buf, "Channel Precedence: " | 4096 | sprintf(buf, "Channel Precedence: " |
4088 | "0x%02X%02X%02X%02X", cfg[13], cfg[14], | 4097 | "0x%08X", cfg->channel_precedence); |
4089 | cfg[15], cfg[16]); | ||
4090 | iwe.u.data.length = strlen(buf); | 4098 | iwe.u.data.length = strlen(buf); |
4091 | current_ev = iwe_stream_add_point(current_ev, end_buf, | 4099 | current_ev = iwe_stream_add_point(current_ev, end_buf, |
4092 | &iwe, buf); | 4100 | &iwe, buf); |