| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330 | /* * Copyright (c) 2016 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 *//** * @file * @brief Network Management API public header */#ifndef ZEPHYR_INCLUDE_NET_NET_MGMT_H_#define ZEPHYR_INCLUDE_NET_NET_MGMT_H_#include <sys/__assert.h>#include <net/net_core.h>#include <net/net_event.h>#ifdef __cplusplusextern "C" {#endif/** * @brief Network Management * @defgroup net_mgmt Network Management * @ingroup networking * @{ */struct net_if;/** @cond INTERNAL_HIDDEN *//** * @brief NET MGMT event mask basics, normalizing parts of bit fields */#define NET_MGMT_EVENT_MASK		0x80000000#define NET_MGMT_ON_IFACE_MASK		0x40000000#define NET_MGMT_LAYER_MASK		0x30000000#define NET_MGMT_SYNC_EVENT_MASK	0x08000000#define NET_MGMT_LAYER_CODE_MASK	0x07FF0000#define NET_MGMT_COMMAND_MASK		0x0000FFFF#define NET_MGMT_EVENT_BIT		BIT(31)#define NET_MGMT_IFACE_BIT		BIT(30)#define NET_MGMT_SYNC_EVENT_BIT		BIT(27)#define NET_MGMT_LAYER(_layer)		(_layer << 28)#define NET_MGMT_LAYER_CODE(_code)	(_code << 16)#define NET_MGMT_EVENT(mgmt_request)		\	(mgmt_request & NET_MGMT_EVENT_MASK)#define NET_MGMT_ON_IFACE(mgmt_request)		\	(mgmt_request & NET_MGMT_ON_IFACE_MASK)#define NET_MGMT_EVENT_SYNCHRONOUS(mgmt_request)	\	(mgmt_request & NET_MGMT_SYNC_EVENT_MASK)#define NET_MGMT_GET_LAYER(mgmt_request)	\	((mgmt_request & NET_MGMT_LAYER_MASK) >> 28)#define NET_MGMT_GET_LAYER_CODE(mgmt_request)	\	((mgmt_request & NET_MGMT_LAYER_CODE_MASK) >> 16)#define NET_MGMT_GET_COMMAND(mgmt_request)	\	(mgmt_request & NET_MGMT_COMMAND_MASK)/* Useful generic definitions */#define NET_MGMT_LAYER_L2		1#define NET_MGMT_LAYER_L3		2#define NET_MGMT_LAYER_L4		3/** @endcond *//** * @typedef net_mgmt_request_handler_t * @brief Signature which all Net MGMT request handler need to follow * @param mgmt_request The exact request value the handler is being called *        through * @param iface A valid pointer on struct net_if if the request is meant *        to be tight to a network interface. NULL otherwise. * @param data A valid pointer on a data understood by the handler. *        NULL otherwise. * @param len Length in byte of the memory pointed by data. */typedef int (*net_mgmt_request_handler_t)(uint32_t mgmt_request,					  struct net_if *iface,					  void *data, size_t len);#define net_mgmt(_mgmt_request, _iface, _data, _len)			\	net_mgmt_##_mgmt_request(_mgmt_request, _iface, _data, _len)#define NET_MGMT_DEFINE_REQUEST_HANDLER(_mgmt_request)			\	extern int net_mgmt_##_mgmt_request(uint32_t mgmt_request,	\					    struct net_if *iface,	\					    void *data, size_t len)#define NET_MGMT_REGISTER_REQUEST_HANDLER(_mgmt_request, _func)	\	FUNC_ALIAS(_func, net_mgmt_##_mgmt_request, int)struct net_mgmt_event_callback;/** * @typedef net_mgmt_event_handler_t * @brief Define the user's callback handler function signature * @param cb Original struct net_mgmt_event_callback owning this handler. * @param mgmt_event The network event being notified. * @param iface A pointer on a struct net_if to which the the event belongs to, *        if it's an event on an iface. NULL otherwise. */typedef void (*net_mgmt_event_handler_t)(struct net_mgmt_event_callback *cb,					 uint32_t mgmt_event,					 struct net_if *iface);/** * @brief Network Management event callback structure * Used to register a callback into the network management event part, in order * to let the owner of this struct to get network event notification based on * given event mask. */struct net_mgmt_event_callback {	/** Meant to be used internally, to insert the callback into a list.	 * So nobody should mess with it.	 */	sys_snode_t node;	union {		/** Actual callback function being used to notify the owner		 */		net_mgmt_event_handler_t handler;		/** Semaphore meant to be used internaly for the synchronous		 * net_mgmt_event_wait() function.		 */		struct k_sem *sync_call;	};#ifdef CONFIG_NET_MGMT_EVENT_INFO	const void *info;	size_t info_length;#endif	/** A mask of network events on which the above handler should be	 * called in case those events come. Such mask can be modified	 * whenever necessary by the owner, and thus will affect the handler	 * being called or not.	 */	union {		/** A mask of network events on which the above handler should		 * be called in case those events come.		 * Note that only the command part is treated as a mask,		 * matching one to several commands. Layer and layer code will		 * be made of an exact match. This means that in order to		 * receive events from multiple layers, one must have multiple		 * listeners registered, one for each layer being listened.		 */		uint32_t event_mask;		/** Internal place holder when a synchronous event wait is		 * successfully unlocked on a event.		 */		uint32_t raised_event;	};};/** * @brief Helper to initialize a struct net_mgmt_event_callback properly * @param cb A valid application's callback structure pointer. * @param handler A valid handler function pointer. * @param mgmt_event_mask A mask of relevant events for the handler */#ifdef CONFIG_NET_MGMT_EVENTstatic inlinevoid net_mgmt_init_event_callback(struct net_mgmt_event_callback *cb,				  net_mgmt_event_handler_t handler,				  uint32_t mgmt_event_mask){	__ASSERT(cb, "Callback pointer should not be NULL");	__ASSERT(handler, "Handler pointer should not be NULL");	cb->handler = handler;	cb->event_mask = mgmt_event_mask;};#else#define net_mgmt_init_event_callback(...)#endif/** * @brief Add a user callback * @param cb A valid pointer on user's callback to add. */#ifdef CONFIG_NET_MGMT_EVENTvoid net_mgmt_add_event_callback(struct net_mgmt_event_callback *cb);#else#define net_mgmt_add_event_callback(...)#endif/** * @brief Delete a user callback * @param cb A valid pointer on user's callback to delete. */#ifdef CONFIG_NET_MGMT_EVENTvoid net_mgmt_del_event_callback(struct net_mgmt_event_callback *cb);#else#define net_mgmt_del_event_callback(...)#endif/** * @brief Used by the system to notify an event. * @param mgmt_event The actual network event code to notify * @param iface a valid pointer on a struct net_if if only the event is *        based on an iface. NULL otherwise. * @param info a valid pointer on the information you want to pass along *        with the event. NULL otherwise. Note the data pointed there is *        normalized by the related event. * @param length size of the data pointed by info pointer. * * Note: info and length are disabled if CONFIG_NET_MGMT_EVENT_INFO *       is not defined. */#ifdef CONFIG_NET_MGMT_EVENTvoid net_mgmt_event_notify_with_info(uint32_t mgmt_event, struct net_if *iface,				     const void *info, size_t length);static inline void net_mgmt_event_notify(uint32_t mgmt_event,					 struct net_if *iface){	net_mgmt_event_notify_with_info(mgmt_event, iface, NULL, 0);}#else#define net_mgmt_event_notify(...)#define net_mgmt_event_notify_with_info(...)#endif/** * @brief Used to wait synchronously on an event mask * @param mgmt_event_mask A mask of relevant events to wait on. * @param raised_event a pointer on a uint32_t to get which event from *        the mask generated the event. Can be NULL if the caller is not *        interested in that information. * @param iface a pointer on a place holder for the iface on which the *        event has originated from. This is valid if only the event mask *        has bit NET_MGMT_IFACE_BIT set relevantly, depending on events *        the caller wants to listen to. * @param info a valid pointer if user wants to get the information the *        event might bring along. NULL otherwise. * @param info_length tells how long the info memory area is. Only valid if *        the info is not NULL. * @param timeout A timeout delay. K_FOREVER can be used to wait indefinitely. * * @return 0 on success, a negative error code otherwise. -ETIMEDOUT will *         be specifically returned if the timeout kick-in instead of an *         actual event. */#ifdef CONFIG_NET_MGMT_EVENTint net_mgmt_event_wait(uint32_t mgmt_event_mask,			uint32_t *raised_event,			struct net_if **iface,			const void **info,			size_t *info_length,			k_timeout_t timeout);#elsestatic inline int net_mgmt_event_wait(uint32_t mgmt_event_mask,				      uint32_t *raised_event,				      struct net_if **iface,				      const void **info,				      size_t *info_length,				      k_timeout_t timeout){	return 0;}#endif/** * @brief Used to wait synchronously on an event mask for a specific iface * @param iface a pointer on a valid network interface to listen event to * @param mgmt_event_mask A mask of relevant events to wait on. Listened *        to events should be relevant to iface events and thus have the bit *        NET_MGMT_IFACE_BIT set. * @param raised_event a pointer on a uint32_t to get which event from *        the mask generated the event. Can be NULL if the caller is not *        interested in that information. * @param info a valid pointer if user wants to get the information the *        event might bring along. NULL otherwise. * @param info_length tells how long the info memory area is. Only valid if *        the info is not NULL. * @param timeout A timeout delay. K_FOREVER can be used to wait indefinitely. * * @return 0 on success, a negative error code otherwise. -ETIMEDOUT will *         be specifically returned if the timeout kick-in instead of an *         actual event. */#ifdef CONFIG_NET_MGMT_EVENTint net_mgmt_event_wait_on_iface(struct net_if *iface,				 uint32_t mgmt_event_mask,				 uint32_t *raised_event,				 const void **info,				 size_t *info_length,				 k_timeout_t timeout);#elsestatic inline int net_mgmt_event_wait_on_iface(struct net_if *iface,					       uint32_t mgmt_event_mask,					       uint32_t *raised_event,					       const void **info,					       size_t *info_length,					       k_timeout_t timeout){	return 0;}#endif/** * @brief Used by the core of the network stack to initialize the network *        event processing. */#ifdef CONFIG_NET_MGMT_EVENTvoid net_mgmt_event_init(void);#else#define net_mgmt_event_init(...)#endif /* CONFIG_NET_MGMT_EVENT *//** * @} */#ifdef __cplusplus}#endif#endif /* ZEPHYR_INCLUDE_NET_NET_MGMT_H_ */
 |