Annotation of XNU/bsd/net/if_mib.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * Copyright 1996 Massachusetts Institute of Technology
        !            24:  *
        !            25:  * Permission to use, copy, modify, and distribute this software and
        !            26:  * its documentation for any purpose and without fee is hereby
        !            27:  * granted, provided that both the above copyright notice and this
        !            28:  * permission notice appear in all copies, that both the above
        !            29:  * copyright notice and this permission notice appear in all
        !            30:  * supporting documentation, and that the name of M.I.T. not be used
        !            31:  * in advertising or publicity pertaining to distribution of the
        !            32:  * software without specific, written prior permission.  M.I.T. makes
        !            33:  * no representations about the suitability of this software for any
        !            34:  * purpose.  It is provided "as is" without express or implied
        !            35:  * warranty.
        !            36:  * 
        !            37:  * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
        !            38:  * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
        !            39:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
        !            40:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
        !            41:  * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
        !            42:  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
        !            43:  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
        !            44:  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
        !            45:  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
        !            46:  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
        !            47:  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            48:  * SUCH DAMAGE.
        !            49:  *
        !            50:  */
        !            51: 
        !            52: #include <sys/param.h>
        !            53: #include <sys/systm.h>
        !            54: #include <sys/kernel.h>
        !            55: #include <sys/socket.h>
        !            56: #include <sys/sysctl.h>
        !            57: 
        !            58: #include <net/if.h>
        !            59: #include <net/if_mib.h>
        !            60: 
        !            61: #if NETMIBS
        !            62: 
        !            63: /*
        !            64:  * A sysctl(3) MIB for generic interface information.  This information
        !            65:  * is exported in the net.link.generic branch, which has the following
        !            66:  * structure:
        !            67:  *
        !            68:  * net.link.generic    .system                 - system-wide control variables
        !            69:  *                                               and statistics (node)
        !            70:  *                     .ifdata.<ifindex>.general
        !            71:  *                                             - what's in `struct ifdata'
        !            72:  *                                               plus some other info
        !            73:  *                     .ifdata.<ifindex>.linkspecific
        !            74:  *                                             - a link-type-specific data
        !            75:  *                                               structure (as might be used
        !            76:  *                                               by an SNMP agent
        !            77:  *
        !            78:  * Perhaps someday we will make addresses accessible via this interface
        !            79:  * as well (then there will be four such...).  The reason that the
        !            80:  * index comes before the last element in the name is because it
        !            81:  * seems more orthogonal that way, particularly with the possibility
        !            82:  * of other per-interface data living down here as well (e.g., integrated
        !            83:  * services stuff).
        !            84:  */
        !            85: 
        !            86: SYSCTL_DECL(_net_link_generic);
        !            87: SYSCTL_NODE(_net_link_generic, IFMIB_SYSTEM, system, CTLFLAG_RW, 0,
        !            88:            "Variables global to all interfaces");
        !            89: SYSCTL_INT(_net_link_generic_system, IFMIB_IFCOUNT, ifcount, CTLFLAG_RD,
        !            90:           &if_index, 0, "Number of configured interfaces");
        !            91: 
        !            92: static int
        !            93: sysctl_ifdata SYSCTL_HANDLER_ARGS /* XXX bad syntax! */
        !            94: {
        !            95:        int *name = (int *)arg1;
        !            96:        int error, ifnlen;
        !            97:        u_int namelen = arg2;
        !            98:        struct ifnet *ifp;
        !            99:        char workbuf[64];
        !           100:        struct ifmibdata ifmd;
        !           101: 
        !           102:        if (namelen != 2)
        !           103:                return EINVAL;
        !           104: 
        !           105:        if (name[0] <= 0 || name[0] > if_index)
        !           106:                return ENOENT;
        !           107: 
        !           108:        ifp = ifnet_addrs[name[0] - 1]->ifa_ifp;
        !           109: 
        !           110:        switch(name[1]) {
        !           111:        default:
        !           112:                return ENOENT;
        !           113: 
        !           114:        case IFDATA_GENERAL:
        !           115:            /*
        !           116:                ifnlen = snprintf(workbuf, sizeof(workbuf),
        !           117:                    "%s%d", ifp->if_name, ifp->if_unit);
        !           118:                if(ifnlen + 1 > sizeof ifmd.ifmd_name) {
        !           119:                        return ENAMETOOLONG;
        !           120:                } else {
        !           121:                        strcpy(ifmd.ifmd_name, workbuf);
        !           122:                }
        !           123:            */
        !           124: 
        !           125: #define COPY(fld) ifmd.ifmd_##fld = ifp->if_##fld
        !           126:                COPY(pcount);
        !           127:                COPY(flags);
        !           128:                COPY(data);
        !           129: #undef COPY
        !           130:                ifmd.ifmd_snd_len = ifp->if_snd.ifq_len;
        !           131:                ifmd.ifmd_snd_maxlen = ifp->if_snd.ifq_maxlen;
        !           132:                ifmd.ifmd_snd_drops = ifp->if_snd.ifq_drops;
        !           133: 
        !           134:                error = SYSCTL_OUT(req, &ifmd, sizeof ifmd);
        !           135:                if (error || !req->newptr)
        !           136:                        return error;
        !           137: 
        !           138:                error = SYSCTL_IN(req, &ifmd, sizeof ifmd);
        !           139:                if (error)
        !           140:                        return error;
        !           141: 
        !           142: #define DONTCOPY(fld) ifmd.ifmd_data.ifi_##fld = ifp->if_data.ifi_##fld
        !           143:                DONTCOPY(type);
        !           144:                DONTCOPY(physical);
        !           145:                DONTCOPY(addrlen);
        !           146:                DONTCOPY(hdrlen);
        !           147:                DONTCOPY(mtu);
        !           148:                DONTCOPY(metric);
        !           149:                DONTCOPY(baudrate);
        !           150: #undef DONTCOPY
        !           151: #define COPY(fld) ifp->if_##fld = ifmd.ifmd_##fld
        !           152:                COPY(data);
        !           153:                ifp->if_snd.ifq_maxlen = ifmd.ifmd_snd_maxlen;
        !           154:                ifp->if_snd.ifq_drops = ifmd.ifmd_snd_drops;
        !           155: #undef COPY
        !           156:                break;
        !           157: 
        !           158:        case IFDATA_LINKSPECIFIC:
        !           159:                error = SYSCTL_OUT(req, ifp->if_linkmib, ifp->if_linkmiblen);
        !           160:                if (error || !req->newptr)
        !           161:                        return error;
        !           162: 
        !           163:                error = SYSCTL_IN(req, ifp->if_linkmib, ifp->if_linkmiblen);
        !           164:                if (error)
        !           165:                        return error;
        !           166:                
        !           167:        }
        !           168:        return 0;
        !           169: }
        !           170: 
        !           171: SYSCTL_NODE(_net_link_generic, IFMIB_IFDATA, ifdata, CTLFLAG_RW,
        !           172:            sysctl_ifdata, "Interface table");
        !           173: 
        !           174: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.