|  | /* | 
|  | * Copyright (c) 2016 Intel Corporation. | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @file | 
|  | * @brief Public API for network L2 interface | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_INCLUDE_NET_NET_L2_H_ | 
|  | #define ZEPHYR_INCLUDE_NET_NET_L2_H_ | 
|  |  | 
|  | #include <net/buf.h> | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | /** | 
|  | * @brief Network Layer 2 abstraction layer | 
|  | * @defgroup net_l2 Network L2 Abstraction Layer | 
|  | * @ingroup networking | 
|  | * @{ | 
|  | */ | 
|  |  | 
|  | struct net_if; | 
|  |  | 
|  | /** L2 flags */ | 
|  | enum net_l2_flags { | 
|  | /** IP multicast supported */ | 
|  | NET_L2_MULTICAST			= BIT(0), | 
|  |  | 
|  | /** Do not joint solicited node multicast group */ | 
|  | NET_L2_MULTICAST_SKIP_JOIN_SOLICIT_NODE	= BIT(1), | 
|  |  | 
|  | /** Is promiscuous mode supported */ | 
|  | NET_L2_PROMISC_MODE			= BIT(2), | 
|  |  | 
|  | /** Is this L2 point-to-point with tunneling so no need to have | 
|  | * IP address etc to network interface. | 
|  | */ | 
|  | NET_L2_POINT_TO_POINT			= BIT(3), | 
|  | } __packed; | 
|  |  | 
|  | /** | 
|  | * @brief Network L2 structure | 
|  | * | 
|  | * Used to provide an interface to lower network stack. | 
|  | */ | 
|  | struct net_l2 { | 
|  | /** | 
|  | * This function is used by net core to get iface's L2 layer parsing | 
|  | * what's relevant to itself. | 
|  | */ | 
|  | enum net_verdict (*recv)(struct net_if *iface, struct net_pkt *pkt); | 
|  |  | 
|  | /** | 
|  | * This function is used by net core to push a packet to lower layer | 
|  | * (interface's L2), which in turn might work on the packet relevantly. | 
|  | * (adding proper header etc...) | 
|  | * Returns a negative error code, or the number of bytes sent otherwise. | 
|  | */ | 
|  | int (*send)(struct net_if *iface, struct net_pkt *pkt); | 
|  |  | 
|  | /** | 
|  | * This function is used to enable/disable traffic over a network | 
|  | * interface. The function returns <0 if error and >=0 if no error. | 
|  | */ | 
|  | int (*enable)(struct net_if *iface, bool state); | 
|  |  | 
|  | /** | 
|  | * Return L2 flags for the network interface. | 
|  | */ | 
|  | enum net_l2_flags (*get_flags)(struct net_if *iface); | 
|  | }; | 
|  |  | 
|  | /** @cond INTERNAL_HIDDEN */ | 
|  | #define NET_L2_GET_NAME(_name) __net_l2_##_name | 
|  | #define NET_L2_DECLARE_PUBLIC(_name)					\ | 
|  | extern const struct net_l2 NET_L2_GET_NAME(_name) | 
|  | #define NET_L2_GET_CTX_TYPE(_name) _name##_CTX_TYPE | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_DUMMY | 
|  | #define DUMMY_L2		DUMMY | 
|  | #define DUMMY_L2_CTX_TYPE	void* | 
|  | NET_L2_DECLARE_PUBLIC(DUMMY_L2); | 
|  | #endif /* CONFIG_NET_L2_DUMMY */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_ETHERNET | 
|  | #define ETHERNET_L2		ETHERNET | 
|  | NET_L2_DECLARE_PUBLIC(ETHERNET_L2); | 
|  | #endif /* CONFIG_NET_L2_ETHERNET */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_PPP | 
|  | #define PPP_L2			PPP | 
|  | NET_L2_DECLARE_PUBLIC(PPP_L2); | 
|  | #endif /* CONFIG_NET_L2_PPP */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_IEEE802154 | 
|  | #define IEEE802154_L2		IEEE802154 | 
|  | NET_L2_DECLARE_PUBLIC(IEEE802154_L2); | 
|  | #endif /* CONFIG_NET_L2_IEEE802154 */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_BT | 
|  | #define BLUETOOTH_L2		BLUETOOTH | 
|  | #define BLUETOOTH_L2_CTX_TYPE	void* | 
|  | NET_L2_DECLARE_PUBLIC(BLUETOOTH_L2); | 
|  | #endif /* CONFIG_NET_L2_BT */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_OPENTHREAD | 
|  | #define OPENTHREAD_L2		OPENTHREAD | 
|  | NET_L2_DECLARE_PUBLIC(OPENTHREAD_L2); | 
|  | #endif /* CONFIG_NET_L2_OPENTHREAD */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_CANBUS_RAW | 
|  | #define CANBUS_RAW_L2		CANBUS_RAW | 
|  | #define CANBUS_RAW_L2_CTX_TYPE	void* | 
|  | NET_L2_DECLARE_PUBLIC(CANBUS_RAW_L2); | 
|  | #endif /* CONFIG_NET_L2_CANBUS_RAW */ | 
|  |  | 
|  | #ifdef CONFIG_NET_L2_CANBUS | 
|  | #define CANBUS_L2		CANBUS | 
|  | NET_L2_DECLARE_PUBLIC(CANBUS_L2); | 
|  | #endif /* CONFIG_NET_L2_CANBUS */ | 
|  |  | 
|  | #define NET_L2_INIT(_name, _recv_fn, _send_fn, _enable_fn, _get_flags_fn) \ | 
|  | const struct net_l2 (NET_L2_GET_NAME(_name)) __used		\ | 
|  | __attribute__((__section__(".net_l2.init"))) = {		\ | 
|  | .recv = (_recv_fn),					\ | 
|  | .send = (_send_fn),					\ | 
|  | .enable = (_enable_fn),					\ | 
|  | .get_flags = (_get_flags_fn),				\ | 
|  | } | 
|  |  | 
|  | #define NET_L2_GET_DATA(name, sfx) (__net_l2_data_##name##sfx) | 
|  |  | 
|  | #define NET_L2_DATA_INIT(name, sfx, ctx_type)				\ | 
|  | static ctx_type NET_L2_GET_DATA(name, sfx) __used		\ | 
|  | __attribute__((__section__(".net_l2.data"))); | 
|  |  | 
|  | /** @endcond */ | 
|  |  | 
|  | /** | 
|  | * @} | 
|  | */ | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif /* ZEPHYR_INCLUDE_NET_NET_L2_H_ */ |