1 /*
2  * Copyright (c) 2018 Intel Corporation.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  * @brief Ethernet Management interface public header
10  */
11 
12 #ifndef ZEPHYR_INCLUDE_NET_ETHERNET_MGMT_H_
13 #define ZEPHYR_INCLUDE_NET_ETHERNET_MGMT_H_
14 
15 #include <zephyr/net/ethernet.h>
16 #include <zephyr/net/net_mgmt.h>
17 
18 #ifdef __cplusplus
19 extern "C" {
20 #endif
21 
22 /**
23  * @brief Ethernet library
24  * @defgroup ethernet_mgmt Ethernet Library
25  * @since 1.12
26  * @version 0.8.0
27  * @ingroup networking
28  * @{
29  */
30 
31 /** @cond INTERNAL_HIDDEN */
32 
33 #define NET_ETHERNET_LAYER	NET_MGMT_LAYER_L2
34 #define NET_ETHERNET_CODE	NET_MGMT_LAYER_CODE_ETHERNET
35 #define NET_ETHERNET_BASE	(NET_MGMT_IFACE_BIT |			\
36 				 NET_MGMT_LAYER(NET_ETHERNET_LAYER) |	\
37 				 NET_MGMT_LAYER_CODE(NET_ETHERNET_CODE))
38 #define NET_ETHERNET_EVENT	(NET_ETHERNET_BASE | NET_MGMT_EVENT_BIT)
39 
40 enum net_request_ethernet_cmd {
41 	NET_REQUEST_ETHERNET_CMD_SET_MAC_ADDRESS = 1,
42 	NET_REQUEST_ETHERNET_CMD_SET_QAV_PARAM,
43 	NET_REQUEST_ETHERNET_CMD_SET_QBV_PARAM,
44 	NET_REQUEST_ETHERNET_CMD_SET_QBU_PARAM,
45 	NET_REQUEST_ETHERNET_CMD_SET_TXTIME_PARAM,
46 	NET_REQUEST_ETHERNET_CMD_SET_PROMISC_MODE,
47 	NET_REQUEST_ETHERNET_CMD_GET_PRIORITY_QUEUES_NUM,
48 	NET_REQUEST_ETHERNET_CMD_GET_QAV_PARAM,
49 	NET_REQUEST_ETHERNET_CMD_GET_PORTS_NUM,
50 	NET_REQUEST_ETHERNET_CMD_GET_QBV_PARAM,
51 	NET_REQUEST_ETHERNET_CMD_GET_QBU_PARAM,
52 	NET_REQUEST_ETHERNET_CMD_GET_TXTIME_PARAM,
53 	NET_REQUEST_ETHERNET_CMD_SET_T1S_PARAM,
54 	NET_REQUEST_ETHERNET_CMD_SET_TXINJECTION_MODE,
55 	NET_REQUEST_ETHERNET_CMD_GET_TXINJECTION_MODE,
56 	NET_REQUEST_ETHERNET_CMD_SET_MAC_FILTER,
57 };
58 
59 #define NET_REQUEST_ETHERNET_SET_MAC_ADDRESS				\
60 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_MAC_ADDRESS)
61 
62 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_MAC_ADDRESS);
63 
64 #define NET_REQUEST_ETHERNET_SET_QAV_PARAM				\
65 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_QAV_PARAM)
66 
67 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_QAV_PARAM);
68 
69 #define NET_REQUEST_ETHERNET_GET_PORTS_NUM				\
70 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_PORTS_NUM)
71 
72 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_PORTS_NUM);
73 
74 #define NET_REQUEST_ETHERNET_SET_QBV_PARAM				\
75 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_QBV_PARAM)
76 
77 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_QBV_PARAM);
78 
79 #define NET_REQUEST_ETHERNET_SET_QBU_PARAM				\
80 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_QBU_PARAM)
81 
82 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_QBU_PARAM);
83 
84 #define NET_REQUEST_ETHERNET_SET_TXTIME_PARAM				\
85 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_TXTIME_PARAM)
86 
87 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_TXTIME_PARAM);
88 
89 #define NET_REQUEST_ETHERNET_SET_PROMISC_MODE				\
90 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_PROMISC_MODE)
91 
92 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_PROMISC_MODE);
93 
94 #define NET_REQUEST_ETHERNET_GET_PRIORITY_QUEUES_NUM			\
95 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_PRIORITY_QUEUES_NUM)
96 
97 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_PRIORITY_QUEUES_NUM);
98 
99 #define NET_REQUEST_ETHERNET_GET_QAV_PARAM				\
100 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_QAV_PARAM)
101 
102 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_QAV_PARAM);
103 
104 #define NET_REQUEST_ETHERNET_GET_QBV_PARAM				\
105 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_QBV_PARAM)
106 
107 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_QBV_PARAM);
108 
109 #define NET_REQUEST_ETHERNET_GET_QBU_PARAM				\
110 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_QBU_PARAM)
111 
112 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_QBU_PARAM);
113 
114 #define NET_REQUEST_ETHERNET_GET_TXTIME_PARAM				\
115 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_TXTIME_PARAM)
116 
117 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_TXTIME_PARAM);
118 
119 #define NET_REQUEST_ETHERNET_SET_T1S_PARAM				\
120 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_T1S_PARAM)
121 
122 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_T1S_PARAM);
123 
124 #define NET_REQUEST_ETHERNET_SET_TXINJECTION_MODE				\
125 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_TXINJECTION_MODE)
126 
127 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_TXINJECTION_MODE);
128 
129 #define NET_REQUEST_ETHERNET_GET_TXINJECTION_MODE				\
130 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_GET_TXINJECTION_MODE)
131 
132 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_GET_TXINJECTION_MODE);
133 
134 #define NET_REQUEST_ETHERNET_SET_MAC_FILTER				\
135 	(NET_ETHERNET_BASE | NET_REQUEST_ETHERNET_CMD_SET_MAC_FILTER)
136 
137 NET_MGMT_DEFINE_REQUEST_HANDLER(NET_REQUEST_ETHERNET_SET_MAC_FILTER);
138 
139 struct net_eth_addr;
140 struct ethernet_qav_param;
141 struct ethernet_qbv_param;
142 struct ethernet_qbu_param;
143 struct ethernet_txtime_param;
144 
145 struct ethernet_req_params {
146 	union {
147 		bool promisc_mode;
148 		bool txinjection_mode;
149 
150 		struct net_eth_addr mac_address;
151 
152 		struct ethernet_qav_param qav_param;
153 		struct ethernet_qbv_param qbv_param;
154 		struct ethernet_qbu_param qbu_param;
155 		struct ethernet_txtime_param txtime_param;
156 		struct ethernet_t1s_param t1s_param;
157 
158 		struct ethernet_filter filter;
159 
160 		int priority_queues_num;
161 		int ports_num;
162 	};
163 };
164 
165 enum {
166 	NET_EVENT_ETHERNET_CMD_CARRIER_ON_VAL,
167 	NET_EVENT_ETHERNET_CMD_CARRIER_OFF_VAL,
168 	NET_EVENT_ETHERNET_CMD_VLAN_TAG_ENABLED_VAL,
169 	NET_EVENT_ETHERNET_CMD_VLAN_TAG_DISABLED_VAL,
170 
171 	NET_EVENT_ETHERNET_CMD_MAX
172 };
173 
174 BUILD_ASSERT(NET_EVENT_ETHERNET_CMD_MAX <= NET_MGMT_MAX_COMMANDS,
175 	     "Number of events in net_event_ethernet_cmd exceeds the limit");
176 
177 enum net_event_ethernet_cmd {
178 	NET_MGMT_CMD(NET_EVENT_ETHERNET_CMD_CARRIER_ON),
179 	NET_MGMT_CMD(NET_EVENT_ETHERNET_CMD_CARRIER_OFF),
180 	NET_MGMT_CMD(NET_EVENT_ETHERNET_CMD_VLAN_TAG_ENABLED),
181 	NET_MGMT_CMD(NET_EVENT_ETHERNET_CMD_VLAN_TAG_DISABLED),
182 };
183 
184 #define NET_EVENT_ETHERNET_CARRIER_ON					\
185 	(NET_ETHERNET_EVENT | NET_EVENT_ETHERNET_CMD_CARRIER_ON)
186 
187 #define NET_EVENT_ETHERNET_CARRIER_OFF					\
188 	(NET_ETHERNET_EVENT | NET_EVENT_ETHERNET_CMD_CARRIER_OFF)
189 
190 #define NET_EVENT_ETHERNET_VLAN_TAG_ENABLED				\
191 	(NET_ETHERNET_EVENT | NET_EVENT_ETHERNET_CMD_VLAN_TAG_ENABLED)
192 
193 #define NET_EVENT_ETHERNET_VLAN_TAG_DISABLED				\
194 	(NET_ETHERNET_EVENT | NET_EVENT_ETHERNET_CMD_VLAN_TAG_DISABLED)
195 
196 struct net_if;
197 
198 /** @endcond */
199 
200 /**
201  * @brief Raise CARRIER_ON event when Ethernet is connected.
202  *
203  * @param iface Ethernet network interface.
204  */
205 #if defined(CONFIG_NET_L2_ETHERNET_MGMT)
206 void ethernet_mgmt_raise_carrier_on_event(struct net_if *iface);
207 #else
ethernet_mgmt_raise_carrier_on_event(struct net_if * iface)208 static inline void ethernet_mgmt_raise_carrier_on_event(struct net_if *iface)
209 {
210 	ARG_UNUSED(iface);
211 }
212 #endif
213 
214 /**
215  * @brief Raise CARRIER_OFF event when Ethernet is disconnected.
216  *
217  * @param iface Ethernet network interface.
218  */
219 #if defined(CONFIG_NET_L2_ETHERNET_MGMT)
220 void ethernet_mgmt_raise_carrier_off_event(struct net_if *iface);
221 #else
ethernet_mgmt_raise_carrier_off_event(struct net_if * iface)222 static inline void ethernet_mgmt_raise_carrier_off_event(struct net_if *iface)
223 {
224 	ARG_UNUSED(iface);
225 }
226 #endif
227 
228 /**
229  * @brief Raise VLAN_ENABLED event when VLAN is enabled.
230  *
231  * @param iface Ethernet network interface.
232  * @param tag VLAN tag which is enabled.
233  */
234 #if defined(CONFIG_NET_L2_ETHERNET_MGMT)
235 void ethernet_mgmt_raise_vlan_enabled_event(struct net_if *iface, uint16_t tag);
236 #else
ethernet_mgmt_raise_vlan_enabled_event(struct net_if * iface,uint16_t tag)237 static inline void ethernet_mgmt_raise_vlan_enabled_event(struct net_if *iface,
238 							  uint16_t tag)
239 {
240 	ARG_UNUSED(iface);
241 	ARG_UNUSED(tag);
242 }
243 #endif
244 
245 /**
246  * @brief Raise VLAN_DISABLED event when VLAN is disabled.
247  *
248  * @param iface Ethernet network interface.
249  * @param tag VLAN tag which is disabled.
250  */
251 #if defined(CONFIG_NET_L2_ETHERNET_MGMT)
252 void ethernet_mgmt_raise_vlan_disabled_event(struct net_if *iface,
253 					     uint16_t tag);
254 #else
ethernet_mgmt_raise_vlan_disabled_event(struct net_if * iface,uint16_t tag)255 static inline void ethernet_mgmt_raise_vlan_disabled_event(struct net_if *iface,
256 							   uint16_t tag)
257 {
258 	ARG_UNUSED(iface);
259 	ARG_UNUSED(tag);
260 }
261 #endif
262 
263 /**
264  * @}
265  */
266 
267 #ifdef __cplusplus
268 }
269 #endif
270 
271 #endif /* ZEPHYR_INCLUDE_NET_ETHERNET_MGMT_H_ */
272