Ticket #11919: 0001-Fix-and-enable-ipv4-multicast.patch

File 0001-Fix-and-enable-ipv4-multicast.patch, 3.1 KB (added by mshlyn, 9 years ago)
  • src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp

    From 9ba0d3a860aefc250bca9c8fb53b2c2ca9543dc3 Mon Sep 17 00:00:00 2001
    From: mshlyn <linlongzhou@163.com>
    Date: Wed, 11 Mar 2015 00:51:43 +0800
    Subject: [PATCH] Fix and enable ipv4 multicast
    
    ---
     src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp | 16 +++++++++++++---
     src/add-ons/kernel/network/stack/interfaces.cpp    | 14 ++++++++++++++
     2 files changed, 27 insertions(+), 3 deletions(-)
    
    diff --git a/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp b/src/add-ons/kernel/network/protocols/ipv4/ipv4.cpp
    index 15011da..607b3aa 100644
    a b deliver_multicast(net_protocol_module_info* module, net_buffer* buffer,  
    689689    if (module->deliver_data == NULL)
    690690        return false;
    691691
    692     // TODO: fix multicast!
    693     return false;
    694692    MutexLocker _(sMulticastGroupsLock);
    695693
     694    if (buffer->interface_address == NULL) {
     695        dprintf("%s: buffer->interface_address is NULL\n", __FUNCTION__);
     696        return false;
     697    }
     698
    696699    sockaddr_in* multicastAddr = (sockaddr_in*)buffer->destination;
    697700
    698701    MulticastState::ValueIterator it = sMulticastState->Lookup(std::make_pair(
    deliver_multicast(net_protocol_module_info* module, net_buffer* buffer,  
    714717                // as multicast filters are installed with an IPv4 protocol
    715718                // reference, we need to go and find the appropriate instance
    716719                // related to the 'receiving protocol' with module 'module'.
    717                 net_protocol* protocol = ipProtocol->socket->first_protocol;
     720                protocol = ipProtocol->socket->first_protocol;
    718721
    719722                while (protocol != NULL && protocol->module != module)
    720723                    protocol = protocol->next;
    ipv4_receive_data(net_buffer* buffer)  
    16121615            notForUs = !wasMulticast;
    16131616    } else if (IN_MULTICAST(ntohl(header.destination))) {
    16141617        buffer->flags |= MSG_MCAST;
     1618
     1619        // Multicast MAC address is different from normal MAC
     1620        // Use sdl_index of Link level sockaddr structure to accquire
     1621        // reference
     1622        if (!sDatalinkModule->is_local_link_address(sDomain, false,
     1623                buffer->destination, &buffer->interface_address))
     1624            notForUs = true;
    16151625    } else {
    16161626        uint32 matchedAddressType = 0;
    16171627
  • src/add-ons/kernel/network/stack/interfaces.cpp

    diff --git a/src/add-ons/kernel/network/stack/interfaces.cpp b/src/add-ons/kernel/network/stack/interfaces.cpp
    index 20b4110..28bf173 100644
    a b get_interface_address_for_link(net_domain* domain, const sockaddr* address,  
    15551555
    15561556            return interface->FirstForFamily(domain->family);
    15571557        }
     1558
     1559        // Multicast frame has different MAC address
     1560        // Just compare the index and name
     1561        if (linkAddress.sdl_index == interface->device->index
     1562            && memcmp(linkAddress.sdl_data, interface->device->name,
     1563                IF_NAMESIZE > linkAddress.sdl_nlen
     1564                ? linkAddress.sdl_nlen : IF_NAMESIZE) == 0) {
     1565            TRACE("  %s matches\n", interface->device->name);
     1566            // link address matches
     1567            if (unconfiguredOnly)
     1568                return interface->FirstUnconfiguredForFamily(domain->family);
     1569
     1570            return interface->FirstForFamily(domain->family);
     1571        }
    15581572    }
    15591573
    15601574    return NULL;