1 /** @file
2  * @brief Offloaded network device iface API
3  *
4  * This is not to be included by the application.
5  */
6 
7 /*
8  * Copyright (c) 2022 Nordic Semiconductor ASA
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  */
12 
13 #ifndef ZEPHYR_INCLUDE_OFFLOADED_NETDEV_H_
14 #define ZEPHYR_INCLUDE_OFFLOADED_NETDEV_H_
15 
16 #include <zephyr/kernel.h>
17 #include <zephyr/types.h>
18 #include <stdbool.h>
19 #include <zephyr/net/net_if.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /**
26  * @brief Offloaded Net Devices
27  * @defgroup offloaded_netdev Offloaded Net Devices
28  * @since 3.4
29  * @version 0.8.0
30  * @ingroup networking
31  * @{
32  */
33 
34 /** Types of offloaded netdev L2 */
35 enum offloaded_net_if_types {
36 	/** Unknown, device hasn't register a type */
37 	L2_OFFLOADED_NET_IF_TYPE_UNKNOWN,
38 
39 	/** Ethernet devices */
40 	L2_OFFLOADED_NET_IF_TYPE_ETHERNET,
41 
42 	/** Modem */
43 	L2_OFFLOADED_NET_IF_TYPE_MODEM,
44 
45 	/** IEEE 802.11 Wi-Fi */
46 	L2_OFFLOADED_NET_IF_TYPE_WIFI,
47 };
48 
49 /**
50  * @brief Extended net_if_api for offloaded ifaces/network devices, allowing handling of
51  *	  admin up/down state changes
52  */
53 struct offloaded_if_api {
54 	/**
55 	 * The net_if_api must be placed in first position in this
56 	 * struct so that we are compatible with network interface API.
57 	 */
58 	struct net_if_api iface_api;
59 
60 	/** Enable or disable the device (in response to admin state change) */
61 	int (*enable)(const struct net_if *iface, bool state);
62 
63 	/** Types of offloaded net device */
64 	enum offloaded_net_if_types (*get_type)(void);
65 };
66 
67 /* Ensure offloaded_if_api is compatible with net_if_api */
68 BUILD_ASSERT(offsetof(struct offloaded_if_api, iface_api) == 0);
69 
70 /**
71  * @brief Check if the offloaded network interface supports Wi-Fi.
72  *
73  * @param iface Pointer to network interface
74  *
75  * @return True if interface supports Wi-Fi, False otherwise.
76  */
net_off_is_wifi_offloaded(struct net_if * iface)77 static inline bool net_off_is_wifi_offloaded(struct net_if *iface)
78 {
79 	const struct offloaded_if_api *api = (const struct offloaded_if_api *)
80 		net_if_get_device(iface)->api;
81 
82 	return api->get_type && api->get_type() == L2_OFFLOADED_NET_IF_TYPE_WIFI;
83 }
84 
85 /**
86  * @}
87  */
88 
89 #ifdef __cplusplus
90 }
91 #endif
92 
93 #endif /* ZEPHYR_INCLUDE_OFFLOADED_NETDEV_H_ */
94