xref: /illumos-gate/usr/src/cmd/dlmgmtd/dlmgmt_impl.h (revision 08855964b9970604433f7b19dcd71cf5af5e5f14)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Copyright 2017 Joyent, Inc.
25  * Copyright 2023 Oxide Computer Company
26  */
27 
28 /*
29  * Functions to maintain a table of datalink configuration information.
30  */
31 
32 #ifndef	_DLMGMT_IMPL_H
33 #define	_DLMGMT_IMPL_H
34 
35 #ifdef  __cplusplus
36 extern "C" {
37 #endif
38 
39 #include <door.h>
40 #include <libdllink.h>
41 #include <sys/avl.h>
42 
43 /*
44  * datalink attribute structure
45  */
46 typedef struct dlmgmt_linkattr_s {
47 	struct dlmgmt_linkattr_s	*lp_next;
48 	struct dlmgmt_linkattr_s	*lp_prev;
49 	char				lp_name[MAXLINKATTRLEN];
50 	void				*lp_val;
51 	dladm_datatype_t		lp_type;
52 	uint_t				lp_sz;
53 	boolean_t			lp_linkprop;
54 } dlmgmt_linkattr_t;
55 
56 /*
57  * datalink structure
58  */
59 typedef struct dlmgmt_link_s {
60 	dlmgmt_linkattr_t	*ll_head;
61 	char			ll_link[MAXLINKNAMELEN];
62 	datalink_class_t	ll_class;
63 	uint32_t		ll_media;
64 	datalink_id_t		ll_linkid;
65 	/*
66 	 * The zone that owns the link. If this is set to the id of
67 	 * an NGZ and ll_onloan is set then the link was created and
68 	 * is owned by the GZ but is currently being loaned out to an
69 	 * NGZ. E.g., when the GZ admin creates a VNIC for exclusive
70 	 * use by an NGZ. If ll_onloan is set then ll_zoneid cannot be 0.
71 	 *
72 	 * If ll_zoneid is set to the id of an NGZ but ll_onloan is
73 	 * not set then the link was created by, and is owned by, the NGZ.
74 	 */
75 	zoneid_t		ll_zoneid;
76 	boolean_t		ll_onloan;
77 	avl_node_t		ll_name_node;
78 	avl_node_t		ll_id_node;
79 	avl_node_t		ll_loan_node;
80 	uint32_t		ll_flags;
81 	uint32_t		ll_gen;		/* generation number */
82 	/*
83 	 * A transient link is one that is created and destroyed along with the
84 	 * lifetime of a zone. It is a non-persistent link that is owned by the
85 	 * zone (ll_zoneid is set to the id of the NGZ). It is specifically not
86 	 * on-loan from the GZ.
87 	 */
88 	boolean_t		ll_transient;
89 } dlmgmt_link_t;
90 
91 /*
92  * datalink configuration request structure
93  */
94 typedef struct dlmgmt_dlconf_s {
95 	dlmgmt_linkattr_t	*ld_head;
96 	char			ld_link[MAXLINKNAMELEN];
97 	datalink_id_t		ld_linkid;
98 	datalink_class_t	ld_class;
99 	uint32_t		ld_media;
100 	int			ld_id;
101 	zoneid_t		ld_zoneid;
102 	uint32_t		ld_gen;
103 	avl_node_t		ld_node;
104 } dlmgmt_dlconf_t;
105 
106 extern boolean_t	debug;
107 extern const char	*progname;
108 extern char		cachefile[];
109 extern dladm_handle_t	dld_handle;
110 extern datalink_id_t	dlmgmt_nextlinkid;
111 extern avl_tree_t	dlmgmt_name_avl;
112 extern avl_tree_t	dlmgmt_id_avl;
113 extern avl_tree_t	dlmgmt_loan_avl;
114 extern avl_tree_t	dlmgmt_dlconf_avl;
115 
116 boolean_t	linkattr_equal(dlmgmt_linkattr_t **, const char *, void *,
117 		    size_t);
118 dlmgmt_linkattr_t *linkattr_find(dlmgmt_linkattr_t *, const char *);
119 void		linkattr_unset(dlmgmt_linkattr_t **, const char *);
120 int		linkattr_set(dlmgmt_linkattr_t **, const char *, void *,
121 		    size_t, dladm_datatype_t);
122 int		linkattr_get(dlmgmt_linkattr_t **, const char *, void **,
123 		    size_t *, dladm_datatype_t *);
124 void		linkattr_destroy(dlmgmt_link_t *);
125 
126 void		link_destroy(dlmgmt_link_t *);
127 int		link_activate(dlmgmt_link_t *);
128 boolean_t	link_is_visible(dlmgmt_link_t *, zoneid_t);
129 dlmgmt_link_t	*link_by_id(datalink_id_t, zoneid_t);
130 dlmgmt_link_t	*link_by_name(const char *, zoneid_t);
131 int		dlmgmt_create_common(const char *, datalink_class_t,
132 		    uint32_t, zoneid_t, uint32_t, dlmgmt_link_t **);
133 int		dlmgmt_destroy_common(dlmgmt_link_t *, uint32_t);
134 int		dlmgmt_getattr_common(dlmgmt_linkattr_t **, const char *,
135 		    dlmgmt_getattr_retval_t *);
136 
137 void		dlmgmt_advance(dlmgmt_link_t *);
138 void		dlmgmt_table_lock(boolean_t);
139 void		dlmgmt_table_unlock();
140 
141 int		dlconf_create(const char *, datalink_id_t, datalink_class_t,
142 		    uint32_t, zoneid_t, dlmgmt_dlconf_t **);
143 void		dlconf_destroy(dlmgmt_dlconf_t *);
144 void		dlmgmt_advance_dlconfid(dlmgmt_dlconf_t *);
145 void		dlmgmt_dlconf_table_lock(boolean_t);
146 void		dlmgmt_dlconf_table_unlock(void);
147 
148 int		dlmgmt_generate_name(const char *, char *, size_t, zoneid_t);
149 
150 void		dlmgmt_linktable_init(void);
151 void		dlmgmt_linktable_fini(void);
152 
153 int		dlmgmt_zone_init(zoneid_t);
154 int		dlmgmt_elevate_privileges(void);
155 int		dlmgmt_drop_privileges();
156 void		dlmgmt_handler(void *, char *, size_t, door_desc_t *, uint_t);
157 void		dlmgmt_log(int, const char *, ...);
158 int		dlmgmt_write_db_entry(const char *, dlmgmt_link_t *, uint32_t);
159 int		dlmgmt_delete_db_entry(dlmgmt_link_t *, uint32_t);
160 int		dlmgmt_db_init(zoneid_t, char *);
161 void		dlmgmt_db_fini(zoneid_t);
162 
163 #ifdef  __cplusplus
164 }
165 #endif
166 
167 #endif	/* _DLMGMT_IMPL_H */
168