Zephyr API Documentation 4.1.99
A Scalable Open Source RTOS
 4.1.99
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
virtual.h
Go to the documentation of this file.
1
5/*
6 * Copyright (c) 2021 Intel Corporation
7 *
8 * SPDX-License-Identifier: Apache-2.0
9 */
10
11#ifndef ZEPHYR_INCLUDE_NET_VIRTUAL_H_
12#define ZEPHYR_INCLUDE_NET_VIRTUAL_H_
13
14#include <zephyr/kernel.h>
15#include <zephyr/types.h>
16#include <stdbool.h>
17#include <zephyr/sys/atomic.h>
18
19#include <zephyr/net/net_ip.h>
20#include <zephyr/net/net_pkt.h>
21
22#include <zephyr/sys/util.h>
23#include <zephyr/net/net_if.h>
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
42
45
48
51
53 /* Marker for capabilities - must be at the end of the enum.
54 * It is here because the capability list cannot be empty.
55 */
56 VIRTUAL_INTERFACE_NUM_CAPS
58};
59
62enum virtual_interface_config_type {
63 VIRTUAL_INTERFACE_CONFIG_TYPE_PEER_ADDRESS,
64 VIRTUAL_INTERFACE_CONFIG_TYPE_MTU,
65 VIRTUAL_INTERFACE_CONFIG_TYPE_LINK_TYPE,
66 VIRTUAL_INTERFACE_CONFIG_TYPE_PRIVATE_KEY,
67 VIRTUAL_INTERFACE_CONFIG_TYPE_PUBLIC_KEY,
68};
69
70struct virtual_interface_link_types {
71 int count;
72 uint16_t type[COND_CODE_1(CONFIG_NET_CAPTURE_COOKED_MODE,
73 (CONFIG_NET_CAPTURE_COOKED_MODE_MAX_LINK_TYPES),
74 (1))];
75};
76
77#if !defined(NET_VIRTUAL_MAX_PUBLIC_KEY_LEN)
78#define NET_VIRTUAL_MAX_PUBLIC_KEY_LEN 32U
79#endif
80
81struct virtual_interface_config {
82 sa_family_t family;
83 union {
84 struct in_addr peer4addr;
85 struct in6_addr peer6addr;
86 int mtu;
87 struct virtual_interface_link_types link_types;
88 struct {
89 size_t len;
90 uint8_t *data;
91 } private_key;
92 struct {
93 size_t len;
94 uint8_t data[NET_VIRTUAL_MAX_PUBLIC_KEY_LEN];
95 } public_key;
96 };
97};
98
99#if defined(CONFIG_NET_L2_VIRTUAL)
100#define VIRTUAL_MAX_NAME_LEN CONFIG_NET_L2_VIRTUAL_MAX_NAME_LEN
101#else
102#define VIRTUAL_MAX_NAME_LEN 0
103#endif
112 struct net_if_api iface_api;
113
115 enum virtual_interface_caps (*get_capabilities)(struct net_if *iface);
116
118 int (*start)(const struct device *dev);
119
121 int (*stop)(const struct device *dev);
122
124 int (*send)(struct net_if *iface, struct net_pkt *pkt);
125
132 enum net_verdict (*recv)(struct net_if *iface, struct net_pkt *pkt);
133
135 int (*attach)(struct net_if *virtual_iface, struct net_if *iface);
136
138 int (*set_config)(struct net_if *iface,
139 enum virtual_interface_config_type type,
140 const struct virtual_interface_config *config);
141
143 int (*get_config)(struct net_if *iface,
144 enum virtual_interface_config_type type,
145 struct virtual_interface_config *config);
146};
147
148/* Make sure that the network interface API is properly setup inside
149 * Virtual API struct (it is the first one).
150 */
151BUILD_ASSERT(offsetof(struct virtual_interface_api, iface_api) == 0);
152
157 /* Keep track of contexts */
158 sys_snode_t node;
159
160 /* My virtual network interface */
161 struct net_if *virtual_iface;
169 struct net_if *iface;
170
175
178
181
183 char name[VIRTUAL_MAX_NAME_LEN];
184};
185
195int net_virtual_interface_attach(struct net_if *virtual_iface,
196 struct net_if *iface);
197
207struct net_if *net_virtual_get_iface(struct net_if *iface);
208
218char *net_virtual_get_name(struct net_if *iface, char *buf, size_t len);
219
226void net_virtual_set_name(struct net_if *iface, const char *name);
227
237 enum net_l2_flags flags);
238
248enum net_verdict net_virtual_input(struct net_if *input_iface,
249 struct net_addr *remote_addr,
250 struct net_pkt *pkt);
251
260#if defined(CONFIG_NET_L2_VIRTUAL)
261void net_virtual_init(struct net_if *iface);
262#else
263static inline void net_virtual_init(struct net_if *iface)
264{
265 ARG_UNUSED(iface);
266}
267#endif
268
275#if defined(CONFIG_NET_L2_VIRTUAL)
276void net_virtual_disable(struct net_if *iface);
277#else
278static inline void net_virtual_disable(struct net_if *iface)
279{
280 ARG_UNUSED(iface);
281}
282#endif
283
290#if defined(CONFIG_NET_L2_VIRTUAL)
291void net_virtual_enable(struct net_if *iface);
292#else
293static inline void net_virtual_enable(struct net_if *iface)
294{
295 ARG_UNUSED(iface);
296}
297#endif
298
299#define VIRTUAL_L2_CTX_TYPE struct virtual_interface_context
300
308static inline enum virtual_interface_caps
309net_virtual_get_iface_capabilities(struct net_if *iface)
310{
311 const struct virtual_interface_api *virt =
313
314 if (!virt->get_capabilities) {
315 return (enum virtual_interface_caps)0;
316 }
317
318 return virt->get_capabilities(iface);
319}
320
321#define Z_NET_VIRTUAL_INTERFACE_INIT(node_id, dev_id, name, init_fn, \
322 pm, data, config, prio, api, mtu) \
323 Z_NET_DEVICE_INIT(node_id, dev_id, name, init_fn, pm, data, \
324 config, prio, api, VIRTUAL_L2, \
325 NET_L2_GET_CTX_TYPE(VIRTUAL_L2), mtu)
326
327#define Z_NET_VIRTUAL_INTERFACE_INIT_INSTANCE(node_id, dev_id, name, \
328 inst, init_fn, pm, data, \
329 config, prio, api, mtu) \
330 Z_NET_DEVICE_INIT_INSTANCE(node_id, dev_id, name, inst, \
331 init_fn, pm, data, \
332 config, prio, api, VIRTUAL_L2, \
333 NET_L2_GET_CTX_TYPE(VIRTUAL_L2), mtu)
357#define NET_VIRTUAL_INTERFACE_INIT(dev_id, name, init_fn, pm, data, \
358 config, prio, api, mtu) \
359 Z_NET_VIRTUAL_INTERFACE_INIT(DT_INVALID_NODE, dev_id, name, \
360 init_fn, pm, data, config, prio, \
361 api, mtu)
362
385#define NET_VIRTUAL_INTERFACE_INIT_INSTANCE(dev_id, name, inst, \
386 init_fn, pm, data, \
387 config, prio, api, mtu) \
388 Z_NET_VIRTUAL_INTERFACE_INIT_INSTANCE(DT_INVALID_NODE, dev_id, \
389 name, inst, \
390 init_fn, pm, data, config, \
391 prio, api, mtu)
392
397#ifdef __cplusplus
398}
399#endif
400
401#endif /* ZEPHYR_INCLUDE_NET_VIRTUAL_H_ */
unsigned short int sa_family_t
Socket address family type.
Definition net_ip.h:168
net_verdict
Net Verdict.
Definition net_core.h:103
static const struct device * net_if_get_device(struct net_if *iface)
Get an network interface's device.
Definition net_if.h:1005
net_l2_flags
L2 flags.
Definition net_l2.h:37
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define COND_CODE_1(_flag, _if_1_code, _else_code)
Insert code depending on whether _flag expands to 1 or not.
Definition util_macro.h:203
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition util_macro.h:44
void net_virtual_set_name(struct net_if *iface, const char *name)
Set the name of the virtual network interface L2.
enum net_l2_flags net_virtual_set_flags(struct net_if *iface, enum net_l2_flags flags)
Set the L2 flags of the virtual network interface.
int net_virtual_interface_attach(struct net_if *virtual_iface, struct net_if *iface)
Attach virtual network interface to the given network interface.
enum net_verdict net_virtual_input(struct net_if *input_iface, struct net_addr *remote_addr, struct net_pkt *pkt)
Feed the IP pkt to stack if tunneling is enabled.
virtual_interface_caps
Virtual interface capabilities.
Definition virtual.h:39
char * net_virtual_get_name(struct net_if *iface, char *buf, size_t len)
Return the name of the virtual network interface L2.
struct net_if * net_virtual_get_iface(struct net_if *iface)
Return network interface related to this virtual network interface.
@ VIRTUAL_INTERFACE_IPIP
IPIP tunnel.
Definition virtual.h:41
@ VIRTUAL_INTERFACE_VPN
VPN interface.
Definition virtual.h:50
@ VIRTUAL_INTERFACE_BRIDGE
Virtual Ethernet bridge interface.
Definition virtual.h:47
@ VIRTUAL_INTERFACE_VLAN
Virtual LAN interface (VLAN)
Definition virtual.h:44
Public kernel APIs.
Public API for network interface.
IPv6 and IPv4 definitions.
Network packet buffer descriptor API.
flags
Definition parser.h:97
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition device.h:504
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:510
IPv6 address struct.
Definition net_ip.h:143
IPv4 address struct.
Definition net_ip.h:155
Network Interface structure.
Definition net_if.h:714
Hardware link address structure.
Definition net_linkaddr.h:70
Network packet.
Definition net_pkt.h:91
Virtual L2 API operations.
Definition virtual.h:107
int(* stop)(const struct device *dev)
Stop the device.
Definition virtual.h:121
int(* get_config)(struct net_if *iface, enum virtual_interface_config_type type, struct virtual_interface_config *config)
Get specific L2 configuration.
Definition virtual.h:143
int(* set_config)(struct net_if *iface, enum virtual_interface_config_type type, const struct virtual_interface_config *config)
Set specific L2 configuration.
Definition virtual.h:138
enum net_verdict(* recv)(struct net_if *iface, struct net_pkt *pkt)
Receive a network packet.
Definition virtual.h:132
int(* send)(struct net_if *iface, struct net_pkt *pkt)
Send a network packet.
Definition virtual.h:124
int(* attach)(struct net_if *virtual_iface, struct net_if *iface)
Pass the attachment information to virtual interface.
Definition virtual.h:135
enum virtual_interface_caps(* get_capabilities)(struct net_if *iface)
Get the virtual interface capabilities.
Definition virtual.h:115
struct net_if_api iface_api
The net_if_api must be placed in first position in this struct so that we are compatible with network...
Definition virtual.h:112
int(* start)(const struct device *dev)
Start the device.
Definition virtual.h:118
Virtual L2 context that is needed to binding to the real network interface.
Definition virtual.h:155
enum net_l2_flags virtual_l2_flags
This tells what L2 features does virtual support.
Definition virtual.h:174
struct net_if * iface
Other network interface this virtual network interface is attached to.
Definition virtual.h:169
char name[VIRTUAL_MAX_NAME_LEN]
User friendly name of this L2 layer.
Definition virtual.h:183
bool is_init
Is this context already initialized.
Definition virtual.h:177
struct net_linkaddr lladdr
Link address for this network interface.
Definition virtual.h:180
Misc utilities.