Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/net/if_clone.h
39478 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (c) 1982, 1986, 1989, 1993
5
* The Regents of the University of California. All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. Neither the name of the University nor the names of its contributors
16
* may be used to endorse or promote products derived from this software
17
* without specific prior written permission.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
* SUCH DAMAGE.
30
*/
31
32
#ifndef _NET_IF_CLONE_H_
33
#define _NET_IF_CLONE_H_
34
35
#ifdef _KERNEL
36
37
#include <sys/_eventhandler.h>
38
39
#define CLONE_COMPAT_13
40
41
struct if_clone;
42
43
/* Public KPI */
44
struct ifc_data {
45
uint32_t flags;
46
uint32_t unit; /* Selected unit when IFC_C_AUTOUNIT set */
47
void *params;
48
struct vnet *vnet;
49
};
50
51
typedef int ifc_match_f(struct if_clone *ifc, const char *name);
52
typedef int ifc_create_f(struct if_clone *ifc, char *name, size_t maxlen,
53
struct ifc_data *ifd, struct ifnet **ifpp);
54
typedef int ifc_destroy_f(struct if_clone *ifc, struct ifnet *ifp, uint32_t flags);
55
56
struct nl_parsed_link;
57
struct nlattr_bmask;
58
struct nl_pstate;
59
struct nl_writer;
60
struct ifc_data_nl {
61
struct nl_parsed_link *lattrs;/* (in) Parsed link attributes */
62
const struct nlattr_bmask *bm; /* (in) Bitmask of set link attributes */
63
struct nl_pstate *npt; /* (in) Netlink context */
64
void *params;/* (in) (Compat) data from ioctl */
65
uint32_t flags; /* (in) IFC_F flags */
66
uint32_t unit; /* (in/out) Selected unit when IFC_C_AUTOUNIT set */
67
int error; /* (out) Return error code */
68
struct ifnet *ifp; /* (out) Returned ifp */
69
};
70
71
typedef int ifc_create_nl_f(struct if_clone *ifc, char *name, size_t maxlen,
72
struct ifc_data_nl *ifd);
73
typedef int ifc_modify_nl_f(struct ifnet *ifp, struct ifc_data_nl *ifd);
74
typedef void ifc_dump_nl_f(struct ifnet *ifp, struct nl_writer *nw);
75
76
struct if_clone_addreq {
77
uint16_t version; /* Always 0 for now */
78
uint16_t spare;
79
uint32_t flags;
80
uint32_t maxunit; /* Maximum allowed unit number */
81
ifc_match_f *match_f;
82
ifc_create_f *create_f;
83
ifc_destroy_f *destroy_f;
84
};
85
86
struct if_clone_addreq_v2 {
87
uint16_t version; /* 2 */
88
uint16_t spare;
89
uint32_t flags;
90
uint32_t maxunit; /* Maximum allowed unit number */
91
ifc_match_f *match_f;
92
ifc_create_f *create_f;
93
ifc_destroy_f *destroy_f;
94
ifc_create_nl_f *create_nl_f;
95
ifc_modify_nl_f *modify_nl_f;
96
ifc_dump_nl_f *dump_nl_f;
97
};
98
99
#define IFC_F_SPARE 0x01
100
#define IFC_F_AUTOUNIT 0x02 /* Creation flag: automatically select unit */
101
#define IFC_F_SYSSPACE 0x04 /* Cloner callback: params pointer is in kernel memory */
102
#define IFC_F_FORCE 0x08 /* Deletion flag: force interface deletion */
103
#define IFC_F_CREATE 0x10 /* Creation flag: indicate creation request */
104
#define IFC_F_LIMITUNIT 0x20 /* Creation flag: the unit number is limited */
105
106
_Static_assert(offsetof(struct if_clone_addreq, destroy_f) ==
107
offsetof(struct if_clone_addreq_v2, destroy_f),
108
"destroy_f in if_clone_addreq and if_clone_addreq_v2 are at different offset");
109
110
struct if_clone *ifc_attach_cloner(const char *name, struct if_clone_addreq *req);
111
void ifc_detach_cloner(struct if_clone *ifc);
112
int ifc_create_ifp(const char *name, struct ifc_data *ifd, struct ifnet **ifpp);
113
114
bool ifc_create_ifp_nl(const char *name, struct ifc_data_nl *ifd);
115
bool ifc_modify_ifp_nl(struct ifnet *ifp, struct ifc_data_nl *ifd);
116
bool ifc_dump_ifp_nl(struct ifnet *ifp, struct nl_writer *nw);
117
118
void ifc_link_ifp(struct if_clone *ifc, struct ifnet *ifp);
119
bool ifc_unlink_ifp(struct if_clone *ifc, struct ifnet *ifp);
120
121
int ifc_copyin(const struct ifc_data *ifd, void *target, size_t len);
122
#ifdef CLONE_COMPAT_13
123
124
/* Methods. */
125
typedef int ifc_match_t(struct if_clone *, const char *);
126
typedef int ifc_create_t(struct if_clone *, char *, size_t, caddr_t);
127
typedef int ifc_destroy_t(struct if_clone *, struct ifnet *);
128
129
typedef int ifcs_create_t(struct if_clone *, int, caddr_t);
130
typedef void ifcs_destroy_t(struct ifnet *);
131
132
/* Interface cloner (de)allocating functions. */
133
struct if_clone *
134
if_clone_advanced(const char *, u_int, ifc_match_t, ifc_create_t,
135
ifc_destroy_t);
136
struct if_clone *
137
if_clone_simple(const char *, ifcs_create_t, ifcs_destroy_t, u_int);
138
void if_clone_detach(struct if_clone *);
139
#endif
140
141
/* Unit (de)allocating functions. */
142
int ifc_name2unit(const char *name, int *unit);
143
int ifc_alloc_unit(struct if_clone *, int *);
144
void ifc_free_unit(struct if_clone *, int);
145
146
/* Interface clone event. */
147
typedef void (*if_clone_event_handler_t)(void *, struct if_clone *);
148
EVENTHANDLER_DECLARE(if_clone_event, if_clone_event_handler_t);
149
150
/* The below interfaces used only by net/if.c. */
151
int if_clone_create(char *, size_t, caddr_t);
152
int if_clone_destroy(const char *);
153
int if_clone_list(struct if_clonereq *);
154
void if_clone_restoregroup(struct ifnet *);
155
156
/* The below interfaces are used only by epair(4) and tun(4)/tap(4). */
157
void if_clone_addif(struct if_clone *, struct ifnet *);
158
int if_clone_destroyif(struct if_clone *, struct ifnet *);
159
160
#endif /* _KERNEL */
161
#endif /* !_NET_IF_CLONE_H_ */
162
163