3477 };
3478
3479 static struct streamtab bridge_tab = {
3480 &bridge_rinit, /* st_rdinit */
3481 &bridge_winit /* st_wrinit */
3482 };
3483
3484 /* No STREAMS perimeters; we do all our own locking */
3485 DDI_DEFINE_STREAM_OPS(bridge_ops, nulldev, nulldev, bridge_attach,
3486 bridge_detach, nodev, bridge_info, D_NEW | D_MP, &bridge_tab,
3487 ddi_quiesce_not_supported);
3488
3489 static struct modldrv modldrv = {
3490 &mod_driverops,
3491 "bridging driver",
3492 &bridge_ops
3493 };
3494
3495 static struct modlinkage modlinkage = {
3496 MODREV_1,
3497 (void *)&modldrv,
3498 NULL
3499 };
3500
3501 int
3502 _init(void)
3503 {
3504 int retv;
3505
3506 mac_init_ops(NULL, BRIDGE_DEV_NAME);
3507 bridge_inst_init();
3508 if ((retv = mod_install(&modlinkage)) != 0)
3509 bridge_inst_fini();
3510 return (retv);
3511 }
3512
3513 int
3514 _fini(void)
3515 {
3516 int retv;
3517
3518 rw_enter(&bmac_rwlock, RW_READER);
|
3477 };
3478
3479 static struct streamtab bridge_tab = {
3480 &bridge_rinit, /* st_rdinit */
3481 &bridge_winit /* st_wrinit */
3482 };
3483
3484 /* No STREAMS perimeters; we do all our own locking */
3485 DDI_DEFINE_STREAM_OPS(bridge_ops, nulldev, nulldev, bridge_attach,
3486 bridge_detach, nodev, bridge_info, D_NEW | D_MP, &bridge_tab,
3487 ddi_quiesce_not_supported);
3488
3489 static struct modldrv modldrv = {
3490 &mod_driverops,
3491 "bridging driver",
3492 &bridge_ops
3493 };
3494
3495 static struct modlinkage modlinkage = {
3496 MODREV_1,
3497 { (void *)&modldrv, NULL }
3498 };
3499
3500 int
3501 _init(void)
3502 {
3503 int retv;
3504
3505 mac_init_ops(NULL, BRIDGE_DEV_NAME);
3506 bridge_inst_init();
3507 if ((retv = mod_install(&modlinkage)) != 0)
3508 bridge_inst_fini();
3509 return (retv);
3510 }
3511
3512 int
3513 _fini(void)
3514 {
3515 int retv;
3516
3517 rw_enter(&bmac_rwlock, RW_READER);
|