tdls_extr.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /*
  2. ** Id: include/tdls_extr.h#1
  3. */
  4. /*! \file "tdls_extr.h"
  5. \brief This file contains the external used in other modules
  6. for MediaTek Inc. 802.11 Wireless LAN Adapters.
  7. */
  8. /*
  9. ** Log: tdls_extr.h
  10. *
  11. * 11 18 2013 vend_samp.lin
  12. * NULL
  13. * Initial version.
  14. *
  15. **
  16. */
  17. #ifndef _TDLS_EXTR_H
  18. #define _TDLS_EXTR_H
  19. #if (CFG_SUPPORT_TDLS == 1)
  20. /*******************************************************************************
  21. * C O M P I L E R F L A G S
  22. ********************************************************************************
  23. */
  24. /*******************************************************************************
  25. * E X T E R N A L R E F E R E N C E S
  26. ********************************************************************************
  27. */
  28. #define TDLS_TX_QUOTA_EMPTY_TIMEOUT 10
  29. /*******************************************************************************
  30. * C O N S T A N T S
  31. ********************************************************************************
  32. */
  33. /* protocol */
  34. #define TDLS_FRM_PROT_TYPE 0x890d
  35. /* TDLS uses Ethertype 89-0d frames. The UP shall be AC_VI, unless otherwise specified. */
  36. #define USER_PRIORITY_TDLS 5
  37. /* Status code */
  38. #define TDLS_STATUS WLAN_STATUS
  39. #define TDLS_STATUS_SUCCESS WLAN_STATUS_SUCCESS
  40. #define TDLS_STATUS_FAILURE WLAN_STATUS_FAILURE
  41. #define TDLS_STATUS_INVALID_LENGTH WLAN_STATUS_INVALID_LENGTH
  42. #define TDLS_STATUS_RESOURCES WLAN_STATUS_RESOURCES
  43. /*******************************************************************************
  44. * D A T A T Y P E S
  45. ********************************************************************************
  46. */
  47. #define TDLS_U32 UINT32
  48. #define TDLS_U16 UINT16
  49. #define TDLS_U8 UINT8
  50. typedef enum _TDLS_REASON_CODE {
  51. TDLS_REASON_CODE_UNREACHABLE = 25,
  52. TDLS_REASON_CODE_UNSPECIFIED = 26,
  53. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_UNKNOWN = 0x80, /* 128 */
  54. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_WIFI_OFF = 0x81, /* 129 */
  55. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_ROAMING = 0x82, /* 130 */
  56. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_PTI_TIMEOUT = 0x83, /* 131 */
  57. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_AGE_TIMEOUT = 0x84, /* 132 */
  58. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_REKEY = 0x85, /* 133 */
  59. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_PTI_SEND_FAIL = 0x86, /* 134 */
  60. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_PTI_SEND_MAX_FAIL = 0x87, /* 135 */
  61. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_WRONG_NETWORK_IDX = 0x88, /* 136 */
  62. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_NON_STATE3 = 0x89, /* 137 */
  63. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_TX_QUOTA_EMPTY = 0x8a, /* 138 */
  64. TDLS_REASON_CODE_MTK_DIS_BY_US_DUE_TO_LOST_TEAR_DOWN = 0x8b /* 139 */
  65. } TDLS_REASON_CODE;
  66. /* TDLS FSM */
  67. typedef struct _TDLS_CMD_PEER_ADD_T {
  68. TDLS_U8 aucPeerMac[6];
  69. #if 0
  70. ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex;
  71. UINT_16 u2CapInfo;
  72. UINT_16 u2OperationalRateSet;
  73. UINT_16 u2BSSBasicRateSet;
  74. BOOLEAN fgIsUnknownBssBasicRate;
  75. UINT_8 ucPhyTypeSet;
  76. #endif
  77. } TDLS_CMD_PEER_ADD_T;
  78. typedef struct _TDLS_CMD_LINK_T {
  79. TDLS_U8 aucPeerMac[6];
  80. BOOLEAN fgIsEnabled;
  81. } TDLS_CMD_LINK_T;
  82. typedef struct _TDLS_CMD_PEER_UPDATE_HT_CAP_MCS_INFO_T {
  83. TDLS_U8 arRxMask[10];
  84. TDLS_U16 u2RxHighest;
  85. TDLS_U8 ucTxParams;
  86. TDLS_U8 Reserved[3];
  87. } TDLS_CMD_PEER_UPDATE_HT_CAP_MCS_INFO_T;
  88. typedef struct _TDLS_CMD_PEER_UPDATE_HT_CAP_T {
  89. TDLS_U16 u2CapInfo;
  90. TDLS_U8 ucAmpduParamsInfo;
  91. /* 16 bytes MCS information */
  92. TDLS_CMD_PEER_UPDATE_HT_CAP_MCS_INFO_T rMCS;
  93. TDLS_U16 u2ExtHtCapInfo;
  94. TDLS_U32 u4TxBfCapInfo;
  95. TDLS_U8 ucAntennaSelInfo;
  96. } TDLS_CMD_PEER_UPDATE_HT_CAP_T;
  97. typedef struct _TDLS_CMD_PEER_UPDATE_T {
  98. TDLS_U8 aucPeerMac[6];
  99. #define TDLS_CMD_PEER_UPDATE_SUP_CHAN_MAX 50
  100. TDLS_U8 aucSupChan[TDLS_CMD_PEER_UPDATE_SUP_CHAN_MAX];
  101. TDLS_U16 u2StatusCode;
  102. #define TDLS_CMD_PEER_UPDATE_SUP_RATE_MAX 50
  103. TDLS_U8 aucSupRate[TDLS_CMD_PEER_UPDATE_SUP_RATE_MAX];
  104. TDLS_U16 u2SupRateLen;
  105. TDLS_U8 UapsdBitmap;
  106. TDLS_U8 UapsdMaxSp; /* MAX_SP */
  107. TDLS_U16 u2Capability;
  108. #define TDLS_CMD_PEER_UPDATE_EXT_CAP_MAXLEN 5
  109. TDLS_U8 aucExtCap[TDLS_CMD_PEER_UPDATE_EXT_CAP_MAXLEN];
  110. TDLS_U16 u2ExtCapLen;
  111. TDLS_CMD_PEER_UPDATE_HT_CAP_T rHtCap;
  112. BOOLEAN fgIsSupHt;
  113. } TDLS_CMD_PEER_UPDATE_T;
  114. /* Command to TDLS core module */
  115. typedef enum _TDLS_CMD_CORE_ID {
  116. TDLS_CORE_CMD_TEST_NULL_RCV = 0x00,
  117. TDLS_CORE_CMD_TEST_PTI_RSP = 0x01,
  118. TDLS_CORE_CMD_MIB_UPDATE = 0x02,
  119. TDLS_CORE_CMD_TEST_TX_FAIL_SKIP = 0x03,
  120. TDLS_CORE_CMD_UAPSD_CONF = 0x04,
  121. TDLS_CORE_CMD_TEST_DATA_RCV = 0x05,
  122. TDLS_CORE_CMD_TEST_PTI_REQ = 0x06,
  123. TDLS_CORE_CMD_TEST_CHSW_REQ = 0x07,
  124. TDLS_CORE_CMD_CHSW_CONF = 0x08,
  125. TDLS_CORE_CMD_TEST_KEEP_ALIVE_SKIP = 0x09,
  126. TDLS_CORE_CMD_TEST_CHSW_TIMEOUT_SKIP = 0x0a,
  127. TDLS_CORE_CMD_TEST_CHSW_RSP = 0x0b,
  128. TDLS_CORE_CMD_TEST_SCAN_SKIP = 0x0c,
  129. TDLS_CORE_CMD_SETUP_CONF = 0x0d,
  130. TDLS_CORE_CMD_TEST_TEAR_DOWN = 0x0e,
  131. TDLS_CORE_CMD_KEY_INFO = 0x0f,
  132. TDLS_CORE_CMD_TEST_PTI_TX_FAIL = 0x10
  133. } TDLS_CMD_CORE_ID;
  134. typedef struct _TDLS_CMD_CORE_TEST_NULL_RCV_T {
  135. TDLS_U32 u4PM;
  136. } TDLS_CMD_CORE_TEST_NULL_RCV_T;
  137. typedef struct _TDLS_CMD_CORE_TEST_PTI_REQ_RCV_T {
  138. TDLS_U32 u4DialogToken;
  139. } TDLS_CMD_CORE_TEST_PTI_REQ_RCV_T;
  140. typedef struct _TDLS_CMD_CORE_TEST_PTI_RSP_RCV_T {
  141. TDLS_U32 u4DialogToken;
  142. TDLS_U32 u4PM;
  143. } TDLS_CMD_CORE_TEST_PTI_RSP_RCV_T;
  144. typedef struct _TDLS_CMD_CORE_TEST_TEAR_DOWN_RCV_T {
  145. TDLS_U32 u4ReasonCode;
  146. } TDLS_CMD_CORE_TEST_TEAR_DOWN_RCV_T;
  147. typedef struct _TDLS_CMD_CORE_TEST_CHST_REQ_RCV_T {
  148. TDLS_U32 u4Chan;
  149. TDLS_U32 u4RegClass;
  150. TDLS_U32 u4SecChanOff;
  151. TDLS_U32 u4SwitchTime;
  152. TDLS_U32 u4SwitchTimeout;
  153. } TDLS_CMD_CORE_TEST_CHST_REQ_RCV_T;
  154. typedef struct _TDLS_CMD_CORE_TEST_CHST_RSP_RCV_T {
  155. TDLS_U32 u4Chan;
  156. TDLS_U32 u4SwitchTime;
  157. TDLS_U32 u4SwitchTimeout;
  158. TDLS_U32 u4StatusCode;
  159. } TDLS_CMD_CORE_TEST_CHST_RSP_RCV_T;
  160. typedef struct _TDLS_CMD_CORE_TEST_DATA_RCV_T {
  161. TDLS_U32 u4PM;
  162. TDLS_U32 u4UP;
  163. TDLS_U32 u4EOSP;
  164. TDLS_U32 u4IsNull;
  165. } TDLS_CMD_CORE_TEST_DATA_RCV_T;
  166. typedef struct _TDLS_CMD_CORE_MIB_PARAM_UPDATE_T {
  167. BOOLEAN Tdlsdot11TunneledDirectLinkSetupImplemented;
  168. BOOLEAN Tdlsdot11TDLSPeerUAPSDBufferSTAActivated;
  169. BOOLEAN Tdlsdot11TDLSPeerPSMActivated;
  170. TDLS_U16 Tdlsdot11TDLSPeerUAPSDIndicationWindow;
  171. BOOLEAN Tdlsdot11TDLSChannelSwitchingActivated;
  172. TDLS_U8 Tdlsdot11TDLSPeerSTAMissingAckRetryLimit;
  173. TDLS_U8 Tdlsdot11TDLSResponseTimeout;
  174. TDLS_U16 Tdlsdot11TDLSProbeDelay;
  175. TDLS_U8 Tdlsdot11TDLSDiscoveryRequestWindow;
  176. TDLS_U8 Tdlsdot11TDLSACDeterminationInterval;
  177. } TDLS_CMD_CORE_MIB_PARAM_UPDATE_T;
  178. typedef struct _TDLS_CMD_CORE_TEST_TX_FAIL_SKIP_T {
  179. BOOLEAN fgIsEnable;
  180. } TDLS_CMD_CORE_TEST_TX_FAIL_SKIP_T;
  181. typedef struct _TDLS_CMD_CORE_UAPSD_CONFIG_T {
  182. BOOLEAN fgIsSpTimeoutSkip;
  183. BOOLEAN fgIsPtiTimeoutSkip;
  184. } TDLS_CMD_CORE_UAPSD_CONFIG_T;
  185. typedef struct _TDLS_CMD_CORE_SETUP_CONFIG_T {
  186. BOOLEAN fgIs2040Supported;
  187. } TDLS_CMD_CORE_SETUP_CONFIG_T;
  188. typedef struct _TDLS_CMD_CORE_CHSW_CONFIG_T {
  189. TDLS_U8 ucNetTypeIndex;
  190. BOOLEAN fgIsChSwEnabled;
  191. BOOLEAN fgIsChSwStarted;
  192. TDLS_U8 ucRegClass;
  193. TDLS_U8 ucTargetChan;
  194. TDLS_U8 ucSecChanOff;
  195. BOOLEAN fgIsChSwRegular;
  196. } TDLS_CMD_CORE_CHSW_CONFIG_T;
  197. typedef struct _TDLS_CMD_CORE_TEST_KEEP_ALIVE_SKIP_T {
  198. BOOLEAN fgIsEnable;
  199. } TDLS_CMD_CORE_TEST_KEEP_ALIVE_SKIP_T;
  200. typedef struct _TDLS_CMD_CORE_TEST_CHSW_TIMEOUT_SKIP_T {
  201. BOOLEAN fgIsEnable;
  202. } TDLS_CMD_CORE_TEST_CHSW_TIMEOUT_SKIP_T;
  203. typedef struct _TDLS_CMD_CORE_TEST_PROHIBIT_T {
  204. BOOLEAN fgIsEnable;
  205. BOOLEAN fgIsSet;
  206. } TDLS_CMD_CORE_TEST_PROHIBIT_T;
  207. typedef struct _TDLS_CMD_CORE_TEST_SCAN_SKIP_T {
  208. BOOLEAN fgIsEnable;
  209. } TDLS_CMD_CORE_TEST_SCAN_SKIP_T;
  210. typedef struct _TDLS_CMD_CORE_INFO_DISPLAY_T {
  211. BOOLEAN fgIsToClearAllHistory;
  212. } TDLS_CMD_CORE_INFO_DISPLAY_T;
  213. typedef struct _TDLS_CMD_CORE_TEST_PTI_TX_FAIL_T {
  214. BOOLEAN fgIsEnable;
  215. } TDLS_CMD_CORE_TEST_PTI_TX_FAIL_T;
  216. typedef struct _TDLS_CMD_CORE_T {
  217. TDLS_U32 u4Command; /* TDLS_CMD_CORE_ID */
  218. TDLS_U8 aucPeerMac[6];
  219. TDLS_U8 ucNetTypeIndex;
  220. #define TDLS_CMD_CORE_RESERVED_SIZE 50
  221. union {
  222. TDLS_CMD_CORE_TEST_NULL_RCV_T rCmdNullRcv;
  223. TDLS_CMD_CORE_TEST_PTI_REQ_RCV_T rCmdPtiReqRcv;
  224. TDLS_CMD_CORE_TEST_PTI_RSP_RCV_T rCmdPtiRspRcv;
  225. TDLS_CMD_CORE_TEST_TEAR_DOWN_RCV_T rCmdTearDownRcv;
  226. TDLS_CMD_CORE_TEST_CHST_REQ_RCV_T rCmdChStReqRcv;
  227. TDLS_CMD_CORE_TEST_CHST_RSP_RCV_T rCmdChStRspRcv;
  228. TDLS_CMD_CORE_TEST_DATA_RCV_T rCmdDatRcv;
  229. TDLS_CMD_CORE_TEST_TX_FAIL_SKIP_T rCmdTxFailSkip;
  230. TDLS_CMD_CORE_TEST_KEEP_ALIVE_SKIP_T rCmdKeepAliveSkip;
  231. TDLS_CMD_CORE_TEST_CHSW_TIMEOUT_SKIP_T rCmdChSwTimeoutSkip;
  232. TDLS_CMD_CORE_TEST_PROHIBIT_T rCmdProhibit;
  233. TDLS_CMD_CORE_TEST_SCAN_SKIP_T rCmdScanSkip;
  234. TDLS_CMD_CORE_TEST_PTI_TX_FAIL_T rCmdPtiTxFail;
  235. TDLS_CMD_CORE_MIB_PARAM_UPDATE_T rCmdMibUpdate;
  236. TDLS_CMD_CORE_UAPSD_CONFIG_T rCmdUapsdConf;
  237. TDLS_CMD_CORE_CHSW_CONFIG_T rCmdChSwConf;
  238. TDLS_CMD_CORE_SETUP_CONFIG_T rCmdSetupConf;
  239. TDLS_CMD_CORE_INFO_DISPLAY_T rCmdInfoDisplay;
  240. TDLS_U8 Reserved[TDLS_CMD_CORE_RESERVED_SIZE];
  241. } Content;
  242. } TDLS_CMD_CORE_T;
  243. /*******************************************************************************
  244. * P U B L I C D A T A
  245. ********************************************************************************
  246. */
  247. /*******************************************************************************
  248. * P R I V A T E D A T A
  249. ********************************************************************************
  250. */
  251. /*******************************************************************************
  252. * M A C R O S
  253. ********************************************************************************
  254. */
  255. /*
  256. assign station record idx for the packet only when STA_STATE_3
  257. Or we will try to send data frame when the TDLS peer's state is STA_STATE_1
  258. EX:
  259. 1. mtk_cfg80211_add_station: First create the STA_RECORD_T;
  260. 2. TdlsexCfg80211TdlsMgmt: Send a TDLS request frame.
  261. 3. mtk_cfg80211_add_station: Change state to STA_STATE_1.
  262. 4. TdlsexCfg80211TdlsMgmt: Send a TDLS request frame.
  263. */
  264. #define TDLSEX_STA_REC_IDX_GET(__prAdapter__, __MsduInfo__) \
  265. { \
  266. STA_RECORD_T *__StaRec__; \
  267. __MsduInfo__->ucStaRecIndex = STA_REC_INDEX_NOT_FOUND; \
  268. __StaRec__ = cnmGetStaRecByAddress(__prAdapter__, \
  269. (UINT_8) NETWORK_TYPE_AIS_INDEX, \
  270. __MsduInfo__->aucEthDestAddr); \
  271. if ((__StaRec__ != NULL) && \
  272. ((__StaRec__)->ucStaState == STA_STATE_3) && \
  273. (IS_TDLS_STA(__StaRec__))) { \
  274. __MsduInfo__->ucStaRecIndex = __StaRec__->ucIndex; \
  275. } \
  276. }
  277. /* fill wiphy flag */
  278. #define TDLSEX_WIPHY_FLAGS_INIT(__fgFlag__)\
  279. { \
  280. __fgFlag__ |= (WIPHY_FLAG_SUPPORTS_TDLS | WIPHY_FLAG_TDLS_EXTERNAL_SETUP);\
  281. }
  282. /* assign user priority of a TDLS action frame */
  283. /*
  284. According to 802.11z: Setup req/resp are sent in AC_BK, otherwise we should default
  285. to AC_VI.
  286. */
  287. #define TDLSEX_UP_ASSIGN(__UserPriority__) \
  288. { \
  289. __UserPriority__ = USER_PRIORITY_TDLS; \
  290. }
  291. /*******************************************************************************
  292. * F U N C T I O N D E C L A R A T I O N S
  293. ********************************************************************************
  294. */
  295. int
  296. TdlsexCfg80211TdlsMgmt(struct wiphy *wiphy, struct net_device *dev,
  297. const u8 *peer, u8 action_code, u8 dialog_token,
  298. u16 status_code, u32 peer_capability,
  299. bool initiator, const u8 *buf, size_t len);
  300. int TdlsexCfg80211TdlsOper(struct wiphy *wiphy, struct net_device *dev,
  301. const u8 *peer, enum nl80211_tdls_operation oper);
  302. VOID TdlsexCmd(P_GLUE_INFO_T prGlueInfo, UINT_8 *prInBuf, UINT_32 u4InBufLen);
  303. VOID TdlsexBssExtCapParse(STA_RECORD_T *prStaRec, UINT_8 *pucIE);
  304. VOID TdlsexEventHandle(P_GLUE_INFO_T prGlueInfo, UINT8 *prInBuf, UINT32 u4InBufLen);
  305. TDLS_STATUS TdlsexKeyHandle(ADAPTER_T *prAdapter, PARAM_KEY_T *prNewKey);
  306. VOID TdlsexInit(ADAPTER_T *prAdapter);
  307. BOOLEAN TdlsexIsAnyPeerInPowerSave(ADAPTER_T *prAdapter);
  308. TDLS_STATUS TdlsexLinkCtrl(ADAPTER_T *prAdapter, VOID *pvSetBuffer, UINT_32 u4SetBufferLen, UINT_32 *pu4SetInfoLen);
  309. VOID
  310. TdlsexLinkHistoryRecord(GLUE_INFO_T *prGlueInfo,
  311. BOOLEAN fgIsTearDown, UINT8 *pucPeerMac, BOOLEAN fgIsFromUs, UINT16 u2ReasonCode);
  312. TDLS_STATUS TdlsexMgmtCtrl(ADAPTER_T *prAdapter, VOID *pvSetBuffer, UINT_32 u4SetBufferLen, UINT_32 *pu4SetInfoLen);
  313. TDLS_STATUS TdlsexPeerAdd(P_ADAPTER_T prAdapter, PVOID pvSetBuffer, UINT_32 u4SetBufferLen, PUINT_32 pu4SetInfoLen);
  314. TDLS_STATUS TdlsexPeerUpdate(P_ADAPTER_T prAdapter, PVOID pvSetBuffer, UINT_32 u4SetBufferLen, PUINT_32 pu4SetInfoLen);
  315. BOOLEAN TdlsexRxFrameDrop(GLUE_INFO_T *prGlueInfo, UINT_8 *pPkt);
  316. VOID TdlsexRxFrameHandle(GLUE_INFO_T *prGlueInfo, UINT8 *pPkt, UINT16 u2PktLen);
  317. TDLS_STATUS TdlsexStaRecIdxGet(ADAPTER_T *prAdapter, MSDU_INFO_T *prMsduInfo);
  318. VOID TdlsexTxQuotaCheck(GLUE_INFO_T *prGlueInfo, STA_RECORD_T *prStaRec, UINT8 FreeQuota);
  319. VOID TdlsexUninit(ADAPTER_T *prAdapter);
  320. /*******************************************************************************
  321. * F U N C T I O N S
  322. ********************************************************************************
  323. */
  324. #endif /* CFG_SUPPORT_TDLS */
  325. #endif /* _TDLS_EXTR_H */