1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: Source file defined by the corresponding frame structure and operation interface (cannot be called by
15 * the HAL module).
16 */
17
18 #ifndef MAC_FRAME_ROM_H
19 #define MAC_FRAME_ROM_H
20
21 /*****************************************************************************
22 1 其他头文件包含
23 *****************************************************************************/
24 #include "wlan_types_rom.h"
25 #include "oam_ext_if.h"
26 #include "mac_frame_common_rom.h"
27
28 #ifdef __cplusplus
29 #if __cplusplus
30 extern "C" {
31 #endif
32 #endif
33
34 /* TCP协议类型,chartiot tcp连接端口号 */
35 #define MAC_TCP_PROTOCAL 6
36 #define MAC_UDP_PROTOCAL 17
37 #define MAC_ICMP_PROTOCAL 1
38
39 #define MAC_ARP_REQUEST 0x0001
40 #define MAC_ARP_RESPONSE 0x0002
41
42 #define MAC_ICMP_REQUEST 0x08
43 #define MAC_ICMP_RESPONSE 0x00
44 #define MAC_SUBMSDU_LENGTH_OFFSET 12 /* submsdu的长度字段的偏移值 */
45 #define MAC_SUBMSDU_DA_OFFSET 0 /* submsdu的目的地址的偏移值 */
46 #define MAC_SUBMSDU_SA_OFFSET 6 /* submsdu的源地址的偏移值 */
47 #define MAC_BYTE_ALIGN_VALUE 4 /* 4字节对齐 */
48
49 #define OAL_DECLARE_PACKED __attribute__((__packed__))
50 /* 四地址帧结构体 */
51 struct dmac_ieee80211_frame_addr4 {
52 mac_header_frame_control_stru frame_control;
53 osal_u16 duration_value : 15,
54 duration_flag : 1;
55 osal_u8 address1[WLAN_MAC_ADDR_LEN];
56 osal_u8 address2[WLAN_MAC_ADDR_LEN];
57 osal_u8 address3[WLAN_MAC_ADDR_LEN];
58 osal_u16 frag_num : 4,
59 seq_num : 12;
60 osal_u8 address4[WLAN_MAC_ADDR_LEN];
61 } OAL_DECLARE_PACKED;
62 typedef struct dmac_ieee80211_frame_addr4 dmac_ieee80211_frame_addr4_stru;
63 mac_data_type_enum_uint8 dmac_get_arp_type_by_arphdr(const oal_eth_arphdr_stru *rx_arp_hdr);
64 oal_bool_enum_uint8 dmac_frame_is_null_data(const oal_dmac_netbuf_stru *net_buf);
65 osal_u8 *dmac_find_ie_etc(osal_u8 eid, osal_u8 *ies, osal_s32 len);
66 osal_u8 dmac_get_data_type_etc(const oal_dmac_netbuf_stru *netbuff);
67 osal_bool dmac_is_eapol_key_ptk_etc(const mac_eapol_header_stru *eapol_header);
68 osal_bool dmac_is_eapol_key_ptk_4_4_etc(const oal_dmac_netbuf_stru *netbuff);
69 /*****************************************************************************
70 函 数 名 : wlan_get_bssid
71 功能描述 : 根据"from ds"bit,从帧中提取bssid(mac地址)
72
73 *****************************************************************************/
dmac_get_bssid(osal_u8 * mac_hdr,osal_u8 * bssid,osal_u16 bssid_len)74 static INLINE__ osal_void dmac_get_bssid(osal_u8 *mac_hdr, osal_u8 *bssid, osal_u16 bssid_len)
75 {
76 unref_param(bssid_len);
77 if (mac_hdr_get_from_ds(mac_hdr) == 1) {
78 (osal_void)memcpy_s(bssid, WLAN_MAC_ADDR_LEN, mac_hdr + 10, WLAN_MAC_ADDR_LEN); // from_ds的bssid在mac头偏移10比特
79 } else if (mac_hdr_get_to_ds(mac_hdr) == 1) {
80 (osal_void)memcpy_s(bssid, WLAN_MAC_ADDR_LEN, mac_hdr + 4, WLAN_MAC_ADDR_LEN); // to_ds的bssid在mac头偏移4比特
81 } else {
82 (osal_void)memcpy_s(bssid, WLAN_MAC_ADDR_LEN, mac_hdr + 16, WLAN_MAC_ADDR_LEN); // IBSS的bssid在mac头偏移16比特
83 }
84 }
85
86 /*****************************************************************************
87 函 数 名 : oal_dmac_host2net_short
88 功能描述 : 16 bit本机字节序到网络字节序转换
89 *****************************************************************************/
oal_dmac_host2net_short(osal_u16 val)90 static INLINE__ osal_u16 oal_dmac_host2net_short(osal_u16 val)
91 {
92 return (((val & 0x00FF) << 8) + ((val & 0xFF00) >> 8)); // 移位8字节
93 }
94
95 /*****************************************************************************
96 函 数 名 : oal_dmac_net2host_short
97 功能描述 : 16 bit网络字节序到本机字节序转换
98 *****************************************************************************/
oal_dmac_net2host_short(osal_u16 val)99 static INLINE__ osal_u16 oal_dmac_net2host_short(osal_u16 val)
100 {
101 return (((val & 0x00FF) << 8) + ((val & 0xFF00) >> 8)); // 移位8字节
102 }
103
104 /*****************************************************************************
105 函 数 名 : oal_dmac_host2net_long
106 功能描述 : 32 bit本机字节序到网络字节序转换
107 *****************************************************************************/
oal_dmac_host2net_long(osal_u32 val)108 static INLINE__ osal_u32 oal_dmac_host2net_long(osal_u32 val)
109 {
110 return (((osal_u32)(val & 0x000000FF) << 24) + ((val & 0x0000FF00) << 8) + // 移位8、24字节
111 ((val & 0x00FF0000) >> 8) + ((osal_u32)(val & 0xFF000000) >> 24)); // 移位8、24字节
112 }
113
114 /*****************************************************************************
115 函 数 名 : mac_get_submsdu_len
116 功能描述 : 获取netbuf中submsdu的长度
117 *****************************************************************************/
dmac_get_submsdu_len(const osal_u8 * submsdu_hdr,osal_u16 * submsdu_len)118 static INLINE__ osal_void dmac_get_submsdu_len(const osal_u8 *submsdu_hdr, osal_u16 *submsdu_len)
119 {
120 *submsdu_len = *(submsdu_hdr + MAC_SUBMSDU_LENGTH_OFFSET);
121 // 长度2字节,先取高8位,再取低8位
122 *submsdu_len = (osal_u16)((*submsdu_len << 8) + *(submsdu_hdr + MAC_SUBMSDU_LENGTH_OFFSET + 1));
123 }
124
125 /*****************************************************************************
126 函 数 名 : mac_get_submsdu_pad_len
127 功能描述 : 获取submsdu需要填充的字节数
128 *****************************************************************************/
dmac_get_submsdu_pad_len(osal_u16 msdu_len,osal_u8 * submsdu_pad_len)129 static INLINE__ osal_void dmac_get_submsdu_pad_len(osal_u16 msdu_len, osal_u8 *submsdu_pad_len)
130 {
131 *submsdu_pad_len = msdu_len & 0x3;
132
133 if ((*submsdu_pad_len) != 0) {
134 *submsdu_pad_len = (MAC_BYTE_ALIGN_VALUE - *submsdu_pad_len);
135 }
136 }
137
138 /*****************************************************************************
139 函 数 名 : mac_rx_get_sa
140 功能描述 : 获取收到的帧的源地址
141 *****************************************************************************/
dmac_rx_get_sa(mac_ieee80211_frame_stru * mac_header,osal_u8 ** sa)142 static INLINE__ osal_void dmac_rx_get_sa(mac_ieee80211_frame_stru *mac_header, osal_u8 **sa)
143 {
144 if (mac_header->frame_control.from_ds == 0) {
145 /* IBSS、to AP */
146 *sa = mac_header->address2;
147 } else if ((mac_header->frame_control.from_ds == 1) && (mac_header->frame_control.to_ds == 0)) {
148 /* from AP */
149 *sa = mac_header->address3;
150 } else {
151 /* WDS */
152 *sa = ((dmac_ieee80211_frame_addr4_stru *)mac_header)->address4;
153 }
154 }
155
156 /*****************************************************************************
157 函 数 名 : mac_get_transmitter_addr
158 功能描述 : 获取收到的帧的目的地址
159 *****************************************************************************/
dmac_rx_get_da(mac_ieee80211_frame_stru * mac_header,osal_u8 ** da)160 static INLINE__ osal_void dmac_rx_get_da(mac_ieee80211_frame_stru *mac_header, osal_u8 **da)
161 {
162 if (mac_header->frame_control.to_ds == 0) {
163 /* IBSS、from AP */
164 *da = mac_header->address1;
165 } else {
166 /* WDS、to AP */
167 *da = mac_header->address3;
168 }
169 }
170
171 #ifdef __cplusplus
172 #if __cplusplus
173 }
174 #endif
175 #endif
176
177 #endif /* end of mac_frame_rom.h */
178