Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | /* * Copyright (c) 2016 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Public API for network L2 interface */ #ifndef __NET_L2_H__ #define __NET_L2_H__ #include <net/buf.h> #ifdef __cplusplus extern "C" { #endif struct net_if; #if defined(CONFIG_NET_L2_OFFLOAD_IP) struct net_l2_offload_ip; #endif /* CONFIG_NET_L2_OFFLOAD_IP */ 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_buf *buf); /** * This function is used by net core to push a buffer to lower layer * (interface's L2), which in turn might work on the buffer relevantly. * (adding proper header etc...) */ enum net_verdict (*send)(struct net_if *iface, struct net_buf *buf); /** * This function is used to get the amount of bytes the net core should * reserve as headroom in a net buffer. Such space is relevant to L2 * layer only. */ uint16_t (*reserve)(struct net_if *iface, void *data); /** * This function is used to enable/disable traffic over a network * interface. */ int (*enable)(struct net_if *iface, bool state); #if defined(CONFIG_NET_L2_OFFLOAD_IP) struct net_l2_offload_ip *offload_ip; #endif /* CONFIG_NET_L2_OFFLOAD_IP */ }; #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 extern struct net_l2 __net_l2_start[]; #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 #define ETHERNET_L2_CTX_TYPE void* NET_L2_DECLARE_PUBLIC(ETHERNET_L2); #endif /* CONFIG_NET_L2_ETHERNET */ #ifdef CONFIG_NET_L2_IEEE802154 #include <net/ieee802154.h> #define IEEE802154_L2 IEEE802154 #define IEEE802154_L2_CTX_TYPE struct ieee802154_context NET_L2_DECLARE_PUBLIC(IEEE802154_L2); #endif /* CONFIG_NET_L2_IEEE802154 */ #ifdef CONFIG_NET_L2_BLUETOOTH #define BLUETOOTH_L2 BLUETOOTH #define BLUETOOTH_L2_CTX_TYPE void* #endif /* CONFIG_NET_L2_BLUETOOTH */ #ifdef CONFIG_NET_L2_OFFLOAD_IP #define OFFLOAD_IP_L2 OFFLOAD_IP #define OFFLOAD_IP_L2_CTX_TYPE void* #endif /* CONFIG_NET_L2_OFFLOAD_IP */ extern struct net_l2 __net_l2_end[]; #define NET_L2_INIT(_name, _recv_fn, _send_fn, _reserve_fn, _enable_fn) \ const struct net_l2 (NET_L2_GET_NAME(_name)) __used \ __attribute__((__section__(".net_l2.init"))) = { \ .recv = (_recv_fn), \ .send = (_send_fn), \ .reserve = (_reserve_fn), \ .enable = (_enable_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"))); #ifdef __cplusplus } #endif #endif /* __NET_L2_H__ */ |