2 * SPDX-License-Identifier: BSD-3-Clause
4 * Copyright (c) 1982, 1986, 1989, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
32 #ifndef _NET_IF_CLONE_H_
33 #define _NET_IF_CLONE_H_
37 #include <sys/_eventhandler.h>
39 #define CLONE_COMPAT_13
46 uint32_t unit
; /* Selected unit when IFC_C_AUTOUNIT set */
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
);
56 struct nl_parsed_link
;
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 */
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
);
76 struct if_clone_addreq
{
77 uint16_t version
; /* Always 0 for now */
80 uint32_t maxunit
; /* Maximum allowed unit number */
82 ifc_create_f
*create_f
;
83 ifc_destroy_f
*destroy_f
;
86 struct if_clone_addreq_v2
{
87 uint16_t version
; /* 2 */
90 uint32_t maxunit
; /* Maximum allowed unit number */
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
;
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 */
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");
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
);
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
);
118 void ifc_link_ifp(struct if_clone
*ifc
, struct ifnet
*ifp
);
119 bool ifc_unlink_ifp(struct if_clone
*ifc
, struct ifnet
*ifp
);
121 int ifc_copyin(const struct ifc_data
*ifd
, void *target
, size_t len
);
122 #ifdef CLONE_COMPAT_13
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
*);
129 typedef int ifcs_create_t(struct if_clone
*, int, caddr_t
);
130 typedef void ifcs_destroy_t(struct ifnet
*);
132 /* Interface cloner (de)allocating functions. */
134 if_clone_advanced(const char *, u_int
, ifc_match_t
, ifc_create_t
,
137 if_clone_simple(const char *, ifcs_create_t
, ifcs_destroy_t
, u_int
);
138 void if_clone_detach(struct if_clone
*);
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);
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
);
150 /* The below interfaces used only by net/if.c. */
151 void vnet_if_clone_init(void);
152 int if_clone_create(char *, size_t, caddr_t
);
153 int if_clone_destroy(const char *);
154 int if_clone_list(struct if_clonereq
*);
155 void if_clone_restoregroup(struct ifnet
*);
157 /* The below interfaces are used only by epair(4). */
158 void if_clone_addif(struct if_clone
*, struct ifnet
*);
159 int if_clone_destroyif(struct if_clone
*, struct ifnet
*);
162 #endif /* !_NET_IF_CLONE_H_ */