diff options
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/cfg.c | 39 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 4 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 7 | ||||
-rw-r--r-- | net/mac80211/mesh_plink.c | 3 | ||||
-rw-r--r-- | net/mac80211/tx.c | 3 |
5 files changed, 48 insertions, 8 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 1c94a2ae22ee..ae2c7127a8aa 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1000,6 +1000,36 @@ static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask) | |||
1000 | return (mask >> (parm-1)) & 0x1; | 1000 | return (mask >> (parm-1)) & 0x1; |
1001 | } | 1001 | } |
1002 | 1002 | ||
1003 | static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh, | ||
1004 | const struct mesh_setup *setup) | ||
1005 | { | ||
1006 | u8 *new_ie; | ||
1007 | const u8 *old_ie; | ||
1008 | |||
1009 | /* first allocate the new vendor information element */ | ||
1010 | new_ie = NULL; | ||
1011 | old_ie = ifmsh->vendor_ie; | ||
1012 | |||
1013 | ifmsh->vendor_ie_len = setup->vendor_ie_len; | ||
1014 | if (setup->vendor_ie_len) { | ||
1015 | new_ie = kmemdup(setup->vendor_ie, setup->vendor_ie_len, | ||
1016 | GFP_KERNEL); | ||
1017 | if (!new_ie) | ||
1018 | return -ENOMEM; | ||
1019 | } | ||
1020 | |||
1021 | /* now copy the rest of the setup parameters */ | ||
1022 | ifmsh->mesh_id_len = setup->mesh_id_len; | ||
1023 | memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len); | ||
1024 | ifmsh->mesh_pp_id = setup->path_sel_proto; | ||
1025 | ifmsh->mesh_pm_id = setup->path_metric; | ||
1026 | ifmsh->vendor_ie = new_ie; | ||
1027 | |||
1028 | kfree(old_ie); | ||
1029 | |||
1030 | return 0; | ||
1031 | } | ||
1032 | |||
1003 | static int ieee80211_update_mesh_config(struct wiphy *wiphy, | 1033 | static int ieee80211_update_mesh_config(struct wiphy *wiphy, |
1004 | struct net_device *dev, u32 mask, | 1034 | struct net_device *dev, u32 mask, |
1005 | const struct mesh_config *nconf) | 1035 | const struct mesh_config *nconf) |
@@ -1059,11 +1089,12 @@ static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev, | |||
1059 | { | 1089 | { |
1060 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1090 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
1061 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | 1091 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; |
1092 | int err; | ||
1062 | 1093 | ||
1063 | memcpy(&sdata->u.mesh.mshcfg, conf, sizeof(struct mesh_config)); | 1094 | memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config)); |
1064 | ifmsh->mesh_id_len = setup->mesh_id_len; | 1095 | err = copy_mesh_setup(ifmsh, setup); |
1065 | memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len); | 1096 | if (err) |
1066 | 1097 | return err; | |
1067 | ieee80211_start_mesh(sdata); | 1098 | ieee80211_start_mesh(sdata); |
1068 | 1099 | ||
1069 | return 0; | 1100 | return 0; |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index ce58b2a676e2..eadaa243a3da 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -484,6 +484,8 @@ struct ieee80211_if_mesh { | |||
484 | struct mesh_config mshcfg; | 484 | struct mesh_config mshcfg; |
485 | u32 mesh_seqnum; | 485 | u32 mesh_seqnum; |
486 | bool accepting_plinks; | 486 | bool accepting_plinks; |
487 | const u8 *vendor_ie; | ||
488 | u8 vendor_ie_len; | ||
487 | }; | 489 | }; |
488 | 490 | ||
489 | #ifdef CONFIG_MAC80211_MESH | 491 | #ifdef CONFIG_MAC80211_MESH |
@@ -585,9 +587,7 @@ struct ieee80211_sub_if_data { | |||
585 | struct ieee80211_if_vlan vlan; | 587 | struct ieee80211_if_vlan vlan; |
586 | struct ieee80211_if_managed mgd; | 588 | struct ieee80211_if_managed mgd; |
587 | struct ieee80211_if_ibss ibss; | 589 | struct ieee80211_if_ibss ibss; |
588 | #ifdef CONFIG_MAC80211_MESH | ||
589 | struct ieee80211_if_mesh mesh; | 590 | struct ieee80211_if_mesh mesh; |
590 | #endif | ||
591 | u32 mntr_flags; | 591 | u32 mntr_flags; |
592 | } u; | 592 | } u; |
593 | 593 | ||
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 63e1188d5062..c326e009389d 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -287,6 +287,13 @@ void mesh_mgmt_ies_add(struct sk_buff *skb, struct ieee80211_sub_if_data *sdata) | |||
287 | *pos++ |= sdata->u.mesh.accepting_plinks ? | 287 | *pos++ |= sdata->u.mesh.accepting_plinks ? |
288 | MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00; | 288 | MESHCONF_CAPAB_ACCEPT_PLINKS : 0x00; |
289 | *pos++ = 0x00; | 289 | *pos++ = 0x00; |
290 | |||
291 | if (sdata->u.mesh.vendor_ie) { | ||
292 | int len = sdata->u.mesh.vendor_ie_len; | ||
293 | const u8 *data = sdata->u.mesh.vendor_ie; | ||
294 | if (skb_tailroom(skb) > len) | ||
295 | memcpy(skb_put(skb, len), data, len); | ||
296 | } | ||
290 | } | 297 | } |
291 | 298 | ||
292 | u32 mesh_table_hash(u8 *addr, struct ieee80211_sub_if_data *sdata, struct mesh_table *tbl) | 299 | u32 mesh_table_hash(u8 *addr, struct ieee80211_sub_if_data *sdata, struct mesh_table *tbl) |
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index 1c91f0f3c307..44b53931ba5e 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c | |||
@@ -160,7 +160,8 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
160 | enum plink_frame_type action, u8 *da, __le16 llid, __le16 plid, | 160 | enum plink_frame_type action, u8 *da, __le16 llid, __le16 plid, |
161 | __le16 reason) { | 161 | __le16 reason) { |
162 | struct ieee80211_local *local = sdata->local; | 162 | struct ieee80211_local *local = sdata->local; |
163 | struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400); | 163 | struct sk_buff *skb = dev_alloc_skb(local->hw.extra_tx_headroom + 400 + |
164 | sdata->u.mesh.vendor_ie_len); | ||
164 | struct ieee80211_mgmt *mgmt; | 165 | struct ieee80211_mgmt *mgmt; |
165 | bool include_plid = false; | 166 | bool include_plid = false; |
166 | static const u8 meshpeeringproto[] = { 0x00, 0x0F, 0xAC, 0x2A }; | 167 | static const u8 meshpeeringproto[] = { 0x00, 0x0F, 0xAC, 0x2A }; |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 157bde993ef5..f4b1b624ea9f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -2290,7 +2290,8 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, | |||
2290 | u8 *pos; | 2290 | u8 *pos; |
2291 | 2291 | ||
2292 | /* headroom, head length, tail length and maximum TIM length */ | 2292 | /* headroom, head length, tail length and maximum TIM length */ |
2293 | skb = dev_alloc_skb(local->tx_headroom + 400); | 2293 | skb = dev_alloc_skb(local->tx_headroom + 400 + |
2294 | sdata->u.mesh.vendor_ie_len); | ||
2294 | if (!skb) | 2295 | if (!skb) |
2295 | goto out; | 2296 | goto out; |
2296 | 2297 | ||