mcproxy: not able to process JOIN's received on an Downstream interface for PPPoE kind of interface

24 views
Skip to first unread message

Ganesh Reddy

unread,
Dec 1, 2017, 10:40:21 AM12/1/17
to Multicast Proxy

Hi All,

 

I am trying to debug, the mcproxy  with Downstream interface being PPPoE interface and Upstream being ethernet interface.  

 

Can you help on, weather anybody encountered similar problem ? How to make DOWN stream interface to work for PPPoE interfaces ? Any clues/inputs will be highly appreciate.

 

Problem:             Though Stream is sending from H1 and Listener running at H2, the stream is not reaching H2

Analysis:              Based on debugging, I could guess that at below YELLOW highlighted portions of code is being hit and hence not honoring JOIN received on a PPPoE  tunnel

                              I think, for a point-point interfaces, the netmask will be 255.255.255.255 (Only one host). So, I think based on code flow the netmask check fails and not returning valid IFINDEX. JOIN received on PPPoE interface is discarded….

 

Setup:

H1 -------------------------------------eth0  mcproxy ppp1========PPPoE/CHAP========= ppp1 H2

                                                UPStream              Downstream                                                           

UDPStream sender                                                                                                                       UDP listenr/Subscriber/Join

 

 

CODE flow/inputs

 

} else if (igmp_hdr->igmp_type == IGMP_V3_MEMBERSHIP_REPORT) {

            HC_LOG_DEBUG("IGMP_V3_MEMBERSHIP_REPORT received");

 

            igmpv3_mc_report* v3_report = reinterpret_cast<igmpv3_mc_report*>(igmp_hdr);

            igmpv3_mc_record* rec = reinterpret_cast<igmpv3_mc_record*>(reinterpret_cast<unsigned char*>(v3_report) + sizeof(igmpv3_mc_report));

 

            int num_records = ntohs(v3_report->num_of_mc_records);

            HC_LOG_DEBUG("\tnum of multicast records: " << num_records);

 

            saddr = ip_hdr->ip_src;

            HC_LOG_DEBUG("\tsaddr: " << saddr);

 

            if ((if_index = m_interfaces->get_if_index(saddr)) == 0) {

               HC_LOG_DEBUG("no if_index found");

               return;

            }

 

 

 

unsigned int interfaces::get_if_index(const addr_storage& saddr) const

{

    HC_LOG_TRACE("");

 

    addr_storage recv_subnet;

    addr_storage src_subnet;

   

    const if_prop_map* prop_map;

 

    if (saddr.get_addr_family() == AF_INET) {

        prop_map = m_if_prop.get_if_props();

        for (auto & e : *prop_map) {

            if (e.second.ip4_addr != nullptr && e.second.ip4_addr->ifa_netmask != nullptr && e.second.ip4_addr->ifa_addr != nullptr) {

                recv_subnet = *e.second.ip4_addr->ifa_netmask;

                src_subnet = *e.second.ip4_addr->ifa_addr;

                src_subnet.mask_ipv4(recv_subnet);

                if (src_subnet == recv_subnet.mask_ipv4(saddr)) {

                    return get_if_index(e.second.ip4_addr->ifa_name);

                }

            }

        }

    }else{

        HC_LOG_WARN("cannot map IPv6 addr to interface index:" << saddr);

    }

    return INTERFACES_UNKOWN_IF_INDEX;

}

 

 

 

addr_storage& addr_storage::mask_ipv4(const addr_storage& subnet_mask)

{

    if (this->get_addr_family() == AF_INET && subnet_mask.get_addr_family() == AF_INET) {

        get_in_addr_mutable().s_addr &= subnet_mask.get_in_addr().s_addr;

        return *this;

    } else {

        HC_LOG_ERROR("incompatible ip versions");

    }

 

    return *this;

}    

 

Regards,

Ganesh

Ganesh Reddy

unread,
Dec 4, 2017, 7:37:53 AM12/4/17
to multica...@googlegroups.com, ganesh...@gmail.com, Rajeshbv Bikkina, Vidya Sankar Gottumukkula, Ganesh Reddy, Siva Prasad Meduri

Hi Sebastian,

Reply all
Reply to author
Forward
0 new messages