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();