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

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 4 Dec 2010 15:33:02 +0100 (CET)

Author: axeld
Date: 2010-12-04 15:33:02 +0100 (Sat, 04 Dec 2010)
New Revision: 39722
Changeset: http://dev.haiku-os.org/changeset/39722

Modified:
   haiku/trunk/src/add-ons/kernel/network/stack/link.cpp
Log:
* net_protocol::bind() needs to set the socket's address. This now gives
  the correct sender MAC address in outgoing link level packets.
* SocketStatus() now also works correctly for bound protocols, ie. receiving
  data from a bound link level socket is now working as well.


Modified: haiku/trunk/src/add-ons/kernel/network/stack/link.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/network/stack/link.cpp       2010-12-04 
14:30:10 UTC (rev 39721)
+++ haiku/trunk/src/add-ons/kernel/network/stack/link.cpp       2010-12-04 
14:33:02 UTC (rev 39722)
@@ -166,7 +166,7 @@
        sockaddr_dl& linkAddress = *(sockaddr_dl*)address;
 
        if (linkAddress.sdl_type != 0) {
-               fBoundType = B_NET_FRAME_TYPE(linkAddress.sdl_type, 
+               fBoundType = B_NET_FRAME_TYPE(linkAddress.sdl_type,
                        linkAddress.sdl_e_type);
                // Bind to the type requested - this is needed in order to
                // receive any buffers
@@ -182,6 +182,9 @@
        fBoundToDevice = boundTo;
        socket->bound_to_device = boundTo->device->index;
 
+       memcpy(&socket->address, address, sizeof(struct sockaddr_storage));
+       socket->address.ss_len = sizeof(struct sockaddr_storage);
+
        return B_OK;
 }
 
@@ -198,6 +201,7 @@
        put_device_interface(fBoundToDevice);
 
        socket->bound_to_device = 0;
+       socket->address.ss_len = 0;
        return B_OK;
 }
 
@@ -217,7 +221,7 @@
 status_t
 LinkProtocol::SocketStatus(bool peek) const
 {
-       if (fMonitoredDevice == NULL)
+       if (fMonitoredDevice == NULL && !IsBound())
                return B_DEVICE_NOT_FOUND;
 
        return LocalDatagramSocket::SocketStatus(peek);
@@ -290,7 +294,7 @@
 //     #pragma mark - net_protocol module
 
 
-static net_protocol* 
+static net_protocol*
 link_init_protocol(net_socket* socket)
 {
        LinkProtocol* protocol = new (std::nothrow) LinkProtocol(socket);
@@ -580,7 +584,7 @@
 }
 
 
-static struct net_domain* 
+static struct net_domain*
 link_get_domain(net_protocol* protocol)
 {
        return sDomain;


Other related posts:

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