dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER START
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * The contents of this file are subject to the terms of the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Common Development and Distribution License (the "License").
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You may not use this file except in compliance with the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * or http://www.opensolaris.org/os/licensing.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * See the License for the specific language governing permissions
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and limitations under the License.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * When distributing Covered Code, include this CDDL HEADER in each
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * If applicable, add the following below this CDDL HEADER, with the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * fields enclosed by brackets "[]" replaced with your own identifying
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * information: Portions Copyright [yyyy] [name of copyright owner]
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * CDDL HEADER END
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Use is subject to license terms.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdio.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <unistd.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <stdlib.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <strings.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/types.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/socket.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/sysmacros.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <sys/note.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <fcntl.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <errno.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <assert.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <libgen.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <kstat.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <ofmt.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include <libilb.h>
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#include "ilbadm.h"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_TIMESTAMP_HEADER 0x01 /* a timestamp w. every header */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_DELTA_INTERVAL 0x02 /* delta over specified interval */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ABS_NUMBERS 0x04 /* print absolute numbers, no d's */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ITEMIZE 0x08 /* itemize */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_VERBOSE 0x10 /* verbose error info */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_OLD_VALUES 0x20 /* for internal processing */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_RULES_CHANGED 0x40
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char is_name[KSTAT_STRLEN];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t is_value;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbst_stat_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbst_stat_t rulestats[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"num_servers", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"bytes_not_processed", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"pkt_not_processed", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"bytes_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"pkt_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"nomem_bytes_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"nomem_pkt_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"noport_bytes_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"noport_pkt_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"icmp_echo_processed", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"icmp_dropped", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"icmp_too_big_processed", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"icmp_too_big_dropped", 0}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* indices into array above, to avoid searching */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_NUM_SRV 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_BYTES_U 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_PKT_U 2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_BYTES_D 3
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_PKT_D 4
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_NOMEMBYTES_D 5
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_NOMEMPKT_D 6
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_NOPORTBYTES_D 7
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_NOPORTPKT_D 8
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_ICMP_P 9
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_ICMP_D 10
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_ICMP2BIG_P 11
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RLSTA_ICMP2BIG_D 12
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbst_stat_t servstats[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"bytes_processed", 0},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"pkt_processed", 0}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* indices into array above, to avoid searching */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define SRVST_BYTES_P 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define SRVST_PKT_P 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* values used for of_* commands as id */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_PKT_P 0
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_BYTES_P 1
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_PKT_U 2
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_BYTES_U 3
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_PKT_D 4
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_BYTES_D 5
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ICMP_P 6
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ICMP_D 7
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ICMP2BIG_P 8
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ICMP2BIG_D 9
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_NOMEMP_D 10
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_NOPORTP_D 11
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_NOMEMB_D 12
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_NOPORTB_D 13
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ITEMIZE_SNAME 97
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_ITEMIZE_RNAME 98
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_TIMESTAMP 99
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* approx field widths */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_PKTCTR_W 8
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_BYTECTR_W 10
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define ILBST_TIME_W 15
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t of_rule_stats(ofmt_arg_t *, char *, uint_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t of_server_stats(ofmt_arg_t *, char *, uint_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t of_itemize_stats(ofmt_arg_t *, char *, uint_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t of_timestamp(ofmt_arg_t *, char *, uint_t);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t stat_itemize_fields[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"RULENAME", ILB_NAMESZ, ILBST_ITEMIZE_RNAME, of_itemize_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"SERVERNAME", ILB_NAMESZ, ILBST_ITEMIZE_SNAME, of_itemize_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PKT_P", ILBST_PKTCTR_W, ILBST_PKT_P, of_itemize_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"BYTES_P", ILBST_BYTECTR_W, ILBST_BYTES_P, of_itemize_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"TIME", ILBST_TIME_W, ILBST_TIMESTAMP, of_timestamp},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ofmt_field_t stat_stdfields[] = {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PKT_P", ILBST_PKTCTR_W, ILBST_PKT_P, of_server_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"BYTES_P", ILBST_BYTECTR_W, ILBST_BYTES_P, of_server_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PKT_U", ILBST_PKTCTR_W, ILBST_PKT_U, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"BYTES_U", ILBST_BYTECTR_W, ILBST_BYTES_U, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"PKT_D", ILBST_PKTCTR_W, ILBST_PKT_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"BYTES_D", ILBST_BYTECTR_W, ILBST_BYTES_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"ICMP_P", ILBST_PKTCTR_W, ILBST_ICMP_P, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"ICMP_D", ILBST_PKTCTR_W, ILBST_ICMP_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"ICMP2BIG_P", 11, ILBST_ICMP2BIG_P, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"ICMP2BIG_D", 11, ILBST_ICMP2BIG_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"NOMEMP_D", ILBST_PKTCTR_W, ILBST_NOMEMP_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"NOPORTP_D", ILBST_PKTCTR_W, ILBST_NOPORTP_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"NOMEMB_D", ILBST_PKTCTR_W, ILBST_NOMEMB_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"NOPORTB_D", ILBST_PKTCTR_W, ILBST_NOPORTB_D, of_rule_stats},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {"TIME", ILBST_TIME_W, ILBST_TIMESTAMP, of_timestamp},
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra {NULL, 0, 0, NULL}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra};
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char stat_stdhdrs[] = "PKT_P,BYTES_P,PKT_U,BYTES_U,PKT_D,BYTES_D";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char stat_stdv_hdrs[] = "PKT_P,BYTES_P,PKT_U,BYTES_U,PKT_D,BYTES_D,"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra "ICMP_P,ICMP_D,ICMP2BIG_P,ICMP2BIG_D,NOMEMP_D,NOPORTP_D";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char stat_itemize_rule_hdrs[] = "SERVERNAME,PKT_P,BYTES_P";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic char stat_itemize_server_hdrs[] = "RULENAME,PKT_P,BYTES_P";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define RSTAT_SZ (sizeof (rulestats)/sizeof (rulestats[0]))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra#define SSTAT_SZ (sizeof (servstats)/sizeof (servstats[0]))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char isd_servername[KSTAT_STRLEN]; /* serverID */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_stat_t isd_serverstats[SSTAT_SZ];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra hrtime_t isd_crtime; /* save for comparison purpose */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbst_srv_desc_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * this data structure stores statistics for a rule - both an old set
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and a current/new set. we use pointers to the actual stores and switch
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * the pointers for every round. old_is_old in ilbst_arg_t indicates
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * which pointer points to the "old" data struct (ie, if true, _o pointer
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * points to old)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char ird_rulename[KSTAT_STRLEN];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ird_num_servers;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ird_num_servers_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ird_srv_ind;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra hrtime_t ird_crtime; /* save for comparison */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra hrtime_t ird_crtime_o; /* save for comparison */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *ird_srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *ird_srvlist_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_stat_t ird_rstats[RSTAT_SZ];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_stat_t ird_rstats_o[RSTAT_SZ];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_stat_t *ird_rulestats;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_stat_t *ird_rulestats_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbst_rule_desc_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * overall "container" for information pertaining to statistics, and
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * how to display them.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef struct {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_flags;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* fields representing user input */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *ilbst_rulename; /* optional */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *ilbst_server; /* optional */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_interval;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_count;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* "internal" fields for data and data presentation */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_handle_t ilbst_oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t ilbst_old_is_old;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *ilbst_rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_rcount; /* current list count */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_rcount_prev; /* prev (different) count */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_rlist_sz; /* number of alloc'ed rules */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int ilbst_rule_index; /* for itemizes display */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra} ilbst_arg_t;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_timestamp(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra time_t now;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra struct tm *now_tm;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra now = time(NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra now_tm = localtime(&now);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strftime(buf, bufsize, "%F:%H.%M.%S", now_tm);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_sum_per_rule_processed(ilbst_rule_desc_t *rp, uint64_t *resp, int index,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int flags)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i, num_servers;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *srv, *o_srv, *n_srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t res = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t valid = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t old = flags & ILBST_OLD_VALUES;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t check_valid;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we do abs. numbers, we never look at the _o fields */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra assert((old && (flags & ILBST_ABS_NUMBERS)) == B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* we only check for validity under certain conditions */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra check_valid = !(old || (flags & ILBST_ABS_NUMBERS));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (check_valid && rp->ird_num_servers != rp->ird_num_servers_o)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra valid = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra num_servers = old ? rp->ird_num_servers_o : rp->ird_num_servers;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < num_servers; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra n_srv = &rp->ird_srvlist[i];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra o_srv = &rp->ird_srvlist_o[i];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (old)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv = o_srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv = n_srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra res += srv->isd_serverstats[index].is_value;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if creation times don't match, comparison is wrong; if
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if we already know something is invalid, we don't
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * need to compare again.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (check_valid && valid == B_TRUE &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra o_srv->isd_crtime != n_srv->isd_crtime) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra valid = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * save the result even though it may be imprecise - let the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * caller decide what to do
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *resp = res;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (valid);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misratypedef boolean_t (*sumfunc_t)(ilbst_rule_desc_t *, uint64_t *, int);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_sum_per_rule_pkt_p(ilbst_rule_desc_t *rp, uint64_t *resp, int flags)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (i_sum_per_rule_processed(rp, resp, SRVST_PKT_P, flags));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_sum_per_rule_bytes_p(ilbst_rule_desc_t *rp, uint64_t *resp, int flags)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (i_sum_per_rule_processed(rp, resp, SRVST_BYTES_P, flags));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_server_stats(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_arg_t *sta = (ilbst_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t count = 0, val;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t valid = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sumfunc_t sumfunc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (of_arg->ofmt_id) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_PKT_P: sumfunc = i_sum_per_rule_pkt_p;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_BYTES_P: sumfunc = i_sum_per_rule_bytes_p;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < sta->ilbst_rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra valid = sumfunc(&sta->ilbst_rlist[i], &val, sta->ilbst_flags);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!valid)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (valid);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count += val;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & ILBST_ABS_NUMBERS) != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < sta->ilbst_rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) sumfunc(&sta->ilbst_rlist[i], &val,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_flags | ILBST_OLD_VALUES);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count -= val;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * normally, we print "change per second", which we calculate
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * here. otherwise, we print "change over interval"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & (ILBST_DELTA_INTERVAL|ILBST_ABS_NUMBERS)) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count /= sta->ilbst_interval;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%llu", count);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * this function is called when user wants itemized stats of every
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * server for a named rule, or vice vera.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * i_do_print sets sta->rule_index and the proper ird_srv_ind so
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we don't have to differentiate between these two cases here.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_itemize_stats(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_arg_t *sta = (ilbst_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int stat_ind;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t count;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int rule_index = sta->ilbst_rule_index;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int srv_ind = sta->ilbst_rlist[rule_index].ird_srv_ind;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t ret = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *srv, *osrv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srv = &sta->ilbst_rlist[rule_index].ird_srvlist[srv_ind];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (of_arg->ofmt_id) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_PKT_P: stat_ind = SRVST_PKT_P;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_BYTES_P: stat_ind = SRVST_BYTES_P;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_ITEMIZE_RNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%s",
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist[rule_index].ird_rulename);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_ITEMIZE_SNAME:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%s", srv->isd_servername);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count = srv->isd_serverstats[stat_ind].is_value;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & ILBST_ABS_NUMBERS) != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra osrv = &sta->ilbst_rlist[rule_index].ird_srvlist_o[srv_ind];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (srv->isd_crtime != osrv->isd_crtime)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ret = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count -= osrv->isd_serverstats[stat_ind].is_value;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * normally, we print "change per second", which we calculate
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * here. otherwise, we print "change over interval" or absolute
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * values.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & (ILBST_DELTA_INTERVAL|ILBST_ABS_NUMBERS)) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count /= sta->ilbst_interval;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%llu", count);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ret);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic boolean_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraof_rule_stats(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_arg_t *sta = (ilbst_arg_t *)of_arg->ofmt_cbarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i, ind;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra uint64_t count = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch (of_arg->ofmt_id) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_PKT_U: ind = RLSTA_PKT_U;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_BYTES_U: ind = RLSTA_BYTES_U;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_PKT_D: ind = RLSTA_PKT_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_BYTES_D: ind = RLSTA_BYTES_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_ICMP_P: ind = RLSTA_ICMP_P;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_ICMP_D: ind = RLSTA_ICMP_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_ICMP2BIG_P: ind = RLSTA_ICMP2BIG_P;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_ICMP2BIG_D: ind = RLSTA_ICMP2BIG_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_NOMEMP_D: ind = RLSTA_NOMEMPKT_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_NOPORTP_D: ind = RLSTA_NOPORTPKT_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_NOMEMB_D: ind = RLSTA_NOMEMBYTES_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ILBST_NOPORTB_D: ind = RLSTA_NOPORTBYTES_D;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < sta->ilbst_rcount; i++)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count += sta->ilbst_rlist[i].ird_rulestats[ind].is_value;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & ILBST_ABS_NUMBERS) != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * the purist approach: if we can't say 100% that what we
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * calculate is correct, don't.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_flags & ILBST_RULES_CHANGED)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < sta->ilbst_rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rlist[i].ird_crtime_o != 0 &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist[i].ird_crtime !=
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist[i].ird_crtime_o)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_FALSE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count -= sta->ilbst_rlist[i].ird_rulestats_o[ind].is_value;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * normally, we print "change per second", which we calculate
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * here. otherwise, we print "change over interval"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & (ILBST_DELTA_INTERVAL|ILBST_ABS_NUMBERS)) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra count /= sta->ilbst_interval;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(buf, bufsize, "%llu", count);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Get the number of kstat instances. Note that when rules are being
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * drained the number of kstats instances may be different than the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * kstat counter num_rules (ilb:0:global:num_rules").
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Also there can be multiple instances of a rule in the following
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * scenario:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * A rule named rule A has been deleted but remains in kstats because
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * its undergoing connection draining. During this time, the user adds
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * a new rule with the same name(rule A). In this case, there would
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * be two kstats instances for rule A. Currently ilbadm's aggregate
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * results will include data from both instances of rule A. In,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * future we should have ilbadm stats only consider the latest instance
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * of the rule (ie only consider the the instance that corresponds
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * to the rule that was just added).
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_get_num_kinstances(kstat_ctl_t *kctl)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_t *kp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int num_instances = 0; /* nothing found, 0 rules */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (kp = kctl->kc_chain; kp != NULL; kp = kp->ks_next) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strncmp("rulestat", kp->ks_class, 8) == 0 &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra strncmp("ilb", kp->ks_module, 3) == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra num_instances++;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (num_instances);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * since server stat's classname is made up of <rulename>-sstat,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we walk the rule list to construct the comparison
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Return: pointer to rule whose name matches the class
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * NULL if no match
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbst_rule_desc_t *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misramatch_2_rnames(char *class, ilbst_rule_desc_t *rlist, int rcount)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char classname[KSTAT_STRLEN];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(classname, sizeof (classname), "%s-sstat",
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_rulename);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strncmp(classname, class, sizeof (classname)) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (&rlist[i]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic int
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_stat_index(kstat_named_t *knp, ilbst_stat_t *stats, int count)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < count; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strcasecmp(stats[i].is_name, knp->name) == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (i);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_copy_sstats(ilbst_srv_desc_t *sp, kstat_t *kp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_named_t *knp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i, ind;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra knp = KSTAT_NAMED_PTR(kp);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < kp->ks_ndata; i++, knp++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ind = i_stat_index(knp, servstats, SSTAT_SZ);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (ind == -1)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(sp->isd_serverstats[ind].is_name, knp->name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (sp->isd_serverstats[ind].is_name));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sp->isd_serverstats[ind].is_value = knp->value.ui64;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sp->isd_crtime = kp->ks_crtime;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_get_server_descs(ilbst_arg_t *sta, kstat_ctl_t *kctl)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_t *kp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i = -1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *rp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *rlist = sta->ilbst_rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int rcount = sta->ilbst_rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * find all "server" kstats, or the one specified in
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * sta->server
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (kp = kctl->kc_chain; kp != NULL; kp = kp->ks_next) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strncmp("ilb", kp->ks_module, 3) != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_server != NULL &&
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra strcasecmp(sta->ilbst_server, kp->ks_name) != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp = match_2_rnames(kp->ks_class, rlist, rcount);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rp == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) kstat_read(kctl, kp, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i = rp->ird_srv_ind++;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * This means that a server is added after we check last
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * time... Just make the array bigger.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (i+1 > rp->ird_num_servers) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((srvlist = realloc(rp->ird_srvlist, (i+1) *
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (*srvlist))) == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOMEM;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_srvlist = srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_num_servers = i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(rp->ird_srvlist[i].isd_servername, kp->ks_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (rp->ird_srvlist[i].isd_servername));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_copy_sstats(&rp->ird_srvlist[i], kp);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < rcount; i++)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srv_ind = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_server != NULL && i == -1)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOSERVER;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_copy_rstats(ilbst_rule_desc_t *rp, kstat_t *kp)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_named_t *knp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i, ind;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra knp = KSTAT_NAMED_PTR(kp);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < kp->ks_ndata; i++, knp++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ind = i_stat_index(knp, rulestats, RSTAT_SZ);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (ind == -1)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(rp->ird_rulestats[ind].is_name, knp->name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (rp->ird_rulestats[ind].is_name));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_rulestats[ind].is_value = knp->value.ui64;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_set_rlstats_ptr(ilbst_rule_desc_t *rp, boolean_t old_is_old)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (old_is_old) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_rulestats = rp->ird_rstats;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_rulestats_o = rp->ird_rstats_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_rulestats = rp->ird_rstats_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp->ird_rulestats_o = rp->ird_rstats;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * this function walks the array of rules and switches pointer to old
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and new stats as well as serverlists.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_swap_rl_pointers(ilbst_arg_t *sta, int rcount)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i, tmp_num;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *rlist = sta->ilbst_rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *tmp_srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* swap srvlist pointers */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra tmp_srv = rlist[i].ird_srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srvlist = rlist[i].ird_srvlist_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srvlist_o = tmp_srv;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * swap server counts - we need the old one to
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * save reallocation calls
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra tmp_num = rlist[i].ird_num_servers_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_num_servers_o = rlist[i].ird_num_servers;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_num_servers = tmp_num;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* preserve creation time */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_crtime_o = rlist[i].ird_crtime;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_set_rlstats_ptr(&rlist[i], sta->ilbst_old_is_old);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srv_ind = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_init_rulelist(ilbst_arg_t *sta, int rcount)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *rlist = sta->ilbst_rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_rulestats = rlist[i].ird_rstats;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_rulestats_o = rlist[i].ird_rstats_o;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srv_ind = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * this function searches for kstats describing individual rules and
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * saves name, # of servers, and the kstat_t * describing them (this is
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * for sta->rulename == NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if sta->rulename != NULL, it names the rule we're looking for
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * and this function will fill in the other data (like the all_rules case)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * Returns: ILBADM_ENORULE named rule not found
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * ILBADM_ENOMEM no mem. available
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_get_rule_descs(ilbst_arg_t *sta, kstat_ctl_t *kctl)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_t *kp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_named_t *knp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int num_servers;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *rlist = sta->ilbst_rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int rcount = sta->ilbst_rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * find all "rule" kstats, or the one specified in
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * sta->ilbst_rulename.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0, kp = kctl->kc_chain; i < rcount && kp != NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kp = kp->ks_next) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strncmp("rulestat", kp->ks_class, 8) != 0 ||
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra strncmp("ilb", kp->ks_module, 3) != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) kstat_read(kctl, kp, NULL);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra knp = kstat_data_lookup(kp, "num_servers");
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (knp == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("kstat_data_lookup() failed: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra strerror(errno));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rulename != NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strcasecmp(kp->ks_name, sta->ilbst_rulename)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra != 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) strlcpy(rlist[i].ird_rulename, kp->ks_name,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (rlist[i].ird_rulename));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* only alloc the space we need, set counter here ... */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_server != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra num_servers = 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra num_servers = (int)knp->value.ui64;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* ... furthermore, only reallocate if necessary */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (num_servers != rlist[i].ird_num_servers) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_srv_desc_t *srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_num_servers = num_servers;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rlist[i].ird_srvlist == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srvlist = calloc(num_servers,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (*srvlist));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra srvlist = realloc(rlist[i].ird_srvlist,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (*srvlist) * num_servers);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (srvlist == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOMEM;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srvlist = srvlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_srv_ind = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist[i].ird_crtime = kp->ks_crtime;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_copy_rstats(&rlist[i], kp);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i++;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* if we know we're done, return */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rulename != NULL || i == rcount) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rulename != NULL && i == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENORULE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic void
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_do_print(ilbst_arg_t *sta)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* non-itemized display can go right ahead */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & ILBST_ITEMIZE) == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_print(sta->ilbst_oh, sta);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * rulename is given, list a line per server
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * here's how we do it:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * the _ITEMIZE flag indicates to the print function (called
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * from ofmt_print()) to look at server [ird_srv_ind] only.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rulename != NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rule_index = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < sta->ilbst_rlist->ird_num_servers; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist->ird_srv_ind = i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_print(sta->ilbst_oh, sta);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist->ird_srv_ind = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* list one line for every rule for a given server */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = 0; i < sta->ilbst_rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if a rule doesn't contain a given server, there's no
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * need to print it. Luckily, we can check that
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * fairly easily
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rlist[i].ird_srvlist[0].isd_servername[0] ==
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra '\0')
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra continue;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rule_index = i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist[i].ird_srv_ind = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_print(sta->ilbst_oh, sta);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rule_index = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrastatic ilbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrai_do_show_stats(ilbst_arg_t *sta)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kstat_ctl_t *kctl;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra kid_t nkid;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int rcount = 1, i;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc = ILBADM_OK;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_rule_desc_t *rlist, *rp;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t pseudo_abs = B_FALSE; /* for first pass */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((kctl = kstat_open()) == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("kstat_open() failed: %s"), strerror(errno));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILBADM_LIBERR);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rulename == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rcount = i_get_num_kinstances(kctl);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist = calloc(sizeof (*rlist), rcount);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rlist == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOMEM;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_old_is_old = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist = rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rcount = sta->ilbst_rcount_prev = rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist_sz = rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * in the first pass, we always print absolute numbers. We
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * need to remember whether we wanted abs. numbers for
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * other samples as well
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & ILBST_ABS_NUMBERS) == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_flags |= ILBST_ABS_NUMBERS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra pseudo_abs = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_init_rulelist(sta, rcount);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra do {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_get_rule_descs(sta, kctl);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_get_server_descs(sta, kctl);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rc != ILBADM_OK)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto out;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_do_print(sta);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_count == -1 || --(sta->ilbst_count) > 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) sleep(sta->ilbst_interval);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra nkid = kstat_chain_update(kctl);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_flags &= ~ILBST_RULES_CHANGED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we only need to continue with most of the rest of this if
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * the kstat chain id has changed
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (nkid == 0)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra goto swap_old_new;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (nkid == -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("kstat_chain_update() failed: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra strerror(errno));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_LIBERR;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * find out whether the number of rules has changed.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if so, adjust rcount and _o; if number has increased,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * expand array to hold all rules.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we only shrink if rlist_sz is larger than both rcount and
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * rcount_prev;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rulename == NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rcount = i_get_num_kinstances(kctl);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rcount != sta->ilbst_rcount) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_flags |= ILBST_RULES_CHANGED;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rcount_prev = sta->ilbst_rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rcount = rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rcount > sta->ilbst_rcount_prev) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist = realloc(sta->ilbst_rlist,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (*sta->ilbst_rlist) * rcount);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rlist == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOMEM;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist = rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* realloc doesn't zero out memory */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra for (i = sta->ilbst_rcount_prev;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i < rcount; i++) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rp = &sta->ilbst_rlist[i];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bzero(rp, sizeof (*rp));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_set_rlstats_ptr(rp,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_old_is_old);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * even if rlist_sz was > rcount, it's now
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * shrunk to rcount
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist_sz = sta->ilbst_rcount;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * we may need to shrink the allocated slots down to the
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * actually required number - we need to make sure we
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * don't delete old or new stats.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rlist_sz > MAX(sta->ilbst_rcount,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rcount_prev)) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist_sz =
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra MAX(sta->ilbst_rcount, sta->ilbst_rcount_prev);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rlist = realloc(sta->ilbst_rlist,
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sizeof (*sta->ilbst_rlist) * sta->ilbst_rlist_sz);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (rlist == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOMEM;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_rlist = rlist;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * move pointers around so what used to point to "old"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * stats now points to new, and vice versa
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * if we're printing absolute numbers, this rigmarole is
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * not necessary.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraswap_old_new:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (pseudo_abs)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_flags &= ~ILBST_ABS_NUMBERS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((sta->ilbst_flags & ILBST_ABS_NUMBERS) == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta->ilbst_old_is_old = !sta->ilbst_old_is_old;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_swap_rl_pointers(sta, rcount);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra _NOTE(CONSTCOND)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } while (B_TRUE);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misraout:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) kstat_close(kctl);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if ((rc != ILBADM_OK) && (rc != ILBADM_LIBERR))
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(ilbadm_errstr(rc));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta->ilbst_rlist != NULL)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra free(sta->ilbst_rlist);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/*
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * read ilb's kernel statistics and (periodically) display
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra * them.
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra/* ARGSUSED */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_status_t
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misrailbadm_show_stats(int argc, char *argv[])
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra{
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_status_t rc;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int c;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbst_arg_t sta;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int oflags = 0;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *fieldnames = stat_stdhdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_field_t *fields = stat_stdfields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t r_opt = B_FALSE, s_opt = B_FALSE, i_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t o_opt = B_FALSE, p_opt = B_FALSE, t_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra boolean_t v_opt = B_FALSE, A_opt = B_FALSE, d_opt = B_FALSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_status_t oerr;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_handle_t oh = NULL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra bzero(&sta, sizeof (sta));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta.ilbst_interval = 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta.ilbst_count = 1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra while ((c = getopt(argc, argv, ":tdAr:s:ivo:p")) != -1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra switch ((char)c) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 't': sta.ilbst_flags |= ILBST_TIMESTAMP_HEADER;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra t_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'd': sta.ilbst_flags |= ILBST_DELTA_INTERVAL;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra d_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'A': sta.ilbst_flags |= ILBST_ABS_NUMBERS;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra A_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'r': sta.ilbst_rulename = optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra r_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 's': sta.ilbst_server = optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra s_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'i': sta.ilbst_flags |= ILBST_ITEMIZE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra i_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'o': fieldnames = optarg;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra o_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'p': oflags |= OFMT_PARSABLE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra p_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case 'v': sta.ilbst_flags |= ILBST_VERBOSE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra v_opt = B_TRUE;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fieldnames = stat_stdv_hdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case ':': ilbadm_err(gettext("missing option-argument"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " detected for %c"), (char)optopt);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra case '?': /* fallthrough */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra default:
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra unknown_opt(argv, optind-1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* not reached */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra break;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (s_opt && r_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("options -s and -r are mutually exclusive"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (i_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!(s_opt || r_opt)) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -i requires"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " either -r or -s"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (v_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -i and -v are mutually"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " exclusive"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* only use "std" headers if none are specified */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!o_opt)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (r_opt)
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fieldnames = stat_itemize_rule_hdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra else /* must be s_opt */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fieldnames = stat_itemize_server_hdrs;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fields = stat_itemize_fields;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (p_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (!o_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires -o"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (v_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -o and -v are mutually"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " exclusive"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (strcasecmp(fieldnames, "all") == 0) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("option -p requires"
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra " explicit field names"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (t_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (v_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fieldnames = "all";
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra } else {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra int len = strlen(fieldnames) + 6;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char *fnames;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fnames = malloc(len);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (fnames == NULL) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = ILBADM_ENOMEM;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra (void) snprintf(fnames, len, "%s,TIME", fieldnames);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra fieldnames = fnames;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (A_opt && d_opt) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("options -d and -A are mutually exclusive"));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra /* find and parse interval and count arguments if present */
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (optind < argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta.ilbst_interval = atoi(argv[optind]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta.ilbst_interval < 1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("illegal interval spec %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra argv[optind]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta.ilbst_count = -1;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (++optind < argc) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta.ilbst_count = atoi(argv[optind]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (sta.ilbst_count < 1) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("illegal count spec %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra argv[optind]);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra exit(1);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra oerr = ofmt_open(fieldnames, fields, oflags, 80, &oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra if (oerr != OFMT_SUCCESS) {
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra char e[80];
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ilbadm_err(gettext("ofmt_open failed: %s"),
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_strerror(oh, oerr, e, sizeof (e)));
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (ILBADM_LIBERR);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra }
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra sta.ilbst_oh = oh;
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra rc = i_do_show_stats(&sta);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra ofmt_close(oh);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra return (rc);
dbed73cbda2229fd1aa6dc5743993cae7f0a7ee9Sangeeta Misra}