Commit acad76a5 authored by Hoang Le's avatar Hoang Le Committed by David S. Miller

tipc: support binding to specific ip address when activating UDP bearer

INADDR_ANY is hard-coded when activating UDP bearer. So, we could not
bind to a specific IP address even with replicast mode using - given
remote ip address instead of using multicast ip address.

In this commit, we fixed it by checking and switch to use appropriate
local ip address.

before:
$netstat -plu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address
udp        0      0 **0.0.0.0:6118**            0.0.0.0:*

after:
$netstat -plu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address
udp        0      0 **10.0.0.2:6118**           0.0.0.0:*
Acked-by: default avatarYing Xue <ying.xue@windriver.com>
Acked-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarHoang Le <hoang.h.le@dektech.com.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1986647c
...@@ -650,6 +650,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b, ...@@ -650,6 +650,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
struct udp_tunnel_sock_cfg tuncfg = {NULL}; struct udp_tunnel_sock_cfg tuncfg = {NULL};
struct nlattr *opts[TIPC_NLA_UDP_MAX + 1]; struct nlattr *opts[TIPC_NLA_UDP_MAX + 1];
u8 node_id[NODE_ID_LEN] = {0,}; u8 node_id[NODE_ID_LEN] = {0,};
int rmcast = 0;
ub = kzalloc(sizeof(*ub), GFP_ATOMIC); ub = kzalloc(sizeof(*ub), GFP_ATOMIC);
if (!ub) if (!ub)
...@@ -680,6 +681,9 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b, ...@@ -680,6 +681,9 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
if (err) if (err)
goto err; goto err;
/* Checking remote ip address */
rmcast = tipc_udp_is_mcast_addr(&remote);
/* Autoconfigure own node identity if needed */ /* Autoconfigure own node identity if needed */
if (!tipc_own_id(net)) { if (!tipc_own_id(net)) {
memcpy(node_id, local.ipv6.in6_u.u6_addr8, 16); 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, ...@@ -705,7 +709,12 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
goto err; goto err;
} }
udp_conf.family = AF_INET; 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; udp_conf.use_udp_checksums = false;
ub->ifindex = dev->ifindex; ub->ifindex = dev->ifindex;
if (tipc_mtu_bad(dev, sizeof(struct iphdr) + if (tipc_mtu_bad(dev, sizeof(struct iphdr) +
...@@ -719,7 +728,10 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b, ...@@ -719,7 +728,10 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
udp_conf.family = AF_INET6; udp_conf.family = AF_INET6;
udp_conf.use_udp6_tx_checksums = true; udp_conf.use_udp6_tx_checksums = true;
udp_conf.use_udp6_rx_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; b->mtu = 1280;
#endif #endif
} else { } else {
...@@ -741,7 +753,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b, ...@@ -741,7 +753,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
* is used if it's a multicast address. * is used if it's a multicast address.
*/ */
memcpy(&b->bcast_addr.value, &remote, sizeof(remote)); memcpy(&b->bcast_addr.value, &remote, sizeof(remote));
if (tipc_udp_is_mcast_addr(&remote)) if (rmcast)
err = enable_mcast(ub, &remote); err = enable_mcast(ub, &remote);
else else
err = tipc_udp_rcast_add(b, &remote); err = tipc_udp_rcast_add(b, &remote);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment