#ifndef _SYS_MAC_IMPL_H
#define _SYS_MAC_IMPL_H
#include <sys/cpupart.h>
#include <sys/modhash.h>
#include <sys/mac_client.h>
#include <sys/mac_provider.h>
#include <sys/note.h>
#include <sys/avl.h>
#include <net/if.h>
#include <sys/mac_flow_impl.h>
#include <netinet/ip6.h>
#include <sys/pattr.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAC_PRIVATE_MINOR ((MAXMIN32 + 1) / 2)
#define MAC_MAX_MINOR 1000
typedef struct mac_margin_req_s mac_margin_req_t;
struct mac_margin_req_s {
mac_margin_req_t *mmr_nextp;
uint_t mmr_ref;
uint32_t mmr_margin;
};
typedef struct mac_mtu_req_s mac_mtu_req_t;
struct mac_mtu_req_s {
mac_mtu_req_t *mtr_nextp;
uint_t mtr_ref;
uint32_t mtr_mtu;
};
typedef struct mac_chain_s {
struct mac_chain_s *next;
void *item;
} mac_chain_t;
#define MCB_CONDEMNED 0x1
#define MCB_NOTIFY_CB_T 0x2
#define MCB_TX_NOTIFY_CB_T 0x4
extern boolean_t mac_tx_serialize;
typedef struct mac_cb_s {
struct mac_cb_s *mcb_nextp;
void *mcb_objp;
size_t mcb_objsize;
uint_t mcb_flags;
} mac_cb_t;
typedef struct mac_cb_info_s {
kmutex_t *mcbi_lockp;
kcondvar_t mcbi_cv;
uint_t mcbi_del_cnt;
uint_t mcbi_walker_cnt;
uint_t mcbi_barrier_cnt;
} mac_cb_info_t;
typedef struct mac_notify_cb_s {
mac_cb_t mncb_link;
mac_notify_t mncb_fn;
void *mncb_arg;
struct mac_impl_s *mncb_mip;
} mac_notify_cb_t;
typedef boolean_t (*mcb_func_t)(mac_cb_info_t *, mac_cb_t **, mac_cb_t *);
#define MAC_CALLBACK_WALKER_INC(mcbi) \
mac_callback_walker_enter(mcbi)
#define MAC_CALLBACK_WALKER_DCR(mcbi, headp) \
mac_callback_walker_exit(mcbi, headp, B_FALSE)
#define MAC_PROMISC_WALKER_INC(mip) \
mac_callback_walker_enter(&(mip)->mi_promisc_cb_info)
#define MAC_PROMISC_WALKER_DCR(mip) \
mac_callback_walker_exit(&(mip)->mi_promisc_cb_info, \
&(mip)->mi_promisc_list, B_TRUE)
typedef struct mactype_s {
const char *mt_ident;
uint32_t mt_ref;
uint_t mt_type;
uint_t mt_nativetype;
size_t mt_addr_length;
uint8_t *mt_brdcst_addr;
mactype_ops_t mt_ops;
mac_stat_info_t *mt_stats;
size_t mt_statcount;
mac_ndd_mapping_t *mt_mapping;
size_t mt_mappingcount;
} mactype_t;
typedef enum {
MAC_GROUP_STATE_UNINIT = 0,
MAC_GROUP_STATE_REGISTERED,
MAC_GROUP_STATE_RESERVED,
MAC_GROUP_STATE_SHARED
} mac_group_state_t;
typedef struct mac_ring_s mac_ring_t;
typedef struct mac_group_s mac_group_t;
typedef enum {
MR_FREE,
MR_NEWLY_ADDED,
MR_INUSE
} mac_ring_state_t;
#define MR_INCIPIENT 0x1
#define MR_CONDEMNED 0x2
#define MR_QUIESCE 0x4
typedef struct mac_impl_s mac_impl_t;
struct mac_ring_s {
int mr_index;
mac_ring_type_t mr_type;
mac_ring_t *mr_next;
mac_group_handle_t mr_gh;
mac_classify_type_t mr_classify_type;
struct mac_soft_ring_set_s *mr_srs;
mac_ring_handle_t mr_prh;
mac_rx_t mr_pt_fn;
void *mr_pt_arg1;
mac_resource_handle_t mr_pt_arg2;
uint_t mr_refcnt;
uint64_t mr_gen_num;
kstat_t *mr_ksp;
mac_impl_t *mr_mip;
kmutex_t mr_lock;
kcondvar_t mr_cv;
mac_ring_state_t mr_state;
uint_t mr_flag;
mac_ring_info_t mr_info;
};
#define mr_driver mr_info.mri_driver
#define mr_start mr_info.mri_start
#define mr_stop mr_info.mri_stop
#define mr_stat mr_info.mri_stat
#define MAC_RING_MARK(mr, flag) \
(mr)->mr_flag |= flag;
#define MAC_RING_UNMARK(mr, flag) \
(mr)->mr_flag &= ~flag;
#define MR_REFHOLD_LOCKED(mr) { \
ASSERT(MUTEX_HELD(&mr->mr_lock)); \
(mr)->mr_refcnt++; \
}
#define MR_REFRELE(mr) { \
mutex_enter(&(mr)->mr_lock); \
ASSERT((mr)->mr_refcnt != 0); \
(mr)->mr_refcnt--; \
if ((mr)->mr_refcnt == 0 && \
((mr)->mr_flag & (MR_CONDEMNED | MR_QUIESCE))) \
cv_signal(&(mr)->mr_cv); \
mutex_exit(&(mr)->mr_lock); \
}
typedef struct mac_grp_client {
struct mac_grp_client *mgc_next;
struct mac_client_impl_s *mgc_client;
} mac_grp_client_t;
#define MAC_GROUP_NO_CLIENT(g) ((g)->mrg_clients == NULL)
#define MAC_GROUP_ONLY_CLIENT(g) \
((((g)->mrg_clients != NULL) && \
((g)->mrg_clients->mgc_next == NULL)) ? \
(g)->mrg_clients->mgc_client : NULL)
#define MAC_GROUP_HW_VLAN(g) \
(((g) != NULL) && \
((g)->mrg_info.mgi_addvlan != NULL) && \
((g)->mrg_info.mgi_remvlan != NULL))
struct mac_group_s {
int mrg_index;
mac_ring_type_t mrg_type;
mac_group_state_t mrg_state;
mac_group_t *mrg_next;
mac_handle_t mrg_mh;
mac_ring_t *mrg_rings;
uint_t mrg_cur_count;
mac_grp_client_t *mrg_clients;
mac_group_info_t mrg_info;
};
#define mrg_driver mrg_info.mgi_driver
#define mrg_start mrg_info.mgi_start
#define mrg_stop mrg_info.mgi_stop
#define GROUP_INTR_HANDLE(g) (g)->mrg_info.mgi_intr.mi_handle
#define GROUP_INTR_ENABLE_FUNC(g) (g)->mrg_info.mgi_intr.mi_enable
#define GROUP_INTR_DISABLE_FUNC(g) (g)->mrg_info.mgi_intr.mi_disable
#define MCI_TX_QUIESCE 0x1
typedef struct mac_factory_addr_s {
boolean_t mfa_in_use;
uint8_t mfa_addr[MAXMACADDRLEN];
struct mac_client_impl_s *mfa_client;
} mac_factory_addr_t;
typedef struct mac_mcast_addrs_s {
struct mac_mcast_addrs_s *mma_next;
uint8_t mma_addr[MAXMACADDRLEN];
int mma_ref;
} mac_mcast_addrs_t;
typedef enum {
MAC_ADDRESS_TYPE_UNICAST_CLASSIFIED = 1,
MAC_ADDRESS_TYPE_UNICAST_PROMISC
} mac_address_type_t;
typedef struct mac_vlan_s {
struct mac_vlan_s *mv_next;
uint16_t mv_vid;
} mac_vlan_t;
typedef struct mac_address_s {
mac_address_type_t ma_type;
int ma_nusers;
struct mac_address_s *ma_next;
uint8_t ma_addr[MAXMACADDRLEN];
size_t ma_len;
mac_vlan_t *ma_vlans;
boolean_t ma_untagged;
mac_group_t *ma_group;
mac_impl_t *ma_mip;
} mac_address_t;
extern krwlock_t i_mac_impl_lock;
extern mod_hash_t *i_mac_impl_hash;
extern kmem_cache_t *i_mac_impl_cachep;
extern uint_t i_mac_impl_count;
struct mac_impl_s {
krwlock_t mi_rw_lock;
list_node_t mi_node;
char mi_name[LIFNAMSIZ];
uint32_t mi_state_flags;
void *mi_driver;
mac_info_t mi_info;
mactype_t *mi_type;
void *mi_pdata;
size_t mi_pdata_size;
mac_callbacks_t *mi_callbacks;
dev_info_t *mi_dip;
uint32_t mi_ref;
uint_t mi_active;
link_state_t mi_linkstate;
link_state_t mi_lowlinkstate;
link_state_t mi_lastlowlinkstate;
uint_t mi_devpromisc;
uint8_t mi_addr[MAXMACADDRLEN];
uint8_t mi_dstaddr[MAXMACADDRLEN];
boolean_t mi_dstaddr_set;
kmutex_t mi_perim_lock;
kthread_t *mi_perim_owner;
uint_t mi_perim_ocnt;
kcondvar_t mi_perim_cv;
kmutex_t mi_notify_lock;
mac_cb_info_t mi_notify_cb_info;
mac_cb_t *mi_notify_cb_list;
kthread_t *mi_notify_thread;
uint_t mi_notify_bits;
uint32_t mi_v12n_level;
mac_group_type_t mi_rx_group_type;
uint_t mi_rx_group_count;
mac_group_t *mi_rx_groups;
mac_group_t *mi_rx_donor_grp;
uint_t mi_rxrings_rsvd;
uint_t mi_rxrings_avail;
uint_t mi_rxhwclnt_avail;
uint_t mi_rxhwclnt_used;
mac_capab_rings_t mi_rx_rings_cap;
mac_group_type_t mi_tx_group_type;
uint_t mi_tx_group_count;
uint_t mi_tx_group_free;
mac_group_t *mi_tx_groups;
mac_capab_rings_t mi_tx_rings_cap;
uint_t mi_txrings_rsvd;
uint_t mi_txrings_avail;
uint_t mi_txhwclnt_avail;
uint_t mi_txhwclnt_used;
mac_ring_handle_t mi_default_tx_ring;
mac_capab_transceiver_t mi_transceiver;
mac_led_mode_t mi_led_modes;
mac_capab_led_t mi_led;
uint16_t mi_tx_cksum_flags;
mac_address_t *mi_addresses;
flow_tab_t *mi_flow_tab;
kstat_t *mi_ksp;
uint_t mi_kstat_count;
uint_t mi_nactiveclients;
struct mac_mcast_addrs_s *mi_mcast_addrs;
struct mac_bcast_grp_s *mi_bcast_grp;
uint_t mi_bcast_ngrps;
struct mac_client_impl_s *mi_clients_list;
uint_t mi_nclients;
struct mac_client_impl_s *mi_single_active_client;
uint32_t mi_margin;
uint_t mi_sdu_min;
uint_t mi_sdu_max;
uint_t mi_sdu_multicast;
mac_factory_addr_t *mi_factory_addr;
uint_t mi_factory_addr_num;
kmutex_t mi_promisc_lock;
mac_cb_t *mi_promisc_list;
mac_cb_info_t mi_promisc_cb_info;
kmutex_t mi_ring_lock;
mac_ring_t *mi_ring_freelist;
mac_resource_props_t mi_resource_props;
uint16_t mi_pvid;
minor_t mi_minor;
uint32_t mi_oref;
mac_capab_legacy_t mi_capab_legacy;
dev_t mi_phy_dev;
mac_margin_req_t *mi_mmrp;
mac_mtu_req_t *mi_mtrp;
char **mi_priv_prop;
uint_t mi_priv_prop_count;
mac_capab_share_t mi_share_capab;
mac_handle_t mi_bridge_link;
kmutex_t mi_bridge_lock;
uint32_t mi_llimit;
uint32_t mi_ldecay;
#ifdef DEBUG
#define MAC_PERIM_STACK_DEPTH 15
int mi_perim_stack_depth;
pc_t mi_perim_stack[MAC_PERIM_STACK_DEPTH];
#endif
};
#define MAC_DEFAULT_TX_GROUP(mip) \
(mip)->mi_tx_groups + (mip)->mi_tx_group_count
#define MAC_DEFAULT_RX_GROUP(mip) (mip)->mi_rx_groups
#define MAC_RX_RING_RESERVED(m, cnt) { \
ASSERT((m)->mi_rxrings_avail >= (cnt)); \
(m)->mi_rxrings_rsvd += (cnt); \
(m)->mi_rxrings_avail -= (cnt); \
}
#define MAC_RX_RING_RELEASED(m, cnt) { \
ASSERT((m)->mi_rxrings_rsvd >= (cnt)); \
(m)->mi_rxrings_rsvd -= (cnt); \
(m)->mi_rxrings_avail += (cnt); \
}
#define MAC_RX_GRP_RESERVED(m) { \
ASSERT((m)->mi_rxhwclnt_avail > 0); \
(m)->mi_rxhwclnt_avail--; \
(m)->mi_rxhwclnt_used++; \
}
#define MAC_RX_GRP_RELEASED(m) { \
ASSERT((m)->mi_rxhwclnt_used > 0); \
(m)->mi_rxhwclnt_avail++; \
(m)->mi_rxhwclnt_used--; \
}
#define MAC_TX_RING_RESERVED(m, cnt) { \
ASSERT((m)->mi_txrings_avail >= (cnt)); \
(m)->mi_txrings_rsvd += (cnt); \
(m)->mi_txrings_avail -= (cnt); \
}
#define MAC_TX_RING_RELEASED(m, cnt) { \
ASSERT((m)->mi_txrings_rsvd >= (cnt)); \
(m)->mi_txrings_rsvd -= (cnt); \
(m)->mi_txrings_avail += (cnt); \
}
#define MAC_TX_GRP_RESERVED(m) { \
ASSERT((m)->mi_txhwclnt_avail > 0); \
(m)->mi_txhwclnt_avail--; \
(m)->mi_txhwclnt_used++; \
}
#define MAC_TX_GRP_RELEASED(m) { \
ASSERT((m)->mi_txhwclnt_used > 0); \
(m)->mi_txhwclnt_avail++; \
(m)->mi_txhwclnt_used--; \
}
#define MIS_DISABLED 0x0001
#define MIS_IS_VNIC 0x0002
#define MIS_IS_AGGR 0x0004
#define MIS_NOTIFY_DONE 0x0008
#define MIS_EXCLUSIVE 0x0010
#define MIS_EXCLUSIVE_HELD 0x0020
#define MIS_LEGACY 0x0040
#define MIS_NO_ACTIVE 0x0080
#define MIS_POLL_DISABLE 0x0100
#define MIS_IS_OVERLAY 0x0200
#define mi_getstat mi_callbacks->mc_getstat
#define mi_start mi_callbacks->mc_start
#define mi_stop mi_callbacks->mc_stop
#define mi_open mi_callbacks->mc_open
#define mi_close mi_callbacks->mc_close
#define mi_setpromisc mi_callbacks->mc_setpromisc
#define mi_multicst mi_callbacks->mc_multicst
#define mi_unicst mi_callbacks->mc_unicst
#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_ring_t *mnt_ring;
} mac_notify_task_arg_t;
#define MAC_ENCODE_MPH(mph, mh, need_close) \
(mph) = (mac_perim_handle_t)((uintptr_t)(mh) | need_close)
#define MAC_DECODE_MPH(mph, mip, need_close) { \
mip = (mac_impl_t *)(((uintptr_t)mph) & ~0x1); \
(need_close) = ((uintptr_t)mph & 0x1); \
}
#define MAC_PROP_INFO_DEFAULT 0x0001
#define MAC_PROP_INFO_RANGE 0x0002
#define MAC_PROP_INFO_PERM 0x0004
typedef struct mac_prop_info_state_s {
uint8_t pr_flags;
uint8_t pr_perm;
uint8_t pr_errno;
void *pr_default;
size_t pr_default_size;
mac_propval_range_t *pr_range;
uint_t pr_range_cur_count;
} mac_prop_info_state_t;
#define MAC_PROTECT_ENABLED(mcip, type) \
(((mcip)->mci_flent-> \
fe_resource_props.mrp_mask & MRP_PROTECT) != 0 && \
((mcip)->mci_flent-> \
fe_resource_props.mrp_protect.mp_types & (type)) != 0)
typedef struct mac_client_impl_s mac_client_impl_t;
typedef enum mac_soft_ring_set_type mac_soft_ring_set_type_t;
extern void mac_init(void);
extern int mac_fini(void);
extern void mac_drop_pkt(mblk_t *, const char *, ...)
__KPRINTFLIKE(2);
extern void mac_drop_chain(mblk_t *, const char *, ...)
__KPRINTFLIKE(2);
extern void mac_ndd_ioctl(mac_impl_t *, queue_t *, mblk_t *);
extern boolean_t mac_ip_hdr_length_v6(ip6_t *, uint8_t *, uint16_t *,
uint8_t *, ip6_frag_t **);
extern mblk_t *mac_copymsgchain_cksum(mblk_t *);
extern void mac_rx_deliver(void *, mac_resource_handle_t, mblk_t *,
mac_header_info_t *);
extern void mac_tx_notify(mac_impl_t *);
extern mblk_t *mac_ring_tx(mac_handle_t, mac_ring_handle_t, mblk_t *);
extern mblk_t *mac_provider_tx(mac_impl_t *, mac_ring_handle_t, mblk_t *,
mac_client_impl_t *);
extern void mac_callback_add(mac_cb_info_t *, mac_cb_t **, mac_cb_t *);
extern boolean_t mac_callback_remove(mac_cb_info_t *, mac_cb_t **, mac_cb_t *);
extern void mac_callback_remove_wait(mac_cb_info_t *);
extern void mac_callback_barrier(mac_cb_info_t *);
extern void mac_callback_free(mac_cb_t *);
extern void mac_callback_walker_enter(mac_cb_info_t *);
extern void mac_callback_walker_exit(mac_cb_info_t *, mac_cb_t **, boolean_t);
extern void mac_bcast_init(void);
extern void mac_bcast_fini(void);
extern mac_impl_t *mac_bcast_grp_mip(void *);
extern int mac_bcast_add(mac_client_impl_t *, const uint8_t *, uint16_t,
mac_addrtype_t);
extern void mac_bcast_delete(mac_client_impl_t *, const uint8_t *, uint16_t);
extern void mac_bcast_send(void *, void *, mblk_t *, boolean_t);
extern void mac_bcast_grp_free(void *);
extern void mac_bcast_refresh(mac_impl_t *, mac_multicst_t, void *,
boolean_t);
extern void mac_client_bcast_refresh(mac_client_impl_t *, mac_multicst_t,
void *, boolean_t);
extern int mac_group_addmac(mac_group_t *, const uint8_t *);
extern int mac_group_remmac(mac_group_t *, const uint8_t *);
extern int mac_group_addvlan(mac_group_t *, uint16_t);
extern int mac_group_remvlan(mac_group_t *, uint16_t);
extern mblk_t *mac_hwring_tx(mac_ring_handle_t, mblk_t *);
extern mblk_t *mac_bridge_tx(mac_impl_t *, mac_ring_handle_t, mblk_t *);
extern mac_group_t *mac_reserve_rx_group(mac_client_impl_t *, uint8_t *,
boolean_t);
extern void mac_release_rx_group(mac_client_impl_t *, mac_group_t *);
extern int mac_rx_switch_group(mac_client_impl_t *, mac_group_t *,
mac_group_t *);
extern mac_ring_t *mac_reserve_tx_ring(mac_impl_t *, mac_ring_t *);
extern mac_group_t *mac_reserve_tx_group(mac_client_impl_t *, boolean_t);
extern void mac_release_tx_group(mac_client_impl_t *, mac_group_t *);
extern void mac_tx_switch_group(mac_client_impl_t *, mac_group_t *,
mac_group_t *);
extern void mac_rx_switch_grp_to_sw(mac_group_t *);
extern mac_address_t *mac_find_macaddr(mac_impl_t *, uint8_t *);
extern boolean_t mac_check_macaddr_shared(mac_address_t *);
extern int mac_update_macaddr(mac_address_t *, uint8_t *);
extern void mac_freshen_macaddr(mac_address_t *, uint8_t *);
extern void mac_init_macaddr(mac_impl_t *);
extern void mac_fini_macaddr(mac_impl_t *);
extern int mac_link_flow_init(mac_client_handle_t, flow_entry_t *);
extern void mac_link_flow_clean(mac_client_handle_t, flow_entry_t *);
extern void mac_fanout_recompute_client(mac_client_impl_t *, cpupart_t *);
extern void mac_fanout_recompute(mac_impl_t *);
extern int mac_datapath_setup(mac_client_impl_t *, flow_entry_t *,
const mac_soft_ring_set_type_t);
extern void mac_datapath_teardown(mac_client_impl_t *, flow_entry_t *,
const mac_soft_ring_set_type_t);
extern void mac_rx_srs_group_setup(mac_client_impl_t *, flow_entry_t *,
const mac_soft_ring_set_type_t);
extern void mac_tx_srs_group_setup(mac_client_impl_t *, flow_entry_t *,
const mac_soft_ring_set_type_t);
extern void mac_rx_srs_group_teardown(flow_entry_t *, boolean_t);
extern void mac_tx_srs_group_teardown(mac_client_impl_t *, flow_entry_t *,
const mac_soft_ring_set_type_t);
extern int mac_rx_classify_flow_quiesce(flow_entry_t *, void *);
extern int mac_rx_classify_flow_restart(flow_entry_t *, void *);
extern void mac_client_quiesce(mac_client_impl_t *);
extern void mac_client_restart(mac_client_impl_t *);
extern void mac_flow_update_priority(mac_client_impl_t *, flow_entry_t *);
extern void mac_flow_rem_subflow(flow_entry_t *);
extern void mac_rename_flow(flow_entry_t *, const char *);
extern void mac_flow_set_name(flow_entry_t *, const char *);
extern mblk_t *mac_add_vlan_tag(mblk_t *, uint_t, uint16_t);
extern mblk_t *mac_add_vlan_tag_chain(mblk_t *, uint_t, uint16_t);
extern mblk_t *mac_strip_vlan_tag_chain(mblk_t *);
extern void mac_rx_def(void *, mac_resource_handle_t, mblk_t *, boolean_t);
extern mblk_t *mac_rx_flow(mac_handle_t, mac_resource_handle_t, mblk_t *);
extern void i_mac_share_alloc(mac_client_impl_t *);
extern void i_mac_share_free(mac_client_impl_t *);
extern void i_mac_perim_enter(mac_impl_t *);
extern void i_mac_perim_exit(mac_impl_t *);
extern int i_mac_perim_enter_nowait(mac_impl_t *);
extern void i_mac_tx_srs_notify(mac_impl_t *, mac_ring_handle_t);
extern int mac_hold(const char *, mac_impl_t **);
extern void mac_rele(mac_impl_t *);
extern int i_mac_disable(mac_impl_t *);
extern void i_mac_notify(mac_impl_t *, mac_notify_type_t);
extern void i_mac_notify_exit(mac_impl_t *);
extern void mac_rx_group_unmark(mac_group_t *, uint_t);
extern void mac_tx_client_flush(mac_client_impl_t *);
extern void mac_tx_client_block(mac_client_impl_t *);
extern void mac_tx_client_unblock(mac_client_impl_t *);
extern void mac_tx_invoke_callbacks(mac_client_impl_t *, mac_tx_cookie_t);
extern int i_mac_promisc_set(mac_impl_t *, boolean_t);
extern mactype_t *mactype_getplugin(const char *);
extern void mac_addr_factory_init(mac_impl_t *);
extern void mac_addr_factory_fini(mac_impl_t *);
extern void mac_register_priv_prop(mac_impl_t *, char **);
extern void mac_unregister_priv_prop(mac_impl_t *);
extern int mac_init_rings(mac_impl_t *, mac_ring_type_t);
extern void mac_free_rings(mac_impl_t *, mac_ring_type_t);
extern void mac_compare_ddi_handle(mac_group_t *, uint_t, mac_ring_t *);
extern int mac_start_group(mac_group_t *);
extern void mac_stop_group(mac_group_t *);
extern int mac_start_ring(mac_ring_t *);
extern void mac_stop_ring(mac_ring_t *);
extern int mac_add_macaddr_vlan(mac_impl_t *, mac_group_t *, uint8_t *,
uint16_t, boolean_t);
extern int mac_remove_macaddr_vlan(mac_address_t *, uint16_t);
extern void mac_set_group_state(mac_group_t *, mac_group_state_t);
extern void mac_group_add_client(mac_group_t *, mac_client_impl_t *);
extern void mac_group_remove_client(mac_group_t *, mac_client_impl_t *);
extern int i_mac_group_add_ring(mac_group_t *, mac_ring_t *, int);
extern void i_mac_group_rem_ring(mac_group_t *, mac_ring_t *, boolean_t);
extern int mac_group_ring_modify(mac_client_impl_t *, mac_group_t *,
mac_group_t *);
extern void mac_poll_state_change(mac_handle_t, boolean_t);
extern mac_group_state_t mac_group_next_state(mac_group_t *,
mac_client_impl_t **, mac_group_t *, boolean_t);
extern mblk_t *mac_protect_check(mac_client_handle_t, mblk_t *);
extern int mac_protect_set(mac_client_handle_t, mac_resource_props_t *);
extern boolean_t mac_protect_enabled(mac_client_handle_t, uint32_t);
extern int mac_protect_validate(mac_resource_props_t *);
extern void mac_protect_update(mac_resource_props_t *, mac_resource_props_t *);
extern void mac_protect_update_mac_token(mac_client_impl_t *);
extern void mac_protect_intercept_dynamic(mac_client_impl_t *, mblk_t *);
extern void mac_protect_flush_dynamic(mac_client_impl_t *);
extern void mac_protect_cancel_timer(mac_client_impl_t *);
extern void mac_protect_init(mac_client_impl_t *);
extern void mac_protect_fini(mac_client_impl_t *);
extern int mac_set_resources(mac_handle_t, mac_resource_props_t *);
extern void mac_get_resources(mac_handle_t, mac_resource_props_t *);
extern void mac_get_effective_resources(mac_handle_t, mac_resource_props_t *);
extern void mac_set_promisc_filtered(mac_client_handle_t, boolean_t);
extern boolean_t mac_get_promisc_filtered(mac_client_handle_t);
extern cpupart_t *mac_pset_find(mac_resource_props_t *, boolean_t *);
extern void mac_set_pool_effective(boolean_t, cpupart_t *,
mac_resource_props_t *, mac_resource_props_t *);
extern void mac_set_rings_effective(mac_client_impl_t *);
extern mac_client_impl_t *mac_check_primary_relocation(mac_client_impl_t *,
boolean_t);
extern mac_bridge_tx_t mac_bridge_tx_cb;
extern mac_bridge_rx_t mac_bridge_rx_cb;
extern mac_bridge_ref_t mac_bridge_ref_cb;
extern mac_bridge_ls_t mac_bridge_ls_cb;
struct mac_transceiver_info {
boolean_t mti_present;
boolean_t mti_usable;
};
extern void mac_transceiver_init(mac_impl_t *);
extern int mac_transceiver_count(mac_handle_t, uint_t *);
extern int mac_transceiver_info(mac_handle_t, uint_t, boolean_t *, boolean_t *);
extern int mac_transceiver_read(mac_handle_t, uint_t, uint_t, void *, size_t,
off_t, size_t *);
#define MAC_LED_ALL (MAC_LED_DEFAULT | MAC_LED_OFF | MAC_LED_IDENT | \
MAC_LED_ON)
extern void mac_led_init(mac_impl_t *);
extern int mac_led_get(mac_handle_t, mac_led_mode_t *, mac_led_mode_t *);
extern int mac_led_set(mac_handle_t, mac_led_mode_t);
typedef struct mac_direct_rxs_s {
mac_direct_rx_t mdrx_v4;
mac_direct_rx_t mdrx_v6;
void *mdrx_arg_v4;
void *mdrx_arg_v6;
} mac_direct_rxs_t;
typedef struct mac_bcast_grp_mcip_s {
mac_client_impl_t *mgb_client;
int mgb_client_ref;
} mac_bcast_grp_mcip_t;
typedef struct mac_bcast_grp_s {
struct mac_bcast_grp_s *mbg_next;
void *mbg_addr;
uint16_t mbg_vid;
mac_impl_t *mbg_mac_impl;
mac_addrtype_t mbg_addrtype;
flow_entry_t *mbg_flow_ent;
mac_bcast_grp_mcip_t *mbg_clients;
uint_t mbg_nclients;
uint_t mbg_nclients_alloc;
uint64_t mbg_clients_gen;
uint32_t mbg_id;
} mac_bcast_grp_t;
#ifdef __cplusplus
}
#endif
#endif