>> It seems that kernel maintainers chose to keep the backward compatibility with a default that cause receiving data from all multicast groups and not only from joined multicast group.
>> But they add since kernel 2.6.31 an option that allow to avoid this.

> That's good to hear. (I guess this is the closest they'll ever come to admitting that the default behavior is a bug :-)


>> Do you think it could be possible to set this option in socketJoinGroup in a future release of live555 ?

> Done! I've just installed a new version (2013.10.03) of the "LIVE555 Streaming Media" code that sets this option to 0 if it's defined.

Attached is the changes I made to Linux 2.6.29 to port the IP_MULTICAST_ALL socket option from 2.6.31.

Sorry for this being an svn diff - but it isn't a big change, only a few lines to 5 files.

Hopefully it is of interest and not too off-topic. I've tested it within the limits of what it is meant to do (and only on one (custom ARM) embedded Linux platform) so ymmv.

Cheers,

Piers Hawksley
Index: include/net/inet_sock.h
===================================================================
--- include/net/inet_sock.h     (revision 5965)
+++ include/net/inet_sock.h     (working copy)
@@ -130,7 +130,8 @@
                                freebind:1,
                                hdrincl:1,
                                mc_loop:1,
-                               transparent:1;
+                               transparent:1,
+                               mc_all:1;       // From 2.6.31
        int                     mc_index;
        __be32                  mc_addr;
        struct ip_mc_socklist   *mc_list;
Index: include/linux/in.h
===================================================================
--- include/linux/in.h  (revision 5965)
+++ include/linux/in.h  (working copy)
@@ -107,6 +107,7 @@
 #define MCAST_JOIN_SOURCE_GROUP                46
 #define MCAST_LEAVE_SOURCE_GROUP       47
 #define MCAST_MSFILTER                 48
+#define IP_MULTICAST_ALL               49      // From 2.6.31
 
 #define MCAST_EXCLUDE  0
 #define MCAST_INCLUDE  1
Index: net/ipv4/af_inet.c
===================================================================
--- net/ipv4/af_inet.c  (revision 5965)
+++ net/ipv4/af_inet.c  (working copy)
@@ -376,6 +376,7 @@
        inet->uc_ttl    = -1;
        inet->mc_loop   = 1;
        inet->mc_ttl    = 1;
+       inet->mc_all    = 1;    // From 2.6.31
        inet->mc_index  = 0;
        inet->mc_list   = NULL;
 
Index: net/ipv4/ip_sockglue.c
===================================================================
--- net/ipv4/ip_sockglue.c      (revision 5965)
+++ net/ipv4/ip_sockglue.c      (working copy)
@@ -449,6 +449,7 @@
                             (1<<IP_ROUTER_ALERT) | (1<<IP_FREEBIND) |
                             (1<<IP_PASSSEC) | (1<<IP_TRANSPARENT))) ||
            optname == IP_MULTICAST_TTL ||
+           optname == IP_MULTICAST_ALL ||      // From 2.6.31
            optname == IP_MULTICAST_LOOP ||
            optname == IP_RECVORIGDSTADDR) {
                if (optlen >= sizeof(int)) {
@@ -895,6 +896,13 @@
                kfree(gsf);
                break;
        }
+       case IP_MULTICAST_ALL:  // From 2.6.31
+               if (optlen < 1)
+                       goto e_inval;
+               if (val != 0 && val != 1)
+                       goto e_inval;
+               inet->mc_all = val;
+               break;
        case IP_ROUTER_ALERT:
                err = ip_ra_control(sk, val ? 1 : 0, NULL);
                break;
@@ -1147,6 +1155,9 @@
                release_sock(sk);
                return err;
        }
+       case IP_MULTICAST_ALL:  // From 2.6.31
+               val = inet->mc_all;
+               break;
        case IP_PKTOPTIONS:
        {
                struct msghdr msg;
Index: net/ipv4/igmp.c
===================================================================
--- net/ipv4/igmp.c     (revision 5965)
+++ net/ipv4/igmp.c     (working copy)
@@ -2196,7 +2196,7 @@
                        break;
        }
        if (!pmc)
-               return 1;
+               return inet->mc_all;    // From 2.6.31
        psl = pmc->sflist;
        if (!psl)
                return pmc->sfmode == MCAST_EXCLUDE;
_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to