home *** CD-ROM | disk | FTP | other *** search
/ ftp.sustworks.com 2018 / ftp.sustworks.com.zip / ftp.sustworks.com / USBPegasusEthernet_107.dmg / src / Source / USBPegasusEthernetInterface.cpp < prev    next >
C/C++ Source or Header  |  2007-03-27  |  3KB  |  89 lines

  1. extern "C" {
  2.   #include <sys/param.h>
  3.   #include <sys/systm.h>
  4. }
  5.  
  6. #include "USBPegasusEthernetInterface.h"
  7.  
  8. #define super IOEthernetInterface
  9.  
  10. OSDefineMetaClassAndStructors(USBPegasusEthernetInterface, 
  11.                               IOEthernetInterface);
  12.  
  13. void USBPegasusEthernetInterface::detachFromDataLinkLayer(IOOptionBits options,
  14.                                                           void *parameter ) {
  15. #if TIGER
  16.   super::detachFromDataLinkLayer(options, parameter);
  17. #else
  18.   /* There appears to be an issue with detaching network interfaces in
  19.      Mac OS 1.3.9. (and probably earlier).  The following code
  20.      detaches the bsd network interface, and then blocks until all
  21.      clients of the network interface have released it. */
  22.   int ret;
  23.   boolean_t funnel_state;
  24.   int (*oldFree)(struct ifnet *);
  25.  
  26.   detachLock = IOLockAlloc();
  27.   if(!detachLock) {
  28.     IOLog("USBPegasusEthernetInterface: failed to create detach detach lock.\n");
  29.     dlil_if_detach( getIfnet() );
  30.     return;
  31.   }
  32.  
  33.   ifFinished = false;
  34.   funnel_state = thread_funnel_set( network_flock, TRUE );
  35.  
  36.   /* Install our "free" handler routine. */
  37.   oldFree = (getIfnet())->if_free;
  38.   (getIfnet())->if_free = bsdInterfaceFinished;
  39.  
  40.   /* Attempt to attach interface. */
  41.   ret = dlil_if_detach( getIfnet() );
  42.  
  43.   switch(ret) {
  44.   case DLIL_WAIT_FOR_FREE:
  45.     /* Wait for network interface clients to close. */
  46.     thread_funnel_set( network_flock, FALSE );
  47.     IOLockLock(detachLock);
  48.     while(ifFinished == false) {
  49.       IOLockSleep(detachLock, NO_EVENT, THREAD_ABORTSAFE);      
  50.     }
  51.     thread_funnel_set( network_flock, TRUE );
  52.     break;
  53.   case 0:
  54.     /* Network interface detached. */
  55.     break;
  56.   default:
  57.     IOLog("USBPegasusEthernetInterface: dlil_if_detach: 0x%x.\n",
  58.           ret);
  59.     break;
  60.   }
  61.  
  62.   /* Restore old handler routine */  
  63.   (getIfnet())->if_free = oldFree;
  64.   thread_funnel_set( network_flock, funnel_state );
  65.   IOLockFree(detachLock);
  66. #endif
  67. }
  68.  
  69. #if !TIGER
  70. int USBPegasusEthernetInterface::bsdInterfaceFinished( struct ifnet * ifp ) {
  71.   USBPegasusEthernetInterface *me;
  72.  
  73.   if(!ifp || !ifp->if_private) {
  74.     IOLog("USBPegasusEthernetInterface: No interface.\n");
  75.     return 0;
  76.   }
  77.  
  78.   me = OSDynamicCast(USBPegasusEthernetInterface, (OSObject *)ifp->if_private);
  79.   if(!me) {
  80.     IOLog("USBPegasusEthernetInterface: Dynamic cast failed.\n");
  81.   } else {
  82.     IOLockLock(me->detachLock);
  83.     me->ifFinished = true;
  84.     IOLockWakeup(me->detachLock, NO_EVENT, true);
  85.     IOLockUnlock(me->detachLock);
  86.   }
  87.   return 0;
  88. }
  89. #endif