1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* 27 * Copyright 2019 OmniOS Community Edition (OmniOSce) Association. 28 */ 29 30 #ifndef _LIBDLSTAT_H 31 #define _LIBDLSTAT_H 32 33 /* 34 * This file includes structures, macros and common routines shared by all 35 * data-link administration, and routines which are used to retrieve and 36 * display statistics. 37 */ 38 39 #include <kstat.h> 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 #define LINK_REPORT 1 46 #define FLOW_REPORT 2 47 48 #define DLSTAT_INVALID_ENTRY -1 49 #define MAXSTATNAMELEN 256 50 /* 51 * Definitions common to all stats 52 */ 53 typedef struct dladm_stat_chain_s { 54 char dc_statheader[MAXSTATNAMELEN]; 55 void *dc_statentry; 56 struct dladm_stat_chain_s *dc_next; 57 } dladm_stat_chain_t; 58 59 typedef enum { 60 DLADM_STAT_RX_LANE = 0, /* Per lane rx stats */ 61 DLADM_STAT_TX_LANE, /* Per lane tx stats */ 62 DLADM_STAT_RX_LANE_TOTAL, /* Stats summed across all rx lanes */ 63 DLADM_STAT_TX_LANE_TOTAL, /* Stats summed across all tx lanes */ 64 DLADM_STAT_RX_LANE_FOUT, /* Per fanout (rx lane) stats */ 65 DLADM_STAT_RX_RING, /* Per ring rx stats */ 66 DLADM_STAT_TX_RING, /* Per ring tx stats */ 67 DLADM_STAT_RX_RING_TOTAL, /* Stats summed across all rx rings */ 68 DLADM_STAT_TX_RING_TOTAL, /* Stats summed across all tx rings */ 69 DLADM_STAT_TOTAL, /* Summary view */ 70 DLADM_STAT_AGGR_PORT, /* Aggr port stats */ 71 DLADM_STAT_MISC, /* Misc stats */ 72 DLADM_STAT_NUM_STATS /* This must always be the last entry */ 73 } dladm_stat_type_t; 74 75 /* 76 * Definitions for rx lane stats 77 */ 78 typedef struct rx_lane_stat_s { 79 uint64_t rl_ipackets; 80 uint64_t rl_rbytes; 81 uint64_t rl_lclpackets; 82 uint64_t rl_lclbytes; 83 uint64_t rl_intrs; 84 uint64_t rl_intrbytes; 85 uint64_t rl_pollbytes; 86 uint64_t rl_polls; 87 uint64_t rl_sdrops; 88 uint64_t rl_chl10; 89 uint64_t rl_ch10_50; 90 uint64_t rl_chg50; 91 } rx_lane_stat_t; 92 93 typedef enum { 94 L_HWLANE, 95 L_SWLANE, 96 L_LOCAL, 97 L_LCLSWLANE, 98 L_BCAST, 99 L_DFNCT 100 } lane_type_t; 101 102 typedef struct rx_lane_stat_entry_s { 103 int64_t rle_index; 104 lane_type_t rle_id; 105 rx_lane_stat_t rle_stats; 106 } rx_lane_stat_entry_t; 107 108 /* 109 * Definitions for tx lane stats 110 */ 111 typedef struct tx_lane_stat_s { 112 uint64_t tl_opackets; 113 uint64_t tl_obytes; 114 uint64_t tl_blockcnt; 115 uint64_t tl_unblockcnt; 116 uint64_t tl_sdrops; 117 } tx_lane_stat_t; 118 119 typedef struct tx_lane_stat_entry_s { 120 int64_t tle_index; 121 lane_type_t tle_id; 122 tx_lane_stat_t tle_stats; 123 } tx_lane_stat_entry_t; 124 125 /* 126 * Definitions for tx/rx misc stats 127 */ 128 typedef struct misc_stat_s { 129 uint64_t ms_multircv; 130 uint64_t ms_brdcstrcv; 131 uint64_t ms_multixmt; 132 uint64_t ms_brdcstxmt; 133 uint64_t ms_multircvbytes; 134 uint64_t ms_brdcstrcvbytes; 135 uint64_t ms_multixmtbytes; 136 uint64_t ms_brdcstxmtbytes; 137 uint64_t ms_txerrors; 138 uint64_t ms_macspoofed; 139 uint64_t ms_ipspoofed; 140 uint64_t ms_dhcpspoofed; 141 uint64_t ms_restricted; 142 uint64_t ms_dhcpdropped; 143 uint64_t ms_ipackets; 144 uint64_t ms_rbytes; 145 uint64_t ms_local; 146 uint64_t ms_localbytes; 147 uint64_t ms_intrs; 148 uint64_t ms_intrbytes; 149 uint64_t ms_polls; 150 uint64_t ms_pollbytes; 151 uint64_t ms_rxsdrops; 152 uint64_t ms_chainunder10; 153 uint64_t ms_chain10to50; 154 uint64_t ms_chainover50; 155 uint64_t ms_obytes; 156 uint64_t ms_opackets; 157 uint64_t ms_blockcnt; 158 uint64_t ms_unblockcnt; 159 uint64_t ms_txsdrops; 160 } misc_stat_t; 161 162 /* 163 * To be consistent with other stat entries, misc stat 164 * is wrapped in stat entry 165 */ 166 typedef struct misc_stat_entry_s { 167 misc_stat_t mse_stats; 168 } misc_stat_entry_t; 169 170 /* 171 * Definitions for ring stats: used by rx as well as tx 172 */ 173 typedef struct ring_stat_s { 174 uint64_t r_packets; 175 uint64_t r_bytes; 176 } ring_stat_t; 177 178 typedef struct ring_stat_entry_s { 179 int64_t re_index; 180 ring_stat_t re_stats; 181 } ring_stat_entry_t; 182 183 /* 184 * Definitions for fanout stats 185 */ 186 typedef struct fanout_stat_s { 187 uint64_t f_ipackets; 188 uint64_t f_rbytes; 189 } fanout_stat_t; 190 191 typedef struct fanout_stat_entry_s { 192 int64_t fe_index; 193 lane_type_t fe_id; /* hw, sw, local */ 194 int64_t fe_foutindex; /* fanout index */ 195 fanout_stat_t fe_stats; 196 } fanout_stat_entry_t; 197 198 /* 199 * Definitions for total stats 200 */ 201 typedef struct total_stat_s { 202 uint64_t ts_ipackets; 203 uint64_t ts_rbytes; 204 uint64_t ts_opackets; 205 uint64_t ts_obytes; 206 } total_stat_t; 207 208 /* 209 * To be consistent with other stat entries, total stat 210 * is wrapped in stat entry 211 */ 212 typedef struct total_stat_entry_s { 213 total_stat_t tse_stats; 214 } total_stat_entry_t; 215 216 /* 217 * Definitions for aggr stats 218 */ 219 typedef struct aggr_port_stat_s { 220 uint64_t ap_ipackets; 221 uint64_t ap_rbytes; 222 uint64_t ap_opackets; 223 uint64_t ap_obytes; 224 } aggr_port_stat_t; 225 226 typedef struct aggr_port_stat_entry_s { 227 datalink_id_t ape_portlinkid; 228 aggr_port_stat_t ape_stats; 229 } aggr_port_stat_entry_t; 230 231 /* 232 * Definitions for query all stats 233 */ 234 typedef struct name_value_stat_s { 235 char nv_statname[MAXSTATNAMELEN]; 236 uint64_t nv_statval; 237 struct name_value_stat_s *nv_nextstat; 238 } name_value_stat_t; 239 240 typedef struct name_value_stat_entry_s { 241 char nve_header[MAXSTATNAMELEN]; 242 name_value_stat_t *nve_stats; 243 } name_value_stat_entry_t; 244 245 /* 246 * Definitions for flow stats 247 */ 248 typedef struct flow_stat_s { 249 uint64_t fl_ipackets; 250 uint64_t fl_rbytes; 251 uint64_t fl_ierrors; 252 uint64_t fl_opackets; 253 uint64_t fl_obytes; 254 uint64_t fl_oerrors; 255 uint64_t fl_sdrops; 256 } flow_stat_t; 257 258 typedef struct pktsum_s { 259 hrtime_t snaptime; 260 uint64_t ipackets; 261 uint64_t opackets; 262 uint64_t rbytes; 263 uint64_t obytes; 264 uint64_t ierrors; 265 uint64_t oerrors; 266 } pktsum_t; 267 268 extern kstat_t *dladm_kstat_lookup(kstat_ctl_t *, const char *, int, 269 const char *, const char *); 270 extern void dladm_get_stats(kstat_ctl_t *, kstat_t *, pktsum_t *); 271 extern int dladm_kstat_value(kstat_t *, const char *, uint8_t, 272 void *); 273 extern dladm_status_t dladm_get_single_mac_stat(dladm_handle_t, datalink_id_t, 274 const char *, uint8_t, void *); 275 276 extern void dladm_stats_total(pktsum_t *, pktsum_t *, pktsum_t *); 277 extern void dladm_stats_diff(pktsum_t *, pktsum_t *, pktsum_t *); 278 279 extern dladm_stat_chain_t *dladm_link_stat_query(dladm_handle_t, 280 datalink_id_t, dladm_stat_type_t); 281 extern dladm_stat_chain_t *dladm_link_stat_diffchain(dladm_stat_chain_t *, 282 dladm_stat_chain_t *, dladm_stat_type_t); 283 extern dladm_stat_chain_t *dladm_link_stat_query_all(dladm_handle_t, 284 datalink_id_t, dladm_stat_type_t); 285 286 extern flow_stat_t *dladm_flow_stat_query(dladm_handle_t, 287 const char *); 288 extern flow_stat_t *dladm_flow_stat_diff(flow_stat_t *, 289 flow_stat_t *); 290 extern name_value_stat_entry_t *dladm_flow_stat_query_all(dladm_handle_t, 291 const char *); 292 293 #ifdef __cplusplus 294 } 295 #endif 296 297 #endif /* _LIBDLSTAT_H */