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 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_DLD_H 27 #define _SYS_DLD_H 28 29 /* 30 * Data-Link Driver ioctl interfaces. 31 * 32 * Note that the datastructures defined here define an ioctl interface 33 * that is shared betwen user and kernel space. The dld driver thus 34 * assumes that the structures have identical layout and size when 35 * compiled in either IPL32 or LP64. 36 */ 37 38 #include <sys/types.h> 39 #include <sys/stream.h> 40 #include <sys/mac_flow.h> 41 #include <sys/conf.h> 42 #include <sys/sad.h> 43 #include <sys/mac.h> 44 45 #ifdef __cplusplus 46 extern "C" { 47 #endif 48 49 /* 50 * Data-Link Driver Information (text emitted by modinfo(1m)) 51 */ 52 #define DLD_INFO "Data-Link Driver" 53 54 /* 55 * Options: To enable an option set the property name to a non-zero value 56 * in kernel/drv/dld.conf. 57 */ 58 59 /* 60 * Prevent use of the IP fast-path (direct M_DATA transmit). 61 */ 62 #define DLD_PROP_NO_FASTPATH "no-fastpath" 63 64 /* 65 * Prevent advertising of the DL_CAPAB_POLL capability. 66 */ 67 #define DLD_PROP_NO_POLL "no-poll" 68 69 /* 70 * Prevent advertising of the DL_CAPAB_ZEROCOPY capability. 71 */ 72 #define DLD_PROP_NO_ZEROCOPY "no-zerocopy" 73 74 /* 75 * Prevent advertising of the DL_CAPAB_SOFTRING capability. 76 */ 77 #define DLD_PROP_NO_SOFTRING "no-softring" 78 79 /* 80 * The name of the driver. 81 */ 82 #define DLD_DRIVER_NAME "dld" 83 84 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 85 #pragma pack(4) 86 #endif 87 88 /* 89 * IOCTL codes and data structures. 90 */ 91 #define DLDIOC_ATTR DLDIOC(0x03) 92 93 typedef struct dld_ioc_attr { 94 datalink_id_t dia_linkid; 95 uint_t dia_max_sdu; 96 } dld_ioc_attr_t; 97 98 #define DLDIOC_VLAN_ATTR DLDIOC(0x04) 99 typedef struct dld_ioc_vlan_attr { 100 datalink_id_t div_vlanid; 101 uint16_t div_vid; 102 datalink_id_t div_linkid; 103 boolean_t div_force; 104 } dld_ioc_vlan_attr_t; 105 106 #define DLDIOC_PHYS_ATTR DLDIOC(0x05) 107 #define DLPI_LINKNAME_MAX 32 108 109 typedef struct dld_ioc_phys_attr { 110 datalink_id_t dip_linkid; 111 /* 112 * Whether this physical link supports vanity naming. Note that 113 * physical links whose media type is not supported by GLDv3 114 * can not support vanity naming. 115 */ 116 boolean_t dip_novanity; 117 char dip_dev[MAXLINKNAMELEN]; 118 } dld_ioc_phys_attr_t; 119 120 /* 121 * Secure objects ioctls 122 */ 123 typedef enum { 124 DLD_SECOBJ_CLASS_WEP = 1, 125 DLD_SECOBJ_CLASS_WPA 126 } dld_secobj_class_t; 127 128 #define DLD_SECOBJ_OPT_CREATE 0x00000001 129 #define DLD_SECOBJ_NAME_MAX 32 130 #define DLD_SECOBJ_VAL_MAX 256 131 typedef struct dld_secobj { 132 char so_name[DLD_SECOBJ_NAME_MAX]; 133 dld_secobj_class_t so_class; 134 uint8_t so_val[DLD_SECOBJ_VAL_MAX]; 135 uint_t so_len; 136 } dld_secobj_t; 137 138 #define DLDIOC_SECOBJ_SET DLDIOC(0x06) 139 typedef struct dld_ioc_secobj_set { 140 dld_secobj_t ss_obj; 141 uint_t ss_flags; 142 } dld_ioc_secobj_set_t; 143 144 #define DLDIOC_SECOBJ_GET DLDIOC(0x07) 145 typedef struct dld_ioc_secobj_get { 146 dld_secobj_t sg_obj; 147 uint_t sg_count; 148 uint_t sg_size; 149 } dld_ioc_secobj_get_t; 150 151 /* 152 * The following two slots were used outside of ON, so don't reuse them. 153 * 154 * #define DLDIOCHOLDVLAN DLDIOC(0x08) 155 * #define DLDIOCRELEVLAN DLDIOC(0x09) 156 */ 157 158 #define DLDIOC_SECOBJ_UNSET DLDIOC(0x0a) 159 typedef struct dld_ioc_secobj_unset { 160 char su_name[DLD_SECOBJ_NAME_MAX]; 161 } dld_ioc_secobj_unset_t; 162 163 #define DLDIOC_CREATE_VLAN DLDIOC(0x0b) 164 typedef struct dld_ioc_create_vlan { 165 datalink_id_t dic_vlanid; 166 datalink_id_t dic_linkid; 167 uint16_t dic_vid; 168 boolean_t dic_force; 169 } dld_ioc_create_vlan_t; 170 171 #define DLDIOC_DELETE_VLAN DLDIOC(0x0c) 172 typedef struct dld_ioc_delete_vlan { 173 datalink_id_t did_linkid; 174 } dld_ioc_delete_vlan_t; 175 176 /* 177 * The following constants have been removed, and the slots are open: 178 * 179 * #define DLDIOC_SETAUTOPUSH DLDIOC(0x0d) 180 * #define DLDIOC_GETAUTOPUSH DLDIOC(0x0e) 181 * #define DLDIOC_CLRAUTOPUSH DLDIOC(0x0f) 182 */ 183 184 #define DLDIOC_DOORSERVER DLDIOC(0x10) 185 typedef struct dld_ioc_door { 186 boolean_t did_start_door; 187 } dld_ioc_door_t; 188 189 #define DLDIOC_RENAME DLDIOC(0x11) 190 typedef struct dld_ioc_rename { 191 datalink_id_t dir_linkid1; 192 datalink_id_t dir_linkid2; 193 char dir_link[MAXLINKNAMELEN]; 194 } dld_ioc_rename_t; 195 196 /* 197 * The following constants have been removed, and the slots are open: 198 * 199 * #define DLDIOC_SETZID DLDIOC(0x12) 200 * #define DLDIOC_GETZID DLDIOC(0x13) 201 */ 202 203 typedef struct dld_ioc_zid { 204 zoneid_t diz_zid; 205 datalink_id_t diz_linkid; 206 } dld_ioc_zid_t; 207 208 /* 209 * data-link autopush configuration. 210 */ 211 struct dlautopush { 212 uint_t dap_anchor; 213 uint_t dap_npush; 214 char dap_aplist[MAXAPUSH][FMNAMESZ+1]; 215 }; 216 217 #define DLDIOC_MACADDRGET DLDIOC(0x15) 218 typedef struct dld_ioc_macaddrget { 219 datalink_id_t dig_linkid; 220 uint_t dig_count; 221 uint_t dig_size; 222 } dld_ioc_macaddrget_t; 223 224 /* possible flags for dmi_flags below */ 225 #define DLDIOCMACADDR_USED 0x1 /* address slot used */ 226 227 typedef struct dld_macaddrinfo { 228 uint_t dmi_slot; 229 uint_t dmi_flags; 230 uint_t dmi_addrlen; 231 uchar_t dmi_addr[MAXMACADDRLEN]; 232 char dmi_client_name[MAXNAMELEN]; 233 datalink_id_t dma_client_linkid; 234 } dld_macaddrinfo_t; 235 236 /* 237 * IOCTL codes and data structures for flowadm. 238 */ 239 #define DLDIOC_ADDFLOW DLDIOC(0x16) 240 typedef struct dld_ioc_addflow { 241 datalink_id_t af_linkid; 242 flow_desc_t af_flow_desc; 243 mac_resource_props_t af_resource_props; 244 char af_name[MAXFLOWNAMELEN]; 245 } dld_ioc_addflow_t; 246 247 #define DLDIOC_REMOVEFLOW DLDIOC(0x17) 248 typedef struct dld_ioc_removeflow { 249 char rf_name[MAXFLOWNAMELEN]; 250 } dld_ioc_removeflow_t; 251 252 #define DLDIOC_MODIFYFLOW DLDIOC(0x18) 253 typedef struct dld_ioc_modifyflow { 254 char mf_name[MAXFLOWNAMELEN]; 255 mac_resource_props_t mf_resource_props; 256 } dld_ioc_modifyflow_t; 257 258 #define DLDIOC_WALKFLOW DLDIOC(0x19) 259 typedef struct dld_ioc_walkflow { 260 datalink_id_t wf_linkid; 261 char wf_name[MAXFLOWNAMELEN]; 262 uint32_t wf_nflows; 263 uint_t wf_len; 264 } dld_ioc_walkflow_t; 265 266 typedef struct dld_flowinfo { 267 datalink_id_t fi_linkid; 268 flow_desc_t fi_flow_desc; 269 mac_resource_props_t fi_resource_props; 270 char fi_flowname[MAXFLOWNAMELEN]; 271 uint32_t fi_pad; 272 } dld_flowinfo_t; 273 274 #define DLDIOC_USAGELOG DLDIOC(0x1a) 275 typedef struct dld_ioc_usagelog { 276 mac_logtype_t ul_type; 277 boolean_t ul_onoff; 278 uint_t ul_interval; 279 } dld_ioc_usagelog_t; 280 281 #define DLDIOC_SETMACPROP DLDIOC(0x1b) 282 #define DLDIOC_GETMACPROP DLDIOC(0x1c) 283 284 /* pr_flags can be set to a combination of the following flags */ 285 #define DLD_PROP_DEFAULT 0x0001 286 #define DLD_PROP_POSSIBLE 0x0002 287 288 typedef struct dld_ioc_macprop_s { 289 uint_t pr_flags; 290 datalink_id_t pr_linkid; 291 mac_prop_id_t pr_num; 292 uint_t pr_perm_flags; 293 char pr_name[MAXLINKPROPNAME]; 294 uint_t pr_valsize; /* sizeof pr_val */ 295 char pr_val[1]; 296 } dld_ioc_macprop_t; 297 298 #define DLDIOC_GETHWGRP DLDIOC(0x1d) 299 300 typedef struct dld_ioc_hwgrpget { 301 datalink_id_t dih_linkid; 302 uint_t dih_n_groups; /* number of groups included in ioc */ 303 uint_t dih_size; 304 } dld_ioc_hwgrpget_t; 305 306 #define MAXCLIENTNAMELEN 1024 307 typedef struct dld_hwgrpinfo { 308 char dhi_link_name[MAXLINKNAMELEN]; 309 uint_t dhi_grp_num; 310 uint_t dhi_grp_type; 311 uint_t dhi_n_rings; 312 uint_t dhi_n_clnts; 313 uint_t dhi_rings[MAX_RINGS_PER_GROUP]; 314 char dhi_clnts[MAXCLIENTNAMELEN]; 315 } dld_hwgrpinfo_t; 316 317 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 318 #pragma pack() 319 #endif 320 321 #ifdef _KERNEL 322 323 #define DLD_CAPAB_DIRECT 0x00000001 324 #define DLD_CAPAB_POLL 0x00000002 325 #define DLD_CAPAB_PERIM 0x00000003 326 #define DLD_CAPAB_LSO 0x00000004 327 328 #define DLD_ENABLE 0x00000001 329 #define DLD_DISABLE 0x00000002 330 #define DLD_QUERY 0x00000003 331 332 /* 333 * GLDv3 entry point for negotiating capabilities. 334 * This is exposed to IP after negotiation of DL_CAPAB_DLD. 335 * 336 * This function takes the following arguments: 337 * handle: used for identifying the interface to operate on (provided by dld). 338 * type: capability type. 339 * arg: points to a capability-specific structure. 340 * flags: used for indicating whether to enable or disable a capability. 341 * 342 * With this function, capability negotiation is reduced from a multi-step 343 * process to just one single function call. 344 * e.g. the following code would pass 'x' from IP to dld and obtain 345 * arg.output_arg from dld: 346 * 347 * arg.input_arg = x; 348 * rc = (*dld_capab)(handle, DLD_CAPAB_XXX, &arg, DLD_ENABLE); 349 * ill->info1 = arg.output_arg; 350 */ 351 typedef int (*dld_capab_func_t)(void *, uint_t, void *, uint_t); 352 353 /* 354 * Direct Tx/Rx capability. 355 */ 356 typedef struct dld_capab_direct_s { 357 /* 358 * Rx entry point and handle, owned by IP. 359 */ 360 uintptr_t di_rx_cf; 361 void *di_rx_ch; 362 363 /* 364 * Tx entry points and handle, owned by DLD. 365 */ 366 /* Entry point for transmitting packets */ 367 uintptr_t di_tx_df; 368 void *di_tx_dh; 369 370 /* flow control notification callback */ 371 uintptr_t di_tx_cb_df; /* callback registration/de-registration */ 372 void *di_tx_cb_dh; 373 374 /* flow control "can I put on a ring" callback */ 375 uintptr_t di_tx_fctl_df; /* canput-like callback */ 376 void *di_tx_fctl_dh; 377 } dld_capab_direct_t; 378 379 /* 380 * Polling/softring capability. 381 */ 382 #define POLL_SOFTRING 0x00000001 383 typedef struct dld_capab_poll_s { 384 uintptr_t poll_ring_add_cf; 385 uintptr_t poll_ring_remove_cf; 386 uintptr_t poll_ring_quiesce_cf; 387 uintptr_t poll_ring_restart_cf; 388 uintptr_t poll_ring_bind_cf; 389 void *poll_ring_ch; 390 uintptr_t poll_mac_accept_df; 391 void *poll_mac_dh; 392 } dld_capab_poll_t; 393 394 /* 395 * LSO capability 396 */ 397 /* 398 * Currently supported flags for LSO. 399 */ 400 #define DLD_LSO_BASIC_TCP_IPV4 0x01 /* TCP LSO over IPv4 capability */ 401 #define DLD_LSO_BASIC_TCP_IPV6 0x02 /* TCP LSO over IPv6 capability */ 402 403 typedef struct dld_capab_lso_s { 404 uint_t lso_flags; /* capability flags */ 405 uint_t lso_max; /* maximum payload */ 406 } dld_capab_lso_t; 407 408 int dld_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **); 409 int dld_devt_to_instance(dev_t); 410 int dld_open(queue_t *, dev_t *, int, int, cred_t *); 411 int dld_close(queue_t *); 412 void dld_wput(queue_t *, mblk_t *); 413 void dld_wsrv(queue_t *); 414 int dld_str_open(queue_t *, dev_t *, void *); 415 int dld_str_close(queue_t *); 416 void *dld_str_private(queue_t *); 417 void dld_init_ops(struct dev_ops *, const char *); 418 void dld_fini_ops(struct dev_ops *); 419 int dld_autopush(dev_t *, struct dlautopush *); 420 421 int dld_add_flow(datalink_id_t, char *, flow_desc_t *, 422 mac_resource_props_t *); 423 int dld_remove_flow(char *); 424 int dld_modify_flow(char *, mac_resource_props_t *); 425 int dld_walk_flow(dld_ioc_walkflow_t *, intptr_t, cred_t *); 426 427 #endif 428 429 #ifdef __cplusplus 430 } 431 #endif 432 433 #endif /* _SYS_DLD_H */ 434