xref: /illumos-gate/usr/src/uts/common/io/dls/dls_stat.c (revision 2b24ab6b)
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>
31d62bc4baSyz #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 },
51d62bc4baSyz 	{ MAC_STAT_OPACKETS, "opackets64", KSTAT_DATA_UINT64, 0 },
52d62bc4baSyz 	{ MAC_STAT_LINK_STATE, "link_state", KSTAT_DATA_UINT32,
53d62bc4baSyz 	    (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 
58d62bc4baSyz /*
59d62bc4baSyz  * Exported functions.
60d62bc4baSyz  */
61d62bc4baSyz int
dls_stat_update(kstat_t * ksp,dls_link_t * dlp,int rw)62da14cebeSEric Cheng dls_stat_update(kstat_t *ksp, dls_link_t *dlp, int rw)
63d62bc4baSyz {
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 
89d62bc4baSyz 	/*
90d62bc4baSyz 	 * Ethernet specific kstat "link_duplex"
91d62bc4baSyz 	 */
92d62bc4baSyz 	if (dlp->dl_mip->mi_nativemedia != DL_ETHER) {
93d62bc4baSyz 		knp->value.ui32 = LINK_DUPLEX_UNKNOWN;
94d62bc4baSyz 	} else {
95d62bc4baSyz 		val = mac_stat_get(dlp->dl_mh, ETHER_STAT_LINK_DUPLEX);
96d62bc4baSyz 		knp->value.ui32 = (uint32_t)val;
97d62bc4baSyz 	}
98d62bc4baSyz 	knp++;
997c478bd9Sstevel@tonic-gate 	knp->value.ui32 = dlp->dl_unknowns;
1007c478bd9Sstevel@tonic-gate 
1017c478bd9Sstevel@tonic-gate 	return (0);
1027c478bd9Sstevel@tonic-gate }
1037c478bd9Sstevel@tonic-gate 
104d62bc4baSyz 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)105d62bc4baSyz 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 {
109d62bc4baSyz 	kstat_t		*ksp;
110d62bc4baSyz 	kstat_named_t	*knp;
111d62bc4baSyz 	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) {
115d62bc4baSyz 		return (EINVAL);
116d62bc4baSyz 	}
1177c478bd9Sstevel@tonic-gate 
118d62bc4baSyz 	ksp->ks_update = update;
119d62bc4baSyz 	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 
128d62bc4baSyz 	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);
131d62bc4baSyz 	*kspp = ksp;
132d62bc4baSyz 	return (0);
133d62bc4baSyz }
134