Signed-off-by: Hoang Le <[email protected]>
---
 net/tipc/udp_media.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
index 9783101bc4a9..ec3d31cdb232 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 recive 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);
-- 
2.17.1



_______________________________________________
tipc-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to