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 /*
  23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 #ifndef _SYS_MAC_H
  27 #define _SYS_MAC_H
  28 
  29 #include <sys/types.h>
  30 #ifdef  _KERNEL
  31 #include <sys/sunddi.h>
  32 #endif
  33 
  34 /*
  35  * MAC Services Module
  36  */
  37 
  38 #ifdef  __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 /*
  43  * MAC Information (text emitted by modinfo(1m))
  44  */
  45 #define MAC_INFO        "MAC Services"
  46 
  47 /*
  48  * MAC-Type version identifier.  This is used by mactype_alloc() and
  49  * mactype_register() to verify that incompatible MAC-Type plugins don't
  50  * register.
  51  */
  52 #define MACTYPE_VERSION 0x1
  53 
  54 /*
  55  * Opaque handle types
  56  */
  57 typedef struct __mac_handle             *mac_handle_t;
  58 typedef struct __mac_resource_handle    *mac_resource_handle_t;
  59 typedef struct __mac_notify_handle      *mac_notify_handle_t;
  60 typedef struct __mac_tx_notify_handle   *mac_tx_notify_handle_t;
  61 typedef struct __mac_intr_handle        *mac_intr_handle_t;
  62 typedef struct __mac_ring_handle        *mac_ring_handle_t;
  63 typedef struct __mac_group_handle       *mac_group_handle_t;
  64 
  65 #define DATALINK_INVALID_LINKID 0
  66 #define DATALINK_ALL_LINKID     0
  67 #define DATALINK_MAX_LINKID     0xffffffff
  68 
  69 typedef enum {
  70         LINK_STATE_UNKNOWN = -1,
  71         LINK_STATE_DOWN,
  72         LINK_STATE_UP
  73 } link_state_t;
  74 
  75 typedef enum {
  76         LINK_DUPLEX_UNKNOWN = 0,
  77         LINK_DUPLEX_HALF,
  78         LINK_DUPLEX_FULL
  79 } link_duplex_t;
  80 
  81 typedef enum {
  82         LINK_FLOWCTRL_NONE = 0,
  83         LINK_FLOWCTRL_RX,
  84         LINK_FLOWCTRL_TX,
  85         LINK_FLOWCTRL_BI
  86 } link_flowctrl_t;
  87 
  88 typedef enum {
  89         LINK_TAGMODE_VLANONLY = 0,
  90         LINK_TAGMODE_NORMAL
  91 } link_tagmode_t;
  92 
  93 /*
  94  * Defines range of uint32_t values
  95  */
  96 typedef struct mac_propval_uint32_range_s {
  97         uint32_t mpur_min;
  98         uint32_t mpur_max;
  99 } mac_propval_uint32_range_t;
 100 
 101 /*
 102  * Data type of property values.
 103  */
 104 typedef enum {
 105         MAC_PROPVAL_UINT8,
 106         MAC_PROPVAL_UINT32,
 107         MAC_PROPVAL_STR
 108 } mac_propval_type_t;
 109 
 110 /*
 111  * Captures possible values for a given property. A property can have
 112  * range of values (int32, int64, uint32, uint64, et al) or collection/
 113  * enumeration of values (strings).
 114  * Can be used as a value-result parameter.
 115  */
 116 typedef struct mac_propval_range_s {
 117         uint_t mpr_count;                       /* count of ranges */
 118         mac_propval_type_t mpr_type;            /* type of value */
 119         union {
 120                 mac_propval_uint32_range_t mpr_uint32[1];
 121         } u;
 122 } mac_propval_range_t;
 123 
 124 #define mpr_range_uint32        u.mpr_uint32
 125 
 126 /*
 127  * Maximum MAC address length
 128  */
 129 #define MAXMACADDRLEN           20
 130 
 131 typedef enum {
 132         MAC_LOGTYPE_LINK = 1,
 133         MAC_LOGTYPE_FLOW
 134 } mac_logtype_t;
 135 
 136 typedef struct mac_addrprop_s {
 137         uint32_t        ma_len;
 138         uint8_t         ma_addr[MAXMACADDRLEN];
 139 } mac_addrprop_t;
 140 
 141 #define MAXLINKPROPNAME         256             /* max property name len */
 142 
 143 /*
 144  * Public properties.
 145  *
 146  * Note that there are 2 sets of parameters: the *_EN_* values are
 147  * those that the Administrator configures for autonegotiation. The
 148  * _ADV_* values are those that are currently exposed over the wire.
 149  */
 150 typedef enum {
 151         MAC_PROP_DUPLEX = 0x00000001,
 152         MAC_PROP_SPEED,
 153         MAC_PROP_STATUS,
 154         MAC_PROP_AUTONEG,
 155         MAC_PROP_EN_AUTONEG,
 156         MAC_PROP_MTU,
 157         MAC_PROP_ZONE,
 158         MAC_PROP_AUTOPUSH,
 159         MAC_PROP_FLOWCTRL,
 160         MAC_PROP_ADV_1000FDX_CAP,
 161         MAC_PROP_EN_1000FDX_CAP,
 162         MAC_PROP_ADV_1000HDX_CAP,
 163         MAC_PROP_EN_1000HDX_CAP,
 164         MAC_PROP_ADV_100FDX_CAP,
 165         MAC_PROP_EN_100FDX_CAP,
 166         MAC_PROP_ADV_100HDX_CAP,
 167         MAC_PROP_EN_100HDX_CAP,
 168         MAC_PROP_ADV_10FDX_CAP,
 169         MAC_PROP_EN_10FDX_CAP,
 170         MAC_PROP_ADV_10HDX_CAP,
 171         MAC_PROP_EN_10HDX_CAP,
 172         MAC_PROP_ADV_100T4_CAP,
 173         MAC_PROP_EN_100T4_CAP,
 174         MAC_PROP_IPTUN_HOPLIMIT,
 175         MAC_PROP_IPTUN_ENCAPLIMIT,
 176         MAC_PROP_WL_ESSID,
 177         MAC_PROP_WL_BSSID,
 178         MAC_PROP_WL_BSSTYPE,
 179         MAC_PROP_WL_LINKSTATUS,
 180         MAC_PROP_WL_DESIRED_RATES,
 181         MAC_PROP_WL_SUPPORTED_RATES,
 182         MAC_PROP_WL_AUTH_MODE,
 183         MAC_PROP_WL_ENCRYPTION,
 184         MAC_PROP_WL_RSSI,
 185         MAC_PROP_WL_PHY_CONFIG,
 186         MAC_PROP_WL_CAPABILITY,
 187         MAC_PROP_WL_WPA,
 188         MAC_PROP_WL_SCANRESULTS,
 189         MAC_PROP_WL_POWER_MODE,
 190         MAC_PROP_WL_RADIO,
 191         MAC_PROP_WL_ESS_LIST,
 192         MAC_PROP_WL_KEY_TAB,
 193         MAC_PROP_WL_CREATE_IBSS,
 194         MAC_PROP_WL_SETOPTIE,
 195         MAC_PROP_WL_DELKEY,
 196         MAC_PROP_WL_KEY,
 197         MAC_PROP_WL_MLME,
 198         MAC_PROP_TAGMODE,
 199         MAC_PROP_ADV_10GFDX_CAP,
 200         MAC_PROP_EN_10GFDX_CAP,
 201         MAC_PROP_PVID,
 202         MAC_PROP_LLIMIT,
 203         MAC_PROP_LDECAY,
 204         MAC_PROP_RESOURCE,
 205         MAC_PROP_RESOURCE_EFF,
 206         MAC_PROP_RXRINGSRANGE,
 207         MAC_PROP_TXRINGSRANGE,
 208         MAC_PROP_MAX_TX_RINGS_AVAIL,
 209         MAC_PROP_MAX_RX_RINGS_AVAIL,
 210         MAC_PROP_MAX_RXHWCLNT_AVAIL,
 211         MAC_PROP_MAX_TXHWCLNT_AVAIL,
 212         MAC_PROP_IB_LINKMODE,
 213         MAC_PROP_MACADDRESS,
 214         MAC_PROP_PRIVATE = -1
 215 } mac_prop_id_t;
 216 
 217 /*
 218  * Flags to figure out r/w status of legacy ndd props.
 219  */
 220 #define MAC_PROP_PERM_READ              0x0001
 221 #define MAC_PROP_PERM_WRITE             0x0010
 222 #define MAC_PROP_MAP_KSTAT              0x0100
 223 #define MAC_PROP_PERM_RW                (MAC_PROP_PERM_READ|MAC_PROP_PERM_WRITE)
 224 #define MAC_PROP_FLAGS_RK               (MAC_PROP_PERM_READ|MAC_PROP_MAP_KSTAT)
 225 
 226 #ifdef  _KERNEL
 227 
 228 /*
 229  * There are three ranges of statistics values.  0 to 1 - MAC_STAT_MIN are
 230  * interface statistics maintained by the mac module.  MAC_STAT_MIN to 1 -
 231  * MACTYPE_STAT_MIN are common MAC statistics defined by the mac module and
 232  * maintained by each driver.  MACTYPE_STAT_MIN and above are statistics
 233  * defined by MAC-Type plugins and maintained by each driver.
 234  */
 235 #define MAC_STAT_MIN            1000
 236 #define MACTYPE_STAT_MIN        2000
 237 
 238 #define IS_MAC_STAT(stat)       \
 239         (stat >= MAC_STAT_MIN && stat < MACTYPE_STAT_MIN)
 240 #define IS_MACTYPE_STAT(stat)   (stat >= MACTYPE_STAT_MIN)
 241 
 242 /*
 243  * Statistics maintained by the mac module, and possibly populated as link
 244  * statistics.
 245  */
 246 enum mac_mod_stat {
 247         MAC_STAT_LINK_STATE,
 248         MAC_STAT_LINK_UP,
 249         MAC_STAT_PROMISC,
 250         MAC_STAT_LOWLINK_STATE,
 251         MAC_STAT_HDROPS
 252 };
 253 
 254 /*
 255  * Do not reorder, and add only to the end of this list.
 256  */
 257 enum mac_driver_stat {
 258         /* MIB-II stats (RFC 1213 and RFC 1573) */
 259         MAC_STAT_IFSPEED = MAC_STAT_MIN,
 260         MAC_STAT_MULTIRCV,
 261         MAC_STAT_BRDCSTRCV,
 262         MAC_STAT_MULTIXMT,
 263         MAC_STAT_BRDCSTXMT,
 264         MAC_STAT_NORCVBUF,
 265         MAC_STAT_IERRORS,
 266         MAC_STAT_UNKNOWNS,
 267         MAC_STAT_NOXMTBUF,
 268         MAC_STAT_OERRORS,
 269         MAC_STAT_COLLISIONS,
 270         MAC_STAT_RBYTES,
 271         MAC_STAT_IPACKETS,
 272         MAC_STAT_OBYTES,
 273         MAC_STAT_OPACKETS,
 274         MAC_STAT_UNDERFLOWS,
 275         MAC_STAT_OVERFLOWS
 276 };
 277 
 278 #define MAC_NSTAT       (MAC_STAT_OVERFLOWS - MAC_STAT_IFSPEED + 1)
 279 
 280 #define MAC_STAT_ISACOUNTER(_stat) (            \
 281             (_stat) == MAC_STAT_MULTIRCV ||     \
 282             (_stat) == MAC_STAT_BRDCSTRCV ||    \
 283             (_stat) == MAC_STAT_MULTIXMT ||     \
 284             (_stat) == MAC_STAT_BRDCSTXMT ||    \
 285             (_stat) == MAC_STAT_NORCVBUF ||     \
 286             (_stat) == MAC_STAT_IERRORS ||      \
 287             (_stat) == MAC_STAT_UNKNOWNS ||     \
 288             (_stat) == MAC_STAT_NOXMTBUF ||     \
 289             (_stat) == MAC_STAT_OERRORS ||      \
 290             (_stat) == MAC_STAT_COLLISIONS ||   \
 291             (_stat) == MAC_STAT_RBYTES ||       \
 292             (_stat) == MAC_STAT_IPACKETS ||     \
 293             (_stat) == MAC_STAT_OBYTES ||       \
 294             (_stat) == MAC_STAT_OPACKETS ||     \
 295             (_stat) == MAC_STAT_UNDERFLOWS ||   \
 296             (_stat) == MAC_STAT_OVERFLOWS)
 297 
 298 /*
 299  * Immutable information. (This may not be modified after registration).
 300  */
 301 typedef struct mac_info_s {
 302         uint_t          mi_media;
 303         uint_t          mi_nativemedia;
 304         uint_t          mi_addr_length;
 305         uint8_t         *mi_unicst_addr;
 306         uint8_t         *mi_brdcst_addr;
 307 } mac_info_t;
 308 
 309 /*
 310  * When VNICs are created on top of the NIC, there are two levels
 311  * of MAC layer, a lower MAC, which is the MAC layer at the level of the
 312  * physical NIC, and an upper MAC, which is the MAC layer at the level
 313  * of the VNIC. Each VNIC maps to a MAC client at the lower MAC, and
 314  * the SRS and classification is done at the lower MAC level. The upper
 315  * MAC is therefore for the most part pass-through, and therefore
 316  * special processing needs to be done at the upper MAC layer when
 317  * dealing with a VNIC.
 318  *
 319  * This capability allows the MAC layer to detect when a VNIC is being
 320  * access, and implement the required shortcuts.
 321  */
 322 
 323 typedef void *(*mac_client_handle_fn_t)(void *);
 324 
 325 typedef struct mac_capab_vnic_s {
 326         void                    *mcv_arg;
 327         mac_client_handle_fn_t  mcv_mac_client_handle;
 328 } mac_capab_vnic_t;
 329 
 330 typedef void (*mac_rename_fn_t)(const char *, void *);
 331 typedef mblk_t *(*mac_tx_ring_fn_t)(void *, mblk_t *, uintptr_t,
 332     mac_ring_handle_t *);
 333 typedef struct mac_capab_aggr_s {
 334         mac_rename_fn_t mca_rename_fn;
 335         int (*mca_unicst)(void *, const uint8_t *);
 336         mac_tx_ring_fn_t mca_find_tx_ring_fn;
 337         void *mca_arg;
 338 } mac_capab_aggr_t;
 339 
 340 /* Bridge transmit and receive function signatures */
 341 typedef mblk_t *(*mac_bridge_tx_t)(mac_handle_t, mac_ring_handle_t, mblk_t *);
 342 typedef void (*mac_bridge_rx_t)(mac_handle_t, mac_resource_handle_t, mblk_t *);
 343 typedef void (*mac_bridge_ref_t)(mac_handle_t, boolean_t);
 344 typedef link_state_t (*mac_bridge_ls_t)(mac_handle_t, link_state_t);
 345 
 346 /* must change mac_notify_cb_list[] in mac_provider.c if this is changed */
 347 typedef enum {
 348         MAC_NOTE_LINK,
 349         MAC_NOTE_UNICST,
 350         MAC_NOTE_TX,
 351         MAC_NOTE_DEVPROMISC,
 352         MAC_NOTE_FASTPATH_FLUSH,
 353         MAC_NOTE_SDU_SIZE,
 354         MAC_NOTE_DEST,
 355         MAC_NOTE_MARGIN,
 356         MAC_NOTE_CAPAB_CHG,
 357         MAC_NOTE_LOWLINK,
 358         MAC_NOTE_ALLOWED_IPS,
 359         MAC_NNOTE       /* must be the last entry */
 360 } mac_notify_type_t;
 361 
 362 typedef void            (*mac_notify_t)(void *, mac_notify_type_t);
 363 typedef void            (*mac_rx_t)(void *, mac_resource_handle_t, mblk_t *,
 364                             boolean_t);
 365 typedef mblk_t          *(*mac_receive_t)(void *, int);
 366 
 367 /*
 368  * MAC resource types
 369  */
 370 typedef enum {
 371         MAC_RX_FIFO = 1
 372 } mac_resource_type_t;
 373 
 374 typedef int     (*mac_intr_enable_t)(mac_intr_handle_t);
 375 typedef int     (*mac_intr_disable_t)(mac_intr_handle_t);
 376 
 377 typedef struct mac_intr_s {
 378         mac_intr_handle_t       mi_handle;
 379         mac_intr_enable_t       mi_enable;
 380         mac_intr_disable_t      mi_disable;
 381         ddi_intr_handle_t       mi_ddi_handle;
 382         boolean_t               mi_ddi_shared;
 383 } mac_intr_t;
 384 
 385 typedef struct mac_rx_fifo_s {
 386         mac_resource_type_t     mrf_type;       /* MAC_RX_FIFO */
 387         mac_intr_t              mrf_intr;
 388         mac_receive_t           mrf_receive;
 389         void                    *mrf_rx_arg;
 390         uint32_t                mrf_flow_priority;
 391         /*
 392          * The CPU this flow is to be processed on. With intrd and future
 393          * things, we should know which CPU the flow needs to be processed
 394          * and get a squeue assigned on that CPU.
 395          */
 396         uint_t                  mrf_cpu_id;
 397 } mac_rx_fifo_t;
 398 
 399 #define mrf_intr_handle         mrf_intr.mi_handle
 400 #define mrf_intr_enable         mrf_intr.mi_enable
 401 #define mrf_intr_disable        mrf_intr.mi_disable
 402 
 403 typedef union mac_resource_u {
 404         mac_resource_type_t     mr_type;
 405         mac_rx_fifo_t           mr_fifo;
 406 } mac_resource_t;
 407 
 408 typedef enum {
 409         MAC_ADDRTYPE_UNICAST,
 410         MAC_ADDRTYPE_MULTICAST,
 411         MAC_ADDRTYPE_BROADCAST
 412 } mac_addrtype_t;
 413 
 414 typedef struct mac_header_info_s {
 415         size_t          mhi_hdrsize;
 416         size_t          mhi_pktsize;
 417         const uint8_t   *mhi_daddr;
 418         const uint8_t   *mhi_saddr;
 419         uint32_t        mhi_origsap;
 420         uint32_t        mhi_bindsap;
 421         mac_addrtype_t  mhi_dsttype;
 422         uint16_t        mhi_tci;
 423         boolean_t       mhi_istagged;
 424         boolean_t       mhi_ispvid;
 425 } mac_header_info_t;
 426 
 427 /*
 428  * Function pointer to match dls client signature. Should be same as
 429  * dls_rx_t to allow a soft ring to bypass DLS layer and call a DLS
 430  * client directly.
 431  */
 432 typedef void            (*mac_direct_rx_t)(void *, mac_resource_handle_t,
 433                                 mblk_t *, mac_header_info_t *);
 434 
 435 typedef mac_resource_handle_t   (*mac_resource_add_t)(void *, mac_resource_t *);
 436 typedef int                     (*mac_resource_bind_t)(void *,
 437     mac_resource_handle_t, processorid_t);
 438 typedef void                    (*mac_resource_remove_t)(void *, void *);
 439 typedef void                    (*mac_resource_quiesce_t)(void *, void *);
 440 typedef void                    (*mac_resource_restart_t)(void *, void *);
 441 typedef int                     (*mac_resource_modify_t)(void *, void *,
 442                                     mac_resource_t *);
 443 typedef void                    (*mac_change_upcall_t)(void *, mac_direct_rx_t,
 444     void *);
 445 
 446 /*
 447  * MAC-Type plugin interfaces
 448  */
 449 
 450 typedef int             (*mtops_addr_verify_t)(const void *, void *);
 451 typedef boolean_t       (*mtops_sap_verify_t)(uint32_t, uint32_t *, void *);
 452 typedef mblk_t          *(*mtops_header_t)(const void *, const void *,
 453     uint32_t, void *, mblk_t *, size_t);
 454 typedef int             (*mtops_header_info_t)(mblk_t *, void *,
 455     mac_header_info_t *);
 456 typedef boolean_t       (*mtops_pdata_verify_t)(void *, size_t);
 457 typedef mblk_t          *(*mtops_header_modify_t)(mblk_t *, void *);
 458 typedef void            (*mtops_link_details_t)(char *, size_t, mac_handle_t,
 459     void *);
 460 
 461 typedef struct mactype_ops_s {
 462         uint_t                  mtops_ops;
 463         /*
 464          * mtops_unicst_verify() returns 0 if the given address is a valid
 465          * unicast address, or a non-zero errno otherwise.
 466          */
 467         mtops_addr_verify_t     mtops_unicst_verify;
 468         /*
 469          * mtops_multicst_verify() returns 0 if the given address is a
 470          * valid multicast address, or a non-zero errno otherwise.  If the
 471          * media doesn't support multicast, ENOTSUP should be returned (for
 472          * example).
 473          */
 474         mtops_addr_verify_t     mtops_multicst_verify;
 475         /*
 476          * mtops_sap_verify() returns B_TRUE if the given SAP is a valid
 477          * SAP value, or B_FALSE otherwise.
 478          */
 479         mtops_sap_verify_t      mtops_sap_verify;
 480         /*
 481          * mtops_header() is used to allocate and construct a MAC header.
 482          */
 483         mtops_header_t          mtops_header;
 484         /*
 485          * mtops_header_info() is used to gather information on a given MAC
 486          * header.
 487          */
 488         mtops_header_info_t     mtops_header_info;
 489         /*
 490          * mtops_pdata_verify() is used to verify the validity of MAC
 491          * plugin data.  It is called by mac_register() if the driver has
 492          * supplied MAC plugin data, and also by mac_pdata_update() when
 493          * drivers update the data.
 494          */
 495         mtops_pdata_verify_t    mtops_pdata_verify;
 496         /*
 497          * mtops_header_cook() is an optional callback that converts (or
 498          * "cooks") the given raw header (as sent by a raw DLPI consumer)
 499          * into one that is appropriate to send down to the MAC driver.
 500          * Following the example above, an Ethernet header sent down by a
 501          * DLPI consumer would be converted to whatever header the MAC
 502          * driver expects.
 503          */
 504         mtops_header_modify_t   mtops_header_cook;
 505         /*
 506          * mtops_header_uncook() is an optional callback that does the
 507          * opposite of mtops_header_cook().  It "uncooks" a given MAC
 508          * header (as received from the driver) for consumption by raw DLPI
 509          * consumers.  For example, for a non-Ethernet plugin that wants
 510          * raw DLPI consumers to be fooled into thinking that the device
 511          * provides Ethernet access, this callback would modify the given
 512          * mblk_t such that the MAC header is converted to an Ethernet
 513          * header.
 514          */
 515         mtops_header_modify_t   mtops_header_uncook;
 516         /*
 517          * mtops_link_details() is an optional callback that provides
 518          * extended information about the link state.  Its primary purpose
 519          * is to provide type-specific support for syslog contents on
 520          * link up events.  If no implementation is provided, then a default
 521          * implementation will be used.
 522          */
 523         mtops_link_details_t    mtops_link_details;
 524 } mactype_ops_t;
 525 
 526 /*
 527  * mtops_ops exists for the plugin to enumerate the optional callback
 528  * entrypoints it has defined.  This allows the mac module to define
 529  * additional plugin entrypoints in mactype_ops_t without breaking backward
 530  * compatibility with old plugins.
 531  */
 532 #define MTOPS_PDATA_VERIFY      0x001
 533 #define MTOPS_HEADER_COOK       0x002
 534 #define MTOPS_HEADER_UNCOOK     0x004
 535 #define MTOPS_LINK_DETAILS      0x008
 536 
 537 /*
 538  * Provide mapping for legacy ndd ioctls relevant to that mactype.
 539  * Note that the ndd ioctls are obsolete, and may be removed in a future
 540  * release of Solaris. The ndd ioctls are not typically used in legacy
 541  * ethernet drivers. New datalink drivers of all link-types should use
 542  * dladm(1m) interfaces for administering tunables and not have to provide
 543  * a mapping.
 544  */
 545 typedef struct mac_ndd_mapping_s {
 546         char            *mp_name;
 547         union {
 548                 mac_prop_id_t   u_id;
 549                 uint_t          u_kstat;
 550         } u_mp_id;
 551         long            mp_minval;
 552         long            mp_maxval;
 553         size_t          mp_valsize;
 554         int             mp_flags;
 555 } mac_ndd_mapping_t;
 556 
 557 #define mp_prop_id      u_mp_id.u_id
 558 #define mp_kstat        u_mp_id.u_kstat
 559 
 560 typedef struct mac_stat_info_s {
 561         uint_t          msi_stat;
 562         char            *msi_name;
 563         uint_t          msi_type;       /* as defined in kstat_named_init(9F) */
 564         uint64_t        msi_default;
 565 } mac_stat_info_t;
 566 
 567 typedef struct mactype_register_s {
 568         uint_t          mtr_version;    /* set by mactype_alloc() */
 569         const char      *mtr_ident;
 570         mactype_ops_t   *mtr_ops;
 571         uint_t          mtr_mactype;
 572         uint_t          mtr_nativetype;
 573         uint_t          mtr_addrlen;
 574         uint8_t         *mtr_brdcst_addr;
 575         mac_stat_info_t *mtr_stats;
 576         size_t          mtr_statcount;
 577         mac_ndd_mapping_t *mtr_mapping;
 578         size_t          mtr_mappingcount;
 579 } mactype_register_t;
 580 
 581 /*
 582  * Driver interface functions.
 583  */
 584 extern int                      mac_open_by_linkid(datalink_id_t,
 585                                     mac_handle_t *);
 586 extern int                      mac_open_by_linkname(const char *,
 587                                     mac_handle_t *);
 588 extern const char               *mac_name(mac_handle_t);
 589 extern minor_t                  mac_minor(mac_handle_t);
 590 extern minor_t                  mac_minor_hold(boolean_t);
 591 extern void                     mac_minor_rele(minor_t);
 592 extern void                     mac_sdu_get(mac_handle_t, uint_t *, uint_t *);
 593 extern void                     mac_sdu_get2(mac_handle_t, uint_t *, uint_t *,
 594                                     uint_t *);
 595 extern int                      mac_maxsdu_update(mac_handle_t, uint_t);
 596 extern int                      mac_maxsdu_update2(mac_handle_t, uint_t,
 597                                     uint_t);
 598 extern uint_t                   mac_addr_len(mac_handle_t);
 599 extern int                      mac_type(mac_handle_t);
 600 extern int                      mac_nativetype(mac_handle_t);
 601 
 602 extern void                     mac_unicst_update(mac_handle_t,
 603                                     const uint8_t *);
 604 extern void                     mac_capab_update(mac_handle_t);
 605 extern int                      mac_pdata_update(mac_handle_t, void *,
 606                                     size_t);
 607 extern boolean_t                mac_margin_update(mac_handle_t, uint32_t);
 608 extern void                     mac_margin_get(mac_handle_t, uint32_t *);
 609 extern int                      mac_margin_remove(mac_handle_t, uint32_t);
 610 extern int                      mac_margin_add(mac_handle_t, uint32_t *,
 611                                     boolean_t);
 612 extern int                      mac_fastpath_disable(mac_handle_t);
 613 extern void                     mac_fastpath_enable(mac_handle_t);
 614 extern void                     mac_no_active(mac_handle_t);
 615 
 616 extern mactype_register_t       *mactype_alloc(uint_t);
 617 extern void                     mactype_free(mactype_register_t *);
 618 extern int                      mactype_register(mactype_register_t *);
 619 extern int                      mactype_unregister(const char *);
 620 
 621 extern int                      mac_start_logusage(mac_logtype_t, uint_t);
 622 extern void                     mac_stop_logusage(mac_logtype_t);
 623 
 624 extern mac_handle_t             mac_get_lower_mac_handle(mac_handle_t);
 625 extern boolean_t                mac_is_vnic_primary(mac_handle_t);
 626 
 627 /*
 628  * Packet hashing for distribution to multiple ports and rings.
 629  */
 630 
 631 #define MAC_PKT_HASH_L2         0x01
 632 #define MAC_PKT_HASH_L3         0x02
 633 #define MAC_PKT_HASH_L4         0x04
 634 
 635 extern uint64_t                 mac_pkt_hash(uint_t, mblk_t *, uint8_t,
 636                                     boolean_t);
 637 
 638 /*
 639  * Bridging linkage
 640  */
 641 extern void                     mac_rx_common(mac_handle_t,
 642                                     mac_resource_handle_t, mblk_t *);
 643 extern int                      mac_bridge_set(mac_handle_t, mac_handle_t);
 644 extern void                     mac_bridge_clear(mac_handle_t, mac_handle_t);
 645 extern void                     mac_bridge_vectors(mac_bridge_tx_t,
 646                                     mac_bridge_rx_t, mac_bridge_ref_t,
 647                                     mac_bridge_ls_t);
 648 
 649 /* special case function for TRILL observability */
 650 extern void                     mac_trill_snoop(mac_handle_t, mblk_t *);
 651 
 652 #endif  /* _KERNEL */
 653 
 654 #ifdef  __cplusplus
 655 }
 656 #endif
 657 
 658 #endif /* _SYS_MAC_H */