|
|
1.1 root 1: /*
2: * Copyright (c) 1998-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 (c) 1999 Apple Computer, Inc. All rights reserved.
24: *
25: * IOEthernetController.h
26: *
27: * HISTORY
28: *
29: * Dec 3, 1998 jliu - C++ conversion.
30: */
31:
32: #ifndef _IOETHERNETCONTROLLER_H
33: #define _IOETHERNETCONTROLLER_H
34:
35: #include <IOKit/network/IONetworkController.h>
36:
37: extern "C" {
38: #include <sys/socket.h>
39: #include <net/if.h>
40: #include <net/etherdefs.h>
41: }
42:
43: // Property keys.
44: //
45: #define kIOMACAddress "IOMACAddress"
46:
47: /*! @enum IOEnetPromiscuousMode
48: @discussion A promiscuous mode setting passed to setPromiscuousMode()
49: method.
50: @constant kIOEnetPromiscuousModeOff Turn off promiscuous mode.
51: @constant kIOEnetPromiscuousModeOn Receive all good frames.
52: All good frames on the wire are to be received and submitted
53: to the attached interface.
54: @constant kIOEnetPromiscuousModeAll Receive all frames, including bad
55: frames. More work is needed to communicate the error bits
56: to the upper layers. */
57:
58: enum IOEnetPromiscuousMode {
59: kIOEnetPromiscuousModeOff,
60: kIOEnetPromiscuousModeOn,
61: kIOEnetPromiscuousModeAll
62: };
63:
64: /*! @enum IOEnetMulticastMode
65: @discussion A multicast mode setting passed to setMulticastMode()
66: method.
67: @constant kIOEnetMulticastModeOff Turn off multicast filter.
68: @constant kIOEnetMulticastModeFilter Enable multicast filter.
69: All frames with a destination address that matches an
70: entry in the controller's multicast address list
71: should be received.
72: @constant kIOEnetMulticastModeAll Receive all multicast frames. All
73: frames with a multicast destination address should be
74: received. */
75:
76: enum IOEnetMulticastMode {
77: kIOEnetMulticastModeOff,
78: kIOEnetMulticastModeFilter,
79: kIOEnetMulticastModeAll
80: };
81:
82: /*! @class IOEthernetController
83: @abstract An abstract superclass for Ethernet controllers.
84: Ethernet drivers should subclass IOEthernetController, and implement
85: or override the hardware specific methods to create a working driver.
86: An interface object (normally an IOEthernetInterface instance) must
87: be instantiated to connect the driver to the network layer. */
88:
89: class IOEthernetController : public IONetworkController
90: {
91: OSDeclareAbstractStructors(IOEthernetController)
92:
93: private:
94: IOEnetMulticastMode _mcMode; /* current effective MC mode */
95: IOEnetPromiscuousMode _prMode; /* current effective PR mode */
96:
97: public:
98:
99: /*! @function init
100: @abstract Initialize an IOEthernetController instance.
101: @param properties A dictionary containing a property table.
102: @result true if initialized successfully, false otherwise. */
103:
104: virtual bool init(OSDictionary * properties);
105:
106: /*! @function getFamilyFeatureSet
107: @discussion Get the Ethernet features supported by the controller.
108: Ethernet controller drivers may override this method and return a mask
109: containing all supported feature bits.
110: @result IOEthernetController will always return 0. */
111:
112: virtual UInt32 getFamilyFeatureSet() const;
113:
114: /*! @function doGetHardwareAddress
115: @discussion Call getHardwareAddress() through syncRequest().
116: See getHardwareAddress(). */
117:
118: virtual IOReturn doGetHardwareAddress(IOService * client,
119: enet_addr_t * addr);
120:
121: /*! @function doSetHardwareAddress
122: @discussion Call setHardwareAddress() through syncRequest().
123: See setHardwareAddress(). */
124:
125: virtual IOReturn doSetHardwareAddress(IOService * client,
126: const enet_addr_t * addr);
127:
128: /*! @function doSetMulticastList
129: @discussion Call setMulticastList() through syncRequest().
130: See setMulticastList(). */
131:
132: virtual IOReturn doSetMulticastList(IOService * client,
133: enet_addr_t * addrs,
134: UInt count);
135:
136: protected:
137:
138: /*! @function createInterface
139: @abstract Create an IONetworkInterface object.
140: @discussion Allocate and return a new IOEthernetInterface instance.
141: The controller class from each network family must implement this
142: method inherited from IONetworkController to return the corresponding
143: interface object when attachInterface() is called.
144: Subclasses of IOEthernetController (Ethernet drivers) have
145: little reason to override this implementation.
146: @result The allocated and initialized IOEthernetInterface instance. */
147:
148: virtual IONetworkInterface * createInterface();
149:
150: /*! @function free
151: @abstract Frees the IOEthernetController instance. */
152:
153: virtual void free();
154:
155: /*! @function getHardwareAddress
156: @abstract Get the controller's hardware address (MAC address).
157: @discussion. Ethernet drivers must implement this method,
158: by reading the address from hardware and writing it to the buffer provided.
159: @param addrP Pointer to an enet_addr_t where the hardware address should be
160: written to.
161: @result kIOReturnSuccess on success, or an error otherwise. */
162:
163: virtual IOReturn getHardwareAddress(enet_addr_t * addrP) = 0;
164:
165: /*! @function setHardwareAddress
166: @abstract Change the station's unicast address.
167: @discussion Called when a client wishes to change the unicast
168: address used by the controller's hardware filter.
169: Implementation of this method is optional.
170: @param addrP Pointer to an enet_addr_t containing the new Ethernet address.
171: @result kIOReturnUnsupported. Drivers must return kIOReturnSuccess to
172: indicate success, or an error otherwise. */
173:
174: virtual IOReturn setHardwareAddress(const enet_addr_t * addrP);
175:
176: /*! @function setMulticastMode
177: @abstract Select a new setting for the controller's multicast filter.
178: @discussion Called by enablePacketFilters() when the controller's
179: multicast filter mode needs to be changed. See IOEnetMulticastMode
180: for the list of defined modes.
181: @param mode The new multicast filter mode.
182: @result kIOReturnUnsupported. Drivers must return kIOReturnSuccess to
183: indicate success, or an error otherwise. */
184:
185: virtual IOReturn setMulticastMode(IOEnetMulticastMode mode);
186:
187: /*! @function setMulticastList
188: @abstract Set the list of multicast addresses to be allowed through by
189: the multicast filter.
190: @discussion Called by an interface client when its multicast group
191: membership changes. Drivers that support multicasting should override
192: this method and update the hardware filter using the address list
193: provided.
194: Perfect multicast filtering is preferred if supported by the hardware,
195: in order to reduce the number of unwanted packets that are received.
196: If the number of multicast addresses in the list exceed the limit
197: set by the hardware, or if perfect filtering is not supported,
198: then ideally the hardware should be programmed to perform imperfect
199: filtering, perhaps through a hash table built by the driver.
200: This method will be called only if getPacketFilters() reports that
201: kIOPacketFilterMulticast is supported.
202: @param addrs Pointer to a list of multicast addresses. Not valid if
203: the count argument is 0.
204: @param count The number of multicast addresses in the list. May be
205: zero if the list is empty.
206: @result kIOReturnUnsupported. Drivers must return kIOReturnSuccess to
207: indicate success, or an error otherwise. */
208:
209: virtual IOReturn setMulticastList(enet_addr_t * addrs, UInt count);
210:
211: /*! @function setPromiscuousMode
212: @abstract Select a new promiscuous mode.
213: @discussion Called by enablePacketFilters() when the controller's
214: promiscuous filter mode needs to be changed. See IOEnetPromiscuousMode
215: for the list of defined modes.
216: @param mode The new promiscuous filter mode.
217: @result kIOReturnUnsupported. Drivers must return kIOReturnSuccess to
218: indicate success, or an error otherwise. */
219:
220: virtual IOReturn setPromiscuousMode(IOEnetPromiscuousMode mode);
221:
222: /*! @function publishCapabilities
223: @abstract Publish Ethernet controller's properties and capabilities.
224: @discussion Publish Ethernet specific properties to the property
225: table. For instance, getHardwareAddress() is called to fetch the
226: hardware address. This method is called by the superclass and
227: should never be called by drivers.
228: @result true if all capabilities were discovered and published
229: successfully, false otherwise. Returning false will prevent client
230: objects from attaching to the Ethernet controller since a property
231: that a client depends on may be missing. */
232:
233: virtual bool publishCapabilities();
234:
235: /*! @function getPacketFilters
236: @abstract Get the set of packet filters supported by the Ethernet
237: controller.
238: @discussion Returns all the packet filters supported by the Ethernet
239: controller. See IONetworkController for the list of packet filters.
240: This method will perform a bitwise OR of kIOPacketFilterUnicast,
241: kIOPacketFilterBroadcast, kIOPacketFilterMulticast,
242: kIOPacketFilterPromiscuous, and write the result to the integer
243: pointed by 'filtersP'. Drivers that support a different set of filters
244: should override this method.
245: @param filtersP Pointer to an integer that shall be updated by this
246: method to contain the set of supported filters.
247: @result kIOReturnSuccess. Drivers that override this
248: method must return kIOReturnSuccess to indicate success, or an error
249: otherwise. */
250:
251: virtual IOReturn getPacketFilters(UInt32 * filtersP);
252:
253: /*! @function enablePacketFilters
254: @abstract Enable a set of packet filters supported by the Ethernet
255: controller.
256: @discussion Called by an interface object to change the set of
257: packet filters that are enabled by the controller.
258: The implementation in IOEthernetController will trap
259: any changes to multicast or promiscuous filters and translate
260: the changes into a filter mode for setMulticastMode() and
261: setPromiscuousMode() methods. This is done strictly as a
262: convenience for drivers, which may choose to override this method
263: to handle the filter changes directly.
264: Unicast and Broadcast filters are assumed to be always enabled,
265: no driver intervention is required.
266: @param filters Each bit that is set indicates a particular filter that
267: should be enabled. Filter bits that cleared should be disabled.
268: @param activeFiltersP Must be updated by this method to contain the filter
269: set that was activated. Ideally, it should be the same as the filter
270: set specified by the first argument.
271: @result kIOReturnSuccess on success, otherwise an error code is
272: returned. If (*activeFiltersP != filters), then an error is expected. */
273:
274: virtual IOReturn enablePacketFilters(UInt32 filters,
275: UInt32 * activeFiltersP);
276: };
277:
278: #endif /* !_IOETHERNETCONTROLLER_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.