1 /*
2  * Copyright (c) 2023 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef __SUPP_EVENTS_H__
8 #define __SUPP_EVENTS_H__
9 
10 #include <zephyr/net/wifi_mgmt.h>
11 
12 /* Connectivity Events */
13 #define NET_MGMT_SUPPLICANT_LAYER NET_MGMT_LAYER_L3
14 #define NET_MGMT_SUPPLICANT_CODE NET_MGMT_LAYER_CODE_HOSTAP
15 #define NET_MGMT_SUPPLICANT_BASE (NET_MGMT_LAYER(NET_MGMT_SUPPLICANT_LAYER) | \
16 				   NET_MGMT_LAYER_CODE(NET_MGMT_SUPPLICANT_CODE) | \
17 				   NET_MGMT_IFACE_BIT)
18 #define NET_MGMT_SUPPLICANT_EVENT (NET_MGMT_EVENT_BIT | NET_MGMT_SUPPLICANT_BASE)
19 
20 enum {
21 	NET_EVENT_SUPPLICANT_CMD_READY_VAL,
22 	NET_EVENT_SUPPLICANT_CMD_NOT_READY_VAL,
23 	NET_EVENT_SUPPLICANT_CMD_IFACE_ADDED_VAL,
24 	NET_EVENT_SUPPLICANT_CMD_IFACE_REMOVING_VAL,
25 	NET_EVENT_SUPPLICANT_CMD_IFACE_REMOVED_VAL,
26 	NET_EVENT_SUPPLICANT_CMD_INT_EVENT_VAL,
27 
28 	NET_EVENT_SUPPLICANT_CMD_MAX
29 };
30 
31 BUILD_ASSERT(NET_EVENT_SUPPLICANT_CMD_MAX <= NET_MGMT_MAX_COMMANDS,
32 	     "Number of events in net_event_supplicant_cmd exceeds the limit");
33 
34 enum net_event_supplicant_cmd {
35 	NET_MGMT_CMD(NET_EVENT_SUPPLICANT_CMD_READY),
36 	NET_MGMT_CMD(NET_EVENT_SUPPLICANT_CMD_NOT_READY),
37 	NET_MGMT_CMD(NET_EVENT_SUPPLICANT_CMD_IFACE_ADDED),
38 	NET_MGMT_CMD(NET_EVENT_SUPPLICANT_CMD_IFACE_REMOVING),
39 	NET_MGMT_CMD(NET_EVENT_SUPPLICANT_CMD_IFACE_REMOVED),
40 	NET_MGMT_CMD(NET_EVENT_SUPPLICANT_CMD_INT_EVENT),
41 };
42 
43 #define NET_EVENT_SUPPLICANT_READY					\
44 	(NET_MGMT_SUPPLICANT_EVENT | NET_EVENT_SUPPLICANT_CMD_READY)
45 
46 #define NET_EVENT_SUPPLICANT_NOT_READY					\
47 	(NET_MGMT_SUPPLICANT_EVENT | NET_EVENT_SUPPLICANT_CMD_NOT_READY)
48 
49 #define NET_EVENT_SUPPLICANT_IFACE_ADDED					\
50 	(NET_MGMT_SUPPLICANT_EVENT | NET_EVENT_SUPPLICANT_CMD_IFACE_ADDED)
51 
52 #define NET_EVENT_SUPPLICANT_IFACE_REMOVED					\
53 	(NET_MGMT_SUPPLICANT_EVENT | NET_EVENT_SUPPLICANT_CMD_IFACE_REMOVED)
54 
55 #define NET_EVENT_SUPPLICANT_IFACE_REMOVING					\
56 	(NET_MGMT_SUPPLICANT_EVENT | NET_EVENT_SUPPLICANT_CMD_IFACE_REMOVING)
57 
58 #define NET_EVENT_SUPPLICANT_INT_EVENT					\
59 	(NET_MGMT_SUPPLICANT_EVENT | NET_EVENT_SUPPLICANT_CMD_INT_EVENT)
60 
61 int supplicant_send_wifi_mgmt_event(const char *ifname,
62 				    enum net_event_wifi_cmd event,
63 				    void *status,
64 				    size_t len);
65 int supplicant_generate_state_event(const char *ifname,
66 				    enum net_event_supplicant_cmd event,
67 				    int status);
68 int supplicant_send_wifi_mgmt_conn_event(void *ctx, int status_code);
69 int supplicant_send_wifi_mgmt_disc_event(void *ctx, int reason_code);
70 
71 #ifdef CONFIG_AP
72 int supplicant_send_wifi_mgmt_ap_status(void *ctx,
73 					enum net_event_wifi_cmd event,
74 					enum wifi_ap_status);
75 int supplicant_send_wifi_mgmt_ap_sta_event(void *ctx,
76 					   enum net_event_wifi_cmd event,
77 					   void *data);
78 #endif /* CONFIG_AP */
79 
80 #define REASON_CODE_LEN 18
81 #define NM_WIFI_EVENT_STR_LEN 64
82 #define ETH_ALEN 6
83 
84 union supplicant_event_data {
85 	struct supplicant_event_auth_reject {
86 		int auth_type;
87 		int auth_transaction;
88 		int status_code;
89 		uint8_t bssid[ETH_ALEN];
90 	} auth_reject;
91 
92 	struct supplicant_event_connected {
93 		uint8_t bssid[ETH_ALEN];
94 		char ssid[WIFI_SSID_MAX_LEN];
95 		int id;
96 	} connected;
97 
98 	struct supplicant_event_disconnected {
99 		uint8_t bssid[ETH_ALEN];
100 		int reason_code;
101 		int locally_generated;
102 	} disconnected;
103 
104 	struct supplicant_event_assoc_reject {
105 		int status_code;
106 		int reason_code;
107 	} assoc_reject;
108 
109 	struct supplicant_event_temp_disabled {
110 		int id;
111 		char ssid[WIFI_SSID_MAX_LEN];
112 		unsigned int auth_failures;
113 		unsigned int duration;
114 		char reason_code[REASON_CODE_LEN];
115 	} temp_disabled;
116 
117 	struct supplicant_event_reenabled {
118 		int id;
119 		char ssid[WIFI_SSID_MAX_LEN];
120 	} reenabled;
121 
122 	struct supplicant_event_bss_added {
123 		unsigned int id;
124 		uint8_t bssid[ETH_ALEN];
125 	} bss_added;
126 
127 	struct supplicant_event_bss_removed {
128 		unsigned int id;
129 		uint8_t bssid[ETH_ALEN];
130 	} bss_removed;
131 
132 	struct supplicant_event_network_added {
133 		unsigned int id;
134 	} network_added;
135 
136 	struct supplicant_event_network_removed {
137 		unsigned int id;
138 	} network_removed;
139 
140 	char supplicant_event_str[NM_WIFI_EVENT_STR_LEN];
141 };
142 
143 enum supplicant_event_num {
144 	SUPPLICANT_EVENT_CONNECTED,
145 	SUPPLICANT_EVENT_DISCONNECTED,
146 	SUPPLICANT_EVENT_ASSOC_REJECT,
147 	SUPPLICANT_EVENT_AUTH_REJECT,
148 	SUPPLICANT_EVENT_TERMINATING,
149 	SUPPLICANT_EVENT_SSID_TEMP_DISABLED,
150 	SUPPLICANT_EVENT_SSID_REENABLED,
151 	SUPPLICANT_EVENT_SCAN_STARTED,
152 	SUPPLICANT_EVENT_SCAN_RESULTS,
153 	SUPPLICANT_EVENT_SCAN_FAILED,
154 	SUPPLICANT_EVENT_BSS_ADDED,
155 	SUPPLICANT_EVENT_BSS_REMOVED,
156 	SUPPLICANT_EVENT_NETWORK_NOT_FOUND,
157 	SUPPLICANT_EVENT_NETWORK_ADDED,
158 	SUPPLICANT_EVENT_NETWORK_REMOVED,
159 	SUPPLICANT_EVENT_DSCP_POLICY,
160 	SUPPLICANT_EVENT_REGDOM_CHANGE,
161 };
162 
163 struct supplicant_int_event_data {
164 	enum supplicant_event_num event;
165 	void *data;
166 	size_t data_len;
167 };
168 
169 #endif /* __SUPP_EVENTS_H__ */
170