Annotation of embedaddon/bmon/src/in_kstat.c, revision 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>