[haiku-commits] r38059 - haiku/trunk/src/add-ons/kernel/network/stack

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 12 Aug 2010 15:45:18 +0200 (CEST)

Author: axeld
Date: 2010-08-12 15:45:18 +0200 (Thu, 12 Aug 2010)
New Revision: 38059
Changeset: http://dev.haiku-os.org/changeset/38059

Modified:
   haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp
   haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp
   haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h
Log:
* Also report the address index back to the userland.


Modified: haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp   2010-08-12 
13:38:52 UTC (rev 38058)
+++ haiku/trunk/src/add-ons/kernel/network/stack/datalink.cpp   2010-08-12 
13:45:18 UTC (rev 38059)
@@ -788,15 +788,25 @@
                                        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,
                                        sizeof(sockaddr_storage));

Modified: haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp 2010-08-12 
13:38:52 UTC (rev 38058)
+++ haiku/trunk/src/add-ons/kernel/network/stack/interfaces.cpp 2010-08-12 
13:45:18 UTC (rev 38059)
@@ -638,6 +638,25 @@
 }
 
 
+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()
 {

Modified: haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h   2010-08-12 
13:38:52 UTC (rev 38058)
+++ haiku/trunk/src/add-ons/kernel/network/stack/interfaces.h   2010-08-12 
13:45:18 UTC (rev 38059)
@@ -129,6 +129,7 @@
                        void                            
RemoveAddress(InterfaceAddress* address);
                        bool                            
GetNextAddress(InterfaceAddress** _address);
                        InterfaceAddress*       AddressAt(size_t index);
+                       int32                           
IndexOfAddress(InterfaceAddress* address);
                        size_t                          CountAddresses();
                        void                            RemoveAddresses();
 


Other related posts:

  • » [haiku-commits] r38059 - haiku/trunk/src/add-ons/kernel/network/stack - axeld