|
@@ -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);
|