17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5ba2e4443Sseb * Common Development and Distribution License (the "License"). 6ba2e4443Sseb * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*2b24ab6bSSebastien Roy * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate /* 277c478bd9Sstevel@tonic-gate * Data-Link Services Module 287c478bd9Sstevel@tonic-gate */ 297c478bd9Sstevel@tonic-gate 30da14cebeSEric Cheng #include <sys/dld_impl.h> 31d62bc4baSyz147064 #include <sys/mac_ether.h> 327c478bd9Sstevel@tonic-gate 33ba2e4443Sseb static mac_stat_info_t i_dls_si[] = { 34ba2e4443Sseb { MAC_STAT_IFSPEED, "ifspeed", KSTAT_DATA_UINT64, 0 }, 35ba2e4443Sseb { MAC_STAT_MULTIRCV, "multircv", KSTAT_DATA_UINT32, 0 }, 36ba2e4443Sseb { MAC_STAT_BRDCSTRCV, "brdcstrcv", KSTAT_DATA_UINT32, 0 }, 37ba2e4443Sseb { MAC_STAT_MULTIXMT, "multixmt", KSTAT_DATA_UINT32, 0 }, 38ba2e4443Sseb { MAC_STAT_BRDCSTXMT, "brdcstxmt", KSTAT_DATA_UINT32, 0 }, 39ba2e4443Sseb { MAC_STAT_NORCVBUF, "norcvbuf", KSTAT_DATA_UINT32, 0 }, 40ba2e4443Sseb { MAC_STAT_IERRORS, "ierrors", KSTAT_DATA_UINT32, 0 }, 41ba2e4443Sseb { MAC_STAT_NOXMTBUF, "noxmtbuf", KSTAT_DATA_UINT32, 0 }, 42ba2e4443Sseb { MAC_STAT_OERRORS, "oerrors", KSTAT_DATA_UINT32, 0 }, 43ba2e4443Sseb { MAC_STAT_COLLISIONS, "collisions", KSTAT_DATA_UINT32, 0 }, 44ba2e4443Sseb { MAC_STAT_RBYTES, "rbytes", KSTAT_DATA_UINT32, 0 }, 45ba2e4443Sseb { MAC_STAT_IPACKETS, "ipackets", KSTAT_DATA_UINT32, 0 }, 46ba2e4443Sseb { MAC_STAT_OBYTES, "obytes", KSTAT_DATA_UINT32, 0 }, 47ba2e4443Sseb { MAC_STAT_OPACKETS, "opackets", KSTAT_DATA_UINT32, 0 }, 48ba2e4443Sseb { MAC_STAT_RBYTES, "rbytes64", KSTAT_DATA_UINT64, 0 }, 49ba2e4443Sseb { MAC_STAT_IPACKETS, "ipackets64", KSTAT_DATA_UINT64, 0 }, 50ba2e4443Sseb { MAC_STAT_OBYTES, "obytes64", KSTAT_DATA_UINT64, 0 }, 51d62bc4baSyz147064 { MAC_STAT_OPACKETS, "opackets64", KSTAT_DATA_UINT64, 0 }, 52d62bc4baSyz147064 { MAC_STAT_LINK_STATE, "link_state", KSTAT_DATA_UINT32, 53d62bc4baSyz147064 (uint64_t)LINK_STATE_UNKNOWN} 547c478bd9Sstevel@tonic-gate }; 557c478bd9Sstevel@tonic-gate 567c478bd9Sstevel@tonic-gate #define STAT_INFO_COUNT (sizeof (i_dls_si) / sizeof (i_dls_si[0])) 577c478bd9Sstevel@tonic-gate 587c478bd9Sstevel@tonic-gate /* 59d62bc4baSyz147064 * Exported functions. 60d62bc4baSyz147064 */ 61d62bc4baSyz147064 int 62da14cebeSEric Cheng dls_stat_update(kstat_t *ksp, dls_link_t *dlp, int rw) 63d62bc4baSyz147064 { 647c478bd9Sstevel@tonic-gate kstat_named_t *knp; 657c478bd9Sstevel@tonic-gate uint_t i; 667c478bd9Sstevel@tonic-gate uint64_t val; 677c478bd9Sstevel@tonic-gate 687c478bd9Sstevel@tonic-gate if (rw != KSTAT_READ) 697c478bd9Sstevel@tonic-gate return (EACCES); 707c478bd9Sstevel@tonic-gate 717c478bd9Sstevel@tonic-gate knp = (kstat_named_t *)ksp->ks_data; 727c478bd9Sstevel@tonic-gate for (i = 0; i < STAT_INFO_COUNT; i++) { 73ba2e4443Sseb val = mac_stat_get(dlp->dl_mh, i_dls_si[i].msi_stat); 747c478bd9Sstevel@tonic-gate 75ba2e4443Sseb switch (i_dls_si[i].msi_type) { 767c478bd9Sstevel@tonic-gate case KSTAT_DATA_UINT64: 777c478bd9Sstevel@tonic-gate knp->value.ui64 = val; 787c478bd9Sstevel@tonic-gate break; 797c478bd9Sstevel@tonic-gate case KSTAT_DATA_UINT32: 807c478bd9Sstevel@tonic-gate knp->value.ui32 = (uint32_t)val; 817c478bd9Sstevel@tonic-gate break; 827c478bd9Sstevel@tonic-gate default: 837c478bd9Sstevel@tonic-gate ASSERT(B_FALSE); 847c478bd9Sstevel@tonic-gate } 857c478bd9Sstevel@tonic-gate 867c478bd9Sstevel@tonic-gate knp++; 877c478bd9Sstevel@tonic-gate } 887c478bd9Sstevel@tonic-gate 89d62bc4baSyz147064 /* 90d62bc4baSyz147064 * Ethernet specific kstat "link_duplex" 91d62bc4baSyz147064 */ 92d62bc4baSyz147064 if (dlp->dl_mip->mi_nativemedia != DL_ETHER) { 93d62bc4baSyz147064 knp->value.ui32 = LINK_DUPLEX_UNKNOWN; 94d62bc4baSyz147064 } else { 95d62bc4baSyz147064 val = mac_stat_get(dlp->dl_mh, ETHER_STAT_LINK_DUPLEX); 96d62bc4baSyz147064 knp->value.ui32 = (uint32_t)val; 97d62bc4baSyz147064 } 98d62bc4baSyz147064 knp++; 997c478bd9Sstevel@tonic-gate knp->value.ui32 = dlp->dl_unknowns; 1007c478bd9Sstevel@tonic-gate 1017c478bd9Sstevel@tonic-gate return (0); 1027c478bd9Sstevel@tonic-gate } 1037c478bd9Sstevel@tonic-gate 104d62bc4baSyz147064 int 105d62bc4baSyz147064 dls_stat_create(const char *module, int instance, const char *name, 106*2b24ab6bSSebastien Roy zoneid_t zoneid, int (*update)(struct kstat *, int), void *private, 107*2b24ab6bSSebastien Roy kstat_t **kspp) 1087c478bd9Sstevel@tonic-gate { 1097c478bd9Sstevel@tonic-gate kstat_t *ksp; 1107c478bd9Sstevel@tonic-gate kstat_named_t *knp; 1117c478bd9Sstevel@tonic-gate uint_t i; 1127c478bd9Sstevel@tonic-gate 113*2b24ab6bSSebastien Roy if ((ksp = kstat_create_zone(module, instance, name, "net", 114*2b24ab6bSSebastien Roy KSTAT_TYPE_NAMED, STAT_INFO_COUNT + 2, 0, zoneid)) == NULL) { 115d62bc4baSyz147064 return (EINVAL); 116d62bc4baSyz147064 } 1177c478bd9Sstevel@tonic-gate 118d62bc4baSyz147064 ksp->ks_update = update; 119d62bc4baSyz147064 ksp->ks_private = private; 1207c478bd9Sstevel@tonic-gate 1217c478bd9Sstevel@tonic-gate knp = (kstat_named_t *)ksp->ks_data; 1227c478bd9Sstevel@tonic-gate for (i = 0; i < STAT_INFO_COUNT; i++) { 123ba2e4443Sseb kstat_named_init(knp, i_dls_si[i].msi_name, 124ba2e4443Sseb i_dls_si[i].msi_type); 1257c478bd9Sstevel@tonic-gate knp++; 1267c478bd9Sstevel@tonic-gate } 1277c478bd9Sstevel@tonic-gate 128d62bc4baSyz147064 kstat_named_init(knp++, "link_duplex", KSTAT_DATA_UINT32); 1297c478bd9Sstevel@tonic-gate kstat_named_init(knp, "unknowns", KSTAT_DATA_UINT32); 1307c478bd9Sstevel@tonic-gate kstat_install(ksp); 131d62bc4baSyz147064 *kspp = ksp; 132d62bc4baSyz147064 return (0); 133d62bc4baSyz147064 } 134