diff options
Diffstat (limited to 'net/tipc/udp_media.c')
| -rw-r--r-- | net/tipc/udp_media.c | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c index 9783101bc4a9..10dc59ce9c82 100644 --- a/net/tipc/udp_media.c +++ b/net/tipc/udp_media.c @@ -650,6 +650,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,  	struct udp_tunnel_sock_cfg tuncfg = {NULL};  	struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];  	u8 node_id[NODE_ID_LEN] = {0,}; +	int rmcast = 0;  	ub = kzalloc(sizeof(*ub), GFP_ATOMIC);  	if (!ub) @@ -680,6 +681,9 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,  	if (err)  		goto err; +	/* Checking remote ip address */ +	rmcast = tipc_udp_is_mcast_addr(&remote); +  	/* Autoconfigure own node identity if needed */  	if (!tipc_own_id(net)) {  		memcpy(node_id, local.ipv6.in6_u.u6_addr8, 16); @@ -705,7 +709,12 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,  			goto err;  		}  		udp_conf.family = AF_INET; -		udp_conf.local_ip.s_addr = htonl(INADDR_ANY); + +		/* Switch to use ANY to receive packets from group */ +		if (rmcast) +			udp_conf.local_ip.s_addr = htonl(INADDR_ANY); +		else +			udp_conf.local_ip.s_addr = local.ipv4.s_addr;  		udp_conf.use_udp_checksums = false;  		ub->ifindex = dev->ifindex;  		if (tipc_mtu_bad(dev, sizeof(struct iphdr) + @@ -719,7 +728,10 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,  		udp_conf.family = AF_INET6;  		udp_conf.use_udp6_tx_checksums = true;  		udp_conf.use_udp6_rx_checksums = true; -		udp_conf.local_ip6 = in6addr_any; +		if (rmcast) +			udp_conf.local_ip6 = in6addr_any; +		else +			udp_conf.local_ip6 = local.ipv6;  		b->mtu = 1280;  #endif  	} else { @@ -741,7 +753,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,  	 * is used if it's a multicast address.  	 */  	memcpy(&b->bcast_addr.value, &remote, sizeof(remote)); -	if (tipc_udp_is_mcast_addr(&remote)) +	if (rmcast)  		err = enable_mcast(ub, &remote);  	else  		err = tipc_udp_rcast_add(b, &remote); |