1*10491SRishi.Srivatsavai@Sun.COM /* 2*10491SRishi.Srivatsavai@Sun.COM * CDDL HEADER START 3*10491SRishi.Srivatsavai@Sun.COM * 4*10491SRishi.Srivatsavai@Sun.COM * The contents of this file are subject to the terms of the 5*10491SRishi.Srivatsavai@Sun.COM * Common Development and Distribution License (the "License"). 6*10491SRishi.Srivatsavai@Sun.COM * You may not use this file except in compliance with the License. 7*10491SRishi.Srivatsavai@Sun.COM * 8*10491SRishi.Srivatsavai@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*10491SRishi.Srivatsavai@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*10491SRishi.Srivatsavai@Sun.COM * See the License for the specific language governing permissions 11*10491SRishi.Srivatsavai@Sun.COM * and limitations under the License. 12*10491SRishi.Srivatsavai@Sun.COM * 13*10491SRishi.Srivatsavai@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*10491SRishi.Srivatsavai@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*10491SRishi.Srivatsavai@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*10491SRishi.Srivatsavai@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*10491SRishi.Srivatsavai@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*10491SRishi.Srivatsavai@Sun.COM * 19*10491SRishi.Srivatsavai@Sun.COM * CDDL HEADER END 20*10491SRishi.Srivatsavai@Sun.COM */ 21*10491SRishi.Srivatsavai@Sun.COM 22*10491SRishi.Srivatsavai@Sun.COM /* 23*10491SRishi.Srivatsavai@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24*10491SRishi.Srivatsavai@Sun.COM * Use is subject to license terms. 25*10491SRishi.Srivatsavai@Sun.COM */ 26*10491SRishi.Srivatsavai@Sun.COM 27*10491SRishi.Srivatsavai@Sun.COM #ifndef _BRIDGE_IMPL_H 28*10491SRishi.Srivatsavai@Sun.COM #define _BRIDGE_IMPL_H 29*10491SRishi.Srivatsavai@Sun.COM 30*10491SRishi.Srivatsavai@Sun.COM /* 31*10491SRishi.Srivatsavai@Sun.COM * These are the internal data structures used by the layer-two (Ethernet) 32*10491SRishi.Srivatsavai@Sun.COM * bridging module. 33*10491SRishi.Srivatsavai@Sun.COM */ 34*10491SRishi.Srivatsavai@Sun.COM 35*10491SRishi.Srivatsavai@Sun.COM #ifdef __cplusplus 36*10491SRishi.Srivatsavai@Sun.COM extern "C" { 37*10491SRishi.Srivatsavai@Sun.COM #endif 38*10491SRishi.Srivatsavai@Sun.COM 39*10491SRishi.Srivatsavai@Sun.COM #include <sys/list.h> 40*10491SRishi.Srivatsavai@Sun.COM #include <sys/sysmacros.h> 41*10491SRishi.Srivatsavai@Sun.COM #include <sys/avl.h> 42*10491SRishi.Srivatsavai@Sun.COM #include <sys/queue.h> 43*10491SRishi.Srivatsavai@Sun.COM #include <sys/kstat.h> 44*10491SRishi.Srivatsavai@Sun.COM #include <sys/ksynch.h> 45*10491SRishi.Srivatsavai@Sun.COM #include <sys/ethernet.h> 46*10491SRishi.Srivatsavai@Sun.COM #include <sys/dld.h> 47*10491SRishi.Srivatsavai@Sun.COM #include <sys/mac.h> 48*10491SRishi.Srivatsavai@Sun.COM #include <sys/mac_client.h> 49*10491SRishi.Srivatsavai@Sun.COM #include <sys/vlan.h> 50*10491SRishi.Srivatsavai@Sun.COM #include <net/bridge.h> 51*10491SRishi.Srivatsavai@Sun.COM 52*10491SRishi.Srivatsavai@Sun.COM #define KSINST_NAMES "recv", "sent", "drops", \ 53*10491SRishi.Srivatsavai@Sun.COM "forward_direct", "forward_unknown", "forward_mbcast", \ 54*10491SRishi.Srivatsavai@Sun.COM "learn_source", "learn_moved", "learn_expire", "learn_size" 55*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_ksinst_s { 56*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_recv; /* packets received */ 57*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_sent; /* packets sent through */ 58*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_drops; /* packets dropped (untowardly) */ 59*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_forwards; /* packets forwarded */ 60*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_unknown; /* packets forwarded (unknown dest) */ 61*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_mbcast; /* packets forwarded (multi/bcast) */ 62*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_source; /* source addresses learned */ 63*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_moved; /* source addresses moved */ 64*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_expire; /* source addresses expired */ 65*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bki_count; /* source addresses known */ 66*10491SRishi.Srivatsavai@Sun.COM } bridge_ksinst_t; 67*10491SRishi.Srivatsavai@Sun.COM 68*10491SRishi.Srivatsavai@Sun.COM #define KSLINK_NAMES "recv", "xmit", "drops" 69*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_kslink_s { 70*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bkl_recv; /* packets received */ 71*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bkl_xmit; /* packets transmitted */ 72*10491SRishi.Srivatsavai@Sun.COM kstat_named_t bkl_drops; /* packets dropped */ 73*10491SRishi.Srivatsavai@Sun.COM } bridge_kslink_t; 74*10491SRishi.Srivatsavai@Sun.COM 75*10491SRishi.Srivatsavai@Sun.COM /* 76*10491SRishi.Srivatsavai@Sun.COM * There's one instance structure and one observability mac node for each 77*10491SRishi.Srivatsavai@Sun.COM * bridge. Each open non-DLPI stream gets a 'stream' structure; these are used 78*10491SRishi.Srivatsavai@Sun.COM * for bridge instance allocation and control. Each link on the bridge has a 79*10491SRishi.Srivatsavai@Sun.COM * link structure. Finally, the bridge has a table of learned forwarding 80*10491SRishi.Srivatsavai@Sun.COM * entries, each with a list of outputs, which are either links or TRILL 81*10491SRishi.Srivatsavai@Sun.COM * nicknames. 82*10491SRishi.Srivatsavai@Sun.COM * 83*10491SRishi.Srivatsavai@Sun.COM * The mac structure lives as long as the dls and mac layers are busy. It can 84*10491SRishi.Srivatsavai@Sun.COM * outlive the bridge instance and be picked up again (by name) if the instance 85*10491SRishi.Srivatsavai@Sun.COM * is restarted. 86*10491SRishi.Srivatsavai@Sun.COM */ 87*10491SRishi.Srivatsavai@Sun.COM 88*10491SRishi.Srivatsavai@Sun.COM struct bridge_mac_s; 89*10491SRishi.Srivatsavai@Sun.COM struct bridge_stream_s; 90*10491SRishi.Srivatsavai@Sun.COM 91*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_inst_s { 92*10491SRishi.Srivatsavai@Sun.COM list_node_t bi_node; 93*10491SRishi.Srivatsavai@Sun.COM dev_t bi_dev; 94*10491SRishi.Srivatsavai@Sun.COM uint_t bi_flags; 95*10491SRishi.Srivatsavai@Sun.COM uint_t bi_refs; 96*10491SRishi.Srivatsavai@Sun.COM uint32_t bi_tablemax; 97*10491SRishi.Srivatsavai@Sun.COM uint_t bi_tshift; 98*10491SRishi.Srivatsavai@Sun.COM krwlock_t bi_rwlock; 99*10491SRishi.Srivatsavai@Sun.COM list_t bi_links; 100*10491SRishi.Srivatsavai@Sun.COM kcondvar_t bi_linkwait; 101*10491SRishi.Srivatsavai@Sun.COM avl_tree_t bi_fwd; 102*10491SRishi.Srivatsavai@Sun.COM kstat_t *bi_ksp; 103*10491SRishi.Srivatsavai@Sun.COM struct bridge_stream_s *bi_control; 104*10491SRishi.Srivatsavai@Sun.COM struct bridge_mac_s *bi_mac; 105*10491SRishi.Srivatsavai@Sun.COM void *bi_trilldata; 106*10491SRishi.Srivatsavai@Sun.COM char bi_name[MAXLINKNAMELEN]; 107*10491SRishi.Srivatsavai@Sun.COM bridge_ksinst_t bi_kstats; 108*10491SRishi.Srivatsavai@Sun.COM } bridge_inst_t; 109*10491SRishi.Srivatsavai@Sun.COM 110*10491SRishi.Srivatsavai@Sun.COM #define BIF_SHUTDOWN 0x0001 /* control stream has closed */ 111*10491SRishi.Srivatsavai@Sun.COM 112*10491SRishi.Srivatsavai@Sun.COM /* 113*10491SRishi.Srivatsavai@Sun.COM * The bridge MAC structure has the same lifetime as an observability node. 114*10491SRishi.Srivatsavai@Sun.COM * It's created when a bridge instance is allocated, but is not freed when the 115*10491SRishi.Srivatsavai@Sun.COM * instance is removed because there's no way for a MAC client to guarantee 116*10491SRishi.Srivatsavai@Sun.COM * that all users have disappeared. 117*10491SRishi.Srivatsavai@Sun.COM */ 118*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_mac_s { 119*10491SRishi.Srivatsavai@Sun.COM list_node_t bm_node; 120*10491SRishi.Srivatsavai@Sun.COM mac_handle_t bm_mh; 121*10491SRishi.Srivatsavai@Sun.COM bridge_inst_t *bm_inst; 122*10491SRishi.Srivatsavai@Sun.COM uint_t bm_flags; /* BMF_* below */ 123*10491SRishi.Srivatsavai@Sun.COM uint_t bm_maxsdu; 124*10491SRishi.Srivatsavai@Sun.COM link_state_t bm_linkstate; 125*10491SRishi.Srivatsavai@Sun.COM char bm_name[MAXLINKNAMELEN]; 126*10491SRishi.Srivatsavai@Sun.COM } bridge_mac_t; 127*10491SRishi.Srivatsavai@Sun.COM 128*10491SRishi.Srivatsavai@Sun.COM #define BMF_DLS 0x0001 /* dls monitor node created */ 129*10491SRishi.Srivatsavai@Sun.COM #define BMF_STARTED 0x0002 /* snoop-like client is present */ 130*10491SRishi.Srivatsavai@Sun.COM 131*10491SRishi.Srivatsavai@Sun.COM /* 132*10491SRishi.Srivatsavai@Sun.COM * Bridge streams are used only for instance allocation and control. 133*10491SRishi.Srivatsavai@Sun.COM */ 134*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_stream_s { 135*10491SRishi.Srivatsavai@Sun.COM bridge_inst_t *bs_inst; 136*10491SRishi.Srivatsavai@Sun.COM queue_t *bs_wq; /* write-side queue for stream */ 137*10491SRishi.Srivatsavai@Sun.COM minor_t bs_minor; 138*10491SRishi.Srivatsavai@Sun.COM uint_t bs_taskq_cnt; /* taskq references */ 139*10491SRishi.Srivatsavai@Sun.COM } bridge_stream_t; 140*10491SRishi.Srivatsavai@Sun.COM 141*10491SRishi.Srivatsavai@Sun.COM /* 142*10491SRishi.Srivatsavai@Sun.COM * These macros are used to set and test link membership in particular VLANs. 143*10491SRishi.Srivatsavai@Sun.COM * This membership is used to determine how to forward packets between 144*10491SRishi.Srivatsavai@Sun.COM * interfaces. 145*10491SRishi.Srivatsavai@Sun.COM */ 146*10491SRishi.Srivatsavai@Sun.COM 147*10491SRishi.Srivatsavai@Sun.COM #define BRIDGE_VLAN_ARR_SIZE \ 148*10491SRishi.Srivatsavai@Sun.COM (P2ROUNDUP(VLAN_ID_MAX, NBBY) / NBBY) 149*10491SRishi.Srivatsavai@Sun.COM 150*10491SRishi.Srivatsavai@Sun.COM #define BRIDGE_VLAN_ISSET(l, v) ((l)->bl_vlans[(v) / NBBY] & \ 151*10491SRishi.Srivatsavai@Sun.COM (1 << ((v) % NBBY))) 152*10491SRishi.Srivatsavai@Sun.COM 153*10491SRishi.Srivatsavai@Sun.COM #define BRIDGE_VLAN_SET(l, v) ((l)->bl_vlans[(v) / NBBY] |= \ 154*10491SRishi.Srivatsavai@Sun.COM (1 << ((v) % NBBY))) 155*10491SRishi.Srivatsavai@Sun.COM 156*10491SRishi.Srivatsavai@Sun.COM #define BRIDGE_VLAN_CLR(l, v) ((l)->bl_vlans[(v) / NBBY] &= \ 157*10491SRishi.Srivatsavai@Sun.COM ~(1 << ((v) % NBBY))) 158*10491SRishi.Srivatsavai@Sun.COM 159*10491SRishi.Srivatsavai@Sun.COM #define BRIDGE_AF_ISSET(l, v) ((l)->bl_afs[(v) / NBBY] & \ 160*10491SRishi.Srivatsavai@Sun.COM (1 << ((v) % NBBY))) 161*10491SRishi.Srivatsavai@Sun.COM 162*10491SRishi.Srivatsavai@Sun.COM /* 163*10491SRishi.Srivatsavai@Sun.COM * This structure represents a link attached to a bridge. VLAN membership 164*10491SRishi.Srivatsavai@Sun.COM * information is kept here; when forwarding, we must look at the membership of 165*10491SRishi.Srivatsavai@Sun.COM * the input link and the output to determine when to update the packet 166*10491SRishi.Srivatsavai@Sun.COM * contents and when to discard. 167*10491SRishi.Srivatsavai@Sun.COM */ 168*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_link_s { 169*10491SRishi.Srivatsavai@Sun.COM list_node_t bl_node; 170*10491SRishi.Srivatsavai@Sun.COM uint_t bl_refs; 171*10491SRishi.Srivatsavai@Sun.COM datalink_id_t bl_linkid; /* allocated link ID for bridge */ 172*10491SRishi.Srivatsavai@Sun.COM bridge_state_t bl_state; /* blocking/learning/forwarding */ 173*10491SRishi.Srivatsavai@Sun.COM uint_t bl_pvid; /* VLAN ID for untagged traffic */ 174*10491SRishi.Srivatsavai@Sun.COM uint_t bl_flags; /* BLF_* below */ 175*10491SRishi.Srivatsavai@Sun.COM uint_t bl_learns; /* learning limit */ 176*10491SRishi.Srivatsavai@Sun.COM mac_handle_t bl_mh; 177*10491SRishi.Srivatsavai@Sun.COM mac_client_handle_t bl_mch; 178*10491SRishi.Srivatsavai@Sun.COM uint32_t bl_margin; 179*10491SRishi.Srivatsavai@Sun.COM uint_t bl_maxsdu; 180*10491SRishi.Srivatsavai@Sun.COM mac_unicast_handle_t bl_mah; 181*10491SRishi.Srivatsavai@Sun.COM mac_notify_handle_t bl_mnh; 182*10491SRishi.Srivatsavai@Sun.COM mac_promisc_handle_t bl_mphp; 183*10491SRishi.Srivatsavai@Sun.COM bridge_inst_t *bl_inst; /* backpointer to bridge instance */ 184*10491SRishi.Srivatsavai@Sun.COM kstat_t *bl_ksp; 185*10491SRishi.Srivatsavai@Sun.COM void *bl_trilldata; 186*10491SRishi.Srivatsavai@Sun.COM mblk_t *bl_lfailmp; /* preallocated */ 187*10491SRishi.Srivatsavai@Sun.COM link_state_t bl_linkstate; 188*10491SRishi.Srivatsavai@Sun.COM uint_t bl_trillthreads; 189*10491SRishi.Srivatsavai@Sun.COM kcondvar_t bl_trillwait; 190*10491SRishi.Srivatsavai@Sun.COM kmutex_t bl_trilllock; 191*10491SRishi.Srivatsavai@Sun.COM uint8_t bl_local_mac[ETHERADDRL]; 192*10491SRishi.Srivatsavai@Sun.COM uint8_t bl_vlans[BRIDGE_VLAN_ARR_SIZE]; 193*10491SRishi.Srivatsavai@Sun.COM uint8_t bl_afs[BRIDGE_VLAN_ARR_SIZE]; 194*10491SRishi.Srivatsavai@Sun.COM bridge_kslink_t bl_kstats; 195*10491SRishi.Srivatsavai@Sun.COM } bridge_link_t; 196*10491SRishi.Srivatsavai@Sun.COM 197*10491SRishi.Srivatsavai@Sun.COM #define BLF_DELETED 0x0001 /* waiting for last reference to go */ 198*10491SRishi.Srivatsavai@Sun.COM #define BLF_CLIENT_OPEN 0x0002 /* MAC client opened */ 199*10491SRishi.Srivatsavai@Sun.COM #define BLF_MARGIN_ADDED 0x0004 /* MAC margin added */ 200*10491SRishi.Srivatsavai@Sun.COM #define BLF_SET_BRIDGE 0x0008 /* MAC in bridging mode */ 201*10491SRishi.Srivatsavai@Sun.COM #define BLF_PROM_ADDED 0x0010 /* MAC promiscuous added */ 202*10491SRishi.Srivatsavai@Sun.COM #define BLF_FREED 0x0020 /* free has begun; debug assertion */ 203*10491SRishi.Srivatsavai@Sun.COM #define BLF_TRILLACTIVE 0x0040 /* in active forwarding use */ 204*10491SRishi.Srivatsavai@Sun.COM #define BLF_SDUFAIL 0x0080 /* has mismatched SDU */ 205*10491SRishi.Srivatsavai@Sun.COM 206*10491SRishi.Srivatsavai@Sun.COM /* 207*10491SRishi.Srivatsavai@Sun.COM * This represents a learned forwarding entry. These are generally created and 208*10491SRishi.Srivatsavai@Sun.COM * refreshed on demand as we learn about nodes through source MAC addresses we 209*10491SRishi.Srivatsavai@Sun.COM * see. They're destroyed when they age away. For forwarding, we look up the 210*10491SRishi.Srivatsavai@Sun.COM * destination address in an AVL tree, and the entry found tells us where the 211*10491SRishi.Srivatsavai@Sun.COM * that source must live. 212*10491SRishi.Srivatsavai@Sun.COM */ 213*10491SRishi.Srivatsavai@Sun.COM typedef struct bridge_fwd_s { 214*10491SRishi.Srivatsavai@Sun.COM avl_node_t bf_node; 215*10491SRishi.Srivatsavai@Sun.COM uchar_t bf_dest[ETHERADDRL]; 216*10491SRishi.Srivatsavai@Sun.COM uint16_t bf_trill_nick; /* destination nickname */ 217*10491SRishi.Srivatsavai@Sun.COM clock_t bf_lastheard; /* time we last heard from this node */ 218*10491SRishi.Srivatsavai@Sun.COM uint_t bf_flags; /* BFF_* below */ 219*10491SRishi.Srivatsavai@Sun.COM uint_t bf_refs; 220*10491SRishi.Srivatsavai@Sun.COM uint16_t bf_vlanid; /* VLAN ID for IVL */ 221*10491SRishi.Srivatsavai@Sun.COM uint16_t bf_vcnt; /* number of duplicates */ 222*10491SRishi.Srivatsavai@Sun.COM uint_t bf_nlinks; /* number of links in bf_links */ 223*10491SRishi.Srivatsavai@Sun.COM uint_t bf_maxlinks; /* allocated size of link array */ 224*10491SRishi.Srivatsavai@Sun.COM bridge_link_t **bf_links; 225*10491SRishi.Srivatsavai@Sun.COM } bridge_fwd_t; 226*10491SRishi.Srivatsavai@Sun.COM 227*10491SRishi.Srivatsavai@Sun.COM #define BFF_INTREE 0x0001 228*10491SRishi.Srivatsavai@Sun.COM #define BFF_LOCALADDR 0x0002 /* address is known to mac layer */ 229*10491SRishi.Srivatsavai@Sun.COM #define BFF_VLANLOCAL 0x0004 /* set if duplicate for IVL */ 230*10491SRishi.Srivatsavai@Sun.COM 231*10491SRishi.Srivatsavai@Sun.COM /* TRILL linkage */ 232*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_recv_pkt_t)(void *, bridge_link_t *, mac_resource_handle_t, 233*10491SRishi.Srivatsavai@Sun.COM mblk_t *, mac_header_info_t *); 234*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_encap_pkt_t)(void *, bridge_link_t *, mac_header_info_t *, 235*10491SRishi.Srivatsavai@Sun.COM mblk_t *, uint16_t); 236*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_br_dstr_t)(void *, bridge_inst_t *); 237*10491SRishi.Srivatsavai@Sun.COM typedef void (*trill_ln_dstr_t)(void *, bridge_link_t *); 238*10491SRishi.Srivatsavai@Sun.COM 239*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_register_cb(trill_recv_pkt_t, trill_encap_pkt_t, 240*10491SRishi.Srivatsavai@Sun.COM trill_br_dstr_t, trill_ln_dstr_t); 241*10491SRishi.Srivatsavai@Sun.COM extern bridge_inst_t *bridge_trill_brref(const char *, void *); 242*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_brunref(bridge_inst_t *); 243*10491SRishi.Srivatsavai@Sun.COM extern bridge_link_t *bridge_trill_lnref(bridge_inst_t *, datalink_id_t, 244*10491SRishi.Srivatsavai@Sun.COM void *); 245*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_lnunref(bridge_link_t *); 246*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_decaps(bridge_link_t *, mblk_t *, uint16_t); 247*10491SRishi.Srivatsavai@Sun.COM extern mblk_t *bridge_trill_output(bridge_link_t *, mblk_t *); 248*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_setvlans(bridge_link_t *, const uint8_t *); 249*10491SRishi.Srivatsavai@Sun.COM extern void bridge_trill_flush(bridge_link_t *, uint16_t, boolean_t); 250*10491SRishi.Srivatsavai@Sun.COM 251*10491SRishi.Srivatsavai@Sun.COM /* Ethernet multicast address; constant stored in bridge module */ 252*10491SRishi.Srivatsavai@Sun.COM extern const uint8_t all_isis_rbridges[]; 253*10491SRishi.Srivatsavai@Sun.COM extern const uint8_t bridge_group_address[]; 254*10491SRishi.Srivatsavai@Sun.COM 255*10491SRishi.Srivatsavai@Sun.COM #ifdef __cplusplus 256*10491SRishi.Srivatsavai@Sun.COM } 257*10491SRishi.Srivatsavai@Sun.COM #endif 258*10491SRishi.Srivatsavai@Sun.COM 259*10491SRishi.Srivatsavai@Sun.COM #endif /* _BRIDGE_IMPL_H */ 260