On Mon, Mar 18, 2019 at 10:55:27PM +0000, Keller, Jacob E wrote: > My question is to understand why, in your case, the index is not > sufficient. The fix to specify the address works for your case, but > it doesn't make sense to me, because we should already be bound to > the correct interface.
So I read through the kernel transmit path, and the problem is that the interface (ie the configured IP address) is a link-local address. The kernel will only select such a SA when the multicast DA is a *local* MC DA. This behavior agrees with the RFC. ip_route_output_key_hash_rcu(...) { ... if (fl4->flowi4_oif) { dev_out = dev_get_by_index_rcu(net, fl4->flowi4_oif); ... if (ipv4_is_local_multicast(fl4->daddr) || ipv4_is_lbcast(fl4->daddr) || fl4->flowi4_proto == IPPROTO_IGMP) { if (!fl4->saddr) fl4->saddr = inet_select_addr(dev_out, 0, RT_SCOPE_LINK); goto make_route; } if (!fl4->saddr) { if (ipv4_is_multicast(fl4->daddr)) fl4->saddr = inet_select_addr(dev_out, 0, fl4->flowi4_scope); else if (!fl4->daddr) fl4->saddr = inet_select_addr(dev_out, 0, RT_SCOPE_HOST); } } } Here flowi4_oif is the bound index. Notice the test for ipv4_is_local_multicast(). It passes RT_SCOPE_LINK to inet_select_addr(). In contrast, in the ipv4_is_multicast() case, the passed fl4->flowi4_scope is RT_SCOPE_UNIVERSE. That causes the link-local interfaces to be passed over. So, it isn't correct to join a global MC group on a link-local interface, and I don't see any reason to support that case. I especially do not want the program to bind to a specific address. After all, the interface's address may change at run time. What *is* a problem is the fact that the program transmits on some other interface than the one specified. Unfortunately the kernel doesn't flag this to the application as an error condition. We should find a way to detect this situation and throw a fault. Thanks, Richard _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel