ipv4: reenable multicast
tested between two Haiku VMs with iperf. Change-Id: Id9d3865f2c9f8ed6c79d0ece53f51c781c77b771 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3453 Reviewed-by: Rene Gollent <[email protected]> Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
committed by
Adrien Destugues
parent
3e4b663667
commit
116794af63
@@ -685,6 +685,9 @@ send_fragments(ipv4_protocol* protocol, struct net_route* route,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t ipv4_receive_data(net_buffer* buffer);
|
||||||
|
|
||||||
|
|
||||||
/*! Delivers the provided \a buffer to all listeners of this multicast group.
|
/*! Delivers the provided \a buffer to all listeners of this multicast group.
|
||||||
Does not take over ownership of the buffer.
|
Does not take over ownership of the buffer.
|
||||||
*/
|
*/
|
||||||
@@ -692,17 +695,20 @@ static bool
|
|||||||
deliver_multicast(net_protocol_module_info* module, net_buffer* buffer,
|
deliver_multicast(net_protocol_module_info* module, net_buffer* buffer,
|
||||||
bool deliverToRaw)
|
bool deliverToRaw)
|
||||||
{
|
{
|
||||||
|
TRACE("deliver_multicast(%p [%" B_PRIu32 " bytes])", buffer, buffer->size);
|
||||||
if (module->deliver_data == NULL)
|
if (module->deliver_data == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// TODO: fix multicast!
|
|
||||||
return false;
|
|
||||||
MutexLocker _(sMulticastGroupsLock);
|
MutexLocker _(sMulticastGroupsLock);
|
||||||
|
|
||||||
sockaddr_in* multicastAddr = (sockaddr_in*)buffer->destination;
|
sockaddr_in* multicastAddr = (sockaddr_in*)buffer->destination;
|
||||||
|
|
||||||
|
uint32 index = buffer->index;
|
||||||
|
if (buffer->interface_address != NULL)
|
||||||
|
index = buffer->interface_address->interface->index;
|
||||||
|
|
||||||
MulticastState::ValueIterator it = sMulticastState->Lookup(std::make_pair(
|
MulticastState::ValueIterator it = sMulticastState->Lookup(std::make_pair(
|
||||||
&multicastAddr->sin_addr, buffer->interface_address->interface->index));
|
&multicastAddr->sin_addr, index));
|
||||||
|
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
@@ -720,7 +726,7 @@ deliver_multicast(net_protocol_module_info* module, net_buffer* buffer,
|
|||||||
// as multicast filters are installed with an IPv4 protocol
|
// as multicast filters are installed with an IPv4 protocol
|
||||||
// reference, we need to go and find the appropriate instance
|
// reference, we need to go and find the appropriate instance
|
||||||
// related to the 'receiving protocol' with module 'module'.
|
// related to the 'receiving protocol' with module 'module'.
|
||||||
net_protocol* protocol = ipProtocol->socket->first_protocol;
|
protocol = ipProtocol->socket->first_protocol;
|
||||||
|
|
||||||
while (protocol != NULL && protocol->module != module)
|
while (protocol != NULL && protocol->module != module)
|
||||||
protocol = protocol->next;
|
protocol = protocol->next;
|
||||||
@@ -1543,6 +1549,29 @@ ipv4_send_routed_data(net_protocol* _protocol, struct net_route* route,
|
|||||||
sizeof(ipv4_header), true);
|
sizeof(ipv4_header), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((buffer->flags & MSG_MCAST) != 0
|
||||||
|
&& protocol->multicast_loopback) {
|
||||||
|
// copy an IP multicast packet to the input queue of the loopback
|
||||||
|
// interface
|
||||||
|
net_buffer *loopbackBuffer = gBufferModule->duplicate(buffer);
|
||||||
|
|
||||||
|
// get the IPv4 loopback address
|
||||||
|
struct sockaddr loopbackAddress;
|
||||||
|
gIPv4AddressModule.get_loopback_address(&loopbackAddress);
|
||||||
|
|
||||||
|
// get the matching interface address if any
|
||||||
|
net_interface_address* address =
|
||||||
|
sDatalinkModule->get_interface_address(&loopbackAddress);
|
||||||
|
if (address == NULL || (address->interface->flags & IFF_UP) == 0) {
|
||||||
|
sDatalinkModule->put_interface_address(address);
|
||||||
|
} else {
|
||||||
|
sDatalinkModule->put_interface_address(
|
||||||
|
loopbackBuffer->interface_address);
|
||||||
|
loopbackBuffer->interface_address = address;
|
||||||
|
ipv4_receive_data(loopbackBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TRACE_SK(protocol, " SendRoutedData(): header chksum: %" B_PRIu32
|
TRACE_SK(protocol, " SendRoutedData(): header chksum: %" B_PRIu32
|
||||||
", buffer checksum: %" B_PRIu32,
|
", buffer checksum: %" B_PRIu32,
|
||||||
gBufferModule->checksum(buffer, 0, sizeof(ipv4_header), true),
|
gBufferModule->checksum(buffer, 0, sizeof(ipv4_header), true),
|
||||||
|
|||||||
Reference in New Issue
Block a user