From 4ae58630381888d7a2d632b796bda54998a6376a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 11 Feb 2011 19:36:15 +0000 Subject: [PATCH] * Allow duplicates in the sAddressTable hash table; while it makes no sense to have duplicates there, it should certainly not panic. * Do not add unspecified addresses to the hash table. * The result of adding the initial address of an interface was ignored; now, the interface is correctly destructed, if necessary. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40444 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/stack/interfaces.cpp | 45 ++++++++++++++----- src/add-ons/kernel/network/stack/interfaces.h | 4 +- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 4808afd536..284e879156 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2006-2010, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2011, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -54,7 +54,8 @@ struct AddressHashDefinition { size_t Hash(InterfaceAddress* address) const { - return address->domain->address_module->hash_address(address->local, false); + return address->domain->address_module->hash_address(address->local, + false); } bool Compare(const KeyType& key, InterfaceAddress* address) const @@ -75,7 +76,7 @@ struct AddressHashDefinition { } }; -typedef BOpenHashTable AddressTable; +typedef BOpenHashTable AddressTable; static mutex sLock; @@ -311,6 +312,13 @@ InterfaceAddress::RemoveDefaultRoutes(int32 option) } +bool +InterfaceAddress::LocalIsDefined() const +{ + return local != NULL && local->sa_family != AF_UNSPEC; +} + + #if ENABLE_DEBUGGER_COMMANDS @@ -594,8 +602,10 @@ Interface::AddAddress(InterfaceAddress* address) fAddresses.Add(address); locker.Unlock(); - MutexLocker hashLocker(sHashLock); - sAddressTable.Insert(address); + if (address->LocalIsDefined()) { + MutexLocker hashLocker(sHashLock); + sAddressTable.Insert(address); + } return B_OK; } @@ -614,8 +624,10 @@ Interface::RemoveAddress(InterfaceAddress* address) locker.Unlock(); - MutexLocker hashLocker(sHashLock); - sAddressTable.Remove(address); + if (address->LocalIsDefined()) { + MutexLocker hashLocker(sHashLock); + sAddressTable.Remove(address); + } } @@ -1198,12 +1210,19 @@ add_interface(const char* name, net_domain_private* domain, locker.Unlock(); - notify_interface_added(interface); - add_interface_address(interface, domain, request); + status_t status = add_interface_address(interface, domain, request); + if (status == B_OK) + notify_interface_added(interface); + else { + locker.Lock(); + sInterfaces.Remove(interface); + locker.Unlock(); + interface->ReleaseReference(); + } interface->ReleaseReference(); - return B_OK; + return status; } @@ -1316,7 +1335,8 @@ update_interface_address(InterfaceAddress* interfaceAddress, int32 option, return B_OK; } - sAddressTable.Remove(interfaceAddress); + if (interfaceAddress->LocalIsDefined()) + sAddressTable.Remove(interfaceAddress); // Copy new address over status_t status = InterfaceAddress::Set(_address, newAddress); @@ -1354,7 +1374,8 @@ update_interface_address(InterfaceAddress* interfaceAddress, int32 option, notify_interface_changed(interface); } - sAddressTable.Insert(interfaceAddress); + if (interfaceAddress->LocalIsDefined()) + sAddressTable.Insert(interfaceAddress); return status; } diff --git a/src/add-ons/kernel/network/stack/interfaces.h b/src/add-ons/kernel/network/stack/interfaces.h index f8761289f7..f7bc63b21e 100644 --- a/src/add-ons/kernel/network/stack/interfaces.h +++ b/src/add-ons/kernel/network/stack/interfaces.h @@ -1,5 +1,5 @@ /* - * Copyright 2006-2010, Haiku, Inc. All Rights Reserved. + * Copyright 2006-2011, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: @@ -47,6 +47,8 @@ struct InterfaceAddress : DoublyLinkedListLinkImpl, void AddDefaultRoutes(int32 option); void RemoveDefaultRoutes(int32 option); + bool LocalIsDefined() const; + InterfaceAddress*& HashTableLink() { return fLink; } #if ENABLE_DEBUGGER_COMMANDS