xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_pkt_ofld.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 - 2020 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef __PHL_PKT_OFLD_H__
16*4882a593Smuzhiyun #define __PHL_PKT_OFLD_H__
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define TYPE_DATA_FRAME 0x08
19*4882a593Smuzhiyun #define TYPE_ACTION_FRAME 0xD0
20*4882a593Smuzhiyun #define TYPE_NULL_FRAME 0x48
21*4882a593Smuzhiyun #define TYPE_PROBE_REQ_FRAME 0x40
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define HDR_OFFSET_FRAME_CONTROL 0
24*4882a593Smuzhiyun #define HDR_OFFSET_DURATION 2
25*4882a593Smuzhiyun #define HDR_OFFSET_ADDRESS1 4
26*4882a593Smuzhiyun #define HDR_OFFSET_ADDRESS2 10
27*4882a593Smuzhiyun #define HDR_OFFSET_ADDRESS3 16
28*4882a593Smuzhiyun #define HDR_OFFSET_SEQUENCE 22
29*4882a593Smuzhiyun #define HDR_OFFSET_ADDRESS4 24
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define SET_80211_PKT_HDR_FRAME_CONTROL(_hdr, _val)	\
32*4882a593Smuzhiyun 	WriteLE2Byte(_hdr, _val)
33*4882a593Smuzhiyun #define SET_80211_PKT_HDR_TYPE_AND_SUBTYPE(_hdr, _val)	\
34*4882a593Smuzhiyun 	WriteLE1Byte(_hdr, _val)
35*4882a593Smuzhiyun #define SET_80211_PKT_HDR_PROTOCOL_VERSION(_hdr, _val)	\
36*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 0, 2, _val)
37*4882a593Smuzhiyun #define SET_80211_PKT_HDR_TYPE(_hdr, _val)		\
38*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 2, 2, _val)
39*4882a593Smuzhiyun #define SET_80211_PKT_HDR_SUBTYPE(_hdr, _val)		\
40*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 4, 4, _val)
41*4882a593Smuzhiyun #define SET_80211_PKT_HDR_TO_DS(_hdr, _val)		\
42*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 8, 1, _val)
43*4882a593Smuzhiyun #define SET_80211_PKT_HDR_FROM_DS(_hdr, _val)		\
44*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 9, 1, _val)
45*4882a593Smuzhiyun #define SET_80211_PKT_HDR_MORE_FRAG(_hdr, _val)		\
46*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 10, 1, _val)
47*4882a593Smuzhiyun #define SET_80211_PKT_HDR_RETRY(_hdr, _val)		\
48*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 11, 1, _val)
49*4882a593Smuzhiyun #define SET_80211_PKT_HDR_PWR_MGNT(_hdr, _val)		\
50*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 12, 1, _val)
51*4882a593Smuzhiyun #define SET_80211_PKT_HDR_MORE_DATA(_hdr, _val)		\
52*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 13, 1, _val)
53*4882a593Smuzhiyun #define SET_80211_PKT_HDR_PROTECT(_hdr, _val)		\
54*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_hdr, 14, 1, _val)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define SET_80211_PKT_HDR_DURATION(_hdr, _val)	\
57*4882a593Smuzhiyun 	WriteLE2Byte((u8 *)(_hdr)+HDR_OFFSET_DURATION, _val)
58*4882a593Smuzhiyun #define SET_80211_PKT_HDR_ADDRESS1(_h, _hdr, _val)	\
59*4882a593Smuzhiyun 	_os_mem_cpy(_h, _hdr+HDR_OFFSET_ADDRESS1, _val, MAC_ALEN)
60*4882a593Smuzhiyun #define SET_80211_PKT_HDR_ADDRESS2(_h, _hdr, _val) \
61*4882a593Smuzhiyun 	_os_mem_cpy(_h, _hdr+HDR_OFFSET_ADDRESS2, _val, MAC_ALEN)
62*4882a593Smuzhiyun #define SET_80211_PKT_HDR_ADDRESS3(_h, _hdr, _val) \
63*4882a593Smuzhiyun 	_os_mem_cpy(_h, _hdr+HDR_OFFSET_ADDRESS3, _val, MAC_ALEN)
64*4882a593Smuzhiyun #define SET_80211_PKT_HDR_FRAGMENT_SEQUENCE(_hdr, _val) \
65*4882a593Smuzhiyun 	WriteLE2Byte((u8 *)(_hdr)+HDR_OFFSET_SEQUENCE, _val)
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define NOT_USED 0xFF
69*4882a593Smuzhiyun #define NULL_PACKET_LEN 24
70*4882a593Smuzhiyun #define MAC_HDR_LEN 24
71*4882a593Smuzhiyun #define FCS_LEN 4
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define MAX_MSDU_LEN 2304
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* 11w SA-Query */
76*4882a593Smuzhiyun #define SAQ_ACTION_LEN 4
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define SAQ_OFFSET_ACTION 1
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define ACT_TYPE_SA_QUERY 8
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define SET_ACTION_FRAME_CATEGORY(_ptr, _val) WriteLE1Byte(_ptr, _val)
83*4882a593Smuzhiyun #define SET_SAQ_ACTION_FIELD(_ptr, _val) WriteLE1Byte(_ptr+SAQ_OFFSET_ACTION, _val)
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #define LLC_LEN 8
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define LLC_OFFSET_HDR 0
89*4882a593Smuzhiyun #define LLC_OFFSET_OUI 3
90*4882a593Smuzhiyun #define LLC_OFFSET_PROTO_ID 6
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define SET_LLC_HDR(_h, _ptr, _val) _os_mem_cpy(d, _ptr+LLC_OFFSET_HDR, _val, 3);
93*4882a593Smuzhiyun #define SET_LLC_OUI(_h, _ptr, _val) _os_mem_cpy(d, _ptr+LLC_OFFSET_OUI, _val, 3);
94*4882a593Smuzhiyun #define SET_LLC_PROTO_ID(_h, _ptr, _val) _os_mem_cpy(d, _ptr+LLC_OFFSET_PROTO_ID, _val, 2);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define AUTH_1X_HDR_LEN 4
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define AUTH_1X_OFFSET_PROTO_VER 0
99*4882a593Smuzhiyun #define AUTH_1X_OFFSET_PKT_TYPE 1
100*4882a593Smuzhiyun #define AUTH_1X_OFFSET_LENGTH 2
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define LIB1X_EAPOL_VER	1 /* 00000001B */
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define LIB1X_TYPE_EAPOL_EAPPKT 0 /* 0000 0000B */
105*4882a593Smuzhiyun #define LIB1X_TYPE_EAPOL_START 1 /* 0000 0001B */
106*4882a593Smuzhiyun #define LIB1X_TYPE_EAPOL_LOGOFF 2 /* 0000 0010B */
107*4882a593Smuzhiyun #define LIB1X_TYPE_EAPOL_KEY 3 /* 0000 0011B */
108*4882a593Smuzhiyun #define LIB1X_TYPE_EAPOL_ENCASFALERT 4 /* 0000 0100B */
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #define SET_AUTH_1X_PROTO_VER(_ptr, _val) WriteLE1Byte(_ptr+AUTH_1X_OFFSET_PROTO_VER, _val)
111*4882a593Smuzhiyun #define SET_AUTH_1X_PKT_TYPE(_ptr, _val) WriteLE1Byte(_ptr+AUTH_1X_OFFSET_PKT_TYPE, _val)
112*4882a593Smuzhiyun #define SET_AUTH_1X_LENGTH(_ptr, _val) WriteBE2Byte(_ptr+AUTH_1X_OFFSET_LENGTH, _val)
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define EAPOLMSG_HDR_LEN 95
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define EAPOLKEY_OFFSET_KEYDESC_TYPE 0
117*4882a593Smuzhiyun #define EAPOLKEY_OFFSET_KEY_INFO 1
118*4882a593Smuzhiyun #define EAPOLKEY_OFFSET_REPLAY_CNT 5
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define EAPOLKEY_KEYDESC_TYPE_RSN 2
121*4882a593Smuzhiyun #define EAPOLKEY_KEYDESC_VER_1 1
122*4882a593Smuzhiyun #define EAPOLKEY_KEYDESC_VER_2 2
123*4882a593Smuzhiyun #define EAPOLKEY_KEYDESC_VER_3 3
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define EAPOLKEY_KEYMIC BIT(8)
126*4882a593Smuzhiyun #define EAPOLKEY_SECURE BIT(9)
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun #define SET_EAPOLKEY_KEYDESC_TYPE(_ptr, _val) WriteLE1Byte(_ptr+EAPOLKEY_OFFSET_KEYDESC_TYPE, _val)
129*4882a593Smuzhiyun #define SET_EAPOLKEY_KEY_INFO(_ptr, _val) WriteBE2Byte(_ptr+EAPOLKEY_OFFSET_KEY_INFO, _val)
130*4882a593Smuzhiyun #define SET_EAPOLKEY_REPLAY_CNT(_h, _ptr, _val)	_os_mem_cpy(_h, _ptr+EAPOLKEY_OFFSET_REPLAY_CNT, _val, 8);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define HAL_PKT_OFLD_ADD(_pkt, _id, _pkt_buf, _len) \
133*4882a593Smuzhiyun rtw_hal_pkt_ofld((_pkt)->phl_info->hal, _id, PKT_OFLD_ADD, _pkt_buf, _len)
134*4882a593Smuzhiyun #define HAL_PKT_OFLD_READ(_pkt, _id) \
135*4882a593Smuzhiyun rtw_hal_pkt_ofld((_pkt)->phl_info->hal, _id, PKT_OFLD_READ, NULL, NULL)
136*4882a593Smuzhiyun #define HAL_PKT_OFLD_DEL(_pkt, _id) \
137*4882a593Smuzhiyun rtw_hal_pkt_ofld((_pkt)->phl_info->hal, _id, PKT_OFLD_DEL, NULL, NULL)
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun struct pkt_ofld_obj {
141*4882a593Smuzhiyun 	_os_mutex mux;
142*4882a593Smuzhiyun 	struct phl_info_t *phl_info;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	struct list_head entry_q;
145*4882a593Smuzhiyun 	u32 entry_cnt;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	u32 cur_seq;
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun struct pkt_ofld_req {
151*4882a593Smuzhiyun 	struct list_head list;
152*4882a593Smuzhiyun 	u32 token;
153*4882a593Smuzhiyun 	char *req_name;
154*4882a593Smuzhiyun 	u32 req_name_len;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun struct rtw_pkt_ofld_probe_req_info {
158*4882a593Smuzhiyun 	u8 a2[MAC_ADDRESS_LENGTH];
159*4882a593Smuzhiyun 	void (* construct_pbreq)(void *priv, u8 *pkt_buf, u16 *len);
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun struct rtw_pkt_ofld_null_info {
163*4882a593Smuzhiyun 	u8 a1[MAC_ADDRESS_LENGTH];
164*4882a593Smuzhiyun 	u8 a2[MAC_ADDRESS_LENGTH];
165*4882a593Smuzhiyun 	u8 a3[MAC_ADDRESS_LENGTH];
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun struct rtw_pkt_ofld_arp_rsp_info {
170*4882a593Smuzhiyun 	u8 a1[MAC_ADDRESS_LENGTH];
171*4882a593Smuzhiyun 	u8 a2[MAC_ADDRESS_LENGTH];
172*4882a593Smuzhiyun 	u8 a3[MAC_ADDRESS_LENGTH];
173*4882a593Smuzhiyun 	u8 host_ipv4_addr[IPV4_ADDRESS_LENGTH];
174*4882a593Smuzhiyun 	u8 remote_ipv4_addr[IPV4_ADDRESS_LENGTH];
175*4882a593Smuzhiyun 	u8 sec_hdr;
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun struct rtw_pkt_ofld_na_info {
179*4882a593Smuzhiyun 	u8 a1[MAC_ADDRESS_LENGTH];
180*4882a593Smuzhiyun 	u8 a2[MAC_ADDRESS_LENGTH];
181*4882a593Smuzhiyun 	u8 a3[MAC_ADDRESS_LENGTH];
182*4882a593Smuzhiyun 	u8 sec_hdr;
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun struct rtw_pkt_ofld_eapol_key_info {
186*4882a593Smuzhiyun 	u8 a1[MAC_ADDRESS_LENGTH];
187*4882a593Smuzhiyun 	u8 a2[MAC_ADDRESS_LENGTH];
188*4882a593Smuzhiyun 	u8 a3[MAC_ADDRESS_LENGTH];
189*4882a593Smuzhiyun 	u8 sec_hdr;
190*4882a593Smuzhiyun 	u8 key_desc_ver;
191*4882a593Smuzhiyun 	u8 replay_cnt[8];
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun struct rtw_pkt_ofld_sa_query_info {
195*4882a593Smuzhiyun 	u8 a1[MAC_ADDRESS_LENGTH];
196*4882a593Smuzhiyun 	u8 a2[MAC_ADDRESS_LENGTH];
197*4882a593Smuzhiyun 	u8 a3[MAC_ADDRESS_LENGTH];
198*4882a593Smuzhiyun 	u8 sec_hdr;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun struct rtw_pkt_ofld_realwow_kapkt_info {
202*4882a593Smuzhiyun 	u8 keep_alive_pkt_ptrn[MAX_REALWOW_KCP_SIZE];
203*4882a593Smuzhiyun 	u16 keep_alive_pkt_size;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun struct rtw_pkt_ofld_realwow_ack_info {
207*4882a593Smuzhiyun 	u8 ack_ptrn[MAX_REALWOW_PAYLOAD];
208*4882a593Smuzhiyun 	u16 ack_ptrn_size;
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun struct rtw_pkt_ofld_realwow_wp_info {
212*4882a593Smuzhiyun 	u8 wakeup_ptrn[MAX_REALWOW_PAYLOAD];
213*4882a593Smuzhiyun 	u16 wakeup_ptrn_size;
214*4882a593Smuzhiyun 	u8 wakeupsecnum; /* ? */
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun /* init api */
218*4882a593Smuzhiyun enum rtw_phl_status phl_pkt_ofld_init(struct phl_info_t *phl_info);
219*4882a593Smuzhiyun void phl_pkt_ofld_deinit(struct phl_info_t *phl_info);
220*4882a593Smuzhiyun void phl_pkt_ofld_reset_all_entry(struct phl_info_t *phl_info);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun enum rtw_phl_status phl_pkt_ofld_add_entry(struct phl_info_t *phl_info, u16 macid);
223*4882a593Smuzhiyun enum rtw_phl_status phl_pkt_ofld_del_entry(struct phl_info_t *phl_info, u16 macid);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #define RTW_PHL_PKT_OFLD_REQ(_phl, _macid, _type, _seq, _buf)	\
227*4882a593Smuzhiyun 	phl_pkt_ofld_request(_phl, _macid, _type, _seq, __func__, _buf)
228*4882a593Smuzhiyun enum rtw_phl_status phl_pkt_ofld_request(struct phl_info_t *phl_info,
229*4882a593Smuzhiyun 						u16 macid, u8 type,
230*4882a593Smuzhiyun 						u32 *token, const char *req_name,
231*4882a593Smuzhiyun 						void *buf);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun enum rtw_phl_status phl_pkt_ofld_cancel(struct phl_info_t *phl_info,
234*4882a593Smuzhiyun 					u16 macid, u8 type, u32 *token);
235*4882a593Smuzhiyun void phl_pkt_ofld_show_info(struct phl_info_t *phl_info);
236*4882a593Smuzhiyun u8 phl_pkt_ofld_get_id(struct phl_info_t *phl_info, u16 macid, u8 type);
237*4882a593Smuzhiyun const char *phl_get_pkt_ofld_str(enum pkt_ofld_type type);
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun #endif /* __PHL_PKT_OFLD_H__ */
240*4882a593Smuzhiyun 
241