949 lines
30 KiB
C
Executable File
949 lines
30 KiB
C
Executable File
/*
|
|
* Copyright (C) 2017 XRADIO TECHNOLOGY CO., LTD. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the
|
|
* distribution.
|
|
* 3. Neither the name of XRADIO TECHNOLOGY CO., LTD. nor the names of
|
|
* its contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef _NET_WLAN_WLAN_DEFS_H_
|
|
#define _NET_WLAN_WLAN_DEFS_H_
|
|
|
|
#include <stdint.h>
|
|
#include "compiler.h"
|
|
#include "net/wlan/wlan_common.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef WPA_BIT
|
|
#define WPA_BIT(x) (1 << (x))
|
|
#endif
|
|
|
|
/**
|
|
* @brief WPA cipher definition
|
|
*/
|
|
#define WPA_CIPHER_NONE WPA_BIT(0)
|
|
#define WPA_CIPHER_WEP40 WPA_BIT(1)
|
|
#define WPA_CIPHER_WEP104 WPA_BIT(2)
|
|
#define WPA_CIPHER_TKIP WPA_BIT(3)
|
|
#define WPA_CIPHER_CCMP WPA_BIT(4)
|
|
#define WPA_CIPHER_AES_128_CMAC WPA_BIT(5)
|
|
#define WPA_CIPHER_GCMP WPA_BIT(6)
|
|
#define WPA_CIPHER_SMS4 WPA_BIT(7)
|
|
#define WPA_CIPHER_GCMP_256 WPA_BIT(8)
|
|
#define WPA_CIPHER_CCMP_256 WPA_BIT(9)
|
|
#define WPA_CIPHER_BIP_GMAC_128 WPA_BIT(11)
|
|
#define WPA_CIPHER_BIP_GMAC_256 WPA_BIT(12)
|
|
#define WPA_CIPHER_BIP_CMAC_256 WPA_BIT(13)
|
|
#define WPA_CIPHER_GTK_NOT_USED WPA_BIT(14)
|
|
#define WPA_CIPHER_MASK (WPA_BIT(15) - 1)
|
|
|
|
/**
|
|
* @brief WPA key management definition
|
|
*/
|
|
#define WPA_KEY_MGMT_IEEE8021X WPA_BIT(0)
|
|
#define WPA_KEY_MGMT_PSK WPA_BIT(1)
|
|
#define WPA_KEY_MGMT_NONE WPA_BIT(2)
|
|
#define WPA_KEY_MGMT_IEEE8021X_NO_WPA WPA_BIT(3)
|
|
#define WPA_KEY_MGMT_WPA_NONE WPA_BIT(4)
|
|
#define WPA_KEY_MGMT_FT_IEEE8021X WPA_BIT(5)
|
|
#define WPA_KEY_MGMT_FT_PSK WPA_BIT(6)
|
|
#define WPA_KEY_MGMT_IEEE8021X_SHA256 WPA_BIT(7)
|
|
#define WPA_KEY_MGMT_PSK_SHA256 WPA_BIT(8)
|
|
#define WPA_KEY_MGMT_WPS WPA_BIT(9)
|
|
#define WPA_KEY_MGMT_SAE WPA_BIT(10)
|
|
#define WPA_KEY_MGMT_FT_SAE WPA_BIT(11)
|
|
#define WPA_KEY_MGMT_WAPI_PSK WPA_BIT(12)
|
|
#define WPA_KEY_MGMT_WAPI_CERT WPA_BIT(13)
|
|
#define WPA_KEY_MGMT_CCKM WPA_BIT(14)
|
|
#define WPA_KEY_MGMT_OSEN WPA_BIT(15)
|
|
#define WPA_KEY_MGMT_IEEE8021X_SUITE_B WPA_BIT(16)
|
|
#define WPA_KEY_MGMT_IEEE8021X_SUITE_B_192 WPA_BIT(17)
|
|
#define WPA_KEY_MGMT_FILS_SHA256 WPA_BIT(18)
|
|
#define WPA_KEY_MGMT_FILS_SHA384 WPA_BIT(19)
|
|
#define WPA_KEY_MGMT_FT_FILS_SHA256 WPA_BIT(20)
|
|
#define WPA_KEY_MGMT_FT_FILS_SHA384 WPA_BIT(21)
|
|
#define WPA_KEY_MGMT_OWE WPA_BIT(22)
|
|
#define WPA_KEY_MGMT_DPP WPA_BIT(23)
|
|
#define WPA_KEY_MGMT_FT_IEEE8021X_SHA384 WPA_BIT(24)
|
|
|
|
#define WPA_KEY_MGMT_FT (WPA_KEY_MGMT_FT_PSK | \
|
|
WPA_KEY_MGMT_FT_IEEE8021X | \
|
|
WPA_KEY_MGMT_FT_IEEE8021X_SHA384 | \
|
|
WPA_KEY_MGMT_FT_SAE | \
|
|
WPA_KEY_MGMT_FT_FILS_SHA256 | \
|
|
WPA_KEY_MGMT_FT_FILS_SHA384)
|
|
|
|
|
|
#define WPA_KEY_MGMT_MASK (WPA_BIT(25) - 1)
|
|
|
|
/**
|
|
* @brief WPA protocol definition
|
|
*/
|
|
#define WPA_PROTO_WPA WPA_BIT(0)
|
|
#define WPA_PROTO_RSN WPA_BIT(1)
|
|
#define WPA_PROTO_WAPI WPA_BIT(2)
|
|
#define WPA_PROTO_OSEN WPA_BIT(3)
|
|
#define WPA_PROTO_MASK (WPA_BIT(4) - 1)
|
|
|
|
/**
|
|
* @brief WPA authentication algorithm definition
|
|
*/
|
|
#define WPA_AUTH_ALG_OPEN WPA_BIT(0)
|
|
#define WPA_AUTH_ALG_SHARED WPA_BIT(1)
|
|
#define WPA_AUTH_ALG_LEAP WPA_BIT(2)
|
|
#define WPA_AUTH_ALG_FT WPA_BIT(3)
|
|
#define WPA_AUTH_ALG_SAE WPA_BIT(4)
|
|
#define WPA_AUTH_ALG_FILS WPA_BIT(5)
|
|
#define WPA_AUTH_ALG_FILS_SK_PFS WPA_BIT(6)
|
|
#define WPA_AUTH_ALG_MASK (WPA_BIT(7) - 1)
|
|
#define WPA_AUTH_ALG_AUTO 0 /* automatic selection */
|
|
|
|
/**
|
|
* @brief enum mfp_options - Management frame protection (IEEE 802.11w) options
|
|
*/
|
|
enum mfp_options {
|
|
NO_MGMT_FRAME_PROTECTION = 0,
|
|
MGMT_FRAME_PROTECTION_OPTIONAL = 1,
|
|
MGMT_FRAME_PROTECTION_REQUIRED = 2,
|
|
};
|
|
#define MGMT_FRAME_PROTECTION_DEFAULT 3
|
|
|
|
/**
|
|
* @brief WPA scan result flags definition
|
|
*/
|
|
#define WPA_FLAGS_WPA WPA_BIT(0)
|
|
#define WPA_FLAGS_RSN WPA_BIT(1)
|
|
#define WPA_FLAGS_WEP WPA_BIT(2)
|
|
#define WPA_FLAGS_WPS_PBC WPA_BIT(3)
|
|
#define WPA_FLAGS_WPS_AUTH WPA_BIT(4)
|
|
#define WPA_FLAGS_WPS_PIN WPA_BIT(5)
|
|
#define WPA_FLAGS_WPS WPA_BIT(6)
|
|
#define WPA_FLAGS_IBSS WPA_BIT(7)
|
|
#define WPA_FLAGS_ESS WPA_BIT(8)
|
|
#define WPA_FLAGS_SAE WPA_BIT(9)
|
|
|
|
/**
|
|
* @brief WLAN SSID and passphrase definition
|
|
*/
|
|
#define WLAN_SSID_MAX_LEN 32
|
|
#define WLAN_PASSPHRASE_MIN_LEN 8
|
|
#define WLAN_PASSPHRASE_MAX_LEN 63
|
|
#define WLAN_PSK_HEX_LEN 32
|
|
#define WLAN_PSK_HEX_STR_LEN 64 /* two characters per octet of PSK */
|
|
#define WLAN_MAC_ADDR_LEN 6
|
|
|
|
/**
|
|
* @brief WLAN WEP key length definition
|
|
*/
|
|
#define WLAN_WEP40_KEY_LEN 5 /* 5-byte (40-bit) */
|
|
#define WLAN_WEP104_KEY_LEN 13 /* 13-byte (104-bit) */
|
|
#define WLAN_WEP128_KEY_LEN 16 /* 16-byte (128-bit), unsupported */
|
|
#define WLAN_WEP_KEY_MAX_LEN WLAN_WEP128_KEY_LEN
|
|
|
|
/**
|
|
* @brief IEEE 802.11 frame type definition
|
|
*/
|
|
#define IEEE80211_FC_TYPE_SHIFT 2
|
|
#define IEEE80211_FC_TYPE_MASK (0x3 << IEEE80211_FC_TYPE_SHIFT)
|
|
#define IEEE80211_FC_TYPE_MGMT (0x0 << IEEE80211_FC_TYPE_SHIFT)
|
|
#define IEEE80211_FC_TYPE_CTRL (0x1 << IEEE80211_FC_TYPE_SHIFT)
|
|
#define IEEE80211_FC_TYPE_DATA (0x2 << IEEE80211_FC_TYPE_SHIFT)
|
|
|
|
/**
|
|
* @brief IEEE 802.11 management frame subtype definition
|
|
*/
|
|
#define IEEE80211_FC_STYPE_SHIFT 4
|
|
#define IEEE80211_FC_STYPE_MASK (0xf << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_ASSOC_REQ (0x0 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_ASSOC_RESP (0x1 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_REASSOC_REQ (0x2 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_REASSOC_RESP (0x3 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_PROBE_REQ (0x4 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_PROBE_RESP (0x5 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_BEACON (0x8 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_ATIM (0x9 << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_DISASSOC (0xa << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_AUTH (0xb << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_DEAUTH (0xc << IEEE80211_FC_STYPE_SHIFT)
|
|
#define IEEE80211_FC_STYPE_ACTION (0xd << IEEE80211_FC_STYPE_SHIFT)
|
|
|
|
#define IEEE80211_FC0_VERSION_MASK 0x03
|
|
#define IEEE80211_FC0_VERSION_SHIFT 0
|
|
#define IEEE80211_FC0_VERSION_0 0x00
|
|
#define IEEE80211_FC0_TYPE_MASK 0x0c
|
|
#define IEEE80211_FC0_TYPE_SHIFT 2
|
|
#define IEEE80211_FC0_TYPE_MGT 0x00
|
|
#define IEEE80211_FC0_TYPE_CTL 0x04
|
|
#define IEEE80211_FC0_TYPE_DATA 0x08
|
|
|
|
#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
|
|
#define IEEE80211_FC0_SUBTYPE_SHIFT 4
|
|
|
|
#define IEEE80211_FC1_DIR_MASK 0x03
|
|
#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
|
|
#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
|
|
#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
|
|
#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
|
|
|
|
#define IEEE80211_ADDR_LEN 6
|
|
|
|
/* Status codes (IEEE Std 802.11-2016, 9.4.1.9, Table 9-46) */
|
|
#define WLAN_STATUS_SUCCESS 0
|
|
#define WLAN_STATUS_UNSPECIFIED_FAILURE 1
|
|
#define WLAN_STATUS_TDLS_WAKEUP_ALTERNATE 2
|
|
#define WLAN_STATUS_TDLS_WAKEUP_REJECT 3
|
|
#define WLAN_STATUS_SECURITY_DISABLED 5
|
|
#define WLAN_STATUS_UNACCEPTABLE_LIFETIME 6
|
|
#define WLAN_STATUS_NOT_IN_SAME_BSS 7
|
|
#define WLAN_STATUS_CAPS_UNSUPPORTED 10
|
|
#define WLAN_STATUS_REASSOC_NO_ASSOC 11
|
|
#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12
|
|
#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13
|
|
#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14
|
|
#define WLAN_STATUS_CHALLENGE_FAIL 15
|
|
#define WLAN_STATUS_AUTH_TIMEOUT 16
|
|
#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17
|
|
#define WLAN_STATUS_ASSOC_DENIED_RATES 18
|
|
#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19
|
|
#define WLAN_STATUS_SPEC_MGMT_REQUIRED 22
|
|
#define WLAN_STATUS_PWR_CAPABILITY_NOT_VALID 23
|
|
#define WLAN_STATUS_SUPPORTED_CHANNEL_NOT_VALID 24
|
|
#define WLAN_STATUS_ASSOC_DENIED_NO_SHORT_SLOT_TIME 25
|
|
#define WLAN_STATUS_ASSOC_DENIED_NO_HT 27
|
|
#define WLAN_STATUS_R0KH_UNREACHABLE 28
|
|
#define WLAN_STATUS_ASSOC_DENIED_NO_PCO 29
|
|
#define WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY 30
|
|
#define WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION 31
|
|
#define WLAN_STATUS_UNSPECIFIED_QOS_FAILURE 32
|
|
#define WLAN_STATUS_DENIED_INSUFFICIENT_BANDWIDTH 33
|
|
#define WLAN_STATUS_DENIED_POOR_CHANNEL_CONDITIONS 34
|
|
#define WLAN_STATUS_DENIED_QOS_NOT_SUPPORTED 35
|
|
#define WLAN_STATUS_REQUEST_DECLINED 37
|
|
#define WLAN_STATUS_INVALID_PARAMETERS 38
|
|
#define WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES 39
|
|
#define WLAN_STATUS_INVALID_IE 40
|
|
#define WLAN_STATUS_GROUP_CIPHER_NOT_VALID 41
|
|
#define WLAN_STATUS_PAIRWISE_CIPHER_NOT_VALID 42
|
|
#define WLAN_STATUS_AKMP_NOT_VALID 43
|
|
#define WLAN_STATUS_UNSUPPORTED_RSN_IE_VERSION 44
|
|
#define WLAN_STATUS_INVALID_RSN_IE_CAPAB 45
|
|
#define WLAN_STATUS_CIPHER_REJECTED_PER_POLICY 46
|
|
#define WLAN_STATUS_TS_NOT_CREATED 47
|
|
#define WLAN_STATUS_DIRECT_LINK_NOT_ALLOWED 48
|
|
#define WLAN_STATUS_DEST_STA_NOT_PRESENT 49
|
|
#define WLAN_STATUS_DEST_STA_NOT_QOS_STA 50
|
|
#define WLAN_STATUS_ASSOC_DENIED_LISTEN_INT_TOO_LARGE 51
|
|
#define WLAN_STATUS_INVALID_FT_ACTION_FRAME_COUNT 52
|
|
#define WLAN_STATUS_INVALID_PMKID 53
|
|
#define WLAN_STATUS_INVALID_MDIE 54
|
|
#define WLAN_STATUS_INVALID_FTIE 55
|
|
#define WLAN_STATUS_REQUESTED_TCLAS_NOT_SUPPORTED 56
|
|
#define WLAN_STATUS_INSUFFICIENT_TCLAS_PROCESSING_RESOURCES 57
|
|
#define WLAN_STATUS_TRY_ANOTHER_BSS 58
|
|
#define WLAN_STATUS_GAS_ADV_PROTO_NOT_SUPPORTED 59
|
|
#define WLAN_STATUS_NO_OUTSTANDING_GAS_REQ 60
|
|
#define WLAN_STATUS_GAS_RESP_NOT_RECEIVED 61
|
|
#define WLAN_STATUS_STA_TIMED_OUT_WAITING_FOR_GAS_RESP 62
|
|
#define WLAN_STATUS_GAS_RESP_LARGER_THAN_LIMIT 63
|
|
#define WLAN_STATUS_REQ_REFUSED_HOME 64
|
|
#define WLAN_STATUS_ADV_SRV_UNREACHABLE 65
|
|
#define WLAN_STATUS_REQ_REFUSED_SSPN 67
|
|
#define WLAN_STATUS_REQ_REFUSED_UNAUTH_ACCESS 68
|
|
#define WLAN_STATUS_INVALID_RSNIE 72
|
|
#define WLAN_STATUS_U_APSD_COEX_NOT_SUPPORTED 73
|
|
#define WLAN_STATUS_U_APSD_COEX_MODE_NOT_SUPPORTED 74
|
|
#define WLAN_STATUS_BAD_INTERVAL_WITH_U_APSD_COEX 75
|
|
#define WLAN_STATUS_ANTI_CLOGGING_TOKEN_REQ 76
|
|
#define WLAN_STATUS_FINITE_CYCLIC_GROUP_NOT_SUPPORTED 77
|
|
#define WLAN_STATUS_CANNOT_FIND_ALT_TBTT 78
|
|
#define WLAN_STATUS_TRANSMISSION_FAILURE 79
|
|
#define WLAN_STATUS_REQ_TCLAS_NOT_SUPPORTED 80
|
|
#define WLAN_STATUS_TCLAS_RESOURCES_EXCHAUSTED 81
|
|
#define WLAN_STATUS_REJECTED_WITH_SUGGESTED_BSS_TRANSITION 82
|
|
#define WLAN_STATUS_REJECT_WITH_SCHEDULE 83
|
|
#define WLAN_STATUS_REJECT_NO_WAKEUP_SPECIFIED 84
|
|
#define WLAN_STATUS_SUCCESS_POWER_SAVE_MODE 85
|
|
#define WLAN_STATUS_PENDING_ADMITTING_FST_SESSION 86
|
|
#define WLAN_STATUS_PERFORMING_FST_NOW 87
|
|
#define WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW 88
|
|
#define WLAN_STATUS_REJECT_U_PID_SETTING 89
|
|
#define WLAN_STATUS_REFUSED_EXTERNAL_REASON 92
|
|
#define WLAN_STATUS_REFUSED_AP_OUT_OF_MEMORY 93
|
|
#define WLAN_STATUS_REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED 94
|
|
#define WLAN_STATUS_QUERY_RESP_OUTSTANDING 95
|
|
#define WLAN_STATUS_REJECT_DSE_BAND 96
|
|
#define WLAN_STATUS_TCLAS_PROCESSING_TERMINATED 97
|
|
#define WLAN_STATUS_TS_SCHEDULE_CONFLICT 98
|
|
#define WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL 99
|
|
#define WLAN_STATUS_MCCAOP_RESERVATION_CONFLICT 100
|
|
#define WLAN_STATUS_MAF_LIMIT_EXCEEDED 101
|
|
#define WLAN_STATUS_MCCA_TRACK_LIMIT_EXCEEDED 102
|
|
#define WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT 103
|
|
#define WLAN_STATUS_ASSOC_DENIED_NO_VHT 104
|
|
#define WLAN_STATUS_ENABLEMENT_DENIED 105
|
|
#define WLAN_STATUS_RESTRICTION_FROM_AUTHORIZED_GDB 106
|
|
#define WLAN_STATUS_AUTHORIZATION_DEENABLED 107
|
|
#define WLAN_STATUS_FILS_AUTHENTICATION_FAILURE 112
|
|
#define WLAN_STATUS_UNKNOWN_AUTHENTICATION_SERVER 113
|
|
#define WLAN_STATUS_UNKNOWN_PASSWORD_IDENTIFIER 123
|
|
|
|
/* Reason codes (IEEE Std 802.11-2016, 9.4.1.7, Table 9-45) */
|
|
#define WLAN_REASON_UNSPECIFIED 1
|
|
#define WLAN_REASON_PREV_AUTH_NOT_VALID 2
|
|
#define WLAN_REASON_DEAUTH_LEAVING 3
|
|
#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4
|
|
#define WLAN_REASON_DISASSOC_AP_BUSY 5
|
|
#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6
|
|
#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7
|
|
#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8
|
|
#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9
|
|
#define WLAN_REASON_PWR_CAPABILITY_NOT_VALID 10
|
|
#define WLAN_REASON_SUPPORTED_CHANNEL_NOT_VALID 11
|
|
#define WLAN_REASON_BSS_TRANSITION_DISASSOC 12
|
|
#define WLAN_REASON_INVALID_IE 13
|
|
#define WLAN_REASON_MICHAEL_MIC_FAILURE 14
|
|
#define WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT 15
|
|
#define WLAN_REASON_GROUP_KEY_UPDATE_TIMEOUT 16
|
|
#define WLAN_REASON_IE_IN_4WAY_DIFFERS 17
|
|
#define WLAN_REASON_GROUP_CIPHER_NOT_VALID 18
|
|
#define WLAN_REASON_PAIRWISE_CIPHER_NOT_VALID 19
|
|
#define WLAN_REASON_AKMP_NOT_VALID 20
|
|
#define WLAN_REASON_UNSUPPORTED_RSN_IE_VERSION 21
|
|
#define WLAN_REASON_INVALID_RSN_IE_CAPAB 22
|
|
#define WLAN_REASON_IEEE_802_1X_AUTH_FAILED 23
|
|
#define WLAN_REASON_CIPHER_SUITE_REJECTED 24
|
|
#define WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE 25
|
|
#define WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED 26
|
|
#define WLAN_REASON_SSP_REQUESTED_DISASSOC 27
|
|
#define WLAN_REASON_NO_SSP_ROAMING_AGREEMENT 28
|
|
#define WLAN_REASON_BAD_CIPHER_OR_AKM 29
|
|
#define WLAN_REASON_NOT_AUTHORIZED_THIS_LOCATION 30
|
|
#define WLAN_REASON_SERVICE_CHANGE_PRECLUDES_TS 31
|
|
#define WLAN_REASON_UNSPECIFIED_QOS_REASON 32
|
|
#define WLAN_REASON_NOT_ENOUGH_BANDWIDTH 33
|
|
#define WLAN_REASON_DISASSOC_LOW_ACK 34
|
|
#define WLAN_REASON_EXCEEDED_TXOP 35
|
|
#define WLAN_REASON_STA_LEAVING 36
|
|
#define WLAN_REASON_END_TS_BA_DLS 37
|
|
#define WLAN_REASON_UNKNOWN_TS_BA 38
|
|
#define WLAN_REASON_TIMEOUT 39
|
|
#define WLAN_REASON_PEERKEY_MISMATCH 45
|
|
#define WLAN_REASON_AUTHORIZED_ACCESS_LIMIT_REACHED 46
|
|
#define WLAN_REASON_EXTERNAL_SERVICE_REQUIREMENTS 47
|
|
#define WLAN_REASON_INVALID_FT_ACTION_FRAME_COUNT 48
|
|
#define WLAN_REASON_INVALID_PMKID 49
|
|
#define WLAN_REASON_INVALID_MDE 50
|
|
#define WLAN_REASON_INVALID_FTE 51
|
|
#define WLAN_REASON_MESH_PEERING_CANCELLED 52
|
|
#define WLAN_REASON_MESH_MAX_PEERS 53
|
|
#define WLAN_REASON_MESH_CONFIG_POLICY_VIOLATION 54
|
|
#define WLAN_REASON_MESH_CLOSE_RCVD 55
|
|
#define WLAN_REASON_MESH_MAX_RETRIES 56
|
|
#define WLAN_REASON_MESH_CONFIRM_TIMEOUT 57
|
|
#define WLAN_REASON_MESH_INVALID_GTK 58
|
|
#define WLAN_REASON_MESH_INCONSISTENT_PARAMS 59
|
|
#define WLAN_REASON_MESH_INVALID_SECURITY_CAP 60
|
|
#define WLAN_REASON_MESH_PATH_ERROR_NO_PROXY_INFO 61
|
|
#define WLAN_REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO 62
|
|
#define WLAN_REASON_MESH_PATH_ERROR_DEST_UNREACHABLE 63
|
|
#define WLAN_REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS 64
|
|
#define WLAN_REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ 65
|
|
#define WLAN_REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED 66
|
|
|
|
struct ieee80211_frame {
|
|
uint8_t i_fc[2];
|
|
uint8_t i_dur[2];
|
|
uint8_t i_addr1[IEEE80211_ADDR_LEN];
|
|
uint8_t i_addr2[IEEE80211_ADDR_LEN];
|
|
uint8_t i_addr3[IEEE80211_ADDR_LEN];
|
|
uint8_t i_seq[2];
|
|
/* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
|
|
} __packed;
|
|
|
|
/**
|
|
* @brief Wlan event definition
|
|
*/
|
|
typedef enum wlan_event {
|
|
WLAN_EVENT_CONNECTED,
|
|
WLAN_EVENT_DISCONNECTED,
|
|
WLAN_EVENT_SCAN_SUCCESS,
|
|
WLAN_EVENT_SCAN_FAILED,
|
|
WLAN_EVENT_4WAY_HANDSHAKE_FAILED,
|
|
WLAN_EVENT_SSID_NOT_FOUND,
|
|
WLAN_EVENT_AUTH_TIMEOUT,
|
|
WLAN_EVENT_ASSOC_TIMEOUT,
|
|
WLAN_EVENT_CONNECT_FAILED,
|
|
WLAN_EVENT_CONNECTION_LOSS,
|
|
WLAN_EVENT_ASSOC_FAILED,
|
|
WLAN_EVENT_SAE_COMMIT_FAILED,
|
|
WLAN_EVENT_SAE_CONFIRM_FAILED,
|
|
WLAN_EVENT_P2P_WAKE_UP,
|
|
WLAN_EVENT_P2P_KEEPALIVE_CONNECT_LOST,
|
|
WLAN_EVENT_P2P_IP_WAKE_UP,
|
|
|
|
WLAN_EVENT_BCN_TIM_HOLD,
|
|
|
|
WLAN_EVENT_DEV_HANG,
|
|
} wlan_event_t;
|
|
|
|
/**
|
|
* @brief Wlan power state definition
|
|
*/
|
|
typedef enum wlan_pm_state {
|
|
WLAN_PM_MODE_ON = 0,
|
|
WLAN_PM_MODE_SUSPENDED = 1,
|
|
WLAN_PM_MODE_RESUMED = 2,
|
|
WLAN_PM_MODE_OFF = 3,
|
|
WLAN_PM_MODE_MAX = 4,
|
|
} wlan_pm_state_t;
|
|
|
|
/**
|
|
* @brief Wlan ssid definition
|
|
*/
|
|
typedef struct wlan_ssid {
|
|
uint8_t ssid[WLAN_SSID_MAX_LEN];
|
|
uint8_t ssid_len;
|
|
} wlan_ssid_t;
|
|
|
|
/**
|
|
* @brief Wlan bssid definition
|
|
*/
|
|
typedef struct wlan_bssid {
|
|
uint8_t bssid[WLAN_MAC_ADDR_LEN];
|
|
uint8_t bssid_set;
|
|
} wlan_bssid_t;
|
|
|
|
/**
|
|
* @brief Wlan station configuration field definition
|
|
*/
|
|
typedef enum wlan_sta_field {
|
|
WLAN_STA_FIELD_SSID = 0,
|
|
WLAN_STA_FIELD_PSK,
|
|
WLAN_STA_FIELD_WEP_KEY0,
|
|
WLAN_STA_FIELD_WEP_KEY1,
|
|
WLAN_STA_FIELD_WEP_KEY2,
|
|
WLAN_STA_FIELD_WEP_KEY3,
|
|
WLAN_STA_FIELD_WEP_KEY_INDEX,
|
|
WLAN_STA_FIELD_KEY_MGMT,
|
|
WLAN_STA_FIELD_PAIRWISE_CIPHER,
|
|
WLAN_STA_FIELD_GROUP_CIPHER,
|
|
WLAN_STA_FIELD_GROUP_MGMT_CIPHER,
|
|
WLAN_STA_FIELD_PROTO,
|
|
WLAN_STA_FIELD_AUTH_ALG,
|
|
WLAN_STA_FIELD_IEEE80211W,
|
|
WLAN_STA_FIELD_WPA_PTK_REKEY,
|
|
WLAN_STA_FIELD_SCAN_SSID,
|
|
WLAN_STA_FIELD_BSSID,
|
|
|
|
WLAN_STA_FIELD_NUM,
|
|
} wlan_sta_field_t;
|
|
|
|
/**
|
|
* @brief Wlan station configuration definition
|
|
*/
|
|
typedef struct wlan_sta_config {
|
|
wlan_sta_field_t field;
|
|
|
|
union {
|
|
/**
|
|
* Network name
|
|
*/
|
|
wlan_ssid_t ssid;
|
|
|
|
/**
|
|
* bssid - BSSID
|
|
*
|
|
* If set, this network block is used only when associating with the AP
|
|
* using the configured BSSID
|
|
*/
|
|
wlan_bssid_t bssid;
|
|
|
|
/**
|
|
* WPA preshared key in one of the optional formats:
|
|
* - an ASCII string of passphrase, length is [8, 63]
|
|
* - a hex string of PSK (two characters per octet of PSK), length is 64
|
|
*/
|
|
uint8_t psk[65];
|
|
|
|
/**
|
|
* WEP key in one of the optional formats:
|
|
* - an ASCII string with double quotation, length is {5, 13}
|
|
* - a hex string (two characters per octet), length is {10, 26}
|
|
*/
|
|
uint8_t wep_key[WLAN_WEP_KEY_MAX_LEN * 2 + 1];
|
|
|
|
/**
|
|
* Default key index for TX frames using WEP
|
|
*/
|
|
int wep_tx_keyidx;
|
|
|
|
/**
|
|
* Bitfield of allowed key management protocols
|
|
*
|
|
* WPA_KEY_MGMT_*
|
|
*/
|
|
int key_mgmt;
|
|
|
|
/**
|
|
* Bitfield of allowed pairwise ciphers, WPA_CIPHER_*
|
|
*/
|
|
int pairwise_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed group ciphers, WPA_CIPHER_*
|
|
*/
|
|
int group_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed group management ciphers
|
|
*
|
|
* This is a bitfield of WPA_CIPHER_AES_128_CMAC and WPA_CIPHER_BIP_*
|
|
* values. If 0, no constraint is used for the cipher, i.e., whatever
|
|
* the AP uses is accepted.
|
|
*/
|
|
int group_mgmt_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed protocols
|
|
*
|
|
* WPA_PROTO_*
|
|
*/
|
|
int proto;
|
|
|
|
/**
|
|
* Bitfield of allowed authentication algorithms
|
|
*
|
|
* WPA_AUTH_ALG_*
|
|
*/
|
|
int auth_alg;
|
|
|
|
/**
|
|
* Maximum lifetime for PTK in seconds
|
|
*
|
|
* This value can be used to enforce rekeying of PTK to
|
|
* mitigate some attacks against TKIP deficiencies.
|
|
*/
|
|
int wpa_ptk_rekey;
|
|
|
|
/**
|
|
* Scan this SSID with Probe Requests
|
|
*
|
|
* scan_ssid can be used to scan for APs using hidden SSIDs.
|
|
*/
|
|
int scan_ssid;
|
|
|
|
/**
|
|
* ieee80211w - Whether management frame protection is enabled
|
|
*
|
|
* This value is used to configure policy for management frame
|
|
* protection (IEEE 802.11w). 0 = disabled, 1 = optional, 2 = required.
|
|
*/
|
|
enum mfp_options ieee80211w;
|
|
} u;
|
|
} wlan_sta_config_t;
|
|
|
|
/**
|
|
* @brief Wlan station connection state definition
|
|
*/
|
|
typedef enum wlan_sta_states {
|
|
WLAN_STA_STATE_DISCONNECTED = 0,
|
|
WLAN_STA_STATE_CONNECTED = 1,
|
|
} wlan_sta_states_t;
|
|
|
|
/**
|
|
* @brief WLAN AP status flags definition
|
|
*/
|
|
#define WLAN_STA_AP_STATUS_USE_WPA3 WPA_BIT(0)
|
|
|
|
/**
|
|
* @brief Wlan AP information definition
|
|
*/
|
|
typedef struct wlan_sta_ap {
|
|
wlan_ssid_t ssid;
|
|
uint8_t bssid[6];
|
|
uint8_t channel;
|
|
uint8_t status; /* WLAN AP status flags */
|
|
uint16_t beacon_int;
|
|
int freq;
|
|
int rssi; /* unit is 0.5db */
|
|
int level; /* signal level, unit is dbm */
|
|
int wpa_flags;
|
|
int wpa_cipher;
|
|
int wpa_key_mgmt;
|
|
int rsn_cipher; /* rsn: WPA2/WPA3 */
|
|
int rsn_key_mgmt; /* rsn: WPA2/WPA3 */
|
|
} wlan_sta_ap_t;
|
|
|
|
/**
|
|
* @brief Wlan station scan parameters definition
|
|
*/
|
|
typedef struct wlan_sta_scan_param {
|
|
uint8_t scan_only; /* do scan only */
|
|
uint8_t scan_passive; /* passive scan */
|
|
uint8_t scan_ssid; /* Scan SSID of configured network with Probe Requests */
|
|
} wlan_sta_scan_param_t;
|
|
|
|
/**
|
|
* @brief Wlan station scan results definition
|
|
*/
|
|
typedef struct wlan_sta_scan_results {
|
|
wlan_sta_ap_t *ap;
|
|
int size;
|
|
int num;
|
|
} wlan_sta_scan_results_t;
|
|
|
|
/**
|
|
* @brief Wlan station bss infomation definition
|
|
*/
|
|
typedef struct wlan_sta_bss_info {
|
|
uint8_t *bss;
|
|
uint32_t size;
|
|
} wlan_sta_bss_info_t;
|
|
|
|
/**
|
|
* @brief Parameter of generating WPA PSK based on passphrase and SSID
|
|
*/
|
|
typedef struct wlan_gen_psk_param {
|
|
uint8_t ssid[WLAN_SSID_MAX_LEN];
|
|
uint8_t ssid_len;
|
|
char passphrase[WLAN_PASSPHRASE_MAX_LEN + 1];
|
|
uint8_t psk[WLAN_PSK_HEX_LEN]; /* out */
|
|
} wlan_gen_psk_param_t;
|
|
|
|
/**
|
|
* @brief Wlan station SSID, passphrase and WPA PSK infomation definition
|
|
*/
|
|
typedef struct wlan_ssid_psk {
|
|
uint8_t ssid[WLAN_SSID_MAX_LEN];
|
|
uint8_t ssid_len;
|
|
char passphrase[WLAN_PASSPHRASE_MAX_LEN + 1];
|
|
uint8_t psk_valid;
|
|
uint8_t psk[WLAN_PSK_HEX_LEN];
|
|
} wlan_ssid_psk_t;
|
|
|
|
/**
|
|
* @brief Wlan WPS pin definition
|
|
*/
|
|
typedef struct wlan_sta_wps_pin {
|
|
uint8_t pin[9];
|
|
} wlan_sta_wps_pin_t;
|
|
|
|
/**
|
|
* @brief Wlan AP configuration field definition
|
|
*/
|
|
typedef enum wlan_ap_field {
|
|
WLAN_AP_FIELD_SSID = 0,
|
|
WLAN_AP_FIELD_PSK,
|
|
WLAN_AP_FIELD_KEY_MGMT,
|
|
WLAN_AP_FIELD_WPA_PAIRWISE_CIPHER,
|
|
WLAN_AP_FIELD_RSN_PAIRWISE_CIPHER,
|
|
WLAN_AP_FIELD_PROTO,
|
|
WLAN_AP_FIELD_AUTH_ALG,
|
|
WLAN_AP_FIELD_GROUP_REKEY,
|
|
WLAN_AP_FIELD_STRICT_REKEY,
|
|
WLAN_AP_FIELD_GMK_REKEY,
|
|
WLAN_AP_FIELD_PTK_REKEY,
|
|
WLAN_AP_FIELD_HW_MODE,
|
|
WLAN_AP_FIELD_IEEE80211N,
|
|
WLAN_AP_FIELD_CHANNEL,
|
|
WLAN_AP_FIELD_BEACON_INT,
|
|
WLAN_AP_FIELD_DTIM,
|
|
WLAN_AP_FIELD_MAX_NUM_STA,
|
|
|
|
WLAN_AP_FIELD_NUM,
|
|
} wlan_ap_field_t;
|
|
|
|
/* for compatibility only */
|
|
#define WLAN_AP_FIELD_WPA_CIPHER WLAN_AP_FIELD_WPA_PAIRWISE_CIPHER
|
|
#define WLAN_AP_FIELD_RSN_CIPHER WLAN_AP_FIELD_RSN_PAIRWISE_CIPHER
|
|
|
|
/**
|
|
* @brief Wlan AP hardware mode definition
|
|
*/
|
|
typedef enum wlan_ap_hw_mode {
|
|
WLAN_AP_HW_MODE_IEEE80211B = 0,
|
|
WLAN_AP_HW_MODE_IEEE80211G,
|
|
WLAN_AP_HW_MODE_IEEE80211A,
|
|
WLAN_AP_HW_MODE_IEEE80211AD,
|
|
WLAN_AP_HW_MODE_IEEE80211ANY,
|
|
|
|
WLAN_AP_HW_MODE_NUM,
|
|
} wlan_ap_hw_mode_t;
|
|
|
|
/**
|
|
* @brief Wlan AP configuration definition
|
|
*/
|
|
typedef struct wlan_ap_config {
|
|
wlan_ap_field_t field;
|
|
|
|
union {
|
|
/**
|
|
* Network name
|
|
*/
|
|
wlan_ssid_t ssid;
|
|
|
|
/**
|
|
* WPA preshared key in one of the optional formats:
|
|
* - an ASCII string of passphrase, length is [8, 63]
|
|
* - a hex string of PSK (two characters per octet of PSK), length is 64
|
|
*/
|
|
uint8_t psk[65];
|
|
|
|
/**
|
|
* Bitfield of allowed key management protocols
|
|
*
|
|
* WPA_KEY_MGMT_*
|
|
*/
|
|
int key_mgmt;
|
|
|
|
/**
|
|
* Bitfield of allowed WPA pairwise ciphers
|
|
*
|
|
* WPA_CIPHER_*
|
|
*/
|
|
int wpa_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed RSN pairwise ciphers
|
|
*
|
|
* WPA_CIPHER_*
|
|
*/
|
|
int rsn_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed protocols
|
|
*
|
|
* WPA_PROTO_*
|
|
*/
|
|
int proto;
|
|
|
|
/**
|
|
* Bitfield of allowed authentication algorithms
|
|
*
|
|
* WPA_AUTH_ALG_*
|
|
*/
|
|
int auth_alg;
|
|
|
|
/**
|
|
* Maximum lifetime for GTK in seconds
|
|
*/
|
|
int group_rekey;
|
|
|
|
/**
|
|
* Rekey GTK when any STA that possesses the current GTK is
|
|
* leaving the BSS
|
|
*/
|
|
int strict_rekey;
|
|
|
|
/**
|
|
* Maximum lifetime for GMK in seconds
|
|
*/
|
|
int gmk_rekey;
|
|
|
|
/**
|
|
* Maximum lifetime for PTK in seconds
|
|
*/
|
|
int ptk_rekey;
|
|
|
|
/**
|
|
* Hardware mode
|
|
*/
|
|
wlan_ap_hw_mode_t hw_mode;
|
|
|
|
/**
|
|
* IEEE802.11n mode
|
|
*/
|
|
int ieee80211n;
|
|
|
|
/**
|
|
* RF channel
|
|
*/
|
|
uint8_t channel;
|
|
|
|
/**
|
|
* MIB defines range as 1..65535, but very small values
|
|
* cause problems with the current implementation.
|
|
* Since it is unlikely that this small numbers are
|
|
* useful in real life scenarios, do not allow beacon
|
|
* period to be set below 15 TU.
|
|
*/
|
|
uint16_t beacon_int;
|
|
|
|
/**
|
|
* Delivery traffic indication message
|
|
*/
|
|
int dtim;
|
|
|
|
/**
|
|
* Maximum number of STAs in station table
|
|
*/
|
|
int max_num_sta;
|
|
} u;
|
|
} wlan_ap_config_t;
|
|
|
|
/**
|
|
* @brief Wlan AP default configuration definition
|
|
*/
|
|
typedef struct wlan_ap_default_conf {
|
|
/**
|
|
* Network name
|
|
*/
|
|
char *ssid;
|
|
|
|
/**
|
|
* Network name length
|
|
*/
|
|
uint8_t ssid_len;
|
|
|
|
/**
|
|
* First two octets: country code as described in ISO/IEC 3166-1.
|
|
* Third octet:
|
|
* ' ' (ascii 32): all environments
|
|
* 'O': Outdoor environemnt only
|
|
* 'I': Indoor environment only
|
|
*/
|
|
char country[3];
|
|
|
|
/**
|
|
* WPA preshared key in one of the optional formats:
|
|
* - an ASCII string of passphrase, length is [8, 63]
|
|
* - a hex string of PSK (two characters per octet of PSK), length is 64
|
|
*/
|
|
char *psk;
|
|
|
|
/**
|
|
* Bitfield of allowed key management protocols
|
|
*
|
|
* WPA_KEY_MGMT_*
|
|
*/
|
|
int key_mgmt;
|
|
|
|
/**
|
|
* Bitfield of allowed WPA pairwise ciphers
|
|
*
|
|
* WPA_CIPHER_*
|
|
*/
|
|
int wpa_pairwise_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed RSN pairwise ciphers
|
|
*
|
|
* WPA_CIPHER_*
|
|
*/
|
|
int rsn_pairwise_cipher;
|
|
|
|
/**
|
|
* Bitfield of allowed protocols
|
|
*
|
|
* WPA_PROTO_*
|
|
*/
|
|
int proto;
|
|
|
|
/**
|
|
* Bitfield of allowed authentication algorithms
|
|
*
|
|
* WPA_AUTH_ALG_*
|
|
*/
|
|
int auth_alg;
|
|
|
|
/**
|
|
* Maximum lifetime for GTK in seconds
|
|
*/
|
|
int group_rekey;
|
|
|
|
/**
|
|
* Maximum lifetime for GMK in seconds
|
|
*/
|
|
int gmk_rekey;
|
|
|
|
/**
|
|
* Maximum lifetime for PTK in seconds
|
|
*/
|
|
int ptk_rekey;
|
|
|
|
/**
|
|
* Rekey GTK when any STA that possesses the current GTK is
|
|
* leaving the BSS
|
|
*/
|
|
uint8_t strict_rekey;
|
|
|
|
/**
|
|
* Hardware mode
|
|
*/
|
|
wlan_ap_hw_mode_t hw_mode;
|
|
|
|
/**
|
|
* IEEE802.11n mode
|
|
*/
|
|
uint8_t ieee80211n;
|
|
/**
|
|
* RF channel
|
|
*/
|
|
uint8_t channel;
|
|
|
|
/**
|
|
* MIB defines range as 1..65535, but very small values
|
|
* cause problems with the current implementation.
|
|
* Since it is unlikely that this small numbers are
|
|
* useful in real life scenarios, do not allow beacon
|
|
* period to be set below 15 TU.
|
|
*/
|
|
uint16_t beacon_int;
|
|
|
|
/**
|
|
* Delivery traffic indication message
|
|
*/
|
|
uint8_t dtim;
|
|
|
|
/**
|
|
* Maximum number of STAs in station table
|
|
*/
|
|
uint8_t max_num_sta;
|
|
} wlan_ap_default_conf_t;
|
|
|
|
/**
|
|
* @brief Wlan station information definition
|
|
*/
|
|
typedef struct wlan_ap_sta {
|
|
uint8_t addr[6];
|
|
} wlan_ap_sta_t;
|
|
|
|
/**
|
|
* @brief Wlan connected stations information definition
|
|
*/
|
|
typedef struct wlan_ap_stas {
|
|
wlan_ap_sta_t *sta;
|
|
int size;
|
|
int num;
|
|
} wlan_ap_stas_t;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _NET_WLAN_WLAN_DEFS_H_ */
|