dld.h revision 11042:2d6e217af1b4
1254721Semaste/* 2254721Semaste * CDDL HEADER START 3254721Semaste * 4254721Semaste * The contents of this file are subject to the terms of the 5254721Semaste * Common Development and Distribution License (the "License"). 6254721Semaste * You may not use this file except in compliance with the License. 7254721Semaste * 8254721Semaste * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9254721Semaste * or http://www.opensolaris.org/os/licensing. 10254721Semaste * See the License for the specific language governing permissions 11254721Semaste * and limitations under the License. 12254721Semaste * 13254721Semaste * When distributing Covered Code, include this CDDL HEADER in each 14254721Semaste * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15254721Semaste * If applicable, add the following below this CDDL HEADER, with the 16254721Semaste * fields enclosed by brackets "[]" replaced with your own identifying 17254721Semaste * information: Portions Copyright [yyyy] [name of copyright owner] 18254721Semaste * 19254721Semaste * CDDL HEADER END 20254721Semaste */ 21254721Semaste/* 22254721Semaste * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23254721Semaste * Use is subject to license terms. 24254721Semaste */ 25254721Semaste 26254721Semaste#ifndef _SYS_DLD_H 27254721Semaste#define _SYS_DLD_H 28254721Semaste 29254721Semaste/* 30254721Semaste * Data-Link Driver (public header). 31254721Semaste * 32254721Semaste * Note that the datastructures defined here define an ioctl interface 33254721Semaste * that is shared betwen user and kernel space. The dld driver thus 34254721Semaste * assumes that the structures have identical layout and size when 35254721Semaste * compiled in either IPL32 or LP64. 36254721Semaste */ 37254721Semaste 38254721Semaste#include <sys/types.h> 39254721Semaste#include <sys/stream.h> 40254721Semaste#include <sys/mac_flow.h> 41254721Semaste#include <sys/conf.h> 42254721Semaste#include <sys/sad.h> 43254721Semaste#include <sys/mac.h> 44254721Semaste 45254721Semaste#ifdef __cplusplus 46254721Semasteextern "C" { 47254721Semaste#endif 48254721Semaste 49254721Semaste/* 50254721Semaste * Data-Link Driver Information (text emitted by modinfo(1m)) 51254721Semaste */ 52254721Semaste#define DLD_INFO "Data-Link Driver" 53254721Semaste 54254721Semaste/* 55254721Semaste * Options: To enable an option set the property name to a non-zero value 56254721Semaste * in kernel/drv/dld.conf. 57254721Semaste */ 58254721Semaste 59254721Semaste/* 60254721Semaste * Prevent use of the IP fast-path (direct M_DATA transmit). 61254721Semaste */ 62254721Semaste#define DLD_PROP_NO_FASTPATH "no-fastpath" 63254721Semaste 64254721Semaste/* 65254721Semaste * Prevent advertising of the DL_CAPAB_POLL capability. 66254721Semaste */ 67254721Semaste#define DLD_PROP_NO_POLL "no-poll" 68254721Semaste 69254721Semaste/* 70254721Semaste * Prevent advertising of the DL_CAPAB_ZEROCOPY capability. 71254721Semaste */ 72254721Semaste#define DLD_PROP_NO_ZEROCOPY "no-zerocopy" 73254721Semaste 74254721Semaste/* 75254721Semaste * Prevent advertising of the DL_CAPAB_SOFTRING capability. 76254721Semaste */ 77254721Semaste#define DLD_PROP_NO_SOFTRING "no-softring" 78254721Semaste 79254721Semaste/* 80254721Semaste * The name of the driver. 81254721Semaste */ 82254721Semaste#define DLD_DRIVER_NAME "dld" 83254721Semaste 84254721Semaste#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 85254721Semaste#pragma pack(4) 86254721Semaste#endif 87254721Semaste 88254721Semaste/* 89254721Semaste * IOCTL codes and data structures. 90254721Semaste */ 91254721Semaste#define DLDIOC_ATTR DLDIOC(0x03) 92254721Semaste 93254721Semastetypedef struct dld_ioc_attr { 94254721Semaste datalink_id_t dia_linkid; 95254721Semaste uint_t dia_max_sdu; 96254721Semaste} dld_ioc_attr_t; 97254721Semaste 98254721Semaste#define DLDIOC_VLAN_ATTR DLDIOC(0x04) 99254721Semastetypedef struct dld_ioc_vlan_attr { 100254721Semaste datalink_id_t div_vlanid; 101254721Semaste uint16_t div_vid; 102254721Semaste datalink_id_t div_linkid; 103254721Semaste boolean_t div_force; 104254721Semaste} dld_ioc_vlan_attr_t; 105254721Semaste 106254721Semaste#define DLDIOC_PHYS_ATTR DLDIOC(0x05) 107254721Semaste#define DLPI_LINKNAME_MAX 32 108254721Semaste 109254721Semastetypedef struct dld_ioc_phys_attr { 110254721Semaste datalink_id_t dip_linkid; 111254721Semaste /* 112254721Semaste * Whether this physical link supports vanity naming. Note that 113254721Semaste * physical links whose media type is not supported by GLDv3 114254721Semaste * can not support vanity naming. 115254721Semaste */ 116254721Semaste boolean_t dip_novanity; 117254721Semaste char dip_dev[MAXLINKNAMELEN]; 118254721Semaste} dld_ioc_phys_attr_t; 119254721Semaste 120254721Semaste/* 121254721Semaste * Secure objects ioctls 122254721Semaste */ 123254721Semastetypedef enum { 124254721Semaste DLD_SECOBJ_CLASS_WEP = 1, 125254721Semaste DLD_SECOBJ_CLASS_WPA 126254721Semaste} dld_secobj_class_t; 127254721Semaste 128254721Semaste#define DLD_SECOBJ_OPT_CREATE 0x00000001 129254721Semaste#define DLD_SECOBJ_NAME_MAX 32 130254721Semaste#define DLD_SECOBJ_VAL_MAX 256 131254721Semastetypedef struct dld_secobj { 132254721Semaste char so_name[DLD_SECOBJ_NAME_MAX]; 133254721Semaste dld_secobj_class_t so_class; 134254721Semaste uint8_t so_val[DLD_SECOBJ_VAL_MAX]; 135254721Semaste uint_t so_len; 136254721Semaste} dld_secobj_t; 137254721Semaste 138254721Semaste#define DLDIOC_SECOBJ_SET DLDIOC(0x06) 139254721Semastetypedef struct dld_ioc_secobj_set { 140254721Semaste dld_secobj_t ss_obj; 141254721Semaste uint_t ss_flags; 142254721Semaste} dld_ioc_secobj_set_t; 143254721Semaste 144254721Semaste#define DLDIOC_SECOBJ_GET DLDIOC(0x07) 145254721Semastetypedef struct dld_ioc_secobj_get { 146254721Semaste dld_secobj_t sg_obj; 147254721Semaste uint_t sg_count; 148254721Semaste uint_t sg_size; 149254721Semaste} dld_ioc_secobj_get_t; 150254721Semaste 151254721Semaste/* 152254721Semaste * The following two slots were used outside of ON, so don't reuse them. 153254721Semaste * 154254721Semaste * #define DLDIOCHOLDVLAN DLDIOC(0x08) 155254721Semaste * #define DLDIOCRELEVLAN DLDIOC(0x09) 156254721Semaste */ 157254721Semaste 158254721Semaste#define DLDIOC_SECOBJ_UNSET DLDIOC(0x0a) 159254721Semastetypedef struct dld_ioc_secobj_unset { 160254721Semaste char su_name[DLD_SECOBJ_NAME_MAX]; 161254721Semaste} dld_ioc_secobj_unset_t; 162254721Semaste 163254721Semaste#define DLDIOC_CREATE_VLAN DLDIOC(0x0b) 164254721Semastetypedef struct dld_ioc_create_vlan { 165254721Semaste datalink_id_t dic_vlanid; 166254721Semaste datalink_id_t dic_linkid; 167254721Semaste uint16_t dic_vid; 168254721Semaste boolean_t dic_force; 169254721Semaste} dld_ioc_create_vlan_t; 170254721Semaste 171254721Semaste#define DLDIOC_DELETE_VLAN DLDIOC(0x0c) 172254721Semastetypedef struct dld_ioc_delete_vlan { 173254721Semaste datalink_id_t did_linkid; 174254721Semaste} dld_ioc_delete_vlan_t; 175254721Semaste 176254721Semaste/* 177254721Semaste * The following constants have been removed, and the slots are open: 178254721Semaste * 179254721Semaste * #define DLDIOC_SETAUTOPUSH DLDIOC(0x0d) 180254721Semaste * #define DLDIOC_GETAUTOPUSH DLDIOC(0x0e) 181254721Semaste * #define DLDIOC_CLRAUTOPUSH DLDIOC(0x0f) 182254721Semaste */ 183254721Semaste 184254721Semaste#define DLDIOC_DOORSERVER DLDIOC(0x10) 185254721Semastetypedef struct dld_ioc_door { 186254721Semaste boolean_t did_start_door; 187254721Semaste} dld_ioc_door_t; 188254721Semaste 189254721Semaste#define DLDIOC_RENAME DLDIOC(0x11) 190254721Semastetypedef struct dld_ioc_rename { 191254721Semaste datalink_id_t dir_linkid1; 192254721Semaste datalink_id_t dir_linkid2; 193254721Semaste char dir_link[MAXLINKNAMELEN]; 194254721Semaste} dld_ioc_rename_t; 195254721Semaste 196254721Semaste/* 197254721Semaste * The following constants have been removed, and the slots are open: 198254721Semaste * 199254721Semaste * #define DLDIOC_SETZID DLDIOC(0x12) 200254721Semaste * #define DLDIOC_GETZID DLDIOC(0x13) 201254721Semaste */ 202254721Semaste 203254721Semastetypedef struct dld_ioc_zid { 204254721Semaste zoneid_t diz_zid; 205254721Semaste datalink_id_t diz_linkid; 206254721Semaste} dld_ioc_zid_t; 207254721Semaste 208254721Semaste/* 209254721Semaste * data-link autopush configuration. 210254721Semaste */ 211254721Semastestruct dlautopush { 212254721Semaste uint_t dap_anchor; 213254721Semaste uint_t dap_npush; 214254721Semaste char dap_aplist[MAXAPUSH][FMNAMESZ+1]; 215254721Semaste}; 216254721Semaste 217254721Semaste#define DLDIOC_MACADDRGET DLDIOC(0x15) 218254721Semastetypedef struct dld_ioc_macaddrget { 219254721Semaste datalink_id_t dig_linkid; 220254721Semaste uint_t dig_count; 221254721Semaste uint_t dig_size; 222254721Semaste} dld_ioc_macaddrget_t; 223254721Semaste 224254721Semaste/* possible flags for dmi_flags below */ 225254721Semaste#define DLDIOCMACADDR_USED 0x1 /* address slot used */ 226254721Semaste 227254721Semastetypedef struct dld_macaddrinfo { 228254721Semaste uint_t dmi_slot; 229254721Semaste uint_t dmi_flags; 230254721Semaste uint_t dmi_addrlen; 231254721Semaste uchar_t dmi_addr[MAXMACADDRLEN]; 232254721Semaste char dmi_client_name[MAXNAMELEN]; 233254721Semaste datalink_id_t dma_client_linkid; 234254721Semaste} dld_macaddrinfo_t; 235254721Semaste 236254721Semaste/* 237254721Semaste * IOCTL codes and data structures for flowadm. 238254721Semaste */ 239254721Semaste#define DLDIOC_ADDFLOW DLDIOC(0x16) 240254721Semastetypedef struct dld_ioc_addflow { 241254721Semaste datalink_id_t af_linkid; 242254721Semaste flow_desc_t af_flow_desc; 243254721Semaste mac_resource_props_t af_resource_props; 244254721Semaste char af_name[MAXFLOWNAMELEN]; 245254721Semaste} dld_ioc_addflow_t; 246254721Semaste 247254721Semaste#define DLDIOC_REMOVEFLOW DLDIOC(0x17) 248254721Semastetypedef struct dld_ioc_removeflow { 249254721Semaste char rf_name[MAXFLOWNAMELEN]; 250254721Semaste} dld_ioc_removeflow_t; 251254721Semaste 252254721Semaste#define DLDIOC_MODIFYFLOW DLDIOC(0x18) 253254721Semastetypedef struct dld_ioc_modifyflow { 254254721Semaste char mf_name[MAXFLOWNAMELEN]; 255254721Semaste mac_resource_props_t mf_resource_props; 256254721Semaste} dld_ioc_modifyflow_t; 257254721Semaste 258254721Semaste#define DLDIOC_WALKFLOW DLDIOC(0x19) 259254721Semastetypedef struct dld_ioc_walkflow { 260254721Semaste datalink_id_t wf_linkid; 261254721Semaste char wf_name[MAXFLOWNAMELEN]; 262254721Semaste uint32_t wf_nflows; 263254721Semaste uint_t wf_len; 264254721Semaste} dld_ioc_walkflow_t; 265254721Semaste 266254721Semastetypedef struct dld_flowinfo { 267254721Semaste datalink_id_t fi_linkid; 268254721Semaste flow_desc_t fi_flow_desc; 269254721Semaste mac_resource_props_t fi_resource_props; 270254721Semaste char fi_flowname[MAXFLOWNAMELEN]; 271254721Semaste uint32_t fi_pad; 272254721Semaste} dld_flowinfo_t; 273254721Semaste 274254721Semaste#define DLDIOC_USAGELOG DLDIOC(0x1a) 275254721Semastetypedef struct dld_ioc_usagelog { 276254721Semaste mac_logtype_t ul_type; 277254721Semaste boolean_t ul_onoff; 278254721Semaste uint_t ul_interval; 279254721Semaste} dld_ioc_usagelog_t; 280254721Semaste 281254721Semaste#define DLDIOC_SETMACPROP DLDIOC(0x1b) 282254721Semaste#define DLDIOC_GETMACPROP DLDIOC(0x1c) 283254721Semaste#define MAC_PROP_VERSION 1 284254721Semaste 285254721Semastetypedef struct dld_ioc_macprop_s { 286254721Semaste int pr_version; 287254721Semaste uint_t pr_flags; 288254721Semaste datalink_id_t pr_linkid; 289254721Semaste mac_prop_id_t pr_num; 290254721Semaste uint_t pr_perm_flags; 291254721Semaste char pr_name[MAXLINKPROPNAME]; 292254721Semaste uint_t pr_valsize; /* sizeof pr_val */ 293254721Semaste char pr_val[1]; 294254721Semaste} dld_ioc_macprop_t; 295254721Semaste 296254721Semaste#define DLDIOC_GETHWGRP DLDIOC(0x1d) 297254721Semaste 298254721Semastetypedef struct dld_ioc_hwgrpget { 299254721Semaste datalink_id_t dih_linkid; 300254721Semaste uint_t dih_n_groups; /* number of groups included in ioc */ 301254721Semaste uint_t dih_size; 302254721Semaste} dld_ioc_hwgrpget_t; 303254721Semaste 304254721Semaste#define MAXCLIENTNAMELEN 1024 305254721Semastetypedef struct dld_hwgrpinfo { 306254721Semaste char dhi_link_name[MAXLINKNAMELEN]; 307254721Semaste uint_t dhi_grp_num; 308254721Semaste uint_t dhi_grp_type; 309254721Semaste uint_t dhi_n_rings; 310254721Semaste uint_t dhi_n_clnts; 311254721Semaste /* XXXX later we should use dhi_n_clnts * MAXNAMELEN for dhi_clnts */ 312254721Semaste char dhi_clnts[MAXCLIENTNAMELEN]; 313254721Semaste} dld_hwgrpinfo_t; 314254721Semaste 315254721Semaste#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 316254721Semaste#pragma pack() 317254721Semaste#endif 318254721Semaste 319254721Semaste#ifdef _KERNEL 320254721Semaste 321254721Semaste#define DLD_CAPAB_DIRECT 0x00000001 322254721Semaste#define DLD_CAPAB_POLL 0x00000002 323254721Semaste#define DLD_CAPAB_PERIM 0x00000003 324254721Semaste#define DLD_CAPAB_LSO 0x00000004 325254721Semaste 326254721Semaste#define DLD_ENABLE 0x00000001 327254721Semaste#define DLD_DISABLE 0x00000002 328254721Semaste#define DLD_QUERY 0x00000003 329254721Semaste 330254721Semaste/* 331254721Semaste * GLDv3 entry point for negotiating capabilities. 332254721Semaste * This is exposed to IP after negotiation of DL_CAPAB_DLD. 333254721Semaste * 334254721Semaste * This function takes the following arguments: 335254721Semaste * handle: used for identifying the interface to operate on (provided by dld). 336254721Semaste * type: capability type. 337254721Semaste * arg: points to a capability-specific structure. 338254721Semaste * flags: used for indicating whether to enable or disable a capability. 339254721Semaste * 340254721Semaste * With this function, capability negotiation is reduced from a multi-step 341254721Semaste * process to just one single function call. 342254721Semaste * e.g. the following code would pass 'x' from IP to dld and obtain 343254721Semaste * arg.output_arg from dld: 344254721Semaste * 345254721Semaste * arg.input_arg = x; 346254721Semaste * rc = (*dld_capab)(handle, DLD_CAPAB_XXX, &arg, DLD_ENABLE); 347254721Semaste * ill->info1 = arg.output_arg; 348254721Semaste */ 349254721Semastetypedef int (*dld_capab_func_t)(void *, uint_t, void *, uint_t); 350254721Semaste 351254721Semaste/* 352254721Semaste * Direct Tx/Rx capability. 353254721Semaste */ 354254721Semastetypedef struct dld_capab_direct_s { 355254721Semaste /* 356254721Semaste * Rx entry point and handle, owned by IP. 357254721Semaste */ 358254721Semaste uintptr_t di_rx_cf; 359254721Semaste void *di_rx_ch; 360254721Semaste 361254721Semaste /* 362254721Semaste * Tx entry points and handle, owned by DLD. 363254721Semaste */ 364254721Semaste /* Entry point for transmitting packets */ 365254721Semaste uintptr_t di_tx_df; 366254721Semaste void *di_tx_dh; 367254721Semaste 368254721Semaste /* flow control notification callback */ 369254721Semaste uintptr_t di_tx_cb_df; /* callback registration/de-registration */ 370254721Semaste void *di_tx_cb_dh; 371254721Semaste 372254721Semaste /* flow control "can I put on a ring" callback */ 373254721Semaste uintptr_t di_tx_fctl_df; /* canput-like callback */ 374254721Semaste void *di_tx_fctl_dh; 375254721Semaste} dld_capab_direct_t; 376254721Semaste 377254721Semaste/* 378254721Semaste * Polling/softring capability. 379254721Semaste */ 380254721Semaste#define POLL_SOFTRING 0x00000001 381254721Semastetypedef struct dld_capab_poll_s { 382254721Semaste uintptr_t poll_ring_add_cf; 383254721Semaste uintptr_t poll_ring_remove_cf; 384254721Semaste uintptr_t poll_ring_quiesce_cf; 385254721Semaste uintptr_t poll_ring_restart_cf; 386254721Semaste uintptr_t poll_ring_bind_cf; 387254721Semaste void *poll_ring_ch; 388254721Semaste uintptr_t poll_mac_accept_df; 389254721Semaste void *poll_mac_dh; 390254721Semaste} dld_capab_poll_t; 391254721Semaste 392254721Semaste/* 393254721Semaste * LSO capability 394254721Semaste */ 395254721Semaste/* 396254721Semaste * Currently supported flags for LSO. 397254721Semaste */ 398254721Semaste#define DLD_LSO_BASIC_TCP_IPV4 0x01 /* TCP LSO over IPv4 capability */ 399254721Semaste#define DLD_LSO_BASIC_TCP_IPV6 0x02 /* TCP LSO over IPv6 capability */ 400254721Semaste 401254721Semastetypedef struct dld_capab_lso_s { 402254721Semaste uint_t lso_flags; /* capability flags */ 403254721Semaste uint_t lso_max; /* maximum payload */ 404254721Semaste} dld_capab_lso_t; 405254721Semaste 406254721Semasteint dld_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **); 407254721Semasteint dld_devt_to_instance(dev_t); 408254721Semasteint dld_open(queue_t *, dev_t *, int, int, cred_t *); 409254721Semasteint dld_close(queue_t *); 410254721Semastevoid dld_wput(queue_t *, mblk_t *); 411254721Semastevoid dld_wsrv(queue_t *); 412254721Semasteint dld_str_open(queue_t *, dev_t *, void *); 413254721Semasteint dld_str_close(queue_t *); 414254721Semastevoid *dld_str_private(queue_t *); 415254721Semastevoid dld_init_ops(struct dev_ops *, const char *); 416254721Semastevoid dld_fini_ops(struct dev_ops *); 417254721Semasteint dld_autopush(dev_t *, struct dlautopush *); 418254721Semaste 419254721Semasteint dld_add_flow(datalink_id_t, char *, flow_desc_t *, 420254721Semaste mac_resource_props_t *); 421254721Semasteint dld_remove_flow(char *); 422254721Semasteint dld_modify_flow(char *, mac_resource_props_t *); 423254721Semasteint dld_walk_flow(dld_ioc_walkflow_t *, intptr_t, cred_t *); 424254721Semaste 425254721Semaste#endif 426254721Semaste 427254721Semaste#ifdef __cplusplus 428254721Semaste} 429254721Semaste#endif 430254721Semaste 431254721Semaste#endif /* _SYS_DLD_H */ 432254721Semaste