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