Home | History | Annotate | Download | only in common
      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
     33 extern "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  */
     77 enum {
     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  */
    102 typedef 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  */
    122 typedef 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  */
    130 typedef enum {
    131 	DLPI_ADDRTYPE_UNICAST,
    132 	DLPI_ADDRTYPE_GROUP
    133 } dlpi_addrtype_t;
    134 
    135 /*
    136  * DLPI receive information; see dlpi_recv(3DLPI).
    137  */
    138 typedef 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  */
    149 typedef 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 
    166 typedef 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  */
    172 typedef struct __dlpi_notifyid *dlpi_notifyid_t;
    173 
    174 /*
    175  * Callback function invoked with arguments; see dlpi_enabnotify(3DLPI).
    176  */
    177 typedef void dlpi_notifyfunc_t(dlpi_handle_t, dlpi_notifyinfo_t *, void *);
    178 
    179 extern const char	*dlpi_mactype(uint_t);
    180 extern const char 	*dlpi_strerror(int);
    181 extern const char 	*dlpi_linkname(dlpi_handle_t);
    182 
    183 typedef boolean_t dlpi_walkfunc_t(const char *, void *);
    184 
    185 extern void dlpi_walk(dlpi_walkfunc_t *, void *, uint_t);
    186 extern int dlpi_open(const char *, dlpi_handle_t *, uint_t);
    187 extern void dlpi_close(dlpi_handle_t);
    188 extern int dlpi_info(dlpi_handle_t, dlpi_info_t *, uint_t);
    189 extern int dlpi_bind(dlpi_handle_t, uint_t, uint_t *);
    190 extern int dlpi_unbind(dlpi_handle_t);
    191 extern int dlpi_enabmulti(dlpi_handle_t, const void *, size_t);
    192 extern int dlpi_disabmulti(dlpi_handle_t, const void *, size_t);
    193 extern int dlpi_promiscon(dlpi_handle_t, uint_t);
    194 extern int dlpi_promiscoff(dlpi_handle_t, uint_t);
    195 extern int dlpi_get_physaddr(dlpi_handle_t, uint_t, void *, size_t *);
    196 extern int dlpi_set_physaddr(dlpi_handle_t, uint_t, const void *, size_t);
    197 extern int dlpi_recv(dlpi_handle_t, void *, size_t *, void *, size_t *,
    198     int, dlpi_recvinfo_t *);
    199 extern int dlpi_send(dlpi_handle_t, const void *, size_t, const void *, size_t,
    200     const dlpi_sendinfo_t *);
    201 extern int dlpi_enabnotify(dlpi_handle_t, uint_t, dlpi_notifyfunc_t *,
    202     void *arg, dlpi_notifyid_t *);
    203 extern int dlpi_disabnotify(dlpi_handle_t, dlpi_notifyid_t, void **);
    204 extern int dlpi_fd(dlpi_handle_t);
    205 extern int dlpi_set_timeout(dlpi_handle_t, int);
    206 extern uint_t dlpi_arptype(uint_t);
    207 extern uint_t dlpi_iftype(uint_t);
    208 
    209 /*
    210  * These are Consolidation Private interfaces and are subject to change.
    211  */
    212 extern int dlpi_parselink(const char *, char *, uint_t *);
    213 extern int dlpi_makelink(char *, const char *, uint_t);
    214 extern uint_t dlpi_style(dlpi_handle_t);
    215 
    216 #ifdef	__cplusplus
    217 }
    218 #endif
    219 
    220 #endif /* _LIBDLPI_H */
    221