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