15373Sraghuram /* 25373Sraghuram * CDDL HEADER START 35373Sraghuram * 45373Sraghuram * The contents of this file are subject to the terms of the 55373Sraghuram * Common Development and Distribution License (the "License"). 65373Sraghuram * You may not use this file except in compliance with the License. 75373Sraghuram * 85373Sraghuram * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95373Sraghuram * or http://www.opensolaris.org/os/licensing. 105373Sraghuram * See the License for the specific language governing permissions 115373Sraghuram * and limitations under the License. 125373Sraghuram * 135373Sraghuram * When distributing Covered Code, include this CDDL HEADER in each 145373Sraghuram * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155373Sraghuram * If applicable, add the following below this CDDL HEADER, with the 165373Sraghuram * fields enclosed by brackets "[]" replaced with your own identifying 175373Sraghuram * information: Portions Copyright [yyyy] [name of copyright owner] 185373Sraghuram * 195373Sraghuram * CDDL HEADER END 205373Sraghuram */ 215373Sraghuram 225373Sraghuram /* 23*5935Ssb155480 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 245373Sraghuram * Use is subject to license terms. 255373Sraghuram */ 265373Sraghuram 275373Sraghuram #pragma ident "%Z%%M% %I% %E% SMI" 285373Sraghuram 295373Sraghuram #include <sys/types.h> 305373Sraghuram #include <sys/errno.h> 315373Sraghuram #include <sys/param.h> 325373Sraghuram #include <sys/stream.h> 335373Sraghuram #include <sys/strsubr.h> 345373Sraghuram #include <sys/kmem.h> 355373Sraghuram #include <sys/ksynch.h> 365373Sraghuram #include <sys/stat.h> 375373Sraghuram #include <sys/vgen_stats.h> 385373Sraghuram 395373Sraghuram /* 405373Sraghuram * A set of common kstat statistics related functions that are 415373Sraghuram * used by both vnet and vsw drivers to maintain the statistics specific 425373Sraghuram * LDCs. 435373Sraghuram */ 445373Sraghuram 455373Sraghuram /* 465373Sraghuram * Setup kstats for the LDC statistics. 475373Sraghuram * NOTE: the synchronization for the statistics is the 485373Sraghuram * responsibility of the caller. 495373Sraghuram */ 505373Sraghuram kstat_t * 515373Sraghuram vgen_setup_kstats(char *ks_mod, int instance, 525373Sraghuram char *ks_name, vgen_stats_t *statsp) 535373Sraghuram { 545373Sraghuram kstat_t *ksp; 555373Sraghuram vgen_kstats_t *ldckp; 565373Sraghuram size_t size; 575373Sraghuram 585373Sraghuram size = sizeof (vgen_kstats_t) / sizeof (kstat_named_t); 595373Sraghuram ksp = kstat_create(ks_mod, instance, ks_name, "net", KSTAT_TYPE_NAMED, 605373Sraghuram size, 0); 615373Sraghuram if (ksp == NULL) { 625373Sraghuram return (NULL); 635373Sraghuram } 645373Sraghuram 655373Sraghuram ldckp = (vgen_kstats_t *)ksp->ks_data; 665373Sraghuram kstat_named_init(&ldckp->ipackets, "ipackets", 675373Sraghuram KSTAT_DATA_ULONG); 685373Sraghuram kstat_named_init(&ldckp->ipackets64, "ipackets64", 695373Sraghuram KSTAT_DATA_ULONGLONG); 705373Sraghuram kstat_named_init(&ldckp->ierrors, "ierrors", 715373Sraghuram KSTAT_DATA_ULONG); 725373Sraghuram kstat_named_init(&ldckp->opackets, "opackets", 735373Sraghuram KSTAT_DATA_ULONG); 745373Sraghuram kstat_named_init(&ldckp->opackets64, "opackets64", 755373Sraghuram KSTAT_DATA_ULONGLONG); 765373Sraghuram kstat_named_init(&ldckp->oerrors, "oerrors", 775373Sraghuram KSTAT_DATA_ULONG); 785373Sraghuram 795373Sraghuram 805373Sraghuram /* MIB II kstat variables */ 815373Sraghuram kstat_named_init(&ldckp->rbytes, "rbytes", 825373Sraghuram KSTAT_DATA_ULONG); 835373Sraghuram kstat_named_init(&ldckp->rbytes64, "rbytes64", 845373Sraghuram KSTAT_DATA_ULONGLONG); 855373Sraghuram kstat_named_init(&ldckp->obytes, "obytes", 865373Sraghuram KSTAT_DATA_ULONG); 875373Sraghuram kstat_named_init(&ldckp->obytes64, "obytes64", 885373Sraghuram KSTAT_DATA_ULONGLONG); 895373Sraghuram kstat_named_init(&ldckp->multircv, "multircv", 905373Sraghuram KSTAT_DATA_ULONG); 915373Sraghuram kstat_named_init(&ldckp->multixmt, "multixmt", 925373Sraghuram KSTAT_DATA_ULONG); 935373Sraghuram kstat_named_init(&ldckp->brdcstrcv, "brdcstrcv", 945373Sraghuram KSTAT_DATA_ULONG); 955373Sraghuram kstat_named_init(&ldckp->brdcstxmt, "brdcstxmt", 965373Sraghuram KSTAT_DATA_ULONG); 975373Sraghuram kstat_named_init(&ldckp->norcvbuf, "norcvbuf", 985373Sraghuram KSTAT_DATA_ULONG); 995373Sraghuram kstat_named_init(&ldckp->noxmtbuf, "noxmtbuf", 1005373Sraghuram KSTAT_DATA_ULONG); 1015373Sraghuram 1025373Sraghuram /* Tx stats */ 1035373Sraghuram kstat_named_init(&ldckp->tx_no_desc, "tx_no_desc", 1045373Sraghuram KSTAT_DATA_ULONG); 105*5935Ssb155480 kstat_named_init(&ldckp->tx_qfull, "tx_qfull", 106*5935Ssb155480 KSTAT_DATA_ULONG); 107*5935Ssb155480 kstat_named_init(&ldckp->tx_pri_fail, "tx_pri_fail", 108*5935Ssb155480 KSTAT_DATA_ULONG); 109*5935Ssb155480 kstat_named_init(&ldckp->tx_pri_packets, "tx_pri_packets", 110*5935Ssb155480 KSTAT_DATA_ULONGLONG); 111*5935Ssb155480 kstat_named_init(&ldckp->tx_pri_bytes, "tx_pri_bytes", 112*5935Ssb155480 KSTAT_DATA_ULONGLONG); 1135373Sraghuram 1145373Sraghuram /* Rx stats */ 1155373Sraghuram kstat_named_init(&ldckp->rx_allocb_fail, "rx_allocb_fail", 1165373Sraghuram KSTAT_DATA_ULONG); 1175373Sraghuram kstat_named_init(&ldckp->rx_vio_allocb_fail, "rx_vio_allocb_fail", 1185373Sraghuram KSTAT_DATA_ULONG); 1195373Sraghuram kstat_named_init(&ldckp->rx_lost_pkts, "rx_lost_pkts", 1205373Sraghuram KSTAT_DATA_ULONG); 121*5935Ssb155480 kstat_named_init(&ldckp->rx_pri_fail, "rx_pri_fail", 122*5935Ssb155480 KSTAT_DATA_ULONG); 123*5935Ssb155480 kstat_named_init(&ldckp->rx_pri_packets, "rx_pri_packets", 124*5935Ssb155480 KSTAT_DATA_ULONGLONG); 125*5935Ssb155480 kstat_named_init(&ldckp->rx_pri_bytes, "rx_pri_bytes", 126*5935Ssb155480 KSTAT_DATA_ULONGLONG); 1275373Sraghuram 1285373Sraghuram /* Interrupt stats */ 1295373Sraghuram kstat_named_init(&ldckp->callbacks, "callbacks", 1305373Sraghuram KSTAT_DATA_ULONG); 1315373Sraghuram kstat_named_init(&ldckp->dring_data_acks, "dring_data_acks", 1325373Sraghuram KSTAT_DATA_ULONG); 1335373Sraghuram kstat_named_init(&ldckp->dring_stopped_acks, "dring_stopped_acks", 1345373Sraghuram KSTAT_DATA_ULONG); 1355373Sraghuram kstat_named_init(&ldckp->dring_data_msgs, "dring_data_msgs", 1365373Sraghuram KSTAT_DATA_ULONG); 1375373Sraghuram 1385373Sraghuram ksp->ks_update = vgen_kstat_update; 1395373Sraghuram ksp->ks_private = (void *)statsp; 1405373Sraghuram kstat_install(ksp); 1415373Sraghuram return (ksp); 1425373Sraghuram } 1435373Sraghuram 1445373Sraghuram /* 1455373Sraghuram * Destroy kstats. 1465373Sraghuram */ 1475373Sraghuram void 1485373Sraghuram vgen_destroy_kstats(kstat_t *ksp) 1495373Sraghuram { 1505373Sraghuram if (ksp != NULL) 1515373Sraghuram kstat_delete(ksp); 1525373Sraghuram } 1535373Sraghuram 1545373Sraghuram /* 1555373Sraghuram * Update the kstats. 1565373Sraghuram */ 1575373Sraghuram int 1585373Sraghuram vgen_kstat_update(kstat_t *ksp, int rw) 1595373Sraghuram { 1605373Sraghuram vgen_stats_t *statsp; 1615373Sraghuram vgen_kstats_t *ldckp; 1625373Sraghuram 1635373Sraghuram statsp = (vgen_stats_t *)ksp->ks_private; 1645373Sraghuram ldckp = (vgen_kstats_t *)ksp->ks_data; 1655373Sraghuram 1665373Sraghuram if (rw == KSTAT_READ) { 167*5935Ssb155480 ldckp->ipackets.value.ul = (uint32_t)statsp->ipackets + 168*5935Ssb155480 (uint32_t)statsp->rx_pri_packets; 169*5935Ssb155480 ldckp->ipackets64.value.ull = statsp->ipackets + 170*5935Ssb155480 statsp->rx_pri_packets; 1715373Sraghuram ldckp->ierrors.value.ul = statsp->ierrors; 172*5935Ssb155480 ldckp->opackets.value.ul = (uint32_t)statsp->opackets + 173*5935Ssb155480 (uint32_t)statsp->tx_pri_packets; 174*5935Ssb155480 ldckp->opackets64.value.ull = statsp->opackets + 175*5935Ssb155480 statsp->tx_pri_packets; 1765373Sraghuram ldckp->oerrors.value.ul = statsp->oerrors; 1775373Sraghuram 1785373Sraghuram /* 1795373Sraghuram * MIB II kstat variables 1805373Sraghuram */ 181*5935Ssb155480 ldckp->rbytes.value.ul = (uint32_t)statsp->rbytes + 182*5935Ssb155480 (uint32_t)statsp->rx_pri_bytes; 183*5935Ssb155480 ldckp->rbytes64.value.ull = statsp->rbytes + 184*5935Ssb155480 statsp->rx_pri_bytes; 185*5935Ssb155480 ldckp->obytes.value.ul = (uint32_t)statsp->obytes + 186*5935Ssb155480 (uint32_t)statsp->tx_pri_bytes; 187*5935Ssb155480 ldckp->obytes64.value.ull = statsp->obytes + 188*5935Ssb155480 statsp->tx_pri_bytes; 1895373Sraghuram ldckp->multircv.value.ul = statsp->multircv; 1905373Sraghuram ldckp->multixmt.value.ul = statsp->multixmt; 1915373Sraghuram ldckp->brdcstrcv.value.ul = statsp->brdcstrcv; 1925373Sraghuram ldckp->brdcstxmt.value.ul = statsp->brdcstxmt; 1935373Sraghuram ldckp->norcvbuf.value.ul = statsp->norcvbuf; 1945373Sraghuram ldckp->noxmtbuf.value.ul = statsp->noxmtbuf; 1955373Sraghuram 1965373Sraghuram ldckp->tx_no_desc.value.ul = statsp->tx_no_desc; 197*5935Ssb155480 ldckp->tx_qfull.value.ul = statsp->tx_qfull; 198*5935Ssb155480 ldckp->tx_pri_fail.value.ul = statsp->tx_pri_fail; 199*5935Ssb155480 ldckp->tx_pri_packets.value.ull = statsp->tx_pri_packets; 200*5935Ssb155480 ldckp->tx_pri_bytes.value.ull = statsp->tx_pri_bytes; 2015373Sraghuram 2025373Sraghuram ldckp->rx_allocb_fail.value.ul = statsp->rx_allocb_fail; 2035373Sraghuram ldckp->rx_vio_allocb_fail.value.ul = statsp->rx_vio_allocb_fail; 2045373Sraghuram ldckp->rx_lost_pkts.value.ul = statsp->rx_lost_pkts; 205*5935Ssb155480 ldckp->rx_pri_fail.value.ul = statsp->rx_pri_fail; 206*5935Ssb155480 ldckp->rx_pri_packets.value.ull = statsp->rx_pri_packets; 207*5935Ssb155480 ldckp->rx_pri_bytes.value.ull = statsp->rx_pri_bytes; 2085373Sraghuram 2095373Sraghuram ldckp->callbacks.value.ul = statsp->callbacks; 2105373Sraghuram ldckp->dring_data_acks.value.ul = statsp->dring_data_acks; 2115373Sraghuram ldckp->dring_stopped_acks.value.ul = statsp->dring_stopped_acks; 2125373Sraghuram ldckp->dring_data_msgs.value.ul = statsp->dring_data_msgs; 2135373Sraghuram } else { 2145373Sraghuram statsp->ipackets = ldckp->ipackets64.value.ull; 2155373Sraghuram statsp->ierrors = ldckp->ierrors.value.ul; 2165373Sraghuram statsp->opackets = ldckp->opackets64.value.ull; 2175373Sraghuram statsp->oerrors = ldckp->oerrors.value.ul; 2185373Sraghuram 2195373Sraghuram /* 2205373Sraghuram * MIB II kstat variables 2215373Sraghuram */ 2225373Sraghuram statsp->rbytes = ldckp->rbytes64.value.ull; 2235373Sraghuram statsp->obytes = ldckp->obytes64.value.ull; 2245373Sraghuram statsp->multircv = ldckp->multircv.value.ul; 2255373Sraghuram statsp->multixmt = ldckp->multixmt.value.ul; 2265373Sraghuram statsp->brdcstrcv = ldckp->brdcstrcv.value.ul; 2275373Sraghuram statsp->brdcstxmt = ldckp->brdcstxmt.value.ul; 2285373Sraghuram statsp->norcvbuf = ldckp->norcvbuf.value.ul; 2295373Sraghuram statsp->noxmtbuf = ldckp->noxmtbuf.value.ul; 2305373Sraghuram 2315373Sraghuram statsp->tx_no_desc = ldckp->tx_no_desc.value.ul; 232*5935Ssb155480 statsp->tx_qfull = ldckp->tx_qfull.value.ul; 233*5935Ssb155480 statsp->tx_pri_fail = ldckp->tx_pri_fail.value.ul; 234*5935Ssb155480 statsp->tx_pri_packets = ldckp->tx_pri_packets.value.ull; 235*5935Ssb155480 statsp->tx_pri_bytes = ldckp->tx_pri_bytes.value.ull; 2365373Sraghuram 2375373Sraghuram statsp->rx_allocb_fail = ldckp->rx_allocb_fail.value.ul; 2385373Sraghuram statsp->rx_vio_allocb_fail = ldckp->rx_vio_allocb_fail.value.ul; 2395373Sraghuram statsp->rx_lost_pkts = ldckp->rx_lost_pkts.value.ul; 240*5935Ssb155480 statsp->rx_pri_fail = ldckp->rx_pri_fail.value.ul; 241*5935Ssb155480 statsp->rx_pri_packets = ldckp->rx_pri_packets.value.ull; 242*5935Ssb155480 statsp->rx_pri_bytes = ldckp->rx_pri_bytes.value.ull; 2435373Sraghuram 2445373Sraghuram statsp->callbacks = ldckp->callbacks.value.ul; 2455373Sraghuram statsp->dring_data_acks = ldckp->dring_data_acks.value.ul; 2465373Sraghuram statsp->dring_stopped_acks = ldckp->dring_stopped_acks.value.ul; 2475373Sraghuram statsp->dring_data_msgs = ldckp->dring_data_msgs.value.ul; 2485373Sraghuram } 2495373Sraghuram 2505373Sraghuram return (0); 2515373Sraghuram } 252