1 /*
2  * Copyright (c) 2024 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /**
8  * @brief Header containing utility declarations for the
9  * FMAC IF Layer of the Wi-Fi driver.
10  */
11 #ifndef __FMAC_UTIL_H__
12 #define __FMAC_UTIL_H__
13 
14 #include "fmac_structs_common.h"
15 
16 #include "fmac_structs_common.h"
17 #include "common/pack_def.h"
18 
19 
20 #define NRF_WIFI_FMAC_ETH_ADDR_LEN 6
21 #define NRF_WIFI_FMAC_ETH_HDR_LEN 14
22 
23 #define NRF_WIFI_FMAC_FTYPE_DATA 0x0008
24 #define NRF_WIFI_FMAC_STYPE_DATA 0x0000
25 #define NRF_WIFI_FMAC_STYPE_QOS_DATA 0x0080
26 
27 #define NRF_WIFI_FMAC_FCTL_FTYPE 0x000c
28 #define NRF_WIFI_FMAC_FCTL_PROTECTED 0x4000
29 #define NRF_WIFI_FMAC_FCTL_TODS 0x0100
30 #define NRF_WIFI_FMAC_FCTL_FROMDS 0x0200
31 
32 #define NRF_WIFI_FMAC_CIPHER_SUITE_WEP40 0x000FAC01
33 #define NRF_WIFI_FMAC_CIPHER_SUITE_WEP104 0x000FAC05
34 #define NRF_WIFI_FMAC_CIPHER_SUITE_TKIP 0x000FAC02
35 #define NRF_WIFI_FMAC_CIPHER_SUITE_CCMP 0x000FAC04
36 #define NRF_WIFI_FMAC_CIPHER_SUITE_CCMP_256 0x000FAC0A
37 #define NRF_WIFI_FMAC_CIPHER_SUITE_OPEN 0x0
38 #define NRF_WIFI_FMAC_CIPHER_SUITE_SMS4 0x00147201
39 
40 #define NRF_WIFI_FMAC_CCMP_HDR_LEN 8
41 #define NRF_WIFI_FMAC_CCMP_256_HDR_LEN 8
42 #define NRF_WIFI_FMAC_SMS4_HDR_LEN 18
43 
44 #define NRF_WIFI_FMAC_WEP_IV_LEN 4
45 #define NRF_WIFI_FMAC_TKIP_IV_LEN 8
46 
47 #define NRF_WIFI_FCTL_TODS 0x0100
48 #define NRF_WIFI_FCTL_FROMDS 0x0200
49 #define NRF_WIFI_FMAC_ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */
50 #define NRF_WIFI_FMAC_ETH_P_8021AD 0x88A8 /* 802.1ad Service VLAN */
51 #define NRF_WIFI_FMAC_ETH_P_MPLS_UC 0x8847 /* MPLS Unicast traffic */
52 #define NRF_WIFI_FMAC_ETH_P_MPLS_MC 0x8848 /* MPLS Multicast traffic */
53 #define NRF_WIFI_FMAC_ETH_P_IP 0x0800 /* Internet Protocol packet */
54 #define NRF_WIFI_FMAC_ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
55 #define NRF_WIFI_FMAC_ETH_P_80221 0x8917 /* IEEE 802.21 Media Independent Handover Protocol */
56 #define NRF_WIFI_FMAC_ETH_P_AARP 0x80F3 /* Appletalk AARP */
57 #define NRF_WIFI_FMAC_ETH_P_IPX 0x8137 /* IPX over DIX */
58 #define NRF_WIFI_FMAC_ETH_P_802_3_MIN 0x0600 /* If the value in the ethernet type is less than
59 					      * this value then the frame is Ethernet II.
60 					      * Else it is 802.3
61 					      */
62 #define NRF_WIFI_FMAC_VLAN_PRIO_SHIFT 0x0D /* 13 bit */
63 #define NRF_WIFI_FMAC_VLAN_PRIO_MASK 0xE000
64 #define NRF_WIFI_FMAC_MPLS_LS_TC_MASK 0x00000E00
65 #define NRF_WIFI_FMAC_MPLS_LS_TC_SHIFT 0x09
66 #define NRF_WIFI_FMAC_IPV6_TOS_MASK 0x0FF0
67 #define NRF_WIFI_FMAC_IPV6_TOS_SHIFT 0x04 /* 4bit */
68 #define NRF_WIFI_FMAC_ETH_TYPE_MASK 0xFFFF
69 
70 struct nrf_wifi_fmac_ieee80211_hdr {
71 	unsigned short fc;
72 	unsigned short dur_id;
73 	unsigned char addr_1[NRF_WIFI_FMAC_ETH_ADDR_LEN];
74 	unsigned char addr_2[NRF_WIFI_FMAC_ETH_ADDR_LEN];
75 	unsigned char addr_3[NRF_WIFI_FMAC_ETH_ADDR_LEN];
76 	unsigned short seq_ctrl;
77 	unsigned char addr_4[NRF_WIFI_FMAC_ETH_ADDR_LEN];
78 } __NRF_WIFI_PKD;
79 
80 
81 struct nrf_wifi_fmac_eth_hdr {
82 	unsigned char dst[NRF_WIFI_FMAC_ETH_ADDR_LEN]; /* destination eth addr */
83 	unsigned char src[NRF_WIFI_FMAC_ETH_ADDR_LEN]; /* source ether addr */
84 	unsigned short proto; /* packet type ID field */
85 } __NRF_WIFI_PKD;
86 
87 
88 struct nrf_wifi_fmac_amsdu_hdr {
89 	unsigned char dst[NRF_WIFI_FMAC_ETH_ADDR_LEN]; /* destination eth addr */
90 	unsigned char src[NRF_WIFI_FMAC_ETH_ADDR_LEN]; /* source ether addr */
91 	unsigned short length; /* length*/
92 } __NRF_WIFI_PKD;
93 
94 bool nrf_wifi_util_is_multicast_addr(const unsigned char *addr);
95 
96 bool nrf_wifi_util_is_unicast_addr(const unsigned char *addr);
97 
98 bool nrf_wifi_util_ether_addr_equal(const unsigned char *addr_1,
99 				    const unsigned char *addr_2);
100 
101 unsigned short nrf_wifi_util_rx_get_eth_type(void *nwb);
102 unsigned short nrf_wifi_util_tx_get_eth_type(void *nwb);
103 
104 bool nrf_wifi_util_is_arr_zero(unsigned char *arr,
105 			       unsigned int arr_sz);
106 
107 void *wifi_fmac_priv(struct nrf_wifi_fmac_priv *def);
108 void *wifi_dev_priv(struct nrf_wifi_fmac_dev_ctx *def);
109 
110 #endif /* __FMAC_UTIL_H__ */
111