提交 b79e20b6 编写于 作者: Z Zhu Yi 提交者: John W. Linville

[PATCH] ieee80211: Add 802.11h data type and structures

Add 802.11h data types and structure definitions to ieee80211.h.
Signed-off-by: NHong Liu <hong.liu@intel.com>
Signed-off-by: NZhu Yi <yi.zhu@intel.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 9184d934
...@@ -300,6 +300,23 @@ enum ieee80211_reasoncode { ...@@ -300,6 +300,23 @@ enum ieee80211_reasoncode {
WLAN_REASON_CIPHER_SUITE_REJECTED = 24, WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
}; };
/* Action categories - 802.11h */
enum ieee80211_actioncategories {
WLAN_ACTION_SPECTRUM_MGMT = 0,
/* Reserved 1-127 */
/* Error 128-255 */
};
/* Action details - 802.11h */
enum ieee80211_actiondetails {
WLAN_ACTION_CATEGORY_MEASURE_REQUEST = 0,
WLAN_ACTION_CATEGORY_MEASURE_REPORT = 1,
WLAN_ACTION_CATEGORY_TPC_REQUEST = 2,
WLAN_ACTION_CATEGORY_TPC_REPORT = 3,
WLAN_ACTION_CATEGORY_CHANNEL_SWITCH = 4,
/* 5 - 255 Reserved */
};
#define IEEE80211_STATMASK_SIGNAL (1<<0) #define IEEE80211_STATMASK_SIGNAL (1<<0)
#define IEEE80211_STATMASK_RSSI (1<<1) #define IEEE80211_STATMASK_RSSI (1<<1)
#define IEEE80211_STATMASK_NOISE (1<<2) #define IEEE80211_STATMASK_NOISE (1<<2)
...@@ -378,6 +395,8 @@ struct ieee80211_rx_stats { ...@@ -378,6 +395,8 @@ struct ieee80211_rx_stats {
u8 mask; u8 mask;
u8 freq; u8 freq;
u16 len; u16 len;
u64 tsf;
u32 beacon_time;
}; };
/* IEEE 802.11 requires that STA supports concurrent reception of at least /* IEEE 802.11 requires that STA supports concurrent reception of at least
...@@ -609,6 +628,28 @@ struct ieee80211_auth { ...@@ -609,6 +628,28 @@ struct ieee80211_auth {
struct ieee80211_info_element info_element[0]; struct ieee80211_info_element info_element[0];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct ieee80211_channel_switch {
u8 id;
u8 len;
u8 mode;
u8 channel;
u8 count;
} __attribute__ ((packed));
struct ieee80211_action {
struct ieee80211_hdr_3addr header;
u8 category;
u8 action;
union {
struct ieee80211_action_exchange {
u8 token;
struct ieee80211_info_element info_element[0];
} exchange;
struct ieee80211_channel_switch channel_switch;
} format;
} __attribute__ ((packed));
struct ieee80211_disassoc { struct ieee80211_disassoc {
struct ieee80211_hdr_3addr header; struct ieee80211_hdr_3addr header;
__le16 reason; __le16 reason;
...@@ -693,7 +734,15 @@ struct ieee80211_txb { ...@@ -693,7 +734,15 @@ struct ieee80211_txb {
/* QoS structure */ /* QoS structure */
#define NETWORK_HAS_QOS_PARAMETERS (1<<3) #define NETWORK_HAS_QOS_PARAMETERS (1<<3)
#define NETWORK_HAS_QOS_INFORMATION (1<<4) #define NETWORK_HAS_QOS_INFORMATION (1<<4)
#define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | NETWORK_HAS_QOS_INFORMATION) #define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | \
NETWORK_HAS_QOS_INFORMATION)
/* 802.11h */
#define NETWORK_HAS_POWER_CONSTRAINT (1<<5)
#define NETWORK_HAS_CSA (1<<6)
#define NETWORK_HAS_QUIET (1<<7)
#define NETWORK_HAS_IBSS_DFS (1<<8)
#define NETWORK_HAS_TPC_REPORT (1<<9)
#define QOS_QUEUE_NUM 4 #define QOS_QUEUE_NUM 4
#define QOS_OUI_LEN 3 #define QOS_OUI_LEN 3
...@@ -749,6 +798,91 @@ struct ieee80211_tim_parameters { ...@@ -749,6 +798,91 @@ struct ieee80211_tim_parameters {
/*******************************************************/ /*******************************************************/
enum { /* ieee80211_basic_report.map */
IEEE80211_BASIC_MAP_BSS = (1 << 0),
IEEE80211_BASIC_MAP_OFDM = (1 << 1),
IEEE80211_BASIC_MAP_UNIDENTIFIED = (1 << 2),
IEEE80211_BASIC_MAP_RADAR = (1 << 3),
IEEE80211_BASIC_MAP_UNMEASURED = (1 << 4),
/* Bits 5-7 are reserved */
};
struct ieee80211_basic_report {
u8 channel;
__le64 start_time;
__le16 duration;
u8 map;
} __attribute__ ((packed));
enum { /* ieee80211_measurement_request.mode */
/* Bit 0 is reserved */
IEEE80211_MEASUREMENT_ENABLE = (1 << 1),
IEEE80211_MEASUREMENT_REQUEST = (1 << 2),
IEEE80211_MEASUREMENT_REPORT = (1 << 3),
/* Bits 4-7 are reserved */
};
enum {
IEEE80211_REPORT_BASIC = 0, /* required */
IEEE80211_REPORT_CCA = 1, /* optional */
IEEE80211_REPORT_RPI = 2, /* optional */
/* 3-255 reserved */
};
struct ieee80211_measurement_params {
u8 channel;
__le64 start_time;
__le16 duration;
} __attribute__ ((packed));
struct ieee80211_measurement_request {
struct ieee80211_info_element ie;
u8 token;
u8 mode;
u8 type;
struct ieee80211_measurement_params params[0];
} __attribute__ ((packed));
struct ieee80211_measurement_report {
struct ieee80211_info_element ie;
u8 token;
u8 mode;
u8 type;
union {
struct ieee80211_basic_report basic[0];
} u;
} __attribute__ ((packed));
struct ieee80211_tpc_report {
u8 transmit_power;
u8 link_margin;
} __attribute__ ((packed));
struct ieee80211_channel_map {
u8 channel;
u8 map;
} __attribute__ ((packed));
struct ieee80211_ibss_dfs {
struct ieee80211_info_element ie;
u8 owner[ETH_ALEN];
u8 recovery_interval;
struct ieee80211_channel_map channel_map[0];
};
struct ieee80211_csa {
u8 mode;
u8 channel;
u8 count;
} __attribute__ ((packed));
struct ieee80211_quiet {
u8 count;
u8 period;
u8 duration;
u8 offset;
} __attribute__ ((packed));
struct ieee80211_network { struct ieee80211_network {
/* These entries are used to identify a unique network */ /* These entries are used to identify a unique network */
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
...@@ -768,7 +902,7 @@ struct ieee80211_network { ...@@ -768,7 +902,7 @@ struct ieee80211_network {
u8 rates_ex_len; u8 rates_ex_len;
unsigned long last_scanned; unsigned long last_scanned;
u8 mode; u8 mode;
u8 flags; u32 flags;
u32 last_associate; u32 last_associate;
u32 time_stamp[2]; u32 time_stamp[2];
u16 beacon_interval; u16 beacon_interval;
...@@ -780,6 +914,25 @@ struct ieee80211_network { ...@@ -780,6 +914,25 @@ struct ieee80211_network {
u8 rsn_ie[MAX_WPA_IE_LEN]; u8 rsn_ie[MAX_WPA_IE_LEN];
size_t rsn_ie_len; size_t rsn_ie_len;
struct ieee80211_tim_parameters tim; struct ieee80211_tim_parameters tim;
/* 802.11h info */
/* Power Constraint - mandatory if spctrm mgmt required */
u8 power_constraint;
/* TPC Report - mandatory if spctrm mgmt required */
struct ieee80211_tpc_report tpc_report;
/* IBSS DFS - mandatory if spctrm mgmt required and IBSS
* NOTE: This is variable length and so must be allocated dynamically */
struct ieee80211_ibss_dfs *ibss_dfs;
/* Channel Switch Announcement - optional if spctrm mgmt required */
struct ieee80211_csa csa;
/* Quiet - optional if spctrm mgmt required */
struct ieee80211_quiet quiet;
struct list_head list; struct list_head list;
}; };
...@@ -925,7 +1078,10 @@ struct ieee80211_device { ...@@ -925,7 +1078,10 @@ struct ieee80211_device {
int (*handle_auth) (struct net_device * dev, int (*handle_auth) (struct net_device * dev,
struct ieee80211_auth * auth); struct ieee80211_auth * auth);
int (*handle_deauth) (struct net_device * dev, int (*handle_deauth) (struct net_device * dev,
struct ieee80211_auth * auth); struct ieee80211_deauth * auth);
int (*handle_action) (struct net_device * dev,
struct ieee80211_action * action,
struct ieee80211_rx_stats * stats);
int (*handle_disassoc) (struct net_device * dev, int (*handle_disassoc) (struct net_device * dev,
struct ieee80211_disassoc * assoc); struct ieee80211_disassoc * assoc);
int (*handle_beacon) (struct net_device * dev, int (*handle_beacon) (struct net_device * dev,
...@@ -1094,6 +1250,7 @@ extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ...@@ -1094,6 +1250,7 @@ extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, extern void ieee80211_rx_mgt(struct ieee80211_device *ieee,
struct ieee80211_hdr_4addr *header, struct ieee80211_hdr_4addr *header,
struct ieee80211_rx_stats *stats); struct ieee80211_rx_stats *stats);
extern void ieee80211_network_reset(struct ieee80211_network *network);
/* ieee80211_geo.c */ /* ieee80211_geo.c */
extern const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device extern const struct ieee80211_geo *ieee80211_get_geo(struct ieee80211_device
...@@ -1106,6 +1263,11 @@ extern int ieee80211_is_valid_channel(struct ieee80211_device *ieee, ...@@ -1106,6 +1263,11 @@ extern int ieee80211_is_valid_channel(struct ieee80211_device *ieee,
extern int ieee80211_channel_to_index(struct ieee80211_device *ieee, extern int ieee80211_channel_to_index(struct ieee80211_device *ieee,
u8 channel); u8 channel);
extern u8 ieee80211_freq_to_channel(struct ieee80211_device *ieee, u32 freq); extern u8 ieee80211_freq_to_channel(struct ieee80211_device *ieee, u32 freq);
extern u8 ieee80211_get_channel_flags(struct ieee80211_device *ieee,
u8 channel);
extern const struct ieee80211_channel *ieee80211_get_channel(struct
ieee80211_device
*ieee, u8 channel);
/* ieee80211_wx.c */ /* ieee80211_wx.c */
extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
......
...@@ -1514,7 +1514,7 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee, ...@@ -1514,7 +1514,7 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
case IEEE80211_STYPE_DEAUTH: case IEEE80211_STYPE_DEAUTH:
printk("DEAUTH from AP\n"); printk("DEAUTH from AP\n");
if (ieee->handle_deauth != NULL) if (ieee->handle_deauth != NULL)
ieee->handle_deauth(ieee->dev, (struct ieee80211_auth *) ieee->handle_deauth(ieee->dev, (struct ieee80211_deauth *)
header); header);
break; break;
default: default:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册