mac_impl.h revision 0d2a8e5eea8ac6ea0f5c517f0c481329b57d5459
8326d453818c9fb78ac1670cf49d26fa4da15003venki/*
8326d453818c9fb78ac1670cf49d26fa4da15003venki * CDDL HEADER START
8326d453818c9fb78ac1670cf49d26fa4da15003venki *
8326d453818c9fb78ac1670cf49d26fa4da15003venki * The contents of this file are subject to the terms of the
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Common Development and Distribution License (the "License").
8326d453818c9fb78ac1670cf49d26fa4da15003venki * You may not use this file except in compliance with the License.
8326d453818c9fb78ac1670cf49d26fa4da15003venki *
8326d453818c9fb78ac1670cf49d26fa4da15003venki * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8326d453818c9fb78ac1670cf49d26fa4da15003venki * or http://www.opensolaris.org/os/licensing.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * See the License for the specific language governing permissions
8326d453818c9fb78ac1670cf49d26fa4da15003venki * and limitations under the License.
8326d453818c9fb78ac1670cf49d26fa4da15003venki *
8326d453818c9fb78ac1670cf49d26fa4da15003venki * When distributing Covered Code, include this CDDL HEADER in each
8326d453818c9fb78ac1670cf49d26fa4da15003venki * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * If applicable, add the following below this CDDL HEADER, with the
8326d453818c9fb78ac1670cf49d26fa4da15003venki * fields enclosed by brackets "[]" replaced with your own identifying
8326d453818c9fb78ac1670cf49d26fa4da15003venki * information: Portions Copyright [yyyy] [name of copyright owner]
8326d453818c9fb78ac1670cf49d26fa4da15003venki *
8326d453818c9fb78ac1670cf49d26fa4da15003venki * CDDL HEADER END
8326d453818c9fb78ac1670cf49d26fa4da15003venki */
8326d453818c9fb78ac1670cf49d26fa4da15003venki/*
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Use is subject to license terms.
8326d453818c9fb78ac1670cf49d26fa4da15003venki */
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venki#ifndef _SYS_MAC_IMPL_H
8326d453818c9fb78ac1670cf49d26fa4da15003venki#define _SYS_MAC_IMPL_H
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venki#pragma ident "%Z%%M% %I% %E% SMI"
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venki#include <sys/mac.h>
8326d453818c9fb78ac1670cf49d26fa4da15003venki#include <net/if.h>
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venki#ifdef __cplusplus
8326d453818c9fb78ac1670cf49d26fa4da15003venkiextern "C" {
8326d453818c9fb78ac1670cf49d26fa4da15003venki#endif
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venki/*
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Statistics maintained internally by the mac module.
8326d453818c9fb78ac1670cf49d26fa4da15003venki */
8326d453818c9fb78ac1670cf49d26fa4da15003venkienum mac_mod_stat {
8326d453818c9fb78ac1670cf49d26fa4da15003venki MAC_STAT_LINK_STATE,
8326d453818c9fb78ac1670cf49d26fa4da15003venki MAC_STAT_LINK_UP,
8326d453818c9fb78ac1670cf49d26fa4da15003venki MAC_STAT_PROMISC
8326d453818c9fb78ac1670cf49d26fa4da15003venki};
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkitypedef struct mac_multicst_addr_s mac_multicst_addr_t;
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkistruct mac_multicst_addr_s {
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_multicst_addr_t *mma_nextp;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mma_ref;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint8_t mma_addr[MAXMACADDRLEN];
8326d453818c9fb78ac1670cf49d26fa4da15003venki};
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkitypedef struct mac_notify_fn_s mac_notify_fn_t;
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkistruct mac_notify_fn_s {
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_notify_fn_t *mnf_nextp;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_notify_t mnf_fn;
8326d453818c9fb78ac1670cf49d26fa4da15003venki void *mnf_arg;
8326d453818c9fb78ac1670cf49d26fa4da15003venki};
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkitypedef struct mac_rx_fn_s mac_rx_fn_t;
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkistruct mac_rx_fn_s {
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_rx_fn_t *mrf_nextp;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_rx_t mrf_fn;
8326d453818c9fb78ac1670cf49d26fa4da15003venki void *mrf_arg;
8326d453818c9fb78ac1670cf49d26fa4da15003venki};
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkitypedef struct mac_txloop_fn_s mac_txloop_fn_t;
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkistruct mac_txloop_fn_s {
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_txloop_fn_t *mtf_nextp;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_txloop_t mtf_fn;
8326d453818c9fb78ac1670cf49d26fa4da15003venki void *mtf_arg;
8326d453818c9fb78ac1670cf49d26fa4da15003venki};
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venkitypedef struct mactype_s {
8326d453818c9fb78ac1670cf49d26fa4da15003venki const char *mt_ident;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint32_t mt_ref;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mt_type;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mt_nativetype;
8326d453818c9fb78ac1670cf49d26fa4da15003venki size_t mt_addr_length;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint8_t *mt_brdcst_addr;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mactype_ops_t mt_ops;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_stat_info_t *mt_stats; /* array of mac_stat_info_t elements */
8326d453818c9fb78ac1670cf49d26fa4da15003venki size_t mt_statcount; /* number of elements in mt_stats */
8326d453818c9fb78ac1670cf49d26fa4da15003venki} mactype_t;
8326d453818c9fb78ac1670cf49d26fa4da15003venki
8326d453818c9fb78ac1670cf49d26fa4da15003venki/*
8326d453818c9fb78ac1670cf49d26fa4da15003venki * Each registered MAC is associated with a mac_t structure.
8326d453818c9fb78ac1670cf49d26fa4da15003venki */
8326d453818c9fb78ac1670cf49d26fa4da15003venkitypedef struct mac_impl_s {
8326d453818c9fb78ac1670cf49d26fa4da15003venki char mi_name[LIFNAMSIZ];
8326d453818c9fb78ac1670cf49d26fa4da15003venki const char *mi_drvname;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mi_instance;
8326d453818c9fb78ac1670cf49d26fa4da15003venki void *mi_driver; /* Driver private data */
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_info_t mi_info;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mactype_t *mi_type;
8326d453818c9fb78ac1670cf49d26fa4da15003venki void *mi_pdata;
8326d453818c9fb78ac1670cf49d26fa4da15003venki size_t mi_pdata_size;
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_callbacks_t *mi_callbacks;
8326d453818c9fb78ac1670cf49d26fa4da15003venki dev_info_t *mi_dip;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint32_t mi_ref;
8326d453818c9fb78ac1670cf49d26fa4da15003venki boolean_t mi_disabled;
8326d453818c9fb78ac1670cf49d26fa4da15003venki krwlock_t mi_state_lock;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mi_active;
8326d453818c9fb78ac1670cf49d26fa4da15003venki krwlock_t mi_data_lock;
8326d453818c9fb78ac1670cf49d26fa4da15003venki link_state_t mi_linkstate;
8326d453818c9fb78ac1670cf49d26fa4da15003venki link_state_t mi_lastlinkstate;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mi_promisc;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint_t mi_devpromisc;
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint8_t mi_addr[MAXMACADDRLEN];
8326d453818c9fb78ac1670cf49d26fa4da15003venki uint8_t mi_dstaddr[MAXMACADDRLEN];
8326d453818c9fb78ac1670cf49d26fa4da15003venki mac_multicst_addr_t *mi_mmap;
krwlock_t mi_notify_lock;
mac_notify_fn_t *mi_mnfp;
kmutex_t mi_notify_ref_lock;
uint32_t mi_notify_ref;
kcondvar_t mi_notify_cv;
krwlock_t mi_rx_lock;
mac_rx_fn_t *mi_mrfp;
krwlock_t mi_txloop_lock;
mac_txloop_fn_t *mi_mtfp;
krwlock_t mi_resource_lock;
mac_resource_add_t mi_resource_add;
void *mi_resource_add_arg;
kstat_t *mi_ksp;
uint_t mi_kstat_count;
kmutex_t mi_activelink_lock;
boolean_t mi_activelink;
mac_txinfo_t mi_txinfo;
mac_txinfo_t mi_txloopinfo;
} mac_impl_t;
#define mi_getstat mi_callbacks->mc_getstat
#define mi_start mi_callbacks->mc_start
#define mi_stop mi_callbacks->mc_stop
#define mi_setpromisc mi_callbacks->mc_setpromisc
#define mi_multicst mi_callbacks->mc_multicst
#define mi_unicst mi_callbacks->mc_unicst
#define mi_resources mi_callbacks->mc_resources
#define mi_tx mi_callbacks->mc_tx
#define mi_ioctl mi_callbacks->mc_ioctl
#define mi_getcapab mi_callbacks->mc_getcapab
typedef struct mac_notify_task_arg {
mac_impl_t *mnt_mip;
mac_notify_type_t mnt_type;
} mac_notify_task_arg_t;
extern void mac_init(void);
extern int mac_fini(void);
extern void mac_stat_create(mac_impl_t *);
extern void mac_stat_destroy(mac_impl_t *);
extern uint64_t mac_stat_default(mac_impl_t *, uint_t);
#ifdef __cplusplus
}
#endif
#endif /* _SYS_MAC_IMPL_H */