From 2c12b8a3344347fbd5ee7df7cccbad20650a546f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 12 Aug 2010 13:45:18 +0000 Subject: [PATCH] * Also report the address index back to the userland. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38059 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/network/stack/datalink.cpp | 16 +++++++++++++--- .../kernel/network/stack/interfaces.cpp | 19 +++++++++++++++++++ src/add-ons/kernel/network/stack/interfaces.h | 1 + 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/add-ons/kernel/network/stack/datalink.cpp b/src/add-ons/kernel/network/stack/datalink.cpp index 2f4f1f1deb..4939ca15d2 100644 --- a/src/add-ons/kernel/network/stack/datalink.cpp +++ b/src/add-ons/kernel/network/stack/datalink.cpp @@ -788,14 +788,24 @@ interface_protocol_control(net_datalink_protocol* _protocol, int32 option, address = interface->FirstForFamily( protocol->domain->family); } + + request.ifra_index = interface->IndexOfAddress(address); } else address = interface->AddressAt(request.ifra_index); if (address == NULL) return B_BAD_VALUE; - status_t status = fill_address(address->local, - (sockaddr*)&((struct ifaliasreq*)argument)->ifra_addr, - sizeof(sockaddr_storage)); + // Copy index (in case none was specified) + status_t status = user_memcpy( + &((struct ifaliasreq*)argument)->ifra_index, + &request.ifra_index, sizeof(request.ifra_index)); + + // Copy address info + if (status == B_OK) { + status = fill_address(address->local, + (sockaddr*)&((struct ifaliasreq*)argument)->ifra_addr, + sizeof(sockaddr_storage)); + } if (status == B_OK) { status = fill_address(address->mask, (sockaddr*)&((struct ifaliasreq*)argument)->ifra_mask, diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp index 60c5d9345d..ec0dbceb39 100644 --- a/src/add-ons/kernel/network/stack/interfaces.cpp +++ b/src/add-ons/kernel/network/stack/interfaces.cpp @@ -638,6 +638,25 @@ Interface::AddressAt(size_t index) } +int32 +Interface::IndexOfAddress(InterfaceAddress* address) +{ + RecursiveLocker locker(fLock); + + AddressList::Iterator iterator = fAddresses.GetIterator(); + int32 index = 0; + + while (iterator.HasNext()) { + if (address == iterator.Next()) + return index; + + index++; + } + + return -1; +} + + size_t Interface::CountAddresses() { diff --git a/src/add-ons/kernel/network/stack/interfaces.h b/src/add-ons/kernel/network/stack/interfaces.h index 8acde84739..2640b063ca 100644 --- a/src/add-ons/kernel/network/stack/interfaces.h +++ b/src/add-ons/kernel/network/stack/interfaces.h @@ -129,6 +129,7 @@ public: void RemoveAddress(InterfaceAddress* address); bool GetNextAddress(InterfaceAddress** _address); InterfaceAddress* AddressAt(size_t index); + int32 IndexOfAddress(InterfaceAddress* address); size_t CountAddresses(); void RemoveAddresses();