From a10a3d49d629a4a17b931b286fe2f723f3b60935 Mon Sep 17 00:00:00 2001 From: Waldemar Kornewald Date: Sat, 25 Oct 2003 13:00:28 +0000 Subject: [PATCH] Fixed BUG in FindUnit() and Register/UnregisterInterface(). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5160 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/interfaces/ppp/PPPManager.cpp | 16 ++++++++++++---- .../kernel/network/interfaces/ppp/PPPManager.h | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/network/interfaces/ppp/PPPManager.cpp b/src/add-ons/kernel/network/interfaces/ppp/PPPManager.cpp index 887d13d8cf..e97da4960d 100644 --- a/src/add-ons/kernel/network/interfaces/ppp/PPPManager.cpp +++ b/src/add-ons/kernel/network/interfaces/ppp/PPPManager.cpp @@ -88,7 +88,7 @@ deleter_thread(void *data) manager->DeleterThreadEvent(); // check if the manager is being destroyed - if(receive_data_with_timeout(&sender, &code, NULL, 0, 50000) == B_OK) + if(receive_data_with_timeout(&sender, &code, NULL, 0, 500) == B_OK) return B_OK; } @@ -261,6 +261,7 @@ PPPManager::CreateInterface(const driver_settings *settings, interface_entry *entry = new interface_entry; entry->accessing = 1; entry->deleting = false; + fRegisterRequestor = PPP_UNDEFINED_INTERFACE_ID; entry->interface = new PPPInterface(id, settings, parentEntry ? parentEntry->interface : NULL); @@ -269,8 +270,10 @@ PPPManager::CreateInterface(const driver_settings *settings, delete entry; return PPP_UNDEFINED_INTERFACE_ID; } - fEntries.AddItem(entry); + if(fRegisterRequestor == id) + entry->interface->RegisterInterface(); + locker.UnlockNow(); if(!Report(PPP_MANAGER_REPORT, PPP_REPORT_INTERFACE_CREATED, @@ -332,6 +335,8 @@ PPPManager::RegisterInterface(interface_id ID) LockerHelper locker(fLock); + fRegisterRequestor = ID; + interface_entry *entry = EntryFor(ID); if(!entry || entry->deleting) return NULL; @@ -354,7 +359,7 @@ PPPManager::RegisterInterface(interface_id ID) ifp->ioctl = ppp_ifnet_ioctl; #if DEBUG - printf("PPPManager::DeleteInterface(): Created new ifnet: %s%d\n", + printf("PPPManager::RegisterInterface(): Created new ifnet: %s%d\n", ifp->name, ifp->if_unit); #endif @@ -372,6 +377,9 @@ PPPManager::UnregisterInterface(interface_id ID) LockerHelper locker(fLock); + if(fRegisterRequestor == ID) + fRegisterRequestor = PPP_UNDEFINED_INTERFACE_ID; + interface_entry *entry = EntryFor(ID); if(!entry) return false; @@ -677,7 +685,7 @@ PPPManager::FindUnit() const qsort(units, fEntries.CountItems(), sizeof(int32), greater); int32 unit = 0; - for(int32 index = 0; index < fEntries.CountItems() - 1; index++) { + for(int32 index = 0; index < fEntries.CountItems(); index++) { if(units[index] > unit) return unit; else if(units[index] == unit) diff --git a/src/add-ons/kernel/network/interfaces/ppp/PPPManager.h b/src/add-ons/kernel/network/interfaces/ppp/PPPManager.h index a5cc611816..1d91571e03 100644 --- a/src/add-ons/kernel/network/interfaces/ppp/PPPManager.h +++ b/src/add-ons/kernel/network/interfaces/ppp/PPPManager.h @@ -75,7 +75,7 @@ class PPPManager { BLocker fLock, fReportLock; PPPReportManager fReportManager; List fEntries; - interface_id fNextID; + interface_id fNextID, fRegisterRequestor; thread_id fDeleterThread; net_timer_id fPulseTimer; };