0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * CDDL HEADER START
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * The contents of this file are subject to the terms of the
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Common Development and Distribution License (the "License").
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * You may not use this file except in compliance with the License.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * or http://www.opensolaris.org/os/licensing.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * See the License for the specific language governing permissions
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * and limitations under the License.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * When distributing Covered Code, include this CDDL HEADER in each
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * If applicable, add the following below this CDDL HEADER, with the
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * fields enclosed by brackets "[]" replaced with your own identifying
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * information: Portions Copyright [yyyy] [name of copyright owner]
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * CDDL HEADER END
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Use is subject to license terms.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <stdio.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <locale.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <stdarg.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <stdlib.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <fcntl.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <string.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <stropts.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <errno.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <strings.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <getopt.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <unistd.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <priv.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <netdb.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <libintl.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <libdlflow.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <libdllink.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <libdlstat.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <sys/types.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <sys/socket.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <netinet/in.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <arpa/inet.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <sys/ethernet.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <inet/ip.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <inet/ip6.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <stddef.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#include <ofmt.h>
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef struct flow_chain_s {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char fc_flowname[MAXFLOWNAMELEN];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t fc_visited;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_stat_t *fc_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct flow_chain_s *fc_next;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} flow_chain_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef struct show_flow_state {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_chain_t *fs_flowchain;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_handle_t fs_ofmt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char fs_unit;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t fs_parsable;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} show_flow_state_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef struct show_history_state_s {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t us_plot;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t us_parsable;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t us_printheader;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t us_first;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t us_showall;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_handle_t us_ofmt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} show_history_state_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void do_show_history(int, char **);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int query_flow_stats(dladm_handle_t, dladm_flow_attr_t *, void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int query_link_flow_stats(dladm_handle_t, datalink_id_t, void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void die(const char *, ...);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void die_optdup(int);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void die_opterr(int, int, const char *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void die_dlerr(dladm_status_t, const char *, ...);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void warn(const char *, ...);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* callback functions for printing output */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic ofmt_cb_t print_default_cb, print_flow_stats_cb;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void flowstat_ofmt_check(ofmt_status_t, boolean_t, ofmt_handle_t);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define NULL_OFMT {NULL, 0, 0, NULL}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * structures for flowstat (printing live statistics)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef enum {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_FLOW,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_IPKTS,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_RBYTES,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_IERRORS,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_OPKTS,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_OBYTES,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer FLOW_S_OERRORS
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} flow_s_field_index_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic ofmt_field_t flow_s_fields[] = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* name, field width, index, callback */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "FLOW", 15, FLOW_S_FLOW, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "IPKTS", 8, FLOW_S_IPKTS, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "RBYTES", 8, FLOW_S_RBYTES, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "IERRS", 8, FLOW_S_IERRORS, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "OPKTS", 8, FLOW_S_OPKTS, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "OBYTES", 8, FLOW_S_OBYTES, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "OERRS", 8, FLOW_S_OERRORS, print_flow_stats_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal IyerNULL_OFMT}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef struct flow_args_s {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *flow_s_flow;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_stat_t *flow_s_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char flow_s_unit;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t flow_s_parsable;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} flow_args_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * structures for 'flowstat -h'
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef struct history_fields_buf_s {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_flow[12];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_duration[10];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_ipackets[9];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_rbytes[10];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_opackets[9];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_obytes[10];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_bandwidth[14];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} history_fields_buf_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic ofmt_field_t history_fields[] = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* name, field width, offset */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "FLOW", 13,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_flow), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "DURATION", 11,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_duration), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "IPACKETS", 10,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_ipackets), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "RBYTES", 11,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_rbytes), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "OPACKETS", 10,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_opackets), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "OBYTES", 11,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_obytes), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "BANDWIDTH", 15,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_fields_buf_t, history_bandwidth), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal IyerNULL_OFMT}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyertypedef struct history_l_fields_buf_s {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_l_flow[12];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_l_stime[13];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_l_etime[13];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_l_rbytes[8];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_l_obytes[8];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char history_l_bandwidth[14];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer} history_l_fields_buf_t;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic ofmt_field_t history_l_fields[] = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* name, field width, offset */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "FLOW", 13,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_l_fields_buf_t, history_l_flow), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "START", 14,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_l_fields_buf_t, history_l_stime), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "END", 14,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_l_fields_buf_t, history_l_etime), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "RBYTES", 9,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_l_fields_buf_t, history_l_rbytes), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "OBYTES", 9,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_l_fields_buf_t, history_l_obytes), print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{ "BANDWIDTH", 15,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer offsetof(history_l_fields_buf_t, history_l_bandwidth),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer print_default_cb},
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal IyerNULL_OFMT}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic char *progname;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Handle to libdladm. Opened in main() before the sub-command
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * specific function is called.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic dladm_handle_t handle = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerconst char *usage_ermsg = "flowstat [-r | -t] [-i interval] "
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "[-l link] [flow]\n"
62ef8476c4f1cb016de161827d921418dee4b031Yuri Pankov " flowstat [-A] [-i interval] [-p] [ -o field[,...]]\n"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer " [-u R|K|M|G|T|P] [-l link] [flow]\n"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer " flowstat -h [-a] [-d] [-F format]"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer " [-s <DD/MM/YYYY,HH:MM:SS>]\n"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer " [-e <DD/MM/YYYY,HH:MM:SS>] -f <logfile> "
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "[<flow>]";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerusage(void)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) fprintf(stderr, "%s\n", gettext(usage_ermsg));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* close dladm handle if it was opened */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (handle != NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_close(handle);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer exit(1);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerboolean_t
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerflowstat_unit(char *oarg, char *unit)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((strcmp(oarg, "R") == 0) || (strcmp(oarg, "K") == 0) ||
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (strcmp(oarg, "M") == 0) || (strcmp(oarg, "G") == 0) ||
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (strcmp(oarg, "T") == 0) || (strcmp(oarg, "P") == 0)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer *unit = oarg[0];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (B_TRUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (B_FALSE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyervoid
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyermap_to_units(char *buf, uint_t bufsize, double num, char unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t parsable)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (parsable) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, bufsize, "%.0lf", num);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (unit == '\0') {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int index;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (index = 0; (int)(num/1000) != 0; index++, num /= 1000)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (index) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 0:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = '\0';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 1:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = 'K';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 2:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = 'M';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 3:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = 'G';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 4:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = 'T';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 5:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Largest unit supported */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = 'P';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (unit) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'R':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Already raw numbers */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer unit = '\0';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'K':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer num /= 1000;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'M':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer num /= (1000*1000);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'G':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer num /= (1000*1000*1000);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'T':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer num /= (1000.0*1000.0*1000.0*1000.0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'P':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Largest unit supported */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer num /= (1000.0*1000.0*1000.0*1000.0*1000.0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (unit == '\0')
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, bufsize, " %7.0lf%c", num, unit);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, bufsize, " %6.2lf%c", num, unit);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerflow_chain_t *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerget_flow_prev_stat(const char *flowname, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_flow_state_t *state = arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_chain_t *flow_curr = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Scan prev flowname list and look for entry matching this entry */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (flow_curr = state->fs_flowchain; flow_curr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_curr = flow_curr->fc_next) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strcmp(flow_curr->fc_flowname, flowname) == 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* New flow, add it */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (flow_curr == NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_curr = (flow_chain_t *)malloc(sizeof (flow_chain_t));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (flow_curr == NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer goto done;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strncpy(flow_curr->fc_flowname, flowname,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MAXFLOWNAMELEN);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_curr->fc_stat = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_curr->fc_next = state->fs_flowchain;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->fs_flowchain = flow_curr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdone:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (flow_curr);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Number of flows may change while flowstat -i is executing.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Free memory allocated for flows that are no longer there.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Prepare for next iteration by marking visited = false for
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * existing stat entries.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyercleanup_removed_flows(show_flow_state_t *state)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_chain_t *fcurr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_chain_t *fprev;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_chain_t *tofree;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Delete all nodes from the list that have fc_visited marked false */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fcurr = state->fs_flowchain;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer while (fcurr != NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (fcurr->fc_visited) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fcurr->fc_visited = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fprev = fcurr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fcurr = fcurr->fc_next;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer continue;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Is it head of the list? */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (fcurr == state->fs_flowchain)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->fs_flowchain = fcurr->fc_next;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fprev->fc_next = fcurr->fc_next;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* fprev remains the same */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer tofree = fcurr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fcurr = fcurr->fc_next;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Free stats memory for the removed flow */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_stat_free(tofree->fc_stat);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer free(tofree);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic boolean_t
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerprint_flow_stats_cb(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_args_t *fargs = of_arg->ofmt_cbarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_stat_t *diff_stats = fargs->flow_s_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char unit = fargs->flow_s_unit;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t parsable = fargs->flow_s_parsable;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (of_arg->ofmt_id) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_FLOW:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(buf, bufsize, "%s", fargs->flow_s_flow);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_IPKTS:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer map_to_units(buf, bufsize, diff_stats->fl_ipackets, unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer parsable);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_RBYTES:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer map_to_units(buf, bufsize, diff_stats->fl_rbytes, unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer parsable);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_IERRORS:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer map_to_units(buf, bufsize, diff_stats->fl_ierrors, unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer parsable);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_OPKTS:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer map_to_units(buf, bufsize, diff_stats->fl_opackets, unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer parsable);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_OBYTES:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer map_to_units(buf, bufsize, diff_stats->fl_obytes, unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer parsable);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case FLOW_S_OERRORS:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer map_to_units(buf, bufsize, diff_stats->fl_oerrors, unit,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer parsable);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("invalid input");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (B_TRUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerquery_flow_stats(dladm_handle_t handle, dladm_flow_attr_t *attr, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_flow_state_t *state = arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_chain_t *flow_node;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_stat_t *curr_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_stat_t *prev_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_stat_t *diff_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *flowname = attr->fa_flowname;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_args_t fargs;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Get previous stats for the flow */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_node = get_flow_prev_stat(flowname, arg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (flow_node == NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer goto done;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_node->fc_visited = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer prev_stat = flow_node->fc_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Query library for current stats */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer curr_stat = dladm_flow_stat_query(flowname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (curr_stat == NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer goto done;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* current stats - prev iteration stats */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer diff_stat = dladm_flow_stat_diff(curr_stat, prev_stat);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Free prev stats */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_stat_free(prev_stat);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Prev <- curr stats */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_node->fc_stat = curr_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (diff_stat == NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer goto done;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Print stats */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fargs.flow_s_flow = flowname;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fargs.flow_s_stat = diff_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fargs.flow_s_unit = state->fs_unit;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fargs.flow_s_parsable = state->fs_parsable;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_print(state->fs_ofmt, &fargs);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Free diff stats */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_stat_free(diff_stat);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdone:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_WALK_CONTINUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Wrapper of dladm_walk_flow(query_flow_stats,...) to make it usable for
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * dladm_walk_datalink_id(). Used for showing flow stats for
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * all flows on all links.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerquery_link_flow_stats(dladm_handle_t dh, datalink_id_t linkid, void * arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (dladm_walk_flow(query_flow_stats, dh, linkid, arg, B_FALSE)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer == DLADM_STATUS_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_WALK_CONTINUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_WALK_TERMINATE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyervoid
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerprint_all_stats(name_value_stat_entry_t *stat_entry)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer name_value_stat_t *curr_stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer printf("%s\n", stat_entry->nve_header);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (curr_stat = stat_entry->nve_stats; curr_stat != NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer curr_stat = curr_stat->nv_nextstat) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer printf("\t%15s", curr_stat->nv_statname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer printf("\t%15llu\n", curr_stat->nv_statval);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdump_one_flow_stats(dladm_handle_t handle, dladm_flow_attr_t *attr, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *flowname = attr->fa_flowname;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer void *stat;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer stat = dladm_flow_stat_query_all(flowname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (stat == NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer goto done;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer print_all_stats(stat);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_stat_query_all_free(stat);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdone:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_WALK_CONTINUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Wrapper of dladm_walk_flow(query_flow_stats,...) to make it usable for
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * dladm_walk_datalink_id(). Used for showing flow stats for
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * all flows on all links.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdump_link_flow_stats(dladm_handle_t dh, datalink_id_t linkid, void * arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (dladm_walk_flow(dump_one_flow_stats, dh, linkid, arg, B_FALSE)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer == DLADM_STATUS_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_WALK_CONTINUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_WALK_TERMINATE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdump_all_flow_stats(dladm_flow_attr_t *attrp, void *arg, datalink_id_t linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t flow_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Show stats for named flow */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (flow_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dump_one_flow_stats(handle, attrp, arg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Show stats for flows on one link */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (linkid != DATALINK_INVALID_LINKID) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_walk_flow(dump_one_flow_stats, handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer arg, B_FALSE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Show stats for all flows on all links */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_walk_datalink_id(dump_link_flow_stats,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer handle, arg, DATALINK_CLASS_ALL,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerint
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyermain(int argc, char *argv[])
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_status_t status;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int option;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t r_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t t_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t p_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t i_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t o_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t u_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t A_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t flow_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer datalink_id_t linkid = DATALINK_ALL_LINKID;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char linkname[MAXLINKNAMELEN];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char flowname[MAXFLOWNAMELEN];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint32_t interval = 0;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char unit = '\0';
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_flow_state_t state;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *fields_str = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *o_fields_str = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *total_stat_fields =
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "flow,ipkts,rbytes,ierrs,opkts,obytes,oerrs";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *rx_stat_fields =
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "flow,ipkts,rbytes,ierrs";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *tx_stat_fields =
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "flow,opkts,obytes,oerrs";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_handle_t ofmt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_status_t oferr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t ofmtflags = OFMT_RIGHTJUST;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_attr_t attr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) setlocale(LC_ALL, "");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#if !defined(TEXT_DOMAIN)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#define TEXT_DOMAIN "SYS_TEST"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer#endif
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) textdomain(TEXT_DOMAIN);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer progname = argv[0];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Open the libdladm handle */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if ((status = dladm_open(&handle)) != DLADM_STATUS_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_dlerr(status, "could not open /dev/dld");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bzero(&state, sizeof (state));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer opterr = 0;
62ef8476c4f1cb016de161827d921418dee4b031Yuri Pankov while ((option = getopt_long(argc, argv, ":rtApi:o:u:l:h",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL, NULL)) != -1) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (option) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'r':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (r_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_optdup(option);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer r_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 't':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (t_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_optdup(option);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer t_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'A':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (A_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_optdup(option);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer A_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'p':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (p_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_optdup(option);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer p_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'i':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (i_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_optdup(option);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer i_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!dladm_str2interval(optarg, &interval))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("invalid interval value '%s'", optarg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'o':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer o_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer o_fields_str = optarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'u':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (u_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_optdup(option);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer u_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!flowstat_unit(optarg, &unit))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("invalid unit value '%s',"
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "unit must be R|K|M|G|T|P", optarg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'l':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strlcpy(linkname, optarg, MAXLINKNAMELEN)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer >= MAXLINKNAMELEN)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("link name too long\n");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (dladm_name2info(handle, linkname, &linkid, NULL,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL, NULL) != DLADM_STATUS_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("invalid link '%s'", linkname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'h':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (r_arg || t_arg || p_arg || o_arg || u_arg ||
62ef8476c4f1cb016de161827d921418dee4b031Yuri Pankov i_arg || A_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("the option -h is not compatible with "
62ef8476c4f1cb016de161827d921418dee4b031Yuri Pankov "-r, -t, -p, -o, -u, -i, -A");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer do_show_history(argc, argv);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_opterr(optopt, option, usage_ermsg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (r_arg && t_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("the option -t and -r are not compatible");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (u_arg && p_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("the option -u and -p are not compatible");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (p_arg && !o_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("-p requires -o");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (p_arg && strcasecmp(o_fields_str, "all") == 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("\"-o all\" is invalid with -p");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (A_arg &&
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (r_arg || t_arg || p_arg || o_arg || u_arg || i_arg))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("the option -A is not compatible with "
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "-r, -t, -p, -o, -u, -i");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* get flow name (optional last argument) */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (optind == (argc-1)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (strlcpy(flowname, argv[optind], MAXFLOWNAMELEN)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer >= MAXFLOWNAMELEN)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("flow name too long");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flow_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (optind != argc) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer usage();
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (flow_arg &&
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_info(handle, flowname, &attr) != DLADM_STATUS_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("invalid flow %s", flowname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (A_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dump_all_flow_stats(&attr, &state, linkid, flow_arg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.fs_unit = unit;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.fs_parsable = p_arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (state.fs_parsable)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmtflags |= OFMT_PARSABLE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (r_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = rx_stat_fields;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else if (t_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = tx_stat_fields;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = total_stat_fields;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (o_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = (strcasecmp(o_fields_str, "all") == 0) ?
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str : o_fields_str;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer oferr = ofmt_open(fields_str, flow_s_fields, ofmtflags, 0, &ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flowstat_ofmt_check(oferr, state.fs_parsable, ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.fs_ofmt = ofmt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (;;) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Show stats for named flow */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (flow_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) query_flow_stats(handle, &attr, &state);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Show stats for flows on one link */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (linkid != DATALINK_INVALID_LINKID) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_walk_flow(query_flow_stats, handle, linkid,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer &state, B_FALSE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Show stats for all flows on all links */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) dladm_walk_datalink_id(query_link_flow_stats,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer handle, &state, DATALINK_CLASS_ALL,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DATALINK_ANY_MEDIATYPE, DLADM_OPT_ACTIVE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (interval == 0)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) fflush(stdout);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer cleanup_removed_flows(&state);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) sleep(interval);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_close(ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_close(handle);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyershow_history_date(dladm_usage_t *history, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_history_state_t *state = (show_history_state_t *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer time_t stime;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char timebuf[20];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_attr_t attr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_status_t status;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Only show historical information for existing flows unless '-a'
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * is specified.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!state->us_showall && ((status = dladm_flow_info(handle,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history->du_name, &attr)) != DLADM_STATUS_OK)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (status);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer stime = history->du_stime;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strftime(timebuf, sizeof (timebuf), "%m/%d/%Y",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer localtime(&stime));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf("%s\n", timebuf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_STATUS_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyershow_history_time(dladm_usage_t *history, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_history_state_t *state = (show_history_state_t *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char buf[DLADM_STRSIZE];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history_l_fields_buf_t ubuf;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer time_t time;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer double bw;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_attr_t attr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_status_t status;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Only show historical information for existing flows unless '-a'
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * is specified.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!state->us_showall && ((status = dladm_flow_info(handle,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history->du_name, &attr)) != DLADM_STATUS_OK)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (status);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (state->us_plot) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!state->us_printheader) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (state->us_first) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf("# Time");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->us_first = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf(" %s", history->du_name);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (history->du_last) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf("\n");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->us_first = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->us_printheader = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (state->us_first) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer time = history->du_etime;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strftime(buf, sizeof (buf), "%T",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer localtime(&time));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->us_first = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf("%s", buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bw = (double)history->du_bandwidth/1000;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf(" %.2f", bw);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (history->du_last) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) printf("\n");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state->us_first = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_STATUS_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bzero(&ubuf, sizeof (ubuf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_l_flow, sizeof (ubuf.history_l_flow), "%s",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history->du_name);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer time = history->du_stime;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strftime(buf, sizeof (buf), "%T", localtime(&time));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_l_stime, sizeof (ubuf.history_l_stime),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%s", buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer time = history->du_etime;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strftime(buf, sizeof (buf), "%T", localtime(&time));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_l_etime, sizeof (ubuf.history_l_etime),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%s", buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_l_rbytes, sizeof (ubuf.history_l_rbytes),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_rbytes);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_l_obytes, sizeof (ubuf.history_l_obytes),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_obytes);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_l_bandwidth,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer sizeof (ubuf.history_l_bandwidth), "%s Mbps",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_bw2str(history->du_bandwidth, buf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_print(state->us_ofmt, (void *)&ubuf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_STATUS_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyershow_history_res(dladm_usage_t *history, void *arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_history_state_t *state = (show_history_state_t *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char buf[DLADM_STRSIZE];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history_fields_buf_t ubuf;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_attr_t attr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_status_t status;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Only show historical information for existing flows unless '-a'
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * is specified.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!state->us_showall && ((status = dladm_flow_info(handle,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history->du_name, &attr)) != DLADM_STATUS_OK)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (status);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bzero(&ubuf, sizeof (ubuf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_flow, sizeof (ubuf.history_flow), "%s",
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer history->du_name);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_duration, sizeof (ubuf.history_duration),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_duration);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_ipackets, sizeof (ubuf.history_ipackets),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_ipackets);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_rbytes, sizeof (ubuf.history_rbytes),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_rbytes);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_opackets, sizeof (ubuf.history_opackets),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_opackets);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_obytes, sizeof (ubuf.history_obytes),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%llu", history->du_obytes);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) snprintf(ubuf.history_bandwidth, sizeof (ubuf.history_bandwidth),
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "%s Mbps", dladm_bw2str(history->du_bandwidth, buf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_print(state->us_ofmt, (void *)&ubuf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (DLADM_STATUS_OK);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic boolean_t
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyervalid_formatspec(char *formatspec_str)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (strcmp(formatspec_str, "gnuplot") == 0);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* ARGSUSED */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdo_show_history(int argc, char *argv[])
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *file = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer int opt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_status_t status;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t d_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *stime = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *etime = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *resource = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer show_history_state_t state;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t o_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer boolean_t F_arg = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *fields_str = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *formatspec_str = NULL;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *all_fields =
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "flow,duration,ipackets,rbytes,opackets,obytes,bandwidth";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *all_l_fields =
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer "flow,start,end,rbytes,obytes,bandwidth";
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_handle_t ofmt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_status_t oferr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t ofmtflags = 0;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer bzero(&state, sizeof (show_history_state_t));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_parsable = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_printheader = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_plot = B_FALSE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_first = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer while ((opt = getopt(argc, argv, "das:e:o:f:F:")) != -1) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (opt) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'd':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer d_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'a':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_showall = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'f':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer file = optarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 's':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer stime = optarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'e':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer etime = optarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'o':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer o_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = optarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case 'F':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_plot = F_arg = B_TRUE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer formatspec_str = optarg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_opterr(optopt, opt, usage_ermsg);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (file == NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("-h requires a file");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (optind == (argc-1)) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_attr_t attr;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer resource = argv[optind];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!state.us_showall &&
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_flow_info(handle, resource, &attr) !=
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DLADM_STATUS_OK) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("invalid flow: '%s'", resource);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (state.us_parsable)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmtflags |= OFMT_PARSABLE;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (resource == NULL && stime == NULL && etime == NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!o_arg || (o_arg && strcasecmp(fields_str, "all") == 0))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = all_fields;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer oferr = ofmt_open(fields_str, history_fields, ofmtflags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, &ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (!o_arg || (o_arg && strcasecmp(fields_str, "all") == 0))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer fields_str = all_l_fields;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer oferr = ofmt_open(fields_str, history_l_fields, ofmtflags,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, &ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer flowstat_ofmt_check(oferr, state.us_parsable, ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer state.us_ofmt = ofmt;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (F_arg && d_arg)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("incompatible -d and -F options");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (F_arg && !valid_formatspec(formatspec_str))
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("Format specifier %s not supported", formatspec_str);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (d_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Print log dates */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = dladm_usage_dates(show_history_date,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DLADM_LOGTYPE_FLOW, file, resource, &state);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (resource == NULL && stime == NULL && etime == NULL &&
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer !F_arg) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Print summary */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = dladm_usage_summary(show_history_res,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DLADM_LOGTYPE_FLOW, file, &state);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else if (resource != NULL) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Print log entries for named resource */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = dladm_walk_usage_res(show_history_time,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DLADM_LOGTYPE_FLOW, file, resource, stime, etime, &state);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* Print time and information for each flow */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer status = dladm_walk_usage_time(show_history_time,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer DLADM_LOGTYPE_FLOW, file, stime, etime, &state);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_close(ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (status != DLADM_STATUS_OK)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die_dlerr(status, "-h");
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_close(handle);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerwarn(const char *format, ...)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_list alist;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer format = gettext(format);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) fprintf(stderr, "%s: warning: ", progname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_start(alist, format);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) vfprintf(stderr, format, alist);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_end(alist);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) putc('\n', stderr);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* PRINTFLIKE1 */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdie(const char *format, ...)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_list alist;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer format = gettext(format);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) fprintf(stderr, "%s: ", progname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_start(alist, format);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) vfprintf(stderr, format, alist);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_end(alist);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) putc('\n', stderr);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* close dladm handle if it was opened */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (handle != NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_close(handle);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer exit(EXIT_FAILURE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdie_optdup(int opt)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("the option -%c cannot be specified more than once", opt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdie_opterr(int opt, int opterr, const char *usage)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer switch (opterr) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case ':':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("option '-%c' requires a value\nusage: %s", opt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer gettext(usage));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case '?':
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer default:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die("unrecognized option '-%c'\nusage: %s", opt,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer gettext(usage));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer break;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/* PRINTFLIKE2 */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerdie_dlerr(dladm_status_t err, const char *format, ...)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_list alist;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char errmsg[DLADM_STRSIZE];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer format = gettext(format);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) fprintf(stderr, "%s: ", progname);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_start(alist, format);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) vfprintf(stderr, format, alist);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer va_end(alist);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) fprintf(stderr, ": %s\n", dladm_status2str(err, errmsg));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /* close dladm handle if it was opened */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (handle != NULL)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer dladm_close(handle);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer exit(EXIT_FAILURE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * default output callback function that, when invoked from dladm_print_output,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * prints string which is offset by of_arg->ofmt_id within buf.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic boolean_t
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerprint_default_cb(ofmt_arg_t *of_arg, char *buf, uint_t bufsize)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char *value;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer value = (char *)of_arg->ofmt_cbarg + of_arg->ofmt_id;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) strlcpy(buf, value, bufsize);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (B_TRUE);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerflowstat_ofmt_check(ofmt_status_t oferr, boolean_t parsable,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_handle_t ofmt)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer char buf[OFMT_BUFSIZE];
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (oferr == OFMT_SUCCESS)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (void) ofmt_strerror(ofmt, oferr, buf, sizeof (buf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer /*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * All errors are considered fatal in parsable mode.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * NOMEM errors are always fatal, regardless of mode.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * For other errors, we print diagnostics in human-readable
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * mode and processs what we can.
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (parsable || oferr == OFMT_ENOFIELDS) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ofmt_close(ofmt);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer die(buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer } else {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer warn(buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer }
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}