diff options
author | Rui Paulo <rpaulo@gmail.com> | 2009-11-09 18:46:57 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-11-13 17:43:57 -0500 |
commit | 63c5723bc3af8d4e86984dd4ff0c78218de418d0 (patch) | |
tree | fe900ef2a92377c49c6b3124bb5741a1ac04d436 | |
parent | e304bfd30f356f7b75d30cad0029ecca705fd590 (diff) |
mac80211: add nl80211/cfg80211 handling of the new mesh root mode option.
Signed-off-by: Rui Paulo <rpaulo@gmail.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
Reviewed-by: Andrey Yurovsky <andrey@cozybit.com>
Tested-by: Brian Cavagnolo <brian@cozybit.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | include/linux/nl80211.h | 3 | ||||
-rw-r--r-- | include/net/cfg80211.h | 1 | ||||
-rw-r--r-- | net/mac80211/cfg.c | 7 | ||||
-rw-r--r-- | net/mac80211/debugfs_netdev.c | 2 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 13 | ||||
-rw-r--r-- | net/mac80211/mesh.h | 1 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 6 |
7 files changed, 33 insertions, 0 deletions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h index 7a0bd6ea6f63..d2f276de9abe 100644 --- a/include/linux/nl80211.h +++ b/include/linux/nl80211.h | |||
@@ -1200,6 +1200,8 @@ enum nl80211_mntr_flags { | |||
1200 | * @NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME: The interval of time (in TUs) | 1200 | * @NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME: The interval of time (in TUs) |
1201 | * that it takes for an HWMP information element to propagate across the mesh | 1201 | * that it takes for an HWMP information element to propagate across the mesh |
1202 | * | 1202 | * |
1203 | * @NL80211_MESHCONF_ROOTMODE: whether root mode is enabled or not | ||
1204 | * | ||
1203 | * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute | 1205 | * @NL80211_MESHCONF_ATTR_MAX: highest possible mesh configuration attribute |
1204 | * | 1206 | * |
1205 | * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use | 1207 | * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use |
@@ -1219,6 +1221,7 @@ enum nl80211_meshconf_params { | |||
1219 | NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, | 1221 | NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, |
1220 | NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, | 1222 | NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, |
1221 | NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, | 1223 | NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, |
1224 | NL80211_MESHCONF_HWMP_ROOTMODE, | ||
1222 | 1225 | ||
1223 | /* keep last */ | 1226 | /* keep last */ |
1224 | __NL80211_MESHCONF_ATTR_AFTER_LAST, | 1227 | __NL80211_MESHCONF_ATTR_AFTER_LAST, |
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 7d0ae9c18286..0e4c51fc63e5 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -508,6 +508,7 @@ struct mesh_config { | |||
508 | u32 dot11MeshHWMPactivePathTimeout; | 508 | u32 dot11MeshHWMPactivePathTimeout; |
509 | u16 dot11MeshHWMPpreqMinInterval; | 509 | u16 dot11MeshHWMPpreqMinInterval; |
510 | u16 dot11MeshHWMPnetDiameterTraversalTime; | 510 | u16 dot11MeshHWMPnetDiameterTraversalTime; |
511 | u8 dot11MeshHWMPRootMode; | ||
511 | }; | 512 | }; |
512 | 513 | ||
513 | /** | 514 | /** |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 81053587e72b..7f18c8fa1880 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1029,7 +1029,10 @@ static int ieee80211_set_mesh_params(struct wiphy *wiphy, | |||
1029 | { | 1029 | { |
1030 | struct mesh_config *conf; | 1030 | struct mesh_config *conf; |
1031 | struct ieee80211_sub_if_data *sdata; | 1031 | struct ieee80211_sub_if_data *sdata; |
1032 | struct ieee80211_if_mesh *ifmsh; | ||
1033 | |||
1032 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1034 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
1035 | ifmsh = &sdata->u.mesh; | ||
1033 | 1036 | ||
1034 | /* Set the config options which we are interested in setting */ | 1037 | /* Set the config options which we are interested in setting */ |
1035 | conf = &(sdata->u.mesh.mshcfg); | 1038 | conf = &(sdata->u.mesh.mshcfg); |
@@ -1064,6 +1067,10 @@ static int ieee80211_set_mesh_params(struct wiphy *wiphy, | |||
1064 | mask)) | 1067 | mask)) |
1065 | conf->dot11MeshHWMPnetDiameterTraversalTime = | 1068 | conf->dot11MeshHWMPnetDiameterTraversalTime = |
1066 | nconf->dot11MeshHWMPnetDiameterTraversalTime; | 1069 | nconf->dot11MeshHWMPnetDiameterTraversalTime; |
1070 | if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) { | ||
1071 | conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode; | ||
1072 | ieee80211_mesh_root_setup(ifmsh); | ||
1073 | } | ||
1067 | return 0; | 1074 | return 0; |
1068 | } | 1075 | } |
1069 | 1076 | ||
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c index 8782264f49e7..472b2039906c 100644 --- a/net/mac80211/debugfs_netdev.c +++ b/net/mac80211/debugfs_netdev.c | |||
@@ -149,6 +149,8 @@ IEEE80211_IF_FILE(path_refresh_time, | |||
149 | u.mesh.mshcfg.path_refresh_time, DEC); | 149 | u.mesh.mshcfg.path_refresh_time, DEC); |
150 | IEEE80211_IF_FILE(min_discovery_timeout, | 150 | IEEE80211_IF_FILE(min_discovery_timeout, |
151 | u.mesh.mshcfg.min_discovery_timeout, DEC); | 151 | u.mesh.mshcfg.min_discovery_timeout, DEC); |
152 | IEEE80211_IF_FILE(dot11MeshHWMPRootMode, | ||
153 | u.mesh.mshcfg.dot11MeshHWMPRootMode, DEC); | ||
152 | #endif | 154 | #endif |
153 | 155 | ||
154 | 156 | ||
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 88dcfe3030b1..05955dc6b3d3 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -373,6 +373,17 @@ static void ieee80211_mesh_path_root_timer(unsigned long data) | |||
373 | ieee80211_queue_work(&local->hw, &ifmsh->work); | 373 | ieee80211_queue_work(&local->hw, &ifmsh->work); |
374 | } | 374 | } |
375 | 375 | ||
376 | void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh) | ||
377 | { | ||
378 | if (ifmsh->mshcfg.dot11MeshHWMPRootMode) | ||
379 | set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); | ||
380 | else { | ||
381 | clear_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags); | ||
382 | /* stop running timer */ | ||
383 | del_timer_sync(&ifmsh->mesh_path_root_timer); | ||
384 | } | ||
385 | } | ||
386 | |||
376 | /** | 387 | /** |
377 | * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame | 388 | * ieee80211_fill_mesh_addresses - fill addresses of a locally originated mesh frame |
378 | * @hdr: 802.11 frame header | 389 | * @hdr: 802.11 frame header |
@@ -503,6 +514,7 @@ void ieee80211_mesh_restart(struct ieee80211_sub_if_data *sdata) | |||
503 | add_timer(&ifmsh->mesh_path_timer); | 514 | add_timer(&ifmsh->mesh_path_timer); |
504 | if (test_and_clear_bit(TMR_RUNNING_MPR, &ifmsh->timers_running)) | 515 | if (test_and_clear_bit(TMR_RUNNING_MPR, &ifmsh->timers_running)) |
505 | add_timer(&ifmsh->mesh_path_root_timer); | 516 | add_timer(&ifmsh->mesh_path_root_timer); |
517 | ieee80211_mesh_root_setup(ifmsh); | ||
506 | } | 518 | } |
507 | #endif | 519 | #endif |
508 | 520 | ||
@@ -512,6 +524,7 @@ void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata) | |||
512 | struct ieee80211_local *local = sdata->local; | 524 | struct ieee80211_local *local = sdata->local; |
513 | 525 | ||
514 | set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); | 526 | set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags); |
527 | ieee80211_mesh_root_setup(ifmsh); | ||
515 | ieee80211_queue_work(&local->hw, &ifmsh->work); | 528 | ieee80211_queue_work(&local->hw, &ifmsh->work); |
516 | sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL; | 529 | sdata->vif.bss_conf.beacon_int = MESH_DEFAULT_BEACON_INTERVAL; |
517 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON | | 530 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON | |
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index 00ee84258196..5ad6975bf28c 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h | |||
@@ -242,6 +242,7 @@ ieee80211_rx_result | |||
242 | ieee80211_mesh_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); | 242 | ieee80211_mesh_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb); |
243 | void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata); | 243 | void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata); |
244 | void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata); | 244 | void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata); |
245 | void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh); | ||
245 | 246 | ||
246 | /* Mesh paths */ | 247 | /* Mesh paths */ |
247 | int mesh_nexthop_lookup(struct sk_buff *skb, | 248 | int mesh_nexthop_lookup(struct sk_buff *skb, |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 7c1999872503..17bcad69428d 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2616,6 +2616,8 @@ static int nl80211_get_mesh_params(struct sk_buff *skb, | |||
2616 | cur_params.dot11MeshHWMPpreqMinInterval); | 2616 | cur_params.dot11MeshHWMPpreqMinInterval); |
2617 | NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, | 2617 | NLA_PUT_U16(msg, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, |
2618 | cur_params.dot11MeshHWMPnetDiameterTraversalTime); | 2618 | cur_params.dot11MeshHWMPnetDiameterTraversalTime); |
2619 | NLA_PUT_U8(msg, NL80211_MESHCONF_HWMP_ROOTMODE, | ||
2620 | cur_params.dot11MeshHWMPRootMode); | ||
2619 | nla_nest_end(msg, pinfoattr); | 2621 | nla_nest_end(msg, pinfoattr); |
2620 | genlmsg_end(msg, hdr); | 2622 | genlmsg_end(msg, hdr); |
2621 | err = genlmsg_reply(msg, info); | 2623 | err = genlmsg_reply(msg, info); |
@@ -2726,6 +2728,10 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info) | |||
2726 | dot11MeshHWMPnetDiameterTraversalTime, | 2728 | dot11MeshHWMPnetDiameterTraversalTime, |
2727 | mask, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, | 2729 | mask, NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME, |
2728 | nla_get_u16); | 2730 | nla_get_u16); |
2731 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, | ||
2732 | dot11MeshHWMPRootMode, mask, | ||
2733 | NL80211_MESHCONF_HWMP_ROOTMODE, | ||
2734 | nla_get_u8); | ||
2729 | 2735 | ||
2730 | /* Apply changes */ | 2736 | /* Apply changes */ |
2731 | err = rdev->ops->set_mesh_params(&rdev->wiphy, dev, &cfg, mask); | 2737 | err = rdev->ops->set_mesh_params(&rdev->wiphy, dev, &cfg, mask); |