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