|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.