Print this page
OS-428 add link zonename kstat (change ks_data_size before init)
OS-428 add link zonename kstat

*** 19,133 **** * CDDL HEADER END */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * Data-Link Services Module */ #include <sys/dld_impl.h> #include <sys/mac_ether.h> ! static mac_stat_info_t i_dls_si[] = { ! { MAC_STAT_IFSPEED, "ifspeed", KSTAT_DATA_UINT64, 0 }, ! { MAC_STAT_MULTIRCV, "multircv", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_BRDCSTRCV, "brdcstrcv", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_MULTIXMT, "multixmt", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_BRDCSTXMT, "brdcstxmt", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_NORCVBUF, "norcvbuf", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_IERRORS, "ierrors", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_NOXMTBUF, "noxmtbuf", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_OERRORS, "oerrors", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_COLLISIONS, "collisions", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_RBYTES, "rbytes", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_IPACKETS, "ipackets", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_OBYTES, "obytes", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_OPACKETS, "opackets", KSTAT_DATA_UINT32, 0 }, ! { MAC_STAT_RBYTES, "rbytes64", KSTAT_DATA_UINT64, 0 }, ! { MAC_STAT_IPACKETS, "ipackets64", KSTAT_DATA_UINT64, 0 }, ! { MAC_STAT_OBYTES, "obytes64", KSTAT_DATA_UINT64, 0 }, ! { MAC_STAT_OPACKETS, "opackets64", KSTAT_DATA_UINT64, 0 }, ! { MAC_STAT_LINK_STATE, "link_state", KSTAT_DATA_UINT32, ! (uint64_t)LINK_STATE_UNKNOWN} ! }; - #define STAT_INFO_COUNT (sizeof (i_dls_si) / sizeof (i_dls_si[0])) - /* * Exported functions. */ int dls_stat_update(kstat_t *ksp, dls_link_t *dlp, int rw) { ! kstat_named_t *knp; ! uint_t i; ! uint64_t val; if (rw != KSTAT_READ) return (EACCES); ! knp = (kstat_named_t *)ksp->ks_data; ! for (i = 0; i < STAT_INFO_COUNT; i++) { ! val = mac_stat_get(dlp->dl_mh, i_dls_si[i].msi_stat); - switch (i_dls_si[i].msi_type) { - case KSTAT_DATA_UINT64: - knp->value.ui64 = val; - break; - case KSTAT_DATA_UINT32: - knp->value.ui32 = (uint32_t)val; - break; - default: - ASSERT(B_FALSE); - } - - knp++; - } - /* * Ethernet specific kstat "link_duplex" */ if (dlp->dl_mip->mi_nativemedia != DL_ETHER) { ! knp->value.ui32 = LINK_DUPLEX_UNKNOWN; } else { ! val = mac_stat_get(dlp->dl_mh, ETHER_STAT_LINK_DUPLEX); ! knp->value.ui32 = (uint32_t)val; } - knp++; - knp->value.ui32 = dlp->dl_unknowns; return (0); } int dls_stat_create(const char *module, int instance, const char *name, zoneid_t zoneid, int (*update)(struct kstat *, int), void *private, ! kstat_t **kspp) { kstat_t *ksp; ! kstat_named_t *knp; ! uint_t i; if ((ksp = kstat_create_zone(module, instance, name, "net", ! KSTAT_TYPE_NAMED, STAT_INFO_COUNT + 2, 0, zoneid)) == NULL) { return (EINVAL); } ksp->ks_update = update; ksp->ks_private = private; ! knp = (kstat_named_t *)ksp->ks_data; ! for (i = 0; i < STAT_INFO_COUNT; i++) { ! kstat_named_init(knp, i_dls_si[i].msi_name, ! i_dls_si[i].msi_type); ! knp++; } - kstat_named_init(knp++, "link_duplex", KSTAT_DATA_UINT32); - kstat_named_init(knp, "unknowns", KSTAT_DATA_UINT32); kstat_install(ksp); *kspp = ksp; return (0); } --- 19,185 ---- * CDDL HEADER END */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright 2011 Joyent, Inc. All rights reserved. */ /* * Data-Link Services Module */ #include <sys/dld_impl.h> #include <sys/mac_ether.h> ! /* ! * structure for link kstats ! */ ! typedef struct { ! kstat_named_t dk_ifspeed; ! kstat_named_t dk_multircv; ! kstat_named_t dk_brdcstrcv; ! kstat_named_t dk_multixmt; ! kstat_named_t dk_brdcstxmt; ! kstat_named_t dk_norcvbuf; ! kstat_named_t dk_ierrors; ! kstat_named_t dk_noxmtbuf; ! kstat_named_t dk_oerrors; ! kstat_named_t dk_collisions; ! kstat_named_t dk_rbytes; ! kstat_named_t dk_ipackets; ! kstat_named_t dk_obytes; ! kstat_named_t dk_opackets; ! kstat_named_t dk_rbytes64; ! kstat_named_t dk_ipackets64; ! kstat_named_t dk_obytes64; ! kstat_named_t dk_opackets64; ! kstat_named_t dk_link_state; ! kstat_named_t dk_link_duplex; ! kstat_named_t dk_unknowns; ! kstat_named_t dk_zonename; ! } dls_kstat_t; /* * Exported functions. */ int dls_stat_update(kstat_t *ksp, dls_link_t *dlp, int rw) { ! dls_kstat_t *dkp = ksp->ks_data; if (rw != KSTAT_READ) return (EACCES); ! dkp->dk_ifspeed.value.ui64 = mac_stat_get(dlp->dl_mh, MAC_STAT_IFSPEED); ! dkp->dk_multircv.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_MULTIRCV); ! dkp->dk_brdcstrcv.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_BRDCSTRCV); ! dkp->dk_multixmt.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_MULTIXMT); ! dkp->dk_brdcstxmt.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_BRDCSTXMT); ! dkp->dk_norcvbuf.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_NORCVBUF); ! dkp->dk_ierrors.value.ui32 = mac_stat_get(dlp->dl_mh, MAC_STAT_IERRORS); ! dkp->dk_noxmtbuf.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_NOXMTBUF); ! dkp->dk_oerrors.value.ui32 = mac_stat_get(dlp->dl_mh, MAC_STAT_OERRORS); ! dkp->dk_collisions.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_COLLISIONS); ! dkp->dk_rbytes.value.ui32 = mac_stat_get(dlp->dl_mh, MAC_STAT_RBYTES); ! dkp->dk_ipackets.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_IPACKETS); ! dkp->dk_obytes.value.ui32 = mac_stat_get(dlp->dl_mh, MAC_STAT_OBYTES); ! dkp->dk_opackets.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_OPACKETS); ! dkp->dk_rbytes64.value.ui64 = mac_stat_get(dlp->dl_mh, MAC_STAT_RBYTES); ! dkp->dk_ipackets64.value.ui64 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_IPACKETS); ! dkp->dk_obytes64.value.ui64 = mac_stat_get(dlp->dl_mh, MAC_STAT_OBYTES); ! dkp->dk_opackets64.value.ui64 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_OPACKETS); ! dkp->dk_link_state.value.ui32 = mac_stat_get(dlp->dl_mh, ! MAC_STAT_LINK_STATE); /* * Ethernet specific kstat "link_duplex" */ if (dlp->dl_mip->mi_nativemedia != DL_ETHER) { ! dkp->dk_link_duplex.value.ui32 = LINK_DUPLEX_UNKNOWN; } else { ! dkp->dk_link_duplex.value.ui32 = ! (uint32_t)mac_stat_get(dlp->dl_mh, ETHER_STAT_LINK_DUPLEX); } + dkp->dk_unknowns.value.ui32 = dlp->dl_unknowns; + return (0); } int dls_stat_create(const char *module, int instance, const char *name, zoneid_t zoneid, int (*update)(struct kstat *, int), void *private, ! kstat_t **kspp, zoneid_t newzoneid) { kstat_t *ksp; ! zone_t *zone; ! dls_kstat_t *dkp; if ((ksp = kstat_create_zone(module, instance, name, "net", ! KSTAT_TYPE_NAMED, sizeof (dls_kstat_t) / sizeof (kstat_named_t), ! KSTAT_FLAG_VIRTUAL, zoneid)) == NULL) { return (EINVAL); } ksp->ks_update = update; ksp->ks_private = private; + dkp = ksp->ks_data = kmem_zalloc(sizeof (dls_kstat_t), KM_SLEEP); + if ((zone = zone_find_by_id(newzoneid)) != NULL) { + ksp->ks_data_size += strlen(zone->zone_name) + 1; + } ! kstat_named_init(&dkp->dk_ifspeed, "ifspeed", KSTAT_DATA_UINT64); ! kstat_named_init(&dkp->dk_multircv, "multircv", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_brdcstrcv, "brdcstrcv", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_multixmt, "multixmt", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_brdcstxmt, "brdcstxmt", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_norcvbuf, "norcvbuf", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_ierrors, "ierrors", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_noxmtbuf, "noxmtbuf", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_oerrors, "oerrors", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_collisions, "collisions", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_rbytes, "rbytes", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_ipackets, "ipackets", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_obytes, "obytes", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_opackets, "opackets", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_rbytes64, "rbytes64", KSTAT_DATA_UINT64); ! kstat_named_init(&dkp->dk_ipackets64, "ipackets64", KSTAT_DATA_UINT64); ! kstat_named_init(&dkp->dk_obytes64, "obytes64", KSTAT_DATA_UINT64); ! kstat_named_init(&dkp->dk_opackets64, "opackets64", KSTAT_DATA_UINT64); ! kstat_named_init(&dkp->dk_link_state, "link_state", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_link_duplex, "link_duplex", ! KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_unknowns, "unknowns", KSTAT_DATA_UINT32); ! kstat_named_init(&dkp->dk_zonename, "zonename", KSTAT_DATA_STRING); ! ! if (zone != NULL) { ! kstat_named_setstr(&dkp->dk_zonename, zone->zone_name); ! zone_rele(zone); } kstat_install(ksp); *kspp = ksp; return (0); + } + + void + dls_stat_delete(kstat_t *ksp) + { + void *data; + if (ksp != NULL) { + data = ksp->ks_data; + kstat_delete(ksp); + kmem_free(data, sizeof (dls_kstat_t)); + } }