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;