• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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