From 498255a0d134c73e8ea555932d7920ab3d6c9e88 Mon Sep 17 00:00:00 2001 From: Nivedita Singhvi Date: Thu, 28 May 2009 07:00:46 +0000 Subject: [PATCH] --- yaml --- r: 150592 b: refs/heads/master c: f771bef98004d9d141b085d987a77d06669d4f4f h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/in.h | 1 + trunk/include/net/inet_sock.h | 3 ++- trunk/net/ipv4/af_inet.c | 1 + trunk/net/ipv4/igmp.c | 2 +- trunk/net/ipv4/ip_sockglue.c | 11 +++++++++++ 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 558750338c7e..72ffa656aee0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4d52cfbef6266092d535237ba5a4b981458ab171 +refs/heads/master: f771bef98004d9d141b085d987a77d06669d4f4f diff --git a/trunk/include/linux/in.h b/trunk/include/linux/in.h index d60122a3a088..cf196da04ec9 100644 --- a/trunk/include/linux/in.h +++ b/trunk/include/linux/in.h @@ -107,6 +107,7 @@ struct in_addr { #define MCAST_JOIN_SOURCE_GROUP 46 #define MCAST_LEAVE_SOURCE_GROUP 47 #define MCAST_MSFILTER 48 +#define IP_MULTICAST_ALL 49 #define MCAST_EXCLUDE 0 #define MCAST_INCLUDE 1 diff --git a/trunk/include/net/inet_sock.h b/trunk/include/net/inet_sock.h index de0ecc71cf03..20a6957af870 100644 --- a/trunk/include/net/inet_sock.h +++ b/trunk/include/net/inet_sock.h @@ -130,7 +130,8 @@ struct inet_sock { freebind:1, hdrincl:1, mc_loop:1, - transparent:1; + transparent:1, + mc_all:1; int mc_index; __be32 mc_addr; struct ip_mc_socklist *mc_list; diff --git a/trunk/net/ipv4/af_inet.c b/trunk/net/ipv4/af_inet.c index 5abee4c97449..d87362178588 100644 --- a/trunk/net/ipv4/af_inet.c +++ b/trunk/net/ipv4/af_inet.c @@ -375,6 +375,7 @@ static int inet_create(struct net *net, struct socket *sock, int protocol) inet->uc_ttl = -1; inet->mc_loop = 1; inet->mc_ttl = 1; + inet->mc_all = 1; inet->mc_index = 0; inet->mc_list = NULL; diff --git a/trunk/net/ipv4/igmp.c b/trunk/net/ipv4/igmp.c index 9eb6219af615..e6058a503796 100644 --- a/trunk/net/ipv4/igmp.c +++ b/trunk/net/ipv4/igmp.c @@ -2196,7 +2196,7 @@ int ip_mc_sf_allow(struct sock *sk, __be32 loc_addr, __be32 rmt_addr, int dif) break; } if (!pmc) - return 1; + return inet->mc_all; psl = pmc->sflist; if (!psl) return pmc->sfmode == MCAST_EXCLUDE; diff --git a/trunk/net/ipv4/ip_sockglue.c b/trunk/net/ipv4/ip_sockglue.c index 21b0187123d6..cb49936856e0 100644 --- a/trunk/net/ipv4/ip_sockglue.c +++ b/trunk/net/ipv4/ip_sockglue.c @@ -453,6 +453,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, (1<= sizeof(int)) { @@ -898,6 +899,13 @@ static int do_ip_setsockopt(struct sock *sk, int level, kfree(gsf); break; } + case IP_MULTICAST_ALL: + 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; @@ -1151,6 +1159,9 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, release_sock(sk); return err; } + case IP_MULTICAST_ALL: + val = inet->mc_all; + break; case IP_PKTOPTIONS: { struct msghdr msg;