1 /*
2  * Copyright (c) 2024 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /**
8  * @brief File containing utility function definitions for the
9  * FMAC IF Layer of the Wi-Fi driver.
10  */
11 
12 #include "osal_api.h"
13 #include "common/fmac_api_common.h"
14 #include "common/fmac_util.h"
15 #include "host_rpu_umac_if.h"
16 
nrf_wifi_util_is_multicast_addr(const unsigned char * addr)17 bool nrf_wifi_util_is_multicast_addr(const unsigned char *addr)
18 {
19 	return (0x01 & *addr);
20 }
21 
22 
nrf_wifi_util_is_unicast_addr(const unsigned char * addr)23 bool nrf_wifi_util_is_unicast_addr(const unsigned char *addr)
24 {
25 	return !nrf_wifi_util_is_multicast_addr(addr);
26 }
27 
28 
nrf_wifi_util_ether_addr_equal(const unsigned char * addr_1,const unsigned char * addr_2)29 bool nrf_wifi_util_ether_addr_equal(const unsigned char *addr_1,
30 				    const unsigned char *addr_2)
31 {
32 	const unsigned short *a = (const unsigned short *)addr_1;
33 	const unsigned short *b = (const unsigned short *)addr_2;
34 
35 	return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) == 0;
36 }
37 
nrf_wifi_util_rx_get_eth_type(void * nwb)38 unsigned short nrf_wifi_util_rx_get_eth_type(void *nwb)
39 {
40 	unsigned char *payload = NULL;
41 
42 	payload = (unsigned char *)nwb;
43 
44 	return payload[6] << 8 | payload[7];
45 }
46 
47 
nrf_wifi_util_tx_get_eth_type(void * nwb)48 unsigned short nrf_wifi_util_tx_get_eth_type(void *nwb)
49 {
50 	unsigned char *payload = NULL;
51 
52 	payload = (unsigned char *)nwb;
53 
54 	return payload[12] << 8 | payload[13];
55 }
56 
57 
nrf_wifi_check_mode_validity(unsigned char mode)58 enum nrf_wifi_status nrf_wifi_check_mode_validity(unsigned char mode)
59 {
60 	/**
61 	 * We validate the currently supported driver and lower layer
62 	 * modes only
63 	 */
64 	if ((mode ^ NRF_WIFI_STA_MODE) == 0) {
65 		return NRF_WIFI_STATUS_SUCCESS;
66 	}
67 #ifdef NRF70_RAW_DATA_RX
68 	else if ((mode ^ NRF_WIFI_MONITOR_MODE) == 0) {
69 		return NRF_WIFI_STATUS_SUCCESS;
70 	}
71 #endif /* NRF70_RAW_DATA_RX */
72 	return NRF_WIFI_STATUS_FAIL;
73 }
74 
nrf_wifi_util_is_arr_zero(unsigned char * arr,unsigned int arr_sz)75 bool nrf_wifi_util_is_arr_zero(unsigned char *arr,
76 			       unsigned int arr_sz)
77 {
78 	unsigned int i = 0;
79 
80 	for (i = 0; i < arr_sz; i++) {
81 		if (arr[i] != 0) {
82 			return false;
83 		}
84 	}
85 
86 	return true;
87 }
88 
wifi_fmac_priv(struct nrf_wifi_fmac_priv * def)89 void *wifi_fmac_priv(struct nrf_wifi_fmac_priv *def)
90 {
91 	return &def->priv;
92 }
93 
wifi_dev_priv(struct nrf_wifi_fmac_dev_ctx * def)94 void *wifi_dev_priv(struct nrf_wifi_fmac_dev_ctx *def)
95 {
96 	return &def->priv;
97 }
98