Lines Matching defs:vnetp
79 static void vnet_force_link_state(vnet_t *vnetp, queue_t *q, mblk_t *mp);
101 static int vnet_unattach(vnet_t *vnetp);
102 static void vnet_ring_grp_init(vnet_t *vnetp);
103 static void vnet_ring_grp_uninit(vnet_t *vnetp);
105 static int vnet_read_mac_address(vnet_t *vnetp);
108 static int vnet_bind_hwrings(vnet_t *vnetp);
109 static void vnet_unbind_hwrings(vnet_t *vnetp);
118 static void vnet_fdb_create(vnet_t *vnetp);
119 static void vnet_fdb_destroy(vnet_t *vnetp);
120 static vnet_res_t *vnet_fdbe_find(vnet_t *vnetp, struct ether_addr *addrp);
122 void vnet_fdbe_add(vnet_t *vnetp, vnet_res_t *vresp);
123 static void vnet_fdbe_del(vnet_t *vnetp, vnet_res_t *vresp);
129 static void vnet_start_resources(vnet_t *vnetp);
130 static void vnet_stop_resources(vnet_t *vnetp);
131 static void vnet_dispatch_res_task(vnet_t *vnetp);
134 static void vnet_add_resource(vnet_t *vnetp, vnet_res_t *vresp);
135 static vnet_res_t *vnet_rem_resource(vnet_t *vnetp, vnet_res_t *vresp);
139 int vnet_mtu_update(vnet_t *vnetp, uint32_t mtu);
140 void vnet_link_update(vnet_t *vnetp, link_state_t link_state);
141 void vnet_dds_cleanup_hio(vnet_t *vnetp);
150 int vnet_send_dds_msg(vnet_t *vnetp, void *dmsg);
151 int vnet_hio_mac_init(vnet_t *vnetp, char *ifname);
152 void vnet_hio_mac_cleanup(vnet_t *vnetp);
155 extern int vgen_init(void *vnetp, uint64_t regprop, dev_info_t *vnetdip,
167 extern int vdds_init(vnet_t *vnetp);
168 extern void vdds_cleanup(vnet_t *vnetp);
169 extern void vdds_process_dds_msg(vnet_t *vnetp, vio_dds_msg_t *dmsg);
171 extern void vdds_cleanup_hio(vnet_t *vnetp);
345 vnet_t *vnetp = (vnet_t *)arg;
348 if (vnetp == NULL) {
352 (void) sprintf(bufp, "vnet%d:%s: ", vnetp->instance, fname);
413 vnet_t *vnetp;
435 vnetp = kmem_zalloc(sizeof (vnet_t), KM_SLEEP);
436 vnetp->dip = dip;
437 vnetp->instance = instance;
438 rw_init(&vnetp->vrwlock, NULL, RW_DRIVER, NULL);
439 rw_init(&vnetp->vsw_fp_rw, NULL, RW_DRIVER, NULL);
442 vnet_ring_grp_init(vnetp);
445 status = vdds_init(vnetp);
452 ddi_set_driver_private(dip, (caddr_t)vnetp);
455 status = vnet_read_mac_address(vnetp);
466 vnetp->reg = reg;
468 vnet_fdb_create(vnetp);
472 if ((vnetp->taskqp = ddi_taskq_create(dip, qname, 1,
482 vnetp->nextp = vnet_headp;
483 vnet_headp = vnetp;
503 status = vgen_init(vnetp, reg, vnetp->dip,
504 (uint8_t *)vnetp->curr_macaddr, &vnetp->vgenhdl);
506 DERR(vnetp, "vgen_init() failed\n");
511 status = vnet_mac_register(vnetp);
515 vnetp->link_state = LINK_STATE_UNKNOWN;
518 status = vgen_init_mdeg(vnetp->vgenhdl);
524 vnetp->attach_progress = attach_progress;
530 vnetp->attach_progress = attach_progress;
531 status = vnet_unattach(vnetp);
542 vnet_t *vnetp;
548 vnetp = ddi_get_driver_private(dip);
549 if (vnetp == NULL) {
562 if (vnet_unattach(vnetp) != 0) {
579 vnet_unattach(vnet_t *vnetp)
583 attach_progress = vnetp->attach_progress;
596 if (mac_disable(vnetp->mh) != 0) {
609 vdds_cleanup(vnetp);
618 vgen_uninit(vnetp->vgenhdl);
625 ddi_taskq_destroy(vnetp->taskqp);
631 vnet_fdb_destroy(vnetp);
642 if (*vnetpp == vnetp) {
643 *vnetpp = vnetp->nextp;
652 vnet_ring_grp_uninit(vnetp);
657 VERIFY(mac_unregister(vnetp->mh) == 0);
658 vnetp->mh = NULL;
663 rw_destroy(&vnetp->vrwlock);
664 rw_destroy(&vnetp->vsw_fp_rw);
666 KMEM_FREE(vnetp);
676 vnet_t *vnetp = arg;
678 DBG1(vnetp, "enter\n");
680 WRITE_ENTER(&vnetp->vrwlock);
681 vnetp->flags |= VNET_STARTED;
682 vnet_start_resources(vnetp);
683 RW_EXIT(&vnetp->vrwlock);
685 DBG1(vnetp, "exit\n");
694 vnet_t *vnetp = arg;
696 DBG1(vnetp, "enter\n");
698 WRITE_ENTER(&vnetp->vrwlock);
699 if (vnetp->flags & VNET_STARTED) {
706 vnetp->flags &= ~VNET_STARTED;
707 vnetp->flags |= VNET_STOPPING;
708 vnet_stop_resources(vnetp);
709 vnetp->flags &= ~VNET_STOPPING;
711 RW_EXIT(&vnetp->vrwlock);
713 DBG1(vnetp, "exit\n");
722 vnet_t *vnetp = arg;
724 DBG1(vnetp, "enter\n");
728 DBG1(vnetp, "exit\n");
739 vnet_t *vnetp = arg;
745 DBG1(vnetp, "enter\n");
747 READ_ENTER(&vnetp->vsw_fp_rw);
748 if (vnetp->vsw_fp == NULL) {
749 RW_EXIT(&vnetp->vsw_fp_rw);
752 VNET_FDBE_REFHOLD(vnetp->vsw_fp);
753 RW_EXIT(&vnetp->vsw_fp_rw);
755 vresp = vnetp->vsw_fp;
760 VNET_FDBE_REFRELE(vnetp->vsw_fp);
762 DBG1(vnetp, "exit(%d)\n", rv);
772 vnet_t *vnetp = arg;
773 DBG1(vnetp, "enter\n");
777 DBG1(vnetp, "exit\n");
791 vnet_t *vnetp;
805 vnetp = (vnet_t *)tx_ringp->vnetp;
806 DBG1(vnetp, "enter\n");
809 is_pvid = (vnetp->pvid != vnetp->default_vlan_id) ? B_TRUE : B_FALSE;
824 vresp = vnet_fdbe_find(vnetp, &ehp->ether_dhost);
855 READ_ENTER(&vnetp->vsw_fp_rw);
857 if ((is_unicast) && (vnetp->hio_fp != NULL)) {
858 vresp = vnetp->hio_fp;
861 vresp = vnetp->vsw_fp;
868 RW_EXIT(&vnetp->vsw_fp_rw);
877 RW_EXIT(&vnetp->vsw_fp_rw);
895 vnetp->pvid);
927 DBG1(vnetp, "exit\n");
935 vnet_t *vnetp = arg;
941 DBG1(vnetp, "enter\n");
952 READ_ENTER(&vnetp->vrwlock);
953 for (vresp = vnetp->vres_list; vresp != NULL; vresp = vresp->nextp) {
959 RW_EXIT(&vnetp->vrwlock);
963 DBG1(vnetp, "exit\n");
968 vnet_ring_grp_init(vnet_t *vnetp)
976 tx_grp = &vnetp->tx_grp[0];
989 rx_grp = &vnetp->rx_grp[0];
1018 vnet_ring_grp_uninit(vnet_t *vnetp)
1024 tx_grp = &vnetp->tx_grp[0];
1044 rx_grp = &vnetp->rx_grp[0];
1055 vnet_alloc_pseudo_rx_ring(vnet_t *vnetp)
1061 rx_grp = &vnetp->rx_grp[0];
1085 vnet_free_pseudo_rx_ring(vnet_t *vnetp, vnet_pseudo_rx_ring_t *ringp)
1090 rx_grp = &vnetp->rx_grp[0];
1104 vnet_mac_register(vnet_t *vnetp)
1112 macp->m_driver = vnetp;
1113 macp->m_dip = vnetp->dip;
1114 macp->m_src_addr = vnetp->curr_macaddr;
1117 macp->m_max_sdu = vnetp->mtu;
1126 err = mac_register(macp, &vnetp->mh);
1133 vnet_read_mac_address(vnet_t *vnetp)
1139 rv = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, vnetp->dip,
1142 DWARN(vnetp, "prop_lookup failed(%s) err(%d)\n",
1146 bcopy(macaddr, (caddr_t)vnetp->vendor_addr, ETHERADDRL);
1147 bcopy(macaddr, (caddr_t)vnetp->curr_macaddr, ETHERADDRL);
1154 vnet_fdb_create(vnet_t *vnetp)
1159 vnetp->instance);
1160 vnetp->fdb_nchains = vnet_fdb_nchains;
1161 vnetp->fdb_hashp = mod_hash_create_ptrhash(hashname, vnetp->fdb_nchains,
1166 vnet_fdb_destroy(vnet_t *vnetp)
1169 if (vnetp->fdb_hashp != NULL) {
1170 mod_hash_destroy_hash(vnetp->fdb_hashp);
1171 vnetp->fdb_hashp = NULL;
1172 vnetp->fdb_nchains = 0;
1180 vnet_fdbe_add(vnet_t *vnetp, vnet_res_t *vresp)
1202 rv = mod_hash_insert(vnetp->fdb_hashp, (mod_hash_key_t)addr,
1205 DWARN(vnetp, "Duplicate macaddr key(%lx)\n", addr);
1212 WRITE_ENTER(&vnetp->vsw_fp_rw);
1213 if (vnetp->vsw_fp == NULL)
1214 vnetp->vsw_fp = vresp;
1215 RW_EXIT(&vnetp->vsw_fp_rw);
1218 WRITE_ENTER(&vnetp->vsw_fp_rw);
1219 if (vnetp->hio_fp == NULL)
1220 vnetp->hio_fp = vresp;
1221 RW_EXIT(&vnetp->vsw_fp_rw);
1229 vnet_fdbe_del(vnet_t *vnetp, vnet_res_t *vresp)
1243 rv = mod_hash_remove(vnetp->fdb_hashp, (mod_hash_key_t)addr,
1256 WRITE_ENTER(&vnetp->vsw_fp_rw);
1258 ASSERT(tmp == vnetp->vsw_fp);
1259 vnetp->vsw_fp = NULL;
1261 RW_EXIT(&vnetp->vsw_fp_rw);
1263 WRITE_ENTER(&vnetp->vsw_fp_rw);
1265 vnetp->hio_fp = NULL;
1267 RW_EXIT(&vnetp->vsw_fp_rw);
1286 vnet_fdbe_find(vnet_t *vnetp, struct ether_addr *addrp)
1294 rv = mod_hash_find_cb(vnetp->fdb_hashp, (mod_hash_key_t)key,
1373 vnet_t *vnetp = vresp->vnetp;
1376 if ((vnetp == NULL) || (vnetp->mh == 0)) {
1382 mac_rx_ring(vnetp->mh, ringp->handle, mp, ringp->gen_num);
1389 vnet_t *vnetp = vresp->vnetp;
1394 if (vnetp == NULL || vnetp->mh == NULL) {
1419 tx_grp = &vnetp->tx_grp[0];
1422 mac_tx_ring_update(vnetp->mh, tx_ringp->handle);
1443 vnet_t *vnetp;
1459 vnetp = tx_ringp->vnetp;
1460 mac_tx_ring_update(vnetp->mh, tx_ringp->handle);
1475 vnet_t *vnetp = (vnet_t *)arg1;
1480 tx_grp = &vnetp->tx_grp[0];
1498 vnet_mtu_update(vnet_t *vnetp, uint32_t mtu)
1502 if (vnetp == NULL || vnetp->mh == NULL) {
1506 WRITE_ENTER(&vnetp->vrwlock);
1508 if (vnetp->flags & VNET_STARTED) {
1509 RW_EXIT(&vnetp->vrwlock);
1512 vnetp->instance);
1517 rv = mac_maxsdu_update(vnetp->mh, mtu);
1519 RW_EXIT(&vnetp->vrwlock);
1522 vnetp->instance);
1526 vnetp->mtu = mtu;
1528 RW_EXIT(&vnetp->vrwlock);
1537 vnet_link_update(vnet_t *vnetp, link_state_t link_state)
1539 if (vnetp == NULL || vnetp->mh == NULL) {
1543 WRITE_ENTER(&vnetp->vrwlock);
1544 if (vnetp->link_state == link_state) {
1545 RW_EXIT(&vnetp->vrwlock);
1548 vnetp->link_state = link_state;
1549 RW_EXIT(&vnetp->vrwlock);
1551 mac_link_update(vnetp->mh, link_state);
1571 vnet_t *vnetp;
1583 vnetp = vnet_headp;
1584 while (vnetp != NULL) {
1585 if (VNET_MATCH_RES(vresp, vnetp)) {
1586 vresp->vnetp = vnetp;
1595 vnetp->instance);
1598 vnet_add_resource(vnetp, vresp);
1601 vnetp = vnetp->nextp;
1604 if (vresp->vnetp == NULL) {
1617 (void) vnet_rem_resource(vnetp, vresp);
1624 vnet_dispatch_res_task(vnetp);
1635 vnet_t *vnetp = vresp->vnetp;
1639 ASSERT(vnetp != NULL);
1644 vnet_fdbe_del(vnetp, vresp);
1649 (void) vnet_rem_resource(vnetp, vresp);
1656 vnet_add_resource(vnet_t *vnetp, vnet_res_t *vresp)
1658 WRITE_ENTER(&vnetp->vrwlock);
1659 vresp->nextp = vnetp->vres_list;
1660 vnetp->vres_list = vresp;
1661 RW_EXIT(&vnetp->vrwlock);
1665 vnet_rem_resource(vnet_t *vnetp, vnet_res_t *vresp)
1669 WRITE_ENTER(&vnetp->vrwlock);
1670 if (vresp == vnetp->vres_list) {
1671 vnetp->vres_list = vresp->nextp;
1673 vrp = vnetp->vres_list;
1682 vresp->vnetp = NULL;
1685 RW_EXIT(&vnetp->vrwlock);
1696 vnet_t *vnetp = arg;
1697 vdds_process_dds_msg(vnetp, dmsg);
1705 vnet_send_dds_msg(vnet_t *vnetp, void *dmsg)
1709 if (vnetp->vgenhdl != NULL) {
1710 rv = vgen_dds_tx(vnetp->vgenhdl, dmsg);
1719 vnet_dds_cleanup_hio(vnet_t *vnetp)
1721 vdds_cleanup_hio(vnetp);
1735 vnet_t *vnetp = vresp->vnetp;
1737 if (vnetp == NULL) {
1745 vdds_cleanup_hio(vnetp);
1752 vnet_dispatch_res_task(vnet_t *vnetp)
1757 * Dispatch the task. It could be the case that vnetp->flags does
1762 rv = ddi_taskq_dispatch(vnetp->taskqp, vnet_res_start_task,
1763 vnetp, DDI_NOSLEEP);
1767 vnetp->instance);
1777 vnet_t *vnetp = arg;
1779 WRITE_ENTER(&vnetp->vrwlock);
1780 if (vnetp->flags & VNET_STARTED) {
1781 vnet_start_resources(vnetp);
1783 RW_EXIT(&vnetp->vrwlock);
1791 vnet_start_resources(vnet_t *vnetp)
1798 DBG1(vnetp, "enter\n");
1800 ASSERT(RW_WRITE_HELD(&vnetp->vrwlock));
1802 for (vresp = vnetp->vres_list; vresp != NULL; vresp = vresp->nextp) {
1816 vnet_fdbe_add(vnetp, vresp);
1820 DBG1(vnetp, "exit\n");
1828 vnet_stop_resources(vnet_t *vnetp)
1834 DBG1(vnetp, "enter\n");
1836 ASSERT(RW_WRITE_HELD(&vnetp->vrwlock));
1838 for (vresp = vnetp->vres_list; vresp != NULL; ) {
1860 RW_EXIT(&vnetp->vrwlock);
1864 WRITE_ENTER(&vnetp->vrwlock);
1870 DBG1(vnetp, "exit\n");
1882 vnet_t *vnetp = vresp->vnetp;
1886 ASSERT(vnetp != NULL);
1888 ksp = kstat_create(ks_mod, vnetp->instance, ks_name, "net",
1945 vnet_t *vnetp;
1951 vnetp = vresp->vnetp;
1955 READ_ENTER(&vnetp->vsw_fp_rw);
1956 if (vnetp->hio_fp == NULL) {
1958 RW_EXIT(&vnetp->vsw_fp_rw);
1961 VNET_FDBE_REFHOLD(vnetp->hio_fp);
1962 RW_EXIT(&vnetp->vsw_fp_rw);
1963 vnet_hio_get_stats(vnetp->hio_fp, &statsp);
1964 VNET_FDBE_REFRELE(vnetp->hio_fp);
2072 vnet_t *vnetp = (vnet_t *)arg;
2074 if (vnetp == NULL) {
2170 cap_rings->mr_rnum = vnetp->rx_grp[0].ring_cnt;
2185 cap_rings->mr_rnum = vnetp->tx_grp[0].ring_cnt;
2217 vnet_t *vnetp = arg;
2229 rx_grp = &vnetp->rx_grp[g_index];
2244 rx_ringp->vnetp = vnetp;
2280 tx_grp = &vnetp->tx_grp[0];
2291 tx_ringp->vnetp = vnetp;
2322 vnet_t *vnetp = (vnet_t *)arg;
2333 rx_grp = &vnetp->rx_grp[index];
2336 rx_grp->vnetp = vnetp;
2355 tx_grp = &vnetp->tx_grp[index];
2358 tx_grp->vnetp = vnetp;
2454 vnet_t *vnetp = (vnet_t *)rx_ringp->vnetp;
2464 READ_ENTER(&vnetp->vsw_fp_rw);
2465 if (vnetp->hio_fp == NULL) {
2466 RW_EXIT(&vnetp->vsw_fp_rw);
2470 VNET_FDBE_REFHOLD(vnetp->hio_fp);
2471 RW_EXIT(&vnetp->vsw_fp_rw);
2473 VNET_FDBE_REFRELE(vnetp->hio_fp);
2604 vnet_t *vnetp = rx_ringp->vnetp;
2620 if (vnetp->pvid != vnetp->default_vlan_id) {
2621 vnet_rx_frames_untag(vnetp->pvid, &mp);
2635 vnet_t *vnetp = (vnet_t *)arg;
2646 if (vnetp->pvid != vnetp->default_vlan_id) {
2647 vnet_rx_frames_untag(vnetp->pvid, &mp);
2652 mac_rx_ring(vnetp->mh, ringp->handle, mp, ringp->gen_num);
2659 vnet_t *vnetp;
2661 vnetp = rx_grp->vnetp;
2663 if (bcmp(mac_addr, vnetp->curr_macaddr, ETHERADDRL) == 0) {
2668 vnetp->instance, __func__);
2676 vnet_t *vnetp;
2678 vnetp = rx_grp->vnetp;
2680 if (bcmp(mac_addr, vnetp->curr_macaddr, ETHERADDRL) == 0) {
2685 vnetp->instance, __func__, ether_sprintf((void *)mac_addr));
2690 vnet_hio_mac_init(vnet_t *vnetp, char *ifname)
2722 vnetp->hio_mh = mh;
2724 (void) snprintf(client_name, MAXNAMELEN, "vnet%d-%s", vnetp->instance,
2730 vnetp->hio_mch = mch;
2732 rv = mac_unicast_add(mch, vnetp->curr_macaddr, mac_flags, &muh, 0,
2737 vnetp->hio_muh = muh;
2740 macp->m_driver = vnetp;
2748 vnetp->curr_macaddr, rem_addr, &vnetp->hio_vhp, &vcb);
2755 mac_rx_set(vnetp->hio_mch, vnet_hio_rx_cb, vnetp);
2761 vnet_hio_mac_cleanup(vnetp);
2766 vnet_hio_mac_cleanup(vnet_t *vnetp)
2768 if (vnetp->hio_vhp != NULL) {
2769 vio_net_resource_unreg(vnetp->hio_vhp);
2770 vnetp->hio_vhp = NULL;
2773 if (vnetp->hio_muh != NULL) {
2774 (void) mac_unicast_remove(vnetp->hio_mch, vnetp->hio_muh);
2775 vnetp->hio_muh = NULL;
2778 if (vnetp->hio_mch != NULL) {
2779 mac_client_close(vnetp->hio_mch, 0);
2780 vnetp->hio_mch = NULL;
2783 if (vnetp->hio_mh != NULL) {
2784 mac_close(vnetp->hio_mh);
2785 vnetp->hio_mh = NULL;
2791 vnet_bind_hwrings(vnet_t *vnetp)
2803 mac_perim_enter_by_mh(vnetp->hio_mh, &mph1);
2806 hw_ring_cnt = mac_hwrings_get(vnetp->hio_mch, &vnetp->rx_hwgh, hw_rh,
2813 vnetp->instance, hw_ring_cnt);
2817 if (vnetp->rx_hwgh != NULL) {
2825 mac_rx_client_quiesce(vnetp->hio_mch);
2826 mac_srs_perm_quiesce(vnetp->hio_mch, B_TRUE);
2835 rx_grp = &vnetp->rx_grp[0];
2859 hw_ring_cnt = mac_hwrings_get(vnetp->hio_mch, &vnetp->tx_hwgh, hw_rh,
2866 vnetp->instance, hw_ring_cnt);
2876 tx_grp = &vnetp->tx_grp[0];
2883 mac_client_tx_notify(vnetp->hio_mch, vnet_tx_ring_update, vnetp);
2890 vnet_unbind_hwrings(vnetp);
2896 vnet_unbind_hwrings(vnet_t *vnetp)
2905 mac_perim_enter_by_mh(vnetp->hio_mh, &mph1);
2907 tx_grp = &vnetp->tx_grp[0];
2915 (void) mac_client_tx_notify(vnetp->hio_mch, NULL,
2918 rx_grp = &vnetp->rx_grp[0];
2931 if (vnetp->rx_hwgh != NULL) {
2932 vnetp->rx_hwgh = NULL;
2937 mac_srs_perm_quiesce(vnetp->hio_mch, B_FALSE);
2938 mac_rx_client_restart(vnetp->hio_mch);
2948 vnet_t *vnetp;
2955 vnetp = vresp->vnetp;
2957 rx_grp = &vnetp->rx_grp[0];
2974 mac_perim_enter_by_mh(vnetp->mh, &mph1);
2976 rx_ringp = vnet_alloc_pseudo_rx_ring(vnetp);
2979 vnetp->instance);
3000 vnet_free_pseudo_rx_ring(vnetp, rx_ringp);
3015 vnet_t *vnetp;
3021 vnetp = vresp->vnetp;
3023 rx_grp = &vnetp->rx_grp[0];
3044 mac_perim_enter_by_mh(vnetp->mh, &mph1);
3057 vnet_free_pseudo_rx_ring(vnetp, rx_ringp);
3074 vnet_unbind_hwrings(vresp->vnetp);
3096 rv = vnet_bind_hwrings(vresp->vnetp);
3112 vnet_t *vnetp = (vnet_t *)arg;
3114 *val = mac_stat_get(vnetp->hio_mh, stat);
3173 vnet_t *vnetp;
3177 vnetp = (vnet_t *)arg;
3179 if (vnetp == NULL) {
3188 vnet_force_link_state(vnetp, q, mp);
3200 vnet_force_link_state(vnet_t *vnetp, queue_t *q, mblk_t *mp)
3206 READ_ENTER(&vnetp->vsw_fp_rw);
3208 vresp = vnetp->vsw_fp;
3210 RW_EXIT(&vnetp->vsw_fp_rw);
3218 RW_EXIT(&vnetp->vsw_fp_rw);
3226 vnet_t *vnetp;
3228 vnetp = (vnet_t *)arg;
3230 if (vnetp == NULL) {