|
|
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: * IONetworkInterface.h
26: *
27: * HISTORY
28: * 8-Jan-1999 Joe Liu (jliu) created.
29: */
30:
31: #ifndef _IONETWORKINTERFACE_H
32: #define _IONETWORKINTERFACE_H
33:
34: #include <IOKit/IOService.h>
35: #include <libkern/c++/OSString.h>
36: #include <libkern/c++/OSData.h>
37: #include <libkern/c++/OSArray.h>
38: #include <libkern/c++/OSSet.h>
39: #include <IOKit/IOLocks.h>
40: #include <IOKit/network/IONetworkData.h>
41: #include <IOKit/network/IONetworkStats.h>
42: #include <IOKit/network/IONetworkMedium.h>
43:
44: struct mbuf; // forward declarations.
45: struct ifnet;
46: class IONetworkController;
47: class IONetworkStack;
48:
49: // Property table keys.
50: //
51: #define kIONetworkData "IONetworkData" // OSDictionary
52: #define kIOInterfaceType "IOInterfaceType" // OSNumber:8
53: #define kIOMaxTransferUnit "IOMaxTransferUnit" // OSNumber:32
54: #define kIOMediaAddressLength "IOMediaAddressLength" // OSNumber:8
55: #define kIOMediaHeaderLength "IOMediaHeaderLength" // OSNumber:8
56: #define kIOInterfaceFlags "IOInterfaceFlags" // OSNumber:16
57: #define kIOInterfaceExtraFlags "IOInterfaceExtraFlags" // OSNumber:32
58:
59: /*! @typedef IOOutputAction
60: @discussion Prototype for an output packet handler that will receive
61: all outbound packets sent to the interface from the network layer.
62: This handler is registered by calling registerOutputHandler().
63: @param m A packet mbuf. */
64:
65: typedef UInt32 (OSObject::*IOOutputAction)(struct mbuf * m);
66:
67: /*! @typedef BPF_FUNC
68: @discussion Prototype for the BPF tap handler. This will disappear
69: when the appropriate DLIL header file is included. */
70:
71: typedef int (*BPF_FUNC)(struct ifnet *, struct mbuf *);
72:
73: /*! @enum IOFilterTapMode
74: @constant kIOFilterTapModeInternal The filter tap will automatically
75: tap into the packet stream inside the interface object for a given
76: direction (that matches the filter's direction). This is the default mode.
77: @constant kIOFilterTapModeExternal The filter tap will only receive
78: packets when the feedInputFilterTap() or feedOutputFilterTap() methods
79: are called (probably by a controller driver). This allows the filter
80: to tap at a place that is logically closer to the network media. */
81:
82: typedef enum {
83: kIOFilterTapModeInternal,
84: kIOFilterTapModeExternal,
85: } IOFilterTapMode;
86:
87: // Network events.
88: //
89: enum {
90: /* A new network medium was selected by the controller */
91: kIONetworkEventMediumChange = 0xff000001,
92:
93: /* A link change was detected */
94: kIONetworkEventLinkChange = 0xff000002,
95: };
96:
97: /*! @class IONetworkInterface
98: @abstract An IONetworkInterface object manages the connection
99: between an IONetworkController and the network layer (DLIL).
100: All interaction between the controller and DLIL must flow
101: through an interface object. Any data structures required by
102: the DLIL for a given "network interface" type is allocated and
103: mantained by the interface object. Just as IONetworkController
104: may be subclassed to satisfy the needs of a particular network
105: family (i.e. Ethernet), a corresponding IONetworkInterface
106: subclass should be created.
107:
108: Although most drivers will allocate a single interface object.
109: It is possible for multiple interfaces to be attached to a single
110: controller. The controller driver is responsible for arbitrating
111: requests among its interface clients.
112:
113: IONetworkInterface also maintains a dictionary of IONetworkData
114: objects containing statistics structures. Controller drivers can
115: ask for a particular data object by name and update the
116: statistics counters within directly. This dictionary is added to
117: the interface's property table and is visible outside of the kernel.
118:
119: The inbound and outbound packet flow through the interface may be
120: tapped by an external entity. By default, the interface will
121: manage the filter taps automatically. But a controller driver may
122: disable the default behavior to have a better control over when
123: and which packet are fed to the filter taps.
124: */
125:
126: class IONetworkInterface : public IOService
127: {
128: OSDeclareAbstractStructors(IONetworkInterface)
129:
130: friend class IONetworkStack;
131: friend class IONetworkUserClient;
132:
133: private:
134: IONetworkController * _provider;
135: struct ifnet * _ifp;
136: IORecursiveLock * _ifLock;
137: OSSet * _clientSet;
138: bool _registered;
139: IOFilterTapMode _inputFilterTapMode;
140: IOFilterTapMode _outputFilterTapMode;
141: BPF_FUNC _inputFilterFunc;
142: BPF_FUNC _outputFilterFunc;
143: OSObject * _target;
144: IOOutputAction _outAction;
145: IOService * _client;
146: OSDictionary * _dataDict;
147: IOMediumType _bsdMediaType;
148: struct mbuf * inputQHead;
149: struct mbuf * inputQTail;
150:
151: bool _copyNetworkDataDictToPropertyTable();
152: void _handleMediumAndLinkChangeEvent();
153: bool _setFilterTapMode(IOFilterTapMode * modePtr, IOFilterTapMode mode);
154: bool _setInterfaceProperty(UInt32 value,
155: UInt32 mask,
156: UInt32 bytes,
157: void * addr,
158: char * name,
159: bool restrict);
160:
161: SInt syncSIOCSIFMEDIA(IONetworkController * ctlr, struct ifreq * ifr);
162: SInt syncSIOCGIFMEDIA(IONetworkController * ctlr, struct ifreq * ifr);
163: SInt syncSIOCSIFMTU(IONetworkController * ctlr, struct ifreq * ifr);
164: SInt syncPerformCommand(IONetworkController * ctlr,
165: UInt32 cmd,
166: void * arg0,
167: void * arg1);
168:
169: static int ioctl_shim(struct ifnet * ifp, u_long cmd, caddr_t data);
170: static int set_bpf_tap_shim(struct ifnet * ifp, int mode, BPF_FUNC func);
171: static int free_shim(struct ifnet * ifp);
172: static int output_shim(struct ifnet * ifp, struct mbuf *m);
173: static void null_shim(struct ifnet * ifp);
174:
175: public:
176:
177: /*! @function init
178: @abstract Initialize an IONetworkInterface instance.
179: @discussion Initialize instance variables, call getIfnet() to
180: get the ifnet structure allocated by a concrete subclass,
181: then call initIfnet() to initialize the ifnet structure.
182: @param properties A property dictionary.
183: @result true if initialized successfully, false otherwise. */
184:
185: virtual bool init(OSDictionary * properties = 0);
186:
187: /*! @function isRegistered
188: @abstract Returns true if the interface has been registered with
189: the network layer.
190: @result true if registered, false if the network layer has no
191: knowledge or reference to this network interface. */
192:
193: virtual bool isRegistered() const;
194:
195: /*! @function inputPacket
196: @abstract Handle a packet received by the controller.
197: @discussion Called by a controller to pass a received packet
198: to the network layer. Packets received by this method can
199: also be placed on a queue local to the interface, that the controller
200: can use to delay the packet handoff to the network layer, until all
201: received packets have been transferred to the queue. A subsequent call
202: of flushInputQueue(), or inputPacket() with the queue argument set to
203: false, will cause all queued packets (may be a single packet) to be
204: delivered to the network layer, by making a single dlil_input() call.
205: Additional methods that manipulate the input queue are flushInputQueue()
206: and clearInputQueue(). This queue, which is nothing more than a chain of
207: mbufs, is not protected by a lock since the controller is expected to
208: manipulate the input queue from a single thread. If the input filter
209: tap mode is set to kIOFilterTapModeInternal, then packets sent to
210: this method are also fed to the input filter tap.
211: @param m The packet mbuf containing the received frame.
212: @param length If non zero, the mbuf will be truncated to the
213: given length. If zero, then no truncation will take place.
214: @param queue If true, the only action performed is to queue the
215: input packet. Otherwise, the dlil_input() function is
216: called to handoff all queued packets (including the packet
217: passed in).
218: @result The number of packets submitted to the network layer.
219: Returns 0 if the packet was queued. */
220:
221: virtual UInt32 inputPacket(struct mbuf * m,
222: UInt32 length = 0,
223: bool queue = false);
224:
225: /*! @function flushInputQueue
226: @abstract Deliver all packets in the input queue to the network layer.
227: @discussion Remove all packets from the input queue and
228: submit them to the network layer by calling dlil_input(). This
229: method should be used in connection with the inputPacket() method,
230: to flush the input queue after inputPacket() has queued up
231: all received packets. See inputPacket() and clearInputQueue().
232: @result The number of packets submitted to the network layer.
233: May be zero if the queue is empty. */
234:
235: virtual UInt32 flushInputQueue();
236:
237: /*! @function clearInputQueue
238: @abstract Discard all packets in the input queue.
239: @discussion Remove all packets from the input queue and
240: release them back to the free buffer pool. The packets are not
241: delivered to the network layer. Also see flushInputQueue().
242: @result The number of packets released. */
243:
244: virtual UInt32 clearInputQueue();
245:
246: /*! @function inputEvent
247: @abstract Deliver an event to the network layer.
248: @discussion Called by the controller driver to send a network event
249: to the network layer. Possible applications include: media changed
250: events, power management events, controller state change events.
251: @param eventType The event type.
252: @param arg An argument associated with the event. */
253:
254: virtual void inputEvent(UInt32 eventType, void * arg);
255:
256: /*! @function registerOutputHandler
257: @abstract Register the output handler.
258: @discussion The interface will forward all output packets, sent
259: from the network layer, to the output handler registered through
260: this method. Until a handler is registered, handleClientOpen()
261: will refuse all client opens. The output handler cannot be changed
262: when the interface is registered.
263: @param target Target object that implements the output action.
264: @param action The action which handles output packets.
265: @result true if the handler provided was accepted, false otherwise. */
266:
267: virtual bool registerOutputHandler(OSObject * target,
268: IOOutputAction action);
269:
270: /*! @function setInputFilterTapMode
271: @abstract Set the mode of the input packet tap
272: @discussion To specify how the filter tap will connect to the input packet
273: stream when the tap becomes enabled. See IOFilterTapMode enumeration for
274: a description of the modes. This method will refuse to change the mode
275: when the interface is registered.
276: @param The new mode.
277: @result true if the new mode was accepted, false otherwise. */
278:
279: virtual bool setInputFilterTapMode(IOFilterTapMode mode);
280:
281: /*! @function setOutputFilterTapMode
282: @abstract Set the mode of the output packet tap
283: @discussion To specify how the filter tap will connect to the output packet
284: stream once the tap becomes enabled. See IOFilterTapMode enumeration for
285: a description of the modes. This method will refuse to change the mode
286: when the interface is registered.
287: @param The new mode.
288: @result true if the new mode was accepted, false otherwise. */
289:
290: virtual bool setOutputFilterTapMode(IOFilterTapMode mode);
291:
292: /*! @function getInputFilterTapMode
293: @abstract Get the input filter tap mode.
294: @result Returns the current mode of the input packet tap. */
295:
296: virtual IOFilterTapMode getInputFilterTapMode() const;
297:
298: /*! @function getOutputFilterTapMode
299: @abstract Get the output filter tap mode.
300: @result Returns the current mode of the input packet tap. */
301:
302: virtual IOFilterTapMode getOutputFilterTapMode() const;
303:
304: /*! @function feedInputFilterTap
305: @abstract Feed a packet to the input filter tap.
306: @discussion
307: This method should not be called if the input filter tap mode is
308: set to kIOFilterTapModeInternal, since the tap would already
309: receive every input packet that flows through the interface.
310: A further call to feedInputFilterTap() would cause
311: the tap to receive multiple copies of the same input packet.
312: @param pkt The packet mbuf to pass to the input tap. The rcvif
313: field in the mbuf is modified by this method. */
314:
315: virtual void feedInputFilterTap(struct mbuf * pkt);
316:
317: /*! @function feedOutputFilterTap
318: @abstract Feed a packet to the output filter tap.
319: @discussion
320: This method should not be called if the output filter tap mode is
321: set to kIOFilterTapModeInternal, since the tap would already
322: receive every output packet that flows through the interface.
323: A further call to feedOutputFilterTap() would cause
324: the tap to receive multiple copies of the same output packet.
325: @param pkt The packet mbuf to pass to the output tap. */
326:
327: virtual void feedOutputFilterTap(struct mbuf * pkt);
328:
329: /*! @function getNamePrefix
330: @abstract Get a name prefix for the interface.
331: @discussion The name of the interface advertised to the network layer
332: is generated by concatenating the string returned by this method,
333: and an integer unit number assigned by an external entity.
334: A family specific subclass of IONetworkInterface must implement
335: this method to assign a consistent name for all interfaces that
336: are members of the same family.
337:
338: @result A pointer to a constant string. */
339:
340: virtual const char * getNamePrefix() const = 0;
341:
342: /*! @function getInterfaceName
343: @discussion The if_name field in the ifnet structure is returned.
344: @result Pointer to a string containing the interface name. NULL
345: if a name has not yet been assigned. */
346:
347: virtual const char * getInterfaceName() const;
348:
349: /*! @function getInterfaceType
350: @discussion The if_data.ifi_type field in the ifnet structure is returned.
351: @result The interface type that matches one of the types
352: defined in bsd/net/if_types.h. */
353:
354: virtual UInt8 getInterfaceType() const;
355:
356: /*! @function getMaxTransferUnit
357: @discussion The if_data.ifi_mtu field in the ifnet structure is returned.
358: @result The interface MTU size. For Ethernet (not jumbo frames), this
359: should be 1500. */
360:
361: virtual UInt32 getMaxTransferUnit() const;
362:
363: /*! @function getFlags
364: @discussion The if_flags field in the ifnet structure is returned.
365: @result The interface flags. */
366:
367: virtual UInt16 getFlags() const;
368:
369: /*! @function getExtraFlags
370: @discussion The if_eflags field in the ifnet structure is returned.
371: @result The interface extra flags. */
372:
373: virtual UInt32 getExtraFlags() const;
374:
375: /*! @function getMediaAddressLength
376: @discussion The if_data.ifi_addrlen field in the ifnet structure
377: is returned.
378: @result The size of the media or link address. For Ethernet,
379: this should be 6. */
380:
381: virtual UInt8 getMediaAddressLength() const;
382:
383: /*! @function getMediaHeaderLength
384: @discussion The if_data.ifi_hdrlen field in the ifnet structure
385: is returned.
386: @result The media header length. For Ethernet, this should be 14. */
387:
388: virtual UInt8 getMediaHeaderLength() const;
389:
390: /*! @function getUnitNumber
391: @discussion The if_unit field in the ifnet structure is returned.
392: @result The assigned interface unit number. */
393:
394: virtual UInt16 getUnitNumber() const;
395:
396: /*! @function setInterfaceName
397: @discussion Update the if_name field in the ifnet structure.
398: @param name A new name for the interface.
399: @result true if the interface is unregistered
400: and the update was successful, false otherwise. */
401:
402: virtual bool setInterfaceName(const char * name);
403:
404: /*! @function setInterfaceType
405: @discussion Update the if_data.ifi_type field in the ifnet structure.
406: @param type The type of the interface. See bsd/net/if_types.h for the
407: defined types.
408: @result true if the interface is unregistered
409: and the update was successful, false otherwise. */
410:
411: virtual bool setInterfaceType(UInt8 type);
412:
413: /*! @function setMaxTransferUnit
414: @discussion Update the if_data.ifi_mtu field in the ifnet structure.
415: @param mtu The interface MTU size.
416: @result true if the interface is unregistered
417: and the update was successful, false otherwise. */
418:
419: virtual bool setMaxTransferUnit(UInt32 mtu);
420:
421: /*! @function setFlags
422: @discussion Perform a read-modify-write operation on the if_flags
423: field in the ifnet structure.
424: @param flags The flag bits that should be set.
425: @param clear The flag bits that should be cleared. If 0, then non
426: of the flags are cleared and the result is formed by OR'ing the
427: original flags with the new flags.
428: @result true if the interface is unregistered
429: and the update was successful, false otherwise. */
430:
431: virtual bool setFlags(UInt16 flags, UInt16 clear = 0);
432:
433: /*! @function setExtraFlags
434: @discussion Perform a read-modify-write operation on the if_eflags
435: field in the ifnet structure.
436: @param flags The flags that should be set.
437: @param clear The flags that should be cleared. If 0, then non
438: of the flags are cleared and the result is formed by OR'ing the
439: original flags with the new flags.
440: @result true if the interface is unregistered
441: and the update was successful, false otherwise. */
442:
443: virtual bool setExtraFlags(UInt32 flags, UInt32 clear = 0);
444:
445: /*! @function setMediaAddressLength
446: @discussion Update the if_data.ifi_addrlen field in the ifnet structure.
447: @param length The new media address length.
448: @result true if the interface is unregistered
449: and the update was successful, false otherwise. */
450:
451: virtual bool setMediaAddressLength(UInt8 length);
452:
453: /*! @function setMediaHeaderLength
454: @discussion Update the if_data.ifi_hdrlen field in the ifnet structure.
455: @param length The new media header length.
456: @result true if the interface is unregistered
457: and the update was successful, false otherwise. */
458:
459: virtual bool setMediaHeaderLength(UInt8 length);
460:
461: /*! @function setUnitNumber
462: @discussion Update the if_unit field in the ifnet structure.
463: @param unit The unit number to assign to this interface.
464: @result true if the interface is unregistered
465: and the unit number was accepted, false otherwise. */
466:
467: virtual bool setUnitNumber(UInt16 unit);
468:
469: /*! @function addNetworkData
470: @abstract Add an IONetworkData object to a dictionary kept by
471: the interface.
472: @param aData An IONetworkData object.
473: @result true if the data object was added successfully, false otherwise. */
474:
475: virtual bool addNetworkData(IONetworkData * aData);
476:
477: /*! @function removeNetworkData
478: @abstract Remove an entry from the dictionary of IONetworkData
479: objects.
480: @param aKey An OSSymbol key for an IONetworkData entry in the
481: dictionary.
482: @result True if completed without errors,
483: false if the operation was aborted. */
484:
485: virtual bool removeNetworkData(const OSSymbol * aKey);
486:
487: /*! @function removeNetworkData
488: @abstract Remove an entry from the dictionary of IONetworkData
489: objects.
490: @param aKey A C string key for an IONetworkData entry in the
491: dictionary.
492: @result True if completed without errors,
493: false if the operation was aborted. */
494:
495: virtual bool removeNetworkData(const char * aKey);
496:
497: /*! @function getNetworkData
498: @abstract Get an entry from the dictionary of IONetworkData objects.
499: @discussion Perform a lookup of the dictionary kept by the interface,
500: and return an entry that matches the specified string key.
501: @param aKey Search for an entry with this string key.
502: @result The matching entry, or 0 if no match was found. */
503:
504: virtual IONetworkData * getNetworkData(const char * aKey) const;
505:
506: /*! @function getNetworkData
507: @abstract Get an entry from the dictionary of IONetworkData objects.
508: @discussion Perform a lookup of the dictionary kept by the interface,
509: and return an entry that matches the specified OSSymbol key.
510: @param aKey Search for an entry with this OSSymbol key.
511: @result The matching entry, or 0 if no match was found. */
512:
513: virtual IONetworkData * getNetworkData(const OSSymbol * aKey) const;
514:
515: // Compatibility method (to be removed)
516: inline IONetworkData * getParameter(const char * aKey) const
517: { return getNetworkData(aKey); }
518:
519: protected:
520:
521: /*! @function free
522: @abstract Free the IONetworkInterface instance.
523: @discussion Resource allocated during init are released, and
524: clearInputQueue() is called to make sure the input queue is clean. */
525:
526: virtual void free();
527:
528: /*! @function handleOpen
529: @abstract Handle a client open on the interface.
530: @discussion The open() method in
531: IOService calls this method with the arbitration lock held, and this
532: method must return true to accept the client open. This method will
533: in turn call handleClientOpen() and controllerDidOpen(). Subclasses
534: must not override this method.
535: @param client The client object that requested the open.
536: @param options Not used. See IOService.
537: @param argument Not used. See IOService.
538: @result true to accept the client open, false otherwise. */
539:
540: virtual bool handleOpen(IOService * client,
541: IOOptionBits options,
542: void * argument);
543:
544: /*! @function handleClose
545: @abstract Handle a close by a client.
546: @discussion The close() method in
547: IOService calls this method with the arbitration lock held. This method
548: will in turn call handleClientClose() and controllerWillClose().
549: Subclasses must not override this method.
550: @param client The client object that requested the close.
551: @param options Not used. See IOService. */
552:
553: virtual void handleClose(IOService * client, IOOptionBits options);
554:
555: /*! @function handleIsOpen
556: @abstract Query a client that has an open on the controller.
557: @discussion This method is always called by IOService with the
558: arbitration lock held. Subclasses must not override this method.
559: @result true if the specified client, or any client if none is
560: specified, presently has an open on this object. */
561:
562: virtual bool handleIsOpen(const IOService * client) const;
563:
564: /*! @function lock
565: @abstract Take the interface lock.
566: @discussion Take the recursive lock that protects the interface
567: data and state. All updates to the interface state and to the
568: ifnet structure fields are protected by this lock. */
569:
570: virtual void lock();
571:
572: /*! @function unlock
573: @abstract Release the interface lock.
574: @discussion Release the recursive lock that protects the interface
575: data and state. */
576:
577: virtual void unlock();
578:
579: /*! @function controllerDidOpen
580: @abstract Prepare the controller after it has been opened.
581: @discussion Called by handleOpen() to configure the controller after it
582: has just been opened. The open on the controller occurs after the
583: interface receives the initial open request from a client. Subclasses
584: can override this method and setup the controller before allowing the
585: client open. The implementation in the subclass must call the method in
586: super and check the return value.
587: @param controller The controller that was opened.
588: @result Must return true in order for handleOpen() to accept
589: the client open. If the return is false, then the controller will be
590: closed and the client open will be rejected. */
591:
592: virtual bool controllerDidOpen(IONetworkController * controller);
593:
594: /*! @function controllerWillClose
595: @abstract Quiesce the controller before it is closed.
596: @discussion Called by handleClose() after receiving a close from the
597: last client, and just before the controller is closed. Subclasses
598: can override this method to perform any cleanup action before the
599: controller is closed.
600: @param controller The controller that will be closed. */
601:
602: virtual void controllerWillClose(IONetworkController * controller);
603:
604: /*! @function performCommand
605: @abstract Handle commands from the network layer.
606: @discussion Handles generic socket ioctl commands sent to the interface.
607: IONetworkInterface handles commands that are common to all network
608: families. A subclass of IONetworkInterface may override this method
609: in order to handle the same command that is handled here, but in a
610: different manner, or (the more like case) to augment the command
611: handling to include additional commands, and call super for any
612: commands not handled in the subclass.
613: The ioctl commands handled by IONetworkInterface are
614: SIOCGIFMTU (Get interface MTU size),
615: SIOCSIFMTU (Set interface MTU size),
616: SIOCSIFMEDIA (Set media), and
617: SIOCGIFMEDIA (Get media and link status).
618: @param controller The controller object.
619: @param cmd The command code.
620: @param arg0 Command argument.
621: @param arg1 Command argument.
622: @result A BSD return code defined in bsd/sys/errno.h. */
623:
624: virtual SInt performCommand(IONetworkController * controller,
625: UInt32 cmd,
626: void * arg0,
627: void * arg1);
628:
629: /*! @function getIfnet
630: @abstract Get the ifnet structure allocated by the interface object.
631: @discussion Request an interface to reveal its ifnet structure.
632: A concrete subclass must allocate an ifnet structure when the
633: object is initialized, and return a pointer to the ifnet structure
634: when this method is called.
635: @result Pointer to an ifnet structure allocated by a concrete
636: interface subclass. */
637:
638: virtual struct ifnet * getIfnet() const = 0;
639:
640: /*! @function initIfnet
641: @abstract Initialize the ifnet structure.
642: @discussion Subclasses must override
643: this method and initialize the ifnet structure given in a family specific
644: manner. Subclasses may use the "setter" methods such as setFlags() to
645: initialize the ifnet fields. The implementation in the subclass must call
646: the version in super before it returns, to allow IONetworkInterface to
647: complete the initialization.
648: @param ifp Pointer to an ifnet structure obtained earlier through the
649: getIfnet() call.
650: @result true on success, false otherwise. */
651:
652: virtual bool initIfnet(struct ifnet * ifp);
653:
654: /*! @function handleClientOpen
655: @abstract Handle a client open.
656: @discussion Called by handleOpen() to qualify a client object that
657: is attempting to open the interface.
658: @param controller The controller object (provider).
659: @param client The client object.
660: @result true to accept the client open, false to refuse the open. */
661:
662: virtual bool handleClientOpen(IONetworkController * controller,
663: IOService * client);
664:
665: /*! @function handleClientClose
666: @abstract Handle a client close.
667: @discussion Called by handleOpen() to notify that a client object has
668: closed the interface.
669: @param controller The controller object (provider).
670: @param client The client object. */
671:
672: virtual void handleClientClose(IONetworkController * controller,
673: IOService * client);
674:
675: /*! @function newUserClient
676: @abstract Create a new user client.
677: @discussion Create a new IOUserClient to handle userspace client requests.
678: The default implementation will create an IONetworkUserClient instance
679: if the type given is kIONUCType.
680: @param owningTask See IOService.
681: @param security_id See IOService.
682: @param type See IOService.
683: @param handler See IOService.
684: @result kIOReturnSuccess if an IONetworkUserClient was created. */
685:
686: virtual IOReturn newUserClient(task_t owningTask,
687: void * security_id,
688: UInt32 type,
689: IOUserClient ** handler);
690:
691: /*! @function setInterfaceNameInt
692: @discussion Update the if_name field in the ifnet structure.
693: @param name A new name for the interface.
694: @result true if the update was successful, false otherwise. */
695:
696: virtual bool setInterfaceNameInt(const char * name);
697:
698: /*! @function setInterfaceTypeInt
699: @discussion Update the if_data.ifi_type field in the ifnet structure.
700: @param type The type of the interface. See bsd/net/if_types.h for the
701: defined types.
702: @result true if the update was successful, false otherwise. */
703:
704: virtual bool setInterfaceTypeInt(UInt8 type);
705:
706: /*! @function setMaxTransferUnitInt
707: @discussion Update the if_data.ifi_mtu field in the ifnet structure.
708: @param mtu The interface MTU size.
709: @result true if the update was successful, false otherwise. */
710:
711: virtual bool setMaxTransferUnitInt(UInt32 mtu);
712:
713: /*! @function setFlagsInt
714: @discussion Perform a read-modify-write operation on the if_flags
715: field in the ifnet structure.
716: @param flags The flag bits that should be set.
717: @param clear The flag bits that should be cleared. If 0, then non
718: of the flags are cleared and the result is formed by OR'ing the
719: original flags with the new flags.
720: @result true if the update was successful, false otherwise. */
721:
722: virtual bool setFlagsInt(UInt16 flags, UInt16 clear = 0);
723:
724: /*! @function setExtraFlagsInt
725: @discussion Perform a read-modify-write operation on the if_eflags
726: field in the ifnet structure.
727: @param flags The flags that should be set.
728: @param clear The flags that should be cleared. If 0, then non
729: of the flags are cleared and the result is formed by OR'ing the
730: original flags with the new flags.
731: @result true if the update was successful, false otherwise. */
732:
733: virtual bool setExtraFlagsInt(UInt32 flags, UInt32 clear = 0);
734:
735: /*! @function setMediaAddressLengthInt
736: @discussion Update the if_data.ifi_addrlen field in the ifnet structure.
737: @param length The new media address length.
738: @result true if the field was updated, false otherwise. */
739:
740: virtual bool setMediaAddressLengthInt(UInt8 length);
741:
742: /*! @function setMediaHeaderLengthInt
743: @discussion Update the if_data.ifi_hdrlen field in the ifnet structure.
744: @param length The new media header length.
745: @result true if the update was successful, false otherwise. */
746:
747: virtual bool setMediaHeaderLengthInt(UInt8 length);
748:
749: /*! @function setUnitNumberInt
750: @discussion Update the if_unit field in the ifnet structure.
751: @param unit The unit number to assign to this interface.
752: @result true if the unit number was accepted, false otherwise. */
753:
754: virtual bool setUnitNumberInt(UInt16 unit);
755: };
756:
757: #endif /* !_IONETWORKINTERFACE_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.