#ifndef _BRIDGE_IMPL_H
#define _BRIDGE_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/list.h>
#include <sys/sysmacros.h>
#include <sys/avl.h>
#include <sys/queue.h>
#include <sys/kstat.h>
#include <sys/ksynch.h>
#include <sys/ethernet.h>
#include <sys/dld.h>
#include <sys/mac.h>
#include <sys/mac_client.h>
#include <sys/vlan.h>
#include <net/bridge.h>
#define BRIDGE_DEV_NAME "bridge"
#define KSINST_NAMES "recv", "sent", "drops", \
"forward_direct", "forward_unknown", "forward_mbcast", \
"learn_source", "learn_moved", "learn_expire", "learn_size"
typedef struct bridge_ksinst_s {
kstat_named_t bki_recv;
kstat_named_t bki_sent;
kstat_named_t bki_drops;
kstat_named_t bki_forwards;
kstat_named_t bki_unknown;
kstat_named_t bki_mbcast;
kstat_named_t bki_source;
kstat_named_t bki_moved;
kstat_named_t bki_expire;
kstat_named_t bki_count;
} bridge_ksinst_t;
#define KSLINK_NAMES "recv", "xmit", "drops"
typedef struct bridge_kslink_s {
kstat_named_t bkl_recv;
kstat_named_t bkl_xmit;
kstat_named_t bkl_drops;
} bridge_kslink_t;
struct bridge_mac_s;
struct bridge_stream_s;
typedef struct bridge_inst_s {
list_node_t bi_node;
dev_t bi_dev;
uint_t bi_flags;
uint_t bi_refs;
uint32_t bi_tablemax;
uint_t bi_tshift;
krwlock_t bi_rwlock;
list_t bi_links;
kcondvar_t bi_linkwait;
avl_tree_t bi_fwd;
kstat_t *bi_ksp;
struct bridge_stream_s *bi_control;
struct bridge_mac_s *bi_mac;
void *bi_trilldata;
char bi_name[MAXLINKNAMELEN];
bridge_ksinst_t bi_kstats;
} bridge_inst_t;
#define BIF_SHUTDOWN 0x0001
typedef struct bridge_mac_s {
list_node_t bm_node;
mac_handle_t bm_mh;
bridge_inst_t *bm_inst;
uint_t bm_flags;
uint_t bm_maxsdu;
link_state_t bm_linkstate;
char bm_name[MAXLINKNAMELEN];
} bridge_mac_t;
#define BMF_DLS 0x0001
#define BMF_STARTED 0x0002
typedef struct bridge_stream_s {
bridge_inst_t *bs_inst;
queue_t *bs_wq;
minor_t bs_minor;
uint_t bs_taskq_cnt;
} bridge_stream_t;
#define BRIDGE_VLAN_ARR_SIZE \
(P2ROUNDUP(VLAN_ID_MAX, NBBY) / NBBY)
#define BRIDGE_VLAN_ISSET(l, v) ((l)->bl_vlans[(v) / NBBY] & \
(1 << ((v) % NBBY)))
#define BRIDGE_VLAN_SET(l, v) ((l)->bl_vlans[(v) / NBBY] |= \
(1 << ((v) % NBBY)))
#define BRIDGE_VLAN_CLR(l, v) ((l)->bl_vlans[(v) / NBBY] &= \
~(1 << ((v) % NBBY)))
#define BRIDGE_AF_ISSET(l, v) ((l)->bl_afs[(v) / NBBY] & \
(1 << ((v) % NBBY)))
typedef struct bridge_link_s {
list_node_t bl_node;
uint_t bl_refs;
datalink_id_t bl_linkid;
bridge_state_t bl_state;
uint_t bl_pvid;
uint_t bl_flags;
uint_t bl_learns;
mac_handle_t bl_mh;
mac_client_handle_t bl_mch;
uint32_t bl_margin;
uint_t bl_maxsdu;
mac_unicast_handle_t bl_mah;
mac_notify_handle_t bl_mnh;
mac_promisc_handle_t bl_mphp;
bridge_inst_t *bl_inst;
kstat_t *bl_ksp;
void *bl_trilldata;
mblk_t *bl_lfailmp;
link_state_t bl_linkstate;
uint_t bl_trillthreads;
kcondvar_t bl_trillwait;
kmutex_t bl_trilllock;
uint8_t bl_local_mac[ETHERADDRL];
uint8_t bl_vlans[BRIDGE_VLAN_ARR_SIZE];
uint8_t bl_afs[BRIDGE_VLAN_ARR_SIZE];
bridge_kslink_t bl_kstats;
} bridge_link_t;
#define BLF_DELETED 0x0001
#define BLF_CLIENT_OPEN 0x0002
#define BLF_MARGIN_ADDED 0x0004
#define BLF_SET_BRIDGE 0x0008
#define BLF_PROM_ADDED 0x0010
#define BLF_FREED 0x0020
#define BLF_TRILLACTIVE 0x0040
#define BLF_SDUFAIL 0x0080
#define BLF_LINK_ADDED 0x0100
typedef struct bridge_fwd_s {
avl_node_t bf_node;
uchar_t bf_dest[ETHERADDRL];
uint16_t bf_trill_nick;
clock_t bf_lastheard;
uint_t bf_flags;
uint_t bf_refs;
uint16_t bf_vlanid;
uint16_t bf_vcnt;
uint_t bf_nlinks;
uint_t bf_maxlinks;
bridge_link_t **bf_links;
} bridge_fwd_t;
#define BFF_INTREE 0x0001
#define BFF_LOCALADDR 0x0002
#define BFF_VLANLOCAL 0x0004
typedef void (*trill_recv_pkt_t)(void *, bridge_link_t *, mac_resource_handle_t,
mblk_t *, mac_header_info_t *);
typedef void (*trill_encap_pkt_t)(void *, bridge_link_t *, mac_header_info_t *,
mblk_t *, uint16_t);
typedef void (*trill_br_dstr_t)(void *, bridge_inst_t *);
typedef void (*trill_ln_dstr_t)(void *, bridge_link_t *);
extern void bridge_trill_register_cb(trill_recv_pkt_t, trill_encap_pkt_t,
trill_br_dstr_t, trill_ln_dstr_t);
extern bridge_inst_t *bridge_trill_brref(const char *, void *);
extern void bridge_trill_brunref(bridge_inst_t *);
extern bridge_link_t *bridge_trill_lnref(bridge_inst_t *, datalink_id_t,
void *);
extern void bridge_trill_lnunref(bridge_link_t *);
extern void bridge_trill_decaps(bridge_link_t *, mblk_t *, uint16_t);
extern mblk_t *bridge_trill_output(bridge_link_t *, mblk_t *);
extern void bridge_trill_setvlans(bridge_link_t *, const uint8_t *);
extern void bridge_trill_flush(bridge_link_t *, uint16_t, boolean_t);
extern const uint8_t all_isis_rbridges[];
extern const uint8_t bridge_group_address[];
#ifdef __cplusplus
}
#endif
#endif