|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: /* ! 25: * Copyright (c) 1992 NeXT Computer, Inc. ! 26: * ! 27: * Network interface class. ! 28: * ! 29: * HISTORY ! 30: * ! 31: * 1-Nov-93 John Immordino (jimmord) at NeXT ! 32: * Added API to allow read access to counters and to increment counters ! 33: * by an arbitrary number. The latter is useful for hardware which ! 34: * reports statistics in bursts. ! 35: * ! 36: * 11 December 1992 David E. Bohman at NeXT ! 37: * Created. ! 38: */ ! 39: #import <sys/types.h> ! 40: #import <sys/socket.h> ! 41: #import <sys/param.h> ! 42: #import <driverkit/IONetwork.h> ! 43: #import <sys/mbuf.h> ! 44: #import <net/if.h> ! 45: #import <netinet/in.h> ! 46: #import <netinet/if_ether.h> ! 47: #import <sys/kernel.h> ! 48: ! 49: ! 50: static const char IFNAME_NULL[] = "null"; ! 51: ! 52: @implementation IONetwork ! 53: ! 54: - initForNetworkDevice:device ! 55: name:(const char *)name ! 56: unit:(unsigned int)unit ! 57: type:(const char *)type ! 58: maxTransferUnit:(unsigned int)mtu ! 59: flags:(unsigned int)flags ! 60: { ! 61: struct ifnet *ifp; ! 62: int reuse; ! 63: ! 64: [super init]; ! 65: ! 66: ifp = [device allocateIfnet]; ! 67: if(ifp == (struct ifnet *)NULL) return (0); ! 68: bzero((caddr_t)ifp, sizeof(struct ifnet)); ! 69: ! 70: ifp->if_name = (char *)name; ! 71: ifp->if_type = (char *)type; ! 72: ifp->if_unit = unit; ! 73: ifp->if_mtu = mtu; ! 74: ifp->if_flags = flags; ! 75: ifp->if_private = device; ! 76: ! 77: #if defined(i386) && 0 // XXX fix later ! 78: /************************************************* ! 79: * This code sets the hostid global variable for * ! 80: * the i386 achitecure only. Refer to Tracker * ! 81: * #35253 - JI * ! 82: *************************************************/ ! 83: ! 84: /* ! 85: * Do this only if hostid hasn't been set already. ! 86: */ ! 87: if (hostid == 0) { ! 88: unsigned char hardwareAddr[6]; ! 89: ! 90: /* ! 91: * Get the hardware address for this interface. ! 92: */ ! 93: if (if_control((netif_t)ifp, IFCONTROL_GETADDR, ! 94: (void *)&hardwareAddr) == 0) { ! 95: ! 96: /* ! 97: * Xor the first 2 bytes into the ! 98: * middle 2 bytes, then set hostid. ! 99: */ ! 100: hardwareAddr[2] ^= hardwareAddr[0]; ! 101: hardwareAddr[3] ^= hardwareAddr[1]; ! 102: hostid = NXSwapHostLongToBig(*(long *)&hardwareAddr[2]); ! 103: } ! 104: } ! 105: #endif i386 ! 106: ! 107: _ifp = ifp; ! 108: _device = device; ! 109: ! 110: return self; ! 111: } ! 112: ! 113: - free ! 114: { ! 115: return [super free]; ! 116: } ! 117: ! 118: - (int)handleInputPacket:(netbuf_t)pkt extra:(void *)extra ! 119: { ! 120: if (_device == nil) ! 121: return -1; ! 122: ! 123: return [_device inputPacket:pkt extra:(void *)extra]; ! 124: } ! 125: ! 126: - (unsigned)inputPackets ! 127: { ! 128: return (_ifp->if_ipackets); ! 129: } ! 130: ! 131: - (void)incrementInputPackets ! 132: { ! 133: _ifp->if_ipackets++; ! 134: ! 135: } ! 136: ! 137: - (void)incrementInputPacketsBy:(unsigned)increment ! 138: { ! 139: _ifp->if_ipackets += increment; ! 140: } ! 141: ! 142: - (unsigned)inputErrors ! 143: { ! 144: return (_ifp->if_ierrors); ! 145: } ! 146: ! 147: - (void)incrementInputErrors ! 148: { ! 149: _ifp->if_ierrors++; ! 150: } ! 151: ! 152: - (void)incrementInputErrorsBy:(unsigned)increment ! 153: { ! 154: _ifp->if_ierrors += increment; ! 155: } ! 156: ! 157: - (unsigned)outputPackets ! 158: { ! 159: return (_ifp->if_opackets); ! 160: } ! 161: ! 162: - (void)incrementOutputPackets ! 163: { ! 164: _ifp->if_opackets++; ! 165: } ! 166: ! 167: - (void)incrementOutputPacketsBy:(unsigned)increment ! 168: { ! 169: _ifp->if_opackets += increment; ! 170: } ! 171: ! 172: - (unsigned)outputErrors ! 173: { ! 174: return (_ifp->if_oerrors); ! 175: } ! 176: ! 177: - (void)incrementOutputErrors ! 178: { ! 179: _ifp->if_oerrors++; ! 180: } ! 181: ! 182: - (void)incrementOutputErrorsBy:(unsigned)increment ! 183: { ! 184: _ifp->if_oerrors += increment; ! 185: } ! 186: ! 187: - (unsigned)collisions ! 188: { ! 189: return (_ifp->if_collisions); ! 190: } ! 191: ! 192: - (void)incrementCollisions ! 193: { ! 194: _ifp->if_collisions++; ! 195: } ! 196: ! 197: - (void)incrementCollisionsBy:(unsigned)increment ! 198: { ! 199: _ifp->if_collisions += increment; ! 200: } ! 201: ! 202: - (struct ifnet *)getIONetworkIfnet ! 203: { ! 204: return(_ifp); ! 205: } ! 206: ! 207: - property_IODeviceClass:(char *)classes length:(unsigned int *)maxLen ! 208: { ! 209: strcpy( classes, IOClassNetwork); ! 210: return( self); ! 211: } ! 212: ! 213: @end ! 214:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.