1ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen#ifndef HOSTAP_80211_H
2ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen#define HOSTAP_80211_H
3ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
45fad5a2e1f34b333a801b749c4e143c2ac3e8a4fAdrian Bunk#include <linux/types.h>
51ea893fde29d8cf1639da8989f4b843dc3283ca8Dan Williams#include <linux/skbuff.h>
6d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemminger#include <linux/netdevice.h>
75fad5a2e1f34b333a801b749c4e143c2ac3e8a4fAdrian Bunk
8ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenstruct hostap_ieee80211_mgmt {
98a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro	__le16 frame_control;
108a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro	__le16 duration;
11ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u8 da[6];
12ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u8 sa[6];
13ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u8 bssid[6];
148a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro	__le16 seq_ctrl;
15ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	union {
16ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
178a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 auth_alg;
188a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 auth_transaction;
198a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 status_code;
20ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			/* possibly followed by Challenge text */
21ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 variable[0];
22ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed auth;
23ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
248a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 reason_code;
25ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed deauth;
26ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
278a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 capab_info;
288a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 listen_interval;
29ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			/* followed by SSID and Supported rates */
30ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 variable[0];
31ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed assoc_req;
32ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
338a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 capab_info;
348a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 status_code;
358a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 aid;
36ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			/* followed by Supported rates */
37ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 variable[0];
38ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed assoc_resp, reassoc_resp;
39ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
408a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 capab_info;
418a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 listen_interval;
42ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 current_ap[6];
43ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			/* followed by SSID and Supported rates */
44ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 variable[0];
45ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed reassoc_req;
46ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
478a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 reason_code;
48ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed disassoc;
49ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
50ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed probe_req;
51ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		struct {
52ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 timestamp[8];
538a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 beacon_int;
548a9faf3cd08b91aca1502dbe18e3b5063fda2e87Al Viro			__le16 capab_info;
55ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			/* followed by some of SSID, Supported rates,
56ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
57ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			u8 variable[0];
58ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet		} __packed beacon, probe_resp;
59ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	} u;
60ba2d3587912f82d1ab4367975b1df460db60fb1eEric Dumazet} __packed;
61ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
62ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
63ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen#define IEEE80211_MGMT_HDR_LEN 24
64ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen#define IEEE80211_DATA_HDR3_LEN 24
65ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen#define IEEE80211_DATA_HDR4_LEN 30
66ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
67ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
68ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenstruct hostap_80211_rx_status {
69ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u32 mac_time;
70ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u8 signal;
71ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u8 noise;
72ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	u16 rate; /* in 100 kbps */
73ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen};
74ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
75ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen/* prism2_rx_80211 'type' argument */
76ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenenum {
77ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	PRISM2_RX_MONITOR, PRISM2_RX_MGMT, PRISM2_RX_NON_ASSOC,
78ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen	PRISM2_RX_NULLFUNC_ACK
79ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen};
80ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
81ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenint prism2_rx_80211(struct net_device *dev, struct sk_buff *skb,
82ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		    struct hostap_80211_rx_status *rx_stats, int type);
83ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenvoid hostap_80211_rx(struct net_device *dev, struct sk_buff *skb,
84ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen		     struct hostap_80211_rx_status *rx_stats);
85ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenvoid hostap_dump_rx_80211(const char *name, struct sk_buff *skb,
86ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen			  struct hostap_80211_rx_status *rx_stats);
87ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
88ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinenvoid hostap_dump_tx_80211(const char *name, struct sk_buff *skb);
89d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemmingernetdev_tx_t hostap_data_start_xmit(struct sk_buff *skb,
90d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemminger				   struct net_device *dev);
91d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemmingernetdev_tx_t hostap_mgmt_start_xmit(struct sk_buff *skb,
92d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemminger				   struct net_device *dev);
93d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemmingernetdev_tx_t hostap_master_start_xmit(struct sk_buff *skb,
94d0cf9c0dadcdc89a755bcb301cfc9c796eb28ccfStephen Hemminger				     struct net_device *dev);
95ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen
96ff1d2767d5a43c85f944e86a45284b721f66196cJouni Malinen#endif /* HOSTAP_80211_H */
97