<!doctype html public "-//W3C//DTD W3 HTML//EN">
<html><head><style type="text/css"><!--
blockquote, dl, ul, ol, li { padding-top: 0 ; padding-bottom: 0 }
 --></style><title>Re: [Live-devel] Many multicast sources with same
port pro</title></head><body>
<blockquote type="cite" cite>I have done some investigation on this
issue and here are the results and suggestions.</blockquote>
<blockquote type="cite" cite><br></blockquote>
<blockquote type="cite" cite>1. You were right, it works on
&nbsp;freeBSD , but see 2.</blockquote>
<blockquote type="cite" cite><br></blockquote>
<blockquote type="cite" cite>2. This is not a Linux bug</blockquote>
<div><br></div>
<div>I guess we'll just have to disagree on this.</div>
<div><br></div>
<div><br></div>
<blockquote type="cite" cite>We know that one should not bind() to a
multicast address</blockquote>
<div><br></div>
<div>Agreed :-)</div>
<div><br></div>
<div><br></div>
<blockquote type="cite" cite>, but according to the kernel developers
and other multicast developers this is intended in case you want to
receive only from one address and port and not all. It depends on
whats needed, so no bug..</blockquote>
<blockquote type="cite" cite>.</blockquote>
<blockquote type="cite" cite><a
href="http://jungla.dit.upm.es/~jmseyas/linux/mcast.lj/mcast-lj.html"
>http://jungla.dit.upm.es/~jmseyas/linux/mcast.lj/mcast-lj.html</a
>&nbsp;(shows a bind is required)</blockquote>
<blockquote type="cite" cite><a
href="http://marc.info/?l=linux-netdev&amp;m=121579883022264&amp;w=2"
>http://marc.info/?l=linux-netdev&amp;m=121579883022264&amp;w=2</a></blockquote
>
<blockquote type="cite" cite><a
href="http://marc.info/?l=linux-netdev&amp;m=121580189427089&amp;w=2"
>http://marc.info/?l=linux-netdev&amp;m=121580189427089&amp;w=2</a></blockquote
>
<div><br></div>
<div><br></div>
<div>I don't agree with the arguments made here.&nbsp; In
particular:</div>
<div><br></div>
<blockquote type="cite" cite>
<blockquote>That's how it has always worked in the original socket
implementation (BSD) and derivatives.</blockquote>
</blockquote>
<div><br></div>
<div>is most definitely not true, because (as you have discovered
yourself) it doesn't work this way in FreeBSD.</div>
<div><br></div>
<div>I also don't agree with the claim that &quot;Multicast addresses,
like unicast addresses, are for the entire</div>
<div>machine, not just the socket that does the join&quot;, because
the IP_ADD_MEMBERSHIP operation is explicitly done on a socket (i.e.,
using &quot;setsockopt()&quot;).&nbsp; It also seems wrong that a
process should have the potential to - by joining a multicast group -
control which packets that are received by a separate process.&nbsp;
(This is arguably a security violation.)</div>
<div><br></div>
<div>In any case, this is all a moot point, because I'm not going to
be changing the LIVE555 code to bind to the multicast address (when
creating a multicast 'groupsock'), because in the past - when this
suggestion has been made - some people have discovered and reported
that it doesn't work for them.&nbsp; It does not appear to be portable
across different OSs, so I can't put it in the released code.&nbsp;
It's not inconceivable that sometime in the future I might make a
change to support this, but have it #ifdef'd out by default.&nbsp;
This is not a high priority, though, and the whole &quot;groupsock&quot;
interface will eventually be replaced anyway (to make it more
consistent with the &quot;liveMedia&quot; object model).&nbsp; So it
might not happen for a while, if ever.&nbsp; Sorry.</div>
<div><br></div>
<div>In the meantime, you *might* be able to get the effect you want
by making the following small change to
&quot;liveMedia/MediaSession.cpp&quot;, and also changing
&quot;groupsock/GroupsockHelper.cpp&quot; to replace the line</div>
<div><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>if
(port.num() == 0) addr = ReceivingInterfaceAddr;</div>
<div>with</div>
<div><x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </x-tab>addr =
ReceivingInterfaceAddr;</div>
<div><br></div>
<div>(or, you could patch your Linux kernel :-)</div>
<div><br></div>
<div>*** MediaSession.cpp.save<x-tab>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</x-tab>Fri Oct&nbsp; 1 05:49:35 2010<br>
--- MediaSession.cpp<x-tab>&nbsp;&nbsp;&nbsp; </x-tab>Fri Oct&nbsp; 1
06:02:43 2010<br>
***************<br>
*** 568,573 ****<br>
--- 568,574 ----<br>
&nbsp; Boolean MediaSubsession::initiate(int useSpecialRTPoffset)
{<br>
&nbsp;&nbsp;&nbsp; if (fReadSource != NULL) return True; // has
already been initiated<br>
&nbsp;<br>
+&nbsp;&nbsp; netAddressBits savedReceivingInterfaceAddr =
ReceivingInterfaceAddr;<br>
&nbsp;&nbsp;&nbsp; do {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fCodecName == NULL) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
env().setResultMsg(&quot;Codec is unspecified&quot;);<br>
***************<br>
*** 579,584 ****<br>
--- 580,586 ----<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct in_addr tempAddr;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempAddr.s_addr =
connectionEndpointAddress();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // This could
get changed later, as a result of a RTSP &quot;SETUP&quot;<br>
+&nbsp;&nbsp;&nbsp;&nbsp; if (IsMulticastAddress(tempAddr.s_addr))
ReceivingInterfaceAddr = tempAddr.s_addr;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fClientPortNum != 0) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // The sockets' port
numbers were specified for us.&nbsp; Use these:<br>
***************<br>
*** 892,897 ****<br>
--- 894,900 ----<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return True;<br>
&nbsp;&nbsp;&nbsp; } while (0);<br>
&nbsp;<br>
+&nbsp;&nbsp; ReceivingInterfaceAddr =
savedReceivingInterfaceAddr;<br>
&nbsp;&nbsp;&nbsp; delete fRTPSocket; fRTPSocket = NULL;<br>
&nbsp;&nbsp;&nbsp; delete fRTCPSocket; fRTCPSocket = NULL;<br>
&nbsp;&nbsp;&nbsp; Medium::close(fRTCPInstance); fRTCPInstance =
NULL;</div>
<x-sigsep><pre>-- 
</pre></x-sigsep>
<div><br>
Ross Finlayson<br>
Live Networks, Inc.<br>
http://www.live555.com/</div>
</body>
</html>