Annotation of embedaddon/bmon/src/in_kstat.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * in_kstat.c                  libkstat (SunOS)
                      3:  *
                      4:  * Copyright (c) 2001-2004 Thomas Graf <tgraf@suug.ch>
                      5:  *
                      6:  * Permission is hereby granted, free of charge, to any person obtaining a
                      7:  * copy of this software and associated documentation files (the "Software"),
                      8:  * to deal in the Software without restriction, including without limitation
                      9:  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
                     10:  * and/or sell copies of the Software, and to permit persons to whom the
                     11:  * Software is furnished to do so, subject to the following conditions:
                     12:  *
                     13:  * The above copyright notice and this permission notice shall be included
                     14:  * in all copies or substantial portions of the Software.
                     15:  *
                     16:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
                     17:  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
                     19:  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
                     20:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
                     21:  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
                     22:  * DEALINGS IN THE SOFTWARE.
                     23:  */
                     24: 
                     25: #include <bmon/bmon.h>
                     26: #include <bmon/input.h>
                     27: #include <bmon/item.h>
                     28: #include <bmon/node.h>
                     29: #include <bmon/utils.h>
                     30: 
                     31: #if defined HAVE_KSTAT && defined SYS_SUNOS
                     32: #include <kstat.h>
                     33: 
                     34: static void kstat_do_read(void)
                     35: {
                     36:        kstat_ctl_t *   kc;
                     37:        kstat_t *       kst;
                     38:        kstat_named_t * kn, *kn2;
                     39:        item_t *        i;
                     40:        
                     41:        if (!(kc = kstat_open()))
                     42:                quit("kstat_open() failed");
                     43:        
                     44:        if ((kst = kstat_lookup(kc, NULL, -1, NULL))) {
                     45:                for (; kst; kst = kst->ks_next) {
                     46:                        if (strcmp(kst->ks_class, "net"))
                     47:                                continue;
                     48:                        
                     49:                        if (kstat_read(kc, kst, NULL) < 0)
                     50:                                continue;
                     51: 
                     52:                        if (!strcmp(kst->ks_name, "zero_copy"))
                     53:                                continue;
                     54: 
                     55:                        i = lookup_item(get_local_node(), kst->ks_name, 0, 0);
                     56: 
                     57:                        if (NULL == i)
                     58:                                continue;
                     59: 
                     60:                        i->i_major_attr = BYTES;
                     61:                        i->i_minor_attr = PACKETS;
                     62: 
                     63: #define KSTAT_GET(S) (kstat_named_t *) kstat_data_lookup(kst, #S)
                     64: 
                     65:                        if ((kn = KSTAT_GET(rbytes64)) && (kn2 = KSTAT_GET(obytes64))) {
                     66:                                update_attr(i, BYTES, kn->value.ui64, kn2->value.ui64,
                     67:                                    RX_PROVIDED | TX_PROVIDED | IS64BIT);
                     68:                        } else if ((kn = KSTAT_GET(rbytes)) && (kn2 = KSTAT_GET(obytes)))
                     69:                                update_attr(i, BYTES, kn->value.ui32, kn2->value.ui32,
                     70:                                    RX_PROVIDED | TX_PROVIDED);
                     71: 
                     72:                        if ((kn = KSTAT_GET(ipackets64)) && (kn2 = KSTAT_GET(opackets64))) {
                     73:                                update_attr(i, PACKETS, kn->value.ui64, kn2->value.ui64,
                     74:                                    RX_PROVIDED | TX_PROVIDED | IS64BIT);
                     75:                        } else if ((kn = KSTAT_GET(ipackets)) && (kn2 = KSTAT_GET(opackets)))
                     76:                                update_attr(i, PACKETS, kn->value.ui32, kn2->value.ui32,
                     77:                                    RX_PROVIDED | TX_PROVIDED);
                     78: 
                     79:                        if ((kn = KSTAT_GET(ierror)) && (kn2 = KSTAT_GET(oerrors)))
                     80:                                update_attr(i, ERRORS, kn->value.ui32, kn2->value.ui32,
                     81:                                        RX_PROVIDED | TX_PROVIDED);
                     82: 
                     83:                        if ((kn = KSTAT_GET(multircv64)) && (kn2 = KSTAT_GET(multixmt64)))
                     84:                                update_attr(i, MULTICAST, kn->value.ui64, kn2->value.ui64,
                     85:                                        RX_PROVIDED | TX_PROVIDED);
                     86:                        else if ((kn = KSTAT_GET(multircv)) && (kn2 = KSTAT_GET(multixmt)))
                     87:                                update_attr(i, MULTICAST, kn->value.ui32, kn2->value.ui32,
                     88:                                        RX_PROVIDED | TX_PROVIDED);
                     89: 
                     90:                        if ((kn = KSTAT_GET(brdcstrcv)) && (kn2 = KSTAT_GET(brdcstxmt)))
                     91:                                update_attr(i, BROADCAST, kn->value.ui32, kn2->value.ui32,
                     92:                                        RX_PROVIDED | TX_PROVIDED);
                     93: 
                     94: #undef KSTAT_GET
                     95: 
                     96:                        notify_update(i, NULL);
                     97:                        increase_lifetime(i, 1);
                     98:                }
                     99:        }
                    100:        
                    101:        kstat_close(kc);
                    102: }
                    103: 
                    104: static void print_help(void)
                    105: {
                    106:        printf(
                    107:        "kstat - kstat statistic collector for SunOS\n" \
                    108:        "\n" \
                    109:        "  SunOS statistic collector using libkstat, kindly provides both,\n" \
                    110:        "  32bit and 64bit counters.\n" \
                    111:        "  Author: Thomas Graf <tgraf@suug.ch>\n" \
                    112:        "\n");
                    113: }
                    114: 
                    115: static void kstat_set_opts(tv_t *attrs)
                    116: {
                    117:        while (attrs) {
                    118:                if (!strcasecmp(attrs->type, "help")) {
                    119:                        print_help();
                    120:                        exit(0);
                    121:                }
                    122:                attrs = attrs->next;
                    123:        }
                    124: }
                    125: 
                    126: static int kstat_probe(void)
                    127: {
                    128:        kstat_ctl_t *kc = kstat_open();
                    129: 
                    130:        if (kc) {
                    131:                kstat_t * kst = kstat_lookup(kc, NULL, -1, NULL);
                    132:                kstat_close(kc);
                    133: 
                    134:                if (kst)
                    135:                        return 1;
                    136:        }
                    137: 
                    138:        return 0;
                    139: }
                    140: 
                    141: static struct input_module kstat_ops = {
                    142:        .im_name = "kstat",
                    143:        .im_read = kstat_do_read,
                    144:        .im_set_opts = kstat_set_opts,
                    145:        .im_probe = kstat_probe,
                    146: };
                    147: 
                    148: static void __init kstat_init(void)
                    149: {
                    150:        register_input_module(&kstat_ops);
                    151: }
                    152: 
                    153: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>