Zephyr API Documentation 4.0.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
net_l2.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Intel Corporation.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12#ifndef ZEPHYR_INCLUDE_NET_NET_L2_H_
13#define ZEPHYR_INCLUDE_NET_NET_L2_H_
14
15#include <zephyr/device.h>
16#include <zephyr/net_buf.h>
17#include <zephyr/net/net_ip.h>
18#include <zephyr/net/capture.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
34struct net_if;
35
52
58struct net_l2 {
63 enum net_verdict (*recv)(struct net_if *iface, struct net_pkt *pkt);
64
71 int (*send)(struct net_if *iface, struct net_pkt *pkt);
72
77 int (*enable)(struct net_if *iface, bool state);
78
82 enum net_l2_flags (*get_flags)(struct net_if *iface);
83
87 int (*alloc)(struct net_if *iface, struct net_pkt *pkt,
88 size_t size, enum net_ip_protocol proto,
89 k_timeout_t timeout);
90};
91
93#define NET_L2_GET_NAME(_name) _net_l2_##_name
94#define NET_L2_DECLARE_PUBLIC(_name) \
95 extern const struct net_l2 NET_L2_GET_NAME(_name)
96#define NET_L2_GET_CTX_TYPE(_name) _name##_CTX_TYPE
97
98#define VIRTUAL_L2 VIRTUAL
99NET_L2_DECLARE_PUBLIC(VIRTUAL_L2);
100
101#define DUMMY_L2 DUMMY
102#define DUMMY_L2_CTX_TYPE void*
103NET_L2_DECLARE_PUBLIC(DUMMY_L2);
104
105#define OFFLOADED_NETDEV_L2 OFFLOADED_NETDEV
106NET_L2_DECLARE_PUBLIC(OFFLOADED_NETDEV_L2);
107
108#define ETHERNET_L2 ETHERNET
109NET_L2_DECLARE_PUBLIC(ETHERNET_L2);
110
111#define PPP_L2 PPP
112NET_L2_DECLARE_PUBLIC(PPP_L2);
113
114#define IEEE802154_L2 IEEE802154
115NET_L2_DECLARE_PUBLIC(IEEE802154_L2);
116
117#define OPENTHREAD_L2 OPENTHREAD
118NET_L2_DECLARE_PUBLIC(OPENTHREAD_L2);
119
120#define CANBUS_RAW_L2 CANBUS_RAW
121#define CANBUS_RAW_L2_CTX_TYPE void*
122NET_L2_DECLARE_PUBLIC(CANBUS_RAW_L2);
123
124#ifdef CONFIG_NET_L2_CUSTOM_IEEE802154
125#ifndef CUSTOM_IEEE802154_L2
126#define CUSTOM_IEEE802154_L2 CUSTOM_IEEE802154
127#endif
128#define CUSTOM_IEEE802154_L2_CTX_TYPE void*
129NET_L2_DECLARE_PUBLIC(CUSTOM_IEEE802154_L2);
130#endif /* CONFIG_NET_L2_CUSTOM_IEEE802154 */
131
132#define NET_L2_INIT(_name, _recv_fn, _send_fn, _enable_fn, _get_flags_fn, ...) \
133 const STRUCT_SECTION_ITERABLE(net_l2, \
134 NET_L2_GET_NAME(_name)) = { \
135 .recv = (_recv_fn), \
136 .send = (_send_fn), \
137 .enable = (_enable_fn), \
138 .get_flags = (_get_flags_fn), \
139 .alloc = COND_CODE_0(NUM_VA_ARGS_LESS_1(LIST_DROP_EMPTY(__VA_ARGS__, _)), \
140 (NULL), \
141 (GET_ARG_N(1, __VA_ARGS__))), \
142 }
143
144#define NET_L2_GET_DATA(name, sfx) _net_l2_data_##name##sfx
145
146#define NET_L2_DATA_INIT(name, sfx, ctx_type) \
147 static ctx_type NET_L2_GET_DATA(name, sfx) __used;
148
149typedef int (*net_l2_send_t)(const struct device *dev, struct net_pkt *pkt);
150
151static inline int net_l2_send(net_l2_send_t send_fn,
152 const struct device *dev,
153 struct net_if *iface,
154 struct net_pkt *pkt)
155{
156 net_capture_pkt(iface, pkt);
157
158 return send_fn(dev, pkt);
159}
160
167#ifdef __cplusplus
168}
169#endif
170
171#endif /* ZEPHYR_INCLUDE_NET_NET_L2_H_ */
Network packet capture definitions.
net_ip_protocol
Protocol numbers from IANA/BSD.
Definition net_ip.h:64
net_verdict
Net Verdict.
Definition net_core.h:102
net_l2_flags
L2 flags.
Definition net_l2.h:37
@ NET_L2_POINT_TO_POINT
Is this L2 point-to-point with tunneling so no need to have IP address etc to network interface.
Definition net_l2.h:50
@ NET_L2_MULTICAST_SKIP_JOIN_SOLICIT_NODE
Do not join solicited node multicast group.
Definition net_l2.h:42
@ NET_L2_PROMISC_MODE
Is promiscuous mode supported.
Definition net_l2.h:45
@ NET_L2_MULTICAST
IP multicast supported.
Definition net_l2.h:39
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition util_macro.h:44
Buffer management.
IPv6 and IPv4 definitions.
state
Definition parser_state.h:29
Runtime device structure (in ROM) per driver instance.
Definition device.h:411
Kernel timeout type.
Definition sys_clock.h:65
Network Interface structure.
Definition net_if.h:692
Network L2 structure.
Definition net_l2.h:58
int(* send)(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),...
Definition net_l2.h:71
enum net_verdict(* recv)(struct net_if *iface, struct net_pkt *pkt)
This function is used by net core to get iface's L2 layer parsing what's relevant to itself.
Definition net_l2.h:63
enum net_l2_flags(* get_flags)(struct net_if *iface)
Return L2 flags for the network interface.
Definition net_l2.h:82
int(* enable)(struct net_if *iface, bool state)
This function is used to enable/disable traffic over a network interface.
Definition net_l2.h:77
int(* alloc)(struct net_if *iface, struct net_pkt *pkt, size_t size, enum net_ip_protocol proto, k_timeout_t timeout)
Optional function for reserving L2 header space for this technology.
Definition net_l2.h:87
Network packet.
Definition net_pkt.h:91
struct net_if * iface
Network interface.
Definition net_pkt.h:114