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 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _LIBDLPI_H
27#define	_LIBDLPI_H
28
29#include <sys/types.h>
30#include <sys/dlpi.h>
31
32#ifdef	__cplusplus
33extern "C" {
34#endif
35
36/*
37 * Maximum Physical (hardware) address length, in bytes.
38 * Must be as large as MAXMACADDRLEN (see <sys/mac.h>).
39 */
40#define	DLPI_PHYSADDR_MAX	64
41
42/*
43 * Maximum link name length, including terminating NUL, in bytes.
44 * Must be no larger than MAXLINKNAMELEN (see <sys/param.h>).
45 */
46#define	DLPI_LINKNAME_MAX	32
47
48/*
49 * Constant used to indicate bind to any SAP value
50 */
51#define	DLPI_ANY_SAP	(uint_t)-1
52
53/*
54 * Flag values for dlpi_open(); those not documented in dlpi_open(3DLPI)
55 * are Consolidation Private and subject to change or removal.
56 */
57#define	DLPI_EXCL	0x0001	/* Exclusive open */
58#define	DLPI_PASSIVE	0x0002	/* Open DLPI link in passive mode */
59#define	DLPI_RAW	0x0004	/* Open DLPI link in raw mode */
60#define	DLPI_SERIAL	0x0008	/* Synchronous serial line interface */
61#define	DLPI_NOATTACH	0x0010	/* Do not attach PPA */
62#define	DLPI_NATIVE	0x0020	/* Open DLPI link in native mode */
63#define	DLPI_DEVONLY	0x0040	/* Open DLPI link under /dev only */
64#define	DLPI_DEVIPNET	0x0080	/* Open IP DLPI link under /dev/ipnet */
65#define	DLPI_IPNETINFO	0x0100	/* Request ipnetinfo headers */
66/*
67 * Timeout to be used in DLPI-related operations, in seconds.
68 */
69#define	DLPI_DEF_TIMEOUT  5
70
71/*
72 * Since this library returns error codes defined in either <sys/dlpi.h> or
73 * <libdlpi.h>, libdlpi specific error codes will start at value 10000 to
74 * avoid overlap. DLPI_SUCCESS cannot be 0 because 0 is already DL_BADSAP in
75 * <sys/dlpi.h>.
76 */
77enum {
78	DLPI_SUCCESS = 10000,	/* DLPI operation succeeded */
79	DLPI_EINVAL,		/* invalid argument */
80	DLPI_ELINKNAMEINVAL,	/* invalid DLPI linkname */
81	DLPI_ENOLINK,		/* DLPI link does not exist */
82	DLPI_EBADLINK,		/* bad DLPI link */
83	DLPI_EINHANDLE,		/* invalid DLPI handle */
84	DLPI_ETIMEDOUT,		/* DLPI operation timed out */
85	DLPI_EVERNOTSUP,	/* unsupported DLPI Version */
86	DLPI_EMODENOTSUP,	/* unsupported DLPI connection mode */
87	DLPI_EUNAVAILSAP,	/* unavailable DLPI SAP */
88	DLPI_FAILURE,		/* DLPI operation failed */
89	DLPI_ENOTSTYLE2,	/* DLPI style-2 node reports style-1 */
90	DLPI_EBADMSG,		/* bad DLPI message */
91	DLPI_ERAWNOTSUP,	/* DLPI raw mode not supported */
92	DLPI_ENOTEINVAL,	/* invalid DLPI notification type */
93	DLPI_ENOTENOTSUP,	/* DLPI notification not supported by link */
94	DLPI_ENOTEIDINVAL,	/* invalid DLPI notification id */
95	DLPI_EIPNETINFONOTSUP,	/* DLPI_IPNETINFO not supported */
96	DLPI_ERRMAX		/* Highest + 1 libdlpi error code */
97};
98
99/*
100 * DLPI information; see dlpi_info(3DLPI).
101 */
102typedef struct {
103	uint_t			di_opts;
104	uint_t			di_max_sdu;
105	uint_t			di_min_sdu;
106	uint_t			di_state;
107	uint_t			di_mactype;
108	char			di_linkname[DLPI_LINKNAME_MAX];
109	uchar_t			di_physaddr[DLPI_PHYSADDR_MAX];
110	uchar_t			di_physaddrlen;
111	uchar_t			di_bcastaddr[DLPI_PHYSADDR_MAX];
112	uchar_t			di_bcastaddrlen;
113	uint_t			di_sap;
114	int			di_timeout;
115	dl_qos_cl_sel1_t	di_qos_sel;
116	dl_qos_cl_range1_t 	di_qos_range;
117} dlpi_info_t;
118
119/*
120 * DLPI send information; see dlpi_send(3DLPI).
121 */
122typedef struct {
123	uint_t 		dsi_sap;
124	dl_priority_t	dsi_prio;
125} dlpi_sendinfo_t;
126
127/*
128 * Destination DLPI address type; see dlpi_recv(3DLPI).
129 */
130typedef enum {
131	DLPI_ADDRTYPE_UNICAST,
132	DLPI_ADDRTYPE_GROUP
133} dlpi_addrtype_t;
134
135/*
136 * DLPI receive information; see dlpi_recv(3DLPI).
137 */
138typedef struct {
139	uchar_t 	dri_destaddr[DLPI_PHYSADDR_MAX];
140	uchar_t 	dri_destaddrlen;
141	dlpi_addrtype_t	dri_destaddrtype;
142	size_t  	dri_totmsglen;
143} dlpi_recvinfo_t;
144
145/*
146 * DLPI notification, (DL_NOTIFY_IND) payload information;
147 * see dlpi_enabnotify(3DLPI).
148 */
149typedef struct {
150	uint_t  dni_note;
151	union {
152		uint_t  dniu_speed;
153		uint_t  dniu_size;
154		struct {
155			uchar_t physaddr[DLPI_PHYSADDR_MAX];
156			uchar_t physaddrlen;
157		} dniu_addr;
158	} dni_data;
159} dlpi_notifyinfo_t;
160
161#define	dni_speed		dni_data.dniu_speed
162#define	dni_size		dni_data.dniu_size
163#define	dni_physaddr		dni_data.dniu_addr.physaddr
164#define	dni_physaddrlen 	dni_data.dniu_addr.physaddrlen
165
166typedef struct __dlpi_handle *dlpi_handle_t;
167
168/*
169 * dlpi_notifyid_t refers to a registered notification. Its value should
170 * not be interpreted by the interface consumer.
171 */
172typedef struct __dlpi_notifyid *dlpi_notifyid_t;
173
174/*
175 * Callback function invoked with arguments; see dlpi_enabnotify(3DLPI).
176 */
177typedef void dlpi_notifyfunc_t(dlpi_handle_t, dlpi_notifyinfo_t *, void *);
178
179extern const char	*dlpi_mactype(uint_t);
180extern const char 	*dlpi_strerror(int);
181extern const char 	*dlpi_linkname(dlpi_handle_t);
182
183typedef boolean_t dlpi_walkfunc_t(const char *, void *);
184
185extern void dlpi_walk(dlpi_walkfunc_t *, void *, uint_t);
186extern int dlpi_open(const char *, dlpi_handle_t *, uint_t);
187extern void dlpi_close(dlpi_handle_t);
188extern int dlpi_info(dlpi_handle_t, dlpi_info_t *, uint_t);
189extern int dlpi_bind(dlpi_handle_t, uint_t, uint_t *);
190extern int dlpi_unbind(dlpi_handle_t);
191extern int dlpi_enabmulti(dlpi_handle_t, const void *, size_t);
192extern int dlpi_disabmulti(dlpi_handle_t, const void *, size_t);
193extern int dlpi_promiscon(dlpi_handle_t, uint_t);
194extern int dlpi_promiscoff(dlpi_handle_t, uint_t);
195extern int dlpi_get_physaddr(dlpi_handle_t, uint_t, void *, size_t *);
196extern int dlpi_set_physaddr(dlpi_handle_t, uint_t, const void *, size_t);
197extern int dlpi_recv(dlpi_handle_t, void *, size_t *, void *, size_t *,
198    int, dlpi_recvinfo_t *);
199extern int dlpi_send(dlpi_handle_t, const void *, size_t, const void *, size_t,
200    const dlpi_sendinfo_t *);
201extern int dlpi_enabnotify(dlpi_handle_t, uint_t, dlpi_notifyfunc_t *,
202    void *arg, dlpi_notifyid_t *);
203extern int dlpi_disabnotify(dlpi_handle_t, dlpi_notifyid_t, void **);
204extern int dlpi_fd(dlpi_handle_t);
205extern int dlpi_set_timeout(dlpi_handle_t, int);
206extern uint_t dlpi_arptype(uint_t);
207extern uint_t dlpi_iftype(uint_t);
208
209/*
210 * These are Consolidation Private interfaces and are subject to change.
211 */
212extern int dlpi_parselink(const char *, char *, uint_t *);
213extern int dlpi_makelink(char *, const char *, uint_t);
214extern uint_t dlpi_style(dlpi_handle_t);
215
216#ifdef	__cplusplus
217}
218#endif
219
220#endif /* _LIBDLPI_H */
221