diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-08-27 06:35:58 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-08-27 13:53:31 -0400 |
commit | 34d4bc4d41d282a66dafe1b01a7d46bad468cefb (patch) | |
tree | ac0936b00f1ebd037be32fd0e5f304f26366e6c0 /net/mac80211/ieee80211_i.h | |
parent | 87490f6db38999fee7f6d3dbecc5b94730c7e010 (diff) |
mac80211: support runtime interface type changes
Add support to mac80211 for changing the interface
type even when the interface is UP, if the driver
supports it.
To achieve this
* add a new driver callback for switching,
* split some of the interface up/down code out
into new functions (do_open/do_stop), and
* maintain an own __SDATA_RUNNING bit that will
not be set during interface type, so that any
other code doesn't use the interface.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
-rw-r--r-- | net/mac80211/ieee80211_i.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index f64837788681..d529bd5eab47 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -472,6 +472,16 @@ enum ieee80211_sub_if_data_flags { | |||
472 | IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3), | 472 | IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3), |
473 | }; | 473 | }; |
474 | 474 | ||
475 | /** | ||
476 | * enum ieee80211_sdata_state_bits - virtual interface state bits | ||
477 | * @SDATA_STATE_RUNNING: virtual interface is up & running; this | ||
478 | * mirrors netif_running() but is separate for interface type | ||
479 | * change handling while the interface is up | ||
480 | */ | ||
481 | enum ieee80211_sdata_state_bits { | ||
482 | SDATA_STATE_RUNNING, | ||
483 | }; | ||
484 | |||
475 | struct ieee80211_sub_if_data { | 485 | struct ieee80211_sub_if_data { |
476 | struct list_head list; | 486 | struct list_head list; |
477 | 487 | ||
@@ -485,6 +495,8 @@ struct ieee80211_sub_if_data { | |||
485 | 495 | ||
486 | unsigned int flags; | 496 | unsigned int flags; |
487 | 497 | ||
498 | unsigned long state; | ||
499 | |||
488 | int drop_unencrypted; | 500 | int drop_unencrypted; |
489 | 501 | ||
490 | char name[IFNAMSIZ]; | 502 | char name[IFNAMSIZ]; |
@@ -1087,7 +1099,7 @@ void ieee80211_recalc_idle(struct ieee80211_local *local); | |||
1087 | 1099 | ||
1088 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) | 1100 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) |
1089 | { | 1101 | { |
1090 | return netif_running(sdata->dev); | 1102 | return test_bit(SDATA_STATE_RUNNING, &sdata->state); |
1091 | } | 1103 | } |
1092 | 1104 | ||
1093 | /* tx handling */ | 1105 | /* tx handling */ |