From bbcf6596ece04698d4260b27d6e6e109489f6a6d Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Tue, 1 May 2007 15:15:47 +0000 Subject: [PATCH] select the default interface to be used for multicast through a routing table query. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20952 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/network/protocols/ipv4/ipv4.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp index 2cdbfe7a98..9fdf1eca74 100644 --- a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp +++ b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp @@ -860,6 +860,24 @@ generic_to_ipv4(int option) } +static net_interface * +get_multicast_interface(ipv4_protocol *protocol, const in_addr *address) +{ + sockaddr_in groupAddr; + memset(&groupAddr, 0, sizeof(groupAddr)); + groupAddr.sin_family = AF_INET; + if (address) + groupAddr.sin_addr = *address; + + net_route *route = sDatalinkModule->get_route(sDomain, + (sockaddr *)&groupAddr); + if (route == NULL) + return NULL; + + return route->interface; +} + + static status_t ipv4_delta_membership(ipv4_protocol *protocol, int option, in_addr *interfaceAddr, in_addr *groupAddr, in_addr *sourceAddr) @@ -867,7 +885,7 @@ ipv4_delta_membership(ipv4_protocol *protocol, int option, net_interface *interface = NULL; if (interfaceAddr->s_addr == INADDR_ANY) { - interface = sDatalinkModule->get_interface_with_address(sDomain, NULL); + interface = get_multicast_interface(protocol, groupAddr); } else { sockaddr_in address; fill_sockaddr_in(&address, interfaceAddr->s_addr);