aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds
diff options
context:
space:
mode:
authorKa-Cheong Poon <ka-cheong.poon@oracle.com>2018-07-31 01:48:42 -0400
committerDavid S. Miller <davem@davemloft.net>2018-08-01 12:32:35 -0400
commite65d4d96334e3ff4fe0064612a93a51c63de08de (patch)
tree3bbc43d81b1e59665ceae7f412c70be52c29d89c /net/rds
parentf394ad28feffbeebab77c8bf9a203bd49b957c9a (diff)
rds: Remove IPv6 dependency
This patch removes the IPv6 dependency from RDS. Signed-off-by: Ka-Cheong Poon <ka-cheong.poon@oracle.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds')
-rw-r--r--net/rds/Kconfig2
-rw-r--r--net/rds/af_rds.c32
-rw-r--r--net/rds/bind.c4
-rw-r--r--net/rds/connection.c26
-rw-r--r--net/rds/ib.c31
-rw-r--r--net/rds/ib_cm.c9
-rw-r--r--net/rds/ib_rdma.c2
-rw-r--r--net/rds/rdma_transport.c10
-rw-r--r--net/rds/recv.c2
-rw-r--r--net/rds/send.c2
-rw-r--r--net/rds/tcp.c25
-rw-r--r--net/rds/tcp_listen.c21
12 files changed, 140 insertions, 26 deletions
diff --git a/net/rds/Kconfig b/net/rds/Kconfig
index 4c7f2595d919..41f75563b54b 100644
--- a/net/rds/Kconfig
+++ b/net/rds/Kconfig
@@ -1,7 +1,7 @@
1 1
2config RDS 2config RDS
3 tristate "The RDS Protocol" 3 tristate "The RDS Protocol"
4 depends on INET && IPV6 4 depends on INET
5 ---help--- 5 ---help---
6 The RDS (Reliable Datagram Sockets) protocol provides reliable, 6 The RDS (Reliable Datagram Sockets) protocol provides reliable,
7 sequenced delivery of datagrams over Infiniband or TCP. 7 sequenced delivery of datagrams over Infiniband or TCP.
diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c
index fc5c48b248fe..65387e1e6964 100644
--- a/net/rds/af_rds.c
+++ b/net/rds/af_rds.c
@@ -156,18 +156,20 @@ static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
156 return sizeof(*sin); 156 return sizeof(*sin);
157 } 157 }
158 158
159 if (ipv6_addr_type(&rs->rs_conn_addr) & 159#if IS_ENABLED(CONFIG_IPV6)
160 IPV6_ADDR_MAPPED) { 160 if (!(ipv6_addr_type(&rs->rs_conn_addr) &
161 sin = (struct sockaddr_in *)uaddr; 161 IPV6_ADDR_MAPPED)) {
162 memset(sin, 0, sizeof(*sin)); 162 sin6 = (struct sockaddr_in6 *)uaddr;
163 sin->sin_family = AF_INET; 163 memset(sin6, 0, sizeof(*sin6));
164 return sizeof(*sin); 164 sin6->sin6_family = AF_INET6;
165 return sizeof(*sin6);
165 } 166 }
167#endif
166 168
167 sin6 = (struct sockaddr_in6 *)uaddr; 169 sin = (struct sockaddr_in *)uaddr;
168 memset(sin6, 0, sizeof(*sin6)); 170 memset(sin, 0, sizeof(*sin));
169 sin6->sin6_family = AF_INET6; 171 sin->sin_family = AF_INET;
170 return sizeof(*sin6); 172 return sizeof(*sin);
171 } 173 }
172 if (ipv6_addr_v4mapped(&rs->rs_bound_addr)) { 174 if (ipv6_addr_v4mapped(&rs->rs_bound_addr)) {
173 sin = (struct sockaddr_in *)uaddr; 175 sin = (struct sockaddr_in *)uaddr;
@@ -501,9 +503,7 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
501{ 503{
502 struct sock *sk = sock->sk; 504 struct sock *sk = sock->sk;
503 struct sockaddr_in *sin; 505 struct sockaddr_in *sin;
504 struct sockaddr_in6 *sin6;
505 struct rds_sock *rs = rds_sk_to_rs(sk); 506 struct rds_sock *rs = rds_sk_to_rs(sk);
506 int addr_type;
507 int ret = 0; 507 int ret = 0;
508 508
509 lock_sock(sk); 509 lock_sock(sk);
@@ -528,7 +528,11 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
528 rs->rs_conn_port = sin->sin_port; 528 rs->rs_conn_port = sin->sin_port;
529 break; 529 break;
530 530
531 case AF_INET6: 531#if IS_ENABLED(CONFIG_IPV6)
532 case AF_INET6: {
533 struct sockaddr_in6 *sin6;
534 int addr_type;
535
532 sin6 = (struct sockaddr_in6 *)uaddr; 536 sin6 = (struct sockaddr_in6 *)uaddr;
533 if (addr_len < sizeof(struct sockaddr_in6)) { 537 if (addr_len < sizeof(struct sockaddr_in6)) {
534 ret = -EINVAL; 538 ret = -EINVAL;
@@ -575,6 +579,8 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
575 rs->rs_conn_addr = sin6->sin6_addr; 579 rs->rs_conn_addr = sin6->sin6_addr;
576 rs->rs_conn_port = sin6->sin6_port; 580 rs->rs_conn_port = sin6->sin6_port;
577 break; 581 break;
582 }
583#endif
578 584
579 default: 585 default:
580 ret = -EAFNOSUPPORT; 586 ret = -EAFNOSUPPORT;
diff --git a/net/rds/bind.c b/net/rds/bind.c
index ba778760cbc2..3ab55784b637 100644
--- a/net/rds/bind.c
+++ b/net/rds/bind.c
@@ -165,7 +165,6 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
165 struct in6_addr v6addr, *binding_addr; 165 struct in6_addr v6addr, *binding_addr;
166 struct rds_transport *trans; 166 struct rds_transport *trans;
167 __u32 scope_id = 0; 167 __u32 scope_id = 0;
168 int addr_type;
169 int ret = 0; 168 int ret = 0;
170 __be16 port; 169 __be16 port;
171 170
@@ -183,8 +182,10 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
183 ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, &v6addr); 182 ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, &v6addr);
184 binding_addr = &v6addr; 183 binding_addr = &v6addr;
185 port = sin->sin_port; 184 port = sin->sin_port;
185#if IS_ENABLED(CONFIG_IPV6)
186 } else if (uaddr->sa_family == AF_INET6) { 186 } else if (uaddr->sa_family == AF_INET6) {
187 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)uaddr; 187 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)uaddr;
188 int addr_type;
188 189
189 if (addr_len < sizeof(struct sockaddr_in6)) 190 if (addr_len < sizeof(struct sockaddr_in6))
190 return -EINVAL; 191 return -EINVAL;
@@ -212,6 +213,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
212 } 213 }
213 binding_addr = &sin6->sin6_addr; 214 binding_addr = &sin6->sin6_addr;
214 port = sin6->sin6_port; 215 port = sin6->sin6_port;
216#endif
215 } else { 217 } else {
216 return -EINVAL; 218 return -EINVAL;
217 } 219 }
diff --git a/net/rds/connection.c b/net/rds/connection.c
index 051e35c1e7c6..3bd2f4a5a30d 100644
--- a/net/rds/connection.c
+++ b/net/rds/connection.c
@@ -63,8 +63,12 @@ static struct hlist_head *rds_conn_bucket(const struct in6_addr *laddr,
63 net_get_random_once(&rds6_hash_secret, sizeof(rds6_hash_secret)); 63 net_get_random_once(&rds6_hash_secret, sizeof(rds6_hash_secret));
64 64
65 lhash = (__force u32)laddr->s6_addr32[3]; 65 lhash = (__force u32)laddr->s6_addr32[3];
66#if IS_ENABLED(CONFIG_IPV6)
66 fhash = __ipv6_addr_jhash(faddr, rds6_hash_secret); 67 fhash = __ipv6_addr_jhash(faddr, rds6_hash_secret);
67 hash = __inet6_ehashfn(lhash, 0, fhash, 0, rds_hash_secret); 68#else
69 fhash = (__force u32)faddr->s6_addr32[3];
70#endif
71 hash = __inet_ehashfn(lhash, 0, fhash, 0, rds_hash_secret);
68 72
69 return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK]; 73 return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK];
70} 74}
@@ -201,6 +205,8 @@ static struct rds_connection *__rds_conn_create(struct net *net,
201 conn->c_isv6 = !ipv6_addr_v4mapped(laddr); 205 conn->c_isv6 = !ipv6_addr_v4mapped(laddr);
202 conn->c_faddr = *faddr; 206 conn->c_faddr = *faddr;
203 conn->c_dev_if = dev_if; 207 conn->c_dev_if = dev_if;
208
209#if IS_ENABLED(CONFIG_IPV6)
204 /* If the local address is link local, set c_bound_if to be the 210 /* If the local address is link local, set c_bound_if to be the
205 * index used for this connection. Otherwise, set it to 0 as 211 * index used for this connection. Otherwise, set it to 0 as
206 * the socket is not bound to an interface. c_bound_if is used 212 * the socket is not bound to an interface. c_bound_if is used
@@ -209,6 +215,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
209 if (ipv6_addr_type(laddr) & IPV6_ADDR_LINKLOCAL) 215 if (ipv6_addr_type(laddr) & IPV6_ADDR_LINKLOCAL)
210 conn->c_bound_if = dev_if; 216 conn->c_bound_if = dev_if;
211 else 217 else
218#endif
212 conn->c_bound_if = 0; 219 conn->c_bound_if = 0;
213 220
214 rds_conn_net_set(conn, net); 221 rds_conn_net_set(conn, net);
@@ -500,9 +507,11 @@ static void __rds_inc_msg_cp(struct rds_incoming *inc,
500 struct rds_info_iterator *iter, 507 struct rds_info_iterator *iter,
501 void *saddr, void *daddr, int flip, bool isv6) 508 void *saddr, void *daddr, int flip, bool isv6)
502{ 509{
510#if IS_ENABLED(CONFIG_IPV6)
503 if (isv6) 511 if (isv6)
504 rds6_inc_info_copy(inc, iter, saddr, daddr, flip); 512 rds6_inc_info_copy(inc, iter, saddr, daddr, flip);
505 else 513 else
514#endif
506 rds_inc_info_copy(inc, iter, *(__be32 *)saddr, 515 rds_inc_info_copy(inc, iter, *(__be32 *)saddr,
507 *(__be32 *)daddr, flip); 516 *(__be32 *)daddr, flip);
508} 517}
@@ -581,6 +590,7 @@ static void rds_conn_message_info(struct socket *sock, unsigned int len,
581 rds_conn_message_info_cmn(sock, len, iter, lens, want_send, false); 590 rds_conn_message_info_cmn(sock, len, iter, lens, want_send, false);
582} 591}
583 592
593#if IS_ENABLED(CONFIG_IPV6)
584static void rds6_conn_message_info(struct socket *sock, unsigned int len, 594static void rds6_conn_message_info(struct socket *sock, unsigned int len,
585 struct rds_info_iterator *iter, 595 struct rds_info_iterator *iter,
586 struct rds_info_lengths *lens, 596 struct rds_info_lengths *lens,
@@ -588,6 +598,7 @@ static void rds6_conn_message_info(struct socket *sock, unsigned int len,
588{ 598{
589 rds_conn_message_info_cmn(sock, len, iter, lens, want_send, true); 599 rds_conn_message_info_cmn(sock, len, iter, lens, want_send, true);
590} 600}
601#endif
591 602
592static void rds_conn_message_info_send(struct socket *sock, unsigned int len, 603static void rds_conn_message_info_send(struct socket *sock, unsigned int len,
593 struct rds_info_iterator *iter, 604 struct rds_info_iterator *iter,
@@ -596,12 +607,14 @@ static void rds_conn_message_info_send(struct socket *sock, unsigned int len,
596 rds_conn_message_info(sock, len, iter, lens, 1); 607 rds_conn_message_info(sock, len, iter, lens, 1);
597} 608}
598 609
610#if IS_ENABLED(CONFIG_IPV6)
599static void rds6_conn_message_info_send(struct socket *sock, unsigned int len, 611static void rds6_conn_message_info_send(struct socket *sock, unsigned int len,
600 struct rds_info_iterator *iter, 612 struct rds_info_iterator *iter,
601 struct rds_info_lengths *lens) 613 struct rds_info_lengths *lens)
602{ 614{
603 rds6_conn_message_info(sock, len, iter, lens, 1); 615 rds6_conn_message_info(sock, len, iter, lens, 1);
604} 616}
617#endif
605 618
606static void rds_conn_message_info_retrans(struct socket *sock, 619static void rds_conn_message_info_retrans(struct socket *sock,
607 unsigned int len, 620 unsigned int len,
@@ -611,6 +624,7 @@ static void rds_conn_message_info_retrans(struct socket *sock,
611 rds_conn_message_info(sock, len, iter, lens, 0); 624 rds_conn_message_info(sock, len, iter, lens, 0);
612} 625}
613 626
627#if IS_ENABLED(CONFIG_IPV6)
614static void rds6_conn_message_info_retrans(struct socket *sock, 628static void rds6_conn_message_info_retrans(struct socket *sock,
615 unsigned int len, 629 unsigned int len,
616 struct rds_info_iterator *iter, 630 struct rds_info_iterator *iter,
@@ -618,6 +632,7 @@ static void rds6_conn_message_info_retrans(struct socket *sock,
618{ 632{
619 rds6_conn_message_info(sock, len, iter, lens, 0); 633 rds6_conn_message_info(sock, len, iter, lens, 0);
620} 634}
635#endif
621 636
622void rds_for_each_conn_info(struct socket *sock, unsigned int len, 637void rds_for_each_conn_info(struct socket *sock, unsigned int len,
623 struct rds_info_iterator *iter, 638 struct rds_info_iterator *iter,
@@ -734,6 +749,7 @@ static int rds_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
734 return 1; 749 return 1;
735} 750}
736 751
752#if IS_ENABLED(CONFIG_IPV6)
737static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer) 753static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
738{ 754{
739 struct rds6_info_connection *cinfo6 = buffer; 755 struct rds6_info_connection *cinfo6 = buffer;
@@ -761,6 +777,7 @@ static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
761 */ 777 */
762 return 1; 778 return 1;
763} 779}
780#endif
764 781
765static void rds_conn_info(struct socket *sock, unsigned int len, 782static void rds_conn_info(struct socket *sock, unsigned int len,
766 struct rds_info_iterator *iter, 783 struct rds_info_iterator *iter,
@@ -774,6 +791,7 @@ static void rds_conn_info(struct socket *sock, unsigned int len,
774 sizeof(struct rds_info_connection)); 791 sizeof(struct rds_info_connection));
775} 792}
776 793
794#if IS_ENABLED(CONFIG_IPV6)
777static void rds6_conn_info(struct socket *sock, unsigned int len, 795static void rds6_conn_info(struct socket *sock, unsigned int len,
778 struct rds_info_iterator *iter, 796 struct rds_info_iterator *iter,
779 struct rds_info_lengths *lens) 797 struct rds_info_lengths *lens)
@@ -785,6 +803,7 @@ static void rds6_conn_info(struct socket *sock, unsigned int len,
785 buffer, 803 buffer,
786 sizeof(struct rds6_info_connection)); 804 sizeof(struct rds6_info_connection));
787} 805}
806#endif
788 807
789int rds_conn_init(void) 808int rds_conn_init(void)
790{ 809{
@@ -807,12 +826,13 @@ int rds_conn_init(void)
807 rds_conn_message_info_send); 826 rds_conn_message_info_send);
808 rds_info_register_func(RDS_INFO_RETRANS_MESSAGES, 827 rds_info_register_func(RDS_INFO_RETRANS_MESSAGES,
809 rds_conn_message_info_retrans); 828 rds_conn_message_info_retrans);
829#if IS_ENABLED(CONFIG_IPV6)
810 rds_info_register_func(RDS6_INFO_CONNECTIONS, rds6_conn_info); 830 rds_info_register_func(RDS6_INFO_CONNECTIONS, rds6_conn_info);
811 rds_info_register_func(RDS6_INFO_SEND_MESSAGES, 831 rds_info_register_func(RDS6_INFO_SEND_MESSAGES,
812 rds6_conn_message_info_send); 832 rds6_conn_message_info_send);
813 rds_info_register_func(RDS6_INFO_RETRANS_MESSAGES, 833 rds_info_register_func(RDS6_INFO_RETRANS_MESSAGES,
814 rds6_conn_message_info_retrans); 834 rds6_conn_message_info_retrans);
815 835#endif
816 return 0; 836 return 0;
817} 837}
818 838
@@ -830,11 +850,13 @@ void rds_conn_exit(void)
830 rds_conn_message_info_send); 850 rds_conn_message_info_send);
831 rds_info_deregister_func(RDS_INFO_RETRANS_MESSAGES, 851 rds_info_deregister_func(RDS_INFO_RETRANS_MESSAGES,
832 rds_conn_message_info_retrans); 852 rds_conn_message_info_retrans);
853#if IS_ENABLED(CONFIG_IPV6)
833 rds_info_deregister_func(RDS6_INFO_CONNECTIONS, rds6_conn_info); 854 rds_info_deregister_func(RDS6_INFO_CONNECTIONS, rds6_conn_info);
834 rds_info_deregister_func(RDS6_INFO_SEND_MESSAGES, 855 rds_info_deregister_func(RDS6_INFO_SEND_MESSAGES,
835 rds6_conn_message_info_send); 856 rds6_conn_message_info_send);
836 rds_info_deregister_func(RDS6_INFO_RETRANS_MESSAGES, 857 rds_info_deregister_func(RDS6_INFO_RETRANS_MESSAGES,
837 rds6_conn_message_info_retrans); 858 rds6_conn_message_info_retrans);
859#endif
838} 860}
839 861
840/* 862/*
diff --git a/net/rds/ib.c b/net/rds/ib.c
index a4245c42d43b..89c6333ecd39 100644
--- a/net/rds/ib.c
+++ b/net/rds/ib.c
@@ -321,6 +321,7 @@ static int rds_ib_conn_info_visitor(struct rds_connection *conn,
321 return 1; 321 return 1;
322} 322}
323 323
324#if IS_ENABLED(CONFIG_IPV6)
324/* IPv6 version of rds_ib_conn_info_visitor(). */ 325/* IPv6 version of rds_ib_conn_info_visitor(). */
325static int rds6_ib_conn_info_visitor(struct rds_connection *conn, 326static int rds6_ib_conn_info_visitor(struct rds_connection *conn,
326 void *buffer) 327 void *buffer)
@@ -357,6 +358,7 @@ static int rds6_ib_conn_info_visitor(struct rds_connection *conn,
357 } 358 }
358 return 1; 359 return 1;
359} 360}
361#endif
360 362
361static void rds_ib_ic_info(struct socket *sock, unsigned int len, 363static void rds_ib_ic_info(struct socket *sock, unsigned int len,
362 struct rds_info_iterator *iter, 364 struct rds_info_iterator *iter,
@@ -370,6 +372,7 @@ static void rds_ib_ic_info(struct socket *sock, unsigned int len,
370 sizeof(struct rds_info_rdma_connection)); 372 sizeof(struct rds_info_rdma_connection));
371} 373}
372 374
375#if IS_ENABLED(CONFIG_IPV6)
373/* IPv6 version of rds_ib_ic_info(). */ 376/* IPv6 version of rds_ib_ic_info(). */
374static void rds6_ib_ic_info(struct socket *sock, unsigned int len, 377static void rds6_ib_ic_info(struct socket *sock, unsigned int len,
375 struct rds_info_iterator *iter, 378 struct rds_info_iterator *iter,
@@ -382,6 +385,7 @@ static void rds6_ib_ic_info(struct socket *sock, unsigned int len,
382 buffer, 385 buffer,
383 sizeof(struct rds6_info_rdma_connection)); 386 sizeof(struct rds6_info_rdma_connection));
384} 387}
388#endif
385 389
386/* 390/*
387 * Early RDS/IB was built to only bind to an address if there is an IPoIB 391 * Early RDS/IB was built to only bind to an address if there is an IPoIB
@@ -398,7 +402,9 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
398{ 402{
399 int ret; 403 int ret;
400 struct rdma_cm_id *cm_id; 404 struct rdma_cm_id *cm_id;
405#if IS_ENABLED(CONFIG_IPV6)
401 struct sockaddr_in6 sin6; 406 struct sockaddr_in6 sin6;
407#endif
402 struct sockaddr_in sin; 408 struct sockaddr_in sin;
403 struct sockaddr *sa; 409 struct sockaddr *sa;
404 bool isv4; 410 bool isv4;
@@ -418,6 +424,7 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
418 sin.sin_addr.s_addr = addr->s6_addr32[3]; 424 sin.sin_addr.s_addr = addr->s6_addr32[3];
419 sa = (struct sockaddr *)&sin; 425 sa = (struct sockaddr *)&sin;
420 } else { 426 } else {
427#if IS_ENABLED(CONFIG_IPV6)
421 memset(&sin6, 0, sizeof(sin6)); 428 memset(&sin6, 0, sizeof(sin6));
422 sin6.sin6_family = AF_INET6; 429 sin6.sin6_family = AF_INET6;
423 sin6.sin6_addr = *addr; 430 sin6.sin6_addr = *addr;
@@ -432,21 +439,30 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
432 if (ipv6_addr_type(addr) & IPV6_ADDR_LINKLOCAL) { 439 if (ipv6_addr_type(addr) & IPV6_ADDR_LINKLOCAL) {
433 struct net_device *dev; 440 struct net_device *dev;
434 441
435 if (scope_id == 0) 442 if (scope_id == 0) {
436 return -EADDRNOTAVAIL; 443 ret = -EADDRNOTAVAIL;
444 goto out;
445 }
437 446
438 /* Use init_net for now as RDS is not network 447 /* Use init_net for now as RDS is not network
439 * name space aware. 448 * name space aware.
440 */ 449 */
441 dev = dev_get_by_index(&init_net, scope_id); 450 dev = dev_get_by_index(&init_net, scope_id);
442 if (!dev) 451 if (!dev) {
443 return -EADDRNOTAVAIL; 452 ret = -EADDRNOTAVAIL;
453 goto out;
454 }
444 if (!ipv6_chk_addr(&init_net, addr, dev, 1)) { 455 if (!ipv6_chk_addr(&init_net, addr, dev, 1)) {
445 dev_put(dev); 456 dev_put(dev);
446 return -EADDRNOTAVAIL; 457 ret = -EADDRNOTAVAIL;
458 goto out;
447 } 459 }
448 dev_put(dev); 460 dev_put(dev);
449 } 461 }
462#else
463 ret = -EADDRNOTAVAIL;
464 goto out;
465#endif
450 } 466 }
451 467
452 /* rdma_bind_addr will only succeed for IB & iWARP devices */ 468 /* rdma_bind_addr will only succeed for IB & iWARP devices */
@@ -461,6 +477,7 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
461 addr, scope_id, ret, 477 addr, scope_id, ret,
462 cm_id->device ? cm_id->device->node_type : -1); 478 cm_id->device ? cm_id->device->node_type : -1);
463 479
480out:
464 rdma_destroy_id(cm_id); 481 rdma_destroy_id(cm_id);
465 482
466 return ret; 483 return ret;
@@ -491,7 +508,9 @@ void rds_ib_exit(void)
491 rds_ib_set_unloading(); 508 rds_ib_set_unloading();
492 synchronize_rcu(); 509 synchronize_rcu();
493 rds_info_deregister_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info); 510 rds_info_deregister_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
511#if IS_ENABLED(CONFIG_IPV6)
494 rds_info_deregister_func(RDS6_INFO_IB_CONNECTIONS, rds6_ib_ic_info); 512 rds_info_deregister_func(RDS6_INFO_IB_CONNECTIONS, rds6_ib_ic_info);
513#endif
495 rds_ib_unregister_client(); 514 rds_ib_unregister_client();
496 rds_ib_destroy_nodev_conns(); 515 rds_ib_destroy_nodev_conns();
497 rds_ib_sysctl_exit(); 516 rds_ib_sysctl_exit();
@@ -553,7 +572,9 @@ int rds_ib_init(void)
553 rds_trans_register(&rds_ib_transport); 572 rds_trans_register(&rds_ib_transport);
554 573
555 rds_info_register_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info); 574 rds_info_register_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
575#if IS_ENABLED(CONFIG_IPV6)
556 rds_info_register_func(RDS6_INFO_IB_CONNECTIONS, rds6_ib_ic_info); 576 rds_info_register_func(RDS6_INFO_IB_CONNECTIONS, rds6_ib_ic_info);
577#endif
557 578
558 goto out; 579 goto out;
559 580
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c
index 0d654d99fe41..bfbb31f0c7fd 100644
--- a/net/rds/ib_cm.c
+++ b/net/rds/ib_cm.c
@@ -678,6 +678,7 @@ static u32 rds_ib_protocol_compatible(struct rdma_cm_event *event, bool isv6)
678 return version; 678 return version;
679} 679}
680 680
681#if IS_ENABLED(CONFIG_IPV6)
681/* Given an IPv6 address, find the net_device which hosts that address and 682/* Given an IPv6 address, find the net_device which hosts that address and
682 * return its index. This is used by the rds_ib_cm_handle_connect() code to 683 * return its index. This is used by the rds_ib_cm_handle_connect() code to
683 * find the interface index of where an incoming request comes from when 684 * find the interface index of where an incoming request comes from when
@@ -704,6 +705,7 @@ static u32 __rds_find_ifindex(struct net *net, const struct in6_addr *addr)
704 705
705 return idx; 706 return idx;
706} 707}
708#endif
707 709
708int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, 710int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
709 struct rdma_cm_event *event, bool isv6) 711 struct rdma_cm_event *event, bool isv6)
@@ -732,6 +734,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
732 734
733 dp = event->param.conn.private_data; 735 dp = event->param.conn.private_data;
734 if (isv6) { 736 if (isv6) {
737#if IS_ENABLED(CONFIG_IPV6)
735 dp_cmn = &dp->ricp_v6.dp_cmn; 738 dp_cmn = &dp->ricp_v6.dp_cmn;
736 saddr6 = &dp->ricp_v6.dp_saddr; 739 saddr6 = &dp->ricp_v6.dp_saddr;
737 daddr6 = &dp->ricp_v6.dp_daddr; 740 daddr6 = &dp->ricp_v6.dp_daddr;
@@ -756,6 +759,10 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
756 goto out; 759 goto out;
757 } 760 }
758 } 761 }
762#else
763 err = -EOPNOTSUPP;
764 goto out;
765#endif
759 } else { 766 } else {
760 dp_cmn = &dp->ricp_v4.dp_cmn; 767 dp_cmn = &dp->ricp_v4.dp_cmn;
761 ipv6_addr_set_v4mapped(dp->ricp_v4.dp_saddr, &s_mapped_addr); 768 ipv6_addr_set_v4mapped(dp->ricp_v4.dp_saddr, &s_mapped_addr);
@@ -893,9 +900,11 @@ int rds_ib_conn_path_connect(struct rds_conn_path *cp)
893 900
894 /* XXX I wonder what affect the port space has */ 901 /* XXX I wonder what affect the port space has */
895 /* delegate cm event handler to rdma_transport */ 902 /* delegate cm event handler to rdma_transport */
903#if IS_ENABLED(CONFIG_IPV6)
896 if (conn->c_isv6) 904 if (conn->c_isv6)
897 handler = rds6_rdma_cm_event_handler; 905 handler = rds6_rdma_cm_event_handler;
898 else 906 else
907#endif
899 handler = rds_rdma_cm_event_handler; 908 handler = rds_rdma_cm_event_handler;
900 ic->i_cm_id = rdma_create_id(&init_net, handler, conn, 909 ic->i_cm_id = rdma_create_id(&init_net, handler, conn,
901 RDMA_PS_TCP, IB_QPT_RC); 910 RDMA_PS_TCP, IB_QPT_RC);
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c
index e3c8bbbdb43f..99ccafb90410 100644
--- a/net/rds/ib_rdma.c
+++ b/net/rds/ib_rdma.c
@@ -180,6 +180,7 @@ void rds_ib_get_mr_info(struct rds_ib_device *rds_ibdev, struct rds_info_rdma_co
180 iinfo->rdma_mr_size = pool_1m->fmr_attr.max_pages; 180 iinfo->rdma_mr_size = pool_1m->fmr_attr.max_pages;
181} 181}
182 182
183#if IS_ENABLED(CONFIG_IPV6)
183void rds6_ib_get_mr_info(struct rds_ib_device *rds_ibdev, 184void rds6_ib_get_mr_info(struct rds_ib_device *rds_ibdev,
184 struct rds6_info_rdma_connection *iinfo6) 185 struct rds6_info_rdma_connection *iinfo6)
185{ 186{
@@ -188,6 +189,7 @@ void rds6_ib_get_mr_info(struct rds_ib_device *rds_ibdev,
188 iinfo6->rdma_mr_max = pool_1m->max_items; 189 iinfo6->rdma_mr_max = pool_1m->max_items;
189 iinfo6->rdma_mr_size = pool_1m->fmr_attr.max_pages; 190 iinfo6->rdma_mr_size = pool_1m->fmr_attr.max_pages;
190} 191}
192#endif
191 193
192struct rds_ib_mr *rds_ib_reuse_mr(struct rds_ib_mr_pool *pool) 194struct rds_ib_mr *rds_ib_reuse_mr(struct rds_ib_mr_pool *pool)
193{ 195{
diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c
index ad78929036ef..6b0f57c83a2a 100644
--- a/net/rds/rdma_transport.c
+++ b/net/rds/rdma_transport.c
@@ -39,7 +39,9 @@
39 39
40/* Global IPv4 and IPv6 RDS RDMA listener cm_id */ 40/* Global IPv4 and IPv6 RDS RDMA listener cm_id */
41static struct rdma_cm_id *rds_rdma_listen_id; 41static struct rdma_cm_id *rds_rdma_listen_id;
42#if IS_ENABLED(CONFIG_IPV6)
42static struct rdma_cm_id *rds6_rdma_listen_id; 43static struct rdma_cm_id *rds6_rdma_listen_id;
44#endif
43 45
44static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, 46static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id,
45 struct rdma_cm_event *event, 47 struct rdma_cm_event *event,
@@ -155,11 +157,13 @@ int rds_rdma_cm_event_handler(struct rdma_cm_id *cm_id,
155 return rds_rdma_cm_event_handler_cmn(cm_id, event, false); 157 return rds_rdma_cm_event_handler_cmn(cm_id, event, false);
156} 158}
157 159
160#if IS_ENABLED(CONFIG_IPV6)
158int rds6_rdma_cm_event_handler(struct rdma_cm_id *cm_id, 161int rds6_rdma_cm_event_handler(struct rdma_cm_id *cm_id,
159 struct rdma_cm_event *event) 162 struct rdma_cm_event *event)
160{ 163{
161 return rds_rdma_cm_event_handler_cmn(cm_id, event, true); 164 return rds_rdma_cm_event_handler_cmn(cm_id, event, true);
162} 165}
166#endif
163 167
164static int rds_rdma_listen_init_common(rdma_cm_event_handler handler, 168static int rds_rdma_listen_init_common(rdma_cm_event_handler handler,
165 struct sockaddr *sa, 169 struct sockaddr *sa,
@@ -214,7 +218,9 @@ out:
214static int rds_rdma_listen_init(void) 218static int rds_rdma_listen_init(void)
215{ 219{
216 int ret; 220 int ret;
221#if IS_ENABLED(CONFIG_IPV6)
217 struct sockaddr_in6 sin6; 222 struct sockaddr_in6 sin6;
223#endif
218 struct sockaddr_in sin; 224 struct sockaddr_in sin;
219 225
220 sin.sin_family = PF_INET; 226 sin.sin_family = PF_INET;
@@ -226,6 +232,7 @@ static int rds_rdma_listen_init(void)
226 if (ret != 0) 232 if (ret != 0)
227 return ret; 233 return ret;
228 234
235#if IS_ENABLED(CONFIG_IPV6)
229 sin6.sin6_family = PF_INET6; 236 sin6.sin6_family = PF_INET6;
230 sin6.sin6_addr = in6addr_any; 237 sin6.sin6_addr = in6addr_any;
231 sin6.sin6_port = htons(RDS_CM_PORT); 238 sin6.sin6_port = htons(RDS_CM_PORT);
@@ -237,6 +244,7 @@ static int rds_rdma_listen_init(void)
237 /* Keep going even when IPv6 is not enabled in the system. */ 244 /* Keep going even when IPv6 is not enabled in the system. */
238 if (ret != 0) 245 if (ret != 0)
239 rdsdebug("Cannot set up IPv6 RDMA listener\n"); 246 rdsdebug("Cannot set up IPv6 RDMA listener\n");
247#endif
240 return 0; 248 return 0;
241} 249}
242 250
@@ -247,11 +255,13 @@ static void rds_rdma_listen_stop(void)
247 rdma_destroy_id(rds_rdma_listen_id); 255 rdma_destroy_id(rds_rdma_listen_id);
248 rds_rdma_listen_id = NULL; 256 rds_rdma_listen_id = NULL;
249 } 257 }
258#if IS_ENABLED(CONFIG_IPV6)
250 if (rds6_rdma_listen_id) { 259 if (rds6_rdma_listen_id) {
251 rdsdebug("cm %p\n", rds6_rdma_listen_id); 260 rdsdebug("cm %p\n", rds6_rdma_listen_id);
252 rdma_destroy_id(rds6_rdma_listen_id); 261 rdma_destroy_id(rds6_rdma_listen_id);
253 rds6_rdma_listen_id = NULL; 262 rds6_rdma_listen_id = NULL;
254 } 263 }
264#endif
255} 265}
256 266
257static int rds_rdma_init(void) 267static int rds_rdma_init(void)
diff --git a/net/rds/recv.c b/net/rds/recv.c
index 03cd8df54c26..504cd6bcc54c 100644
--- a/net/rds/recv.c
+++ b/net/rds/recv.c
@@ -793,6 +793,7 @@ void rds_inc_info_copy(struct rds_incoming *inc,
793 rds_info_copy(iter, &minfo, sizeof(minfo)); 793 rds_info_copy(iter, &minfo, sizeof(minfo));
794} 794}
795 795
796#if IS_ENABLED(CONFIG_IPV6)
796void rds6_inc_info_copy(struct rds_incoming *inc, 797void rds6_inc_info_copy(struct rds_incoming *inc,
797 struct rds_info_iterator *iter, 798 struct rds_info_iterator *iter,
798 struct in6_addr *saddr, struct in6_addr *daddr, 799 struct in6_addr *saddr, struct in6_addr *daddr,
@@ -817,3 +818,4 @@ void rds6_inc_info_copy(struct rds_incoming *inc,
817 818
818 rds_info_copy(iter, &minfo6, sizeof(minfo6)); 819 rds_info_copy(iter, &minfo6, sizeof(minfo6));
819} 820}
821#endif
diff --git a/net/rds/send.c b/net/rds/send.c
index 18e2b4d3931f..36a5dba56a43 100644
--- a/net/rds/send.c
+++ b/net/rds/send.c
@@ -1103,6 +1103,7 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
1103 dport = usin->sin_port; 1103 dport = usin->sin_port;
1104 break; 1104 break;
1105 1105
1106#if IS_ENABLED(CONFIG_IPV6)
1106 case AF_INET6: { 1107 case AF_INET6: {
1107 int addr_type; 1108 int addr_type;
1108 1109
@@ -1142,6 +1143,7 @@ int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len)
1142 dport = sin6->sin6_port; 1143 dport = sin6->sin6_port;
1143 break; 1144 break;
1144 } 1145 }
1146#endif
1145 1147
1146 default: 1148 default:
1147 ret = -EINVAL; 1149 ret = -EINVAL;
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index f23925af0b8d..2c7b7c352d3e 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -51,7 +51,9 @@ static LIST_HEAD(rds_tcp_tc_list);
51 * rds6_tcp_tc_count counts both IPv4 and IPv6 connections. 51 * rds6_tcp_tc_count counts both IPv4 and IPv6 connections.
52 */ 52 */
53static unsigned int rds_tcp_tc_count; 53static unsigned int rds_tcp_tc_count;
54#if IS_ENABLED(CONFIG_IPV6)
54static unsigned int rds6_tcp_tc_count; 55static unsigned int rds6_tcp_tc_count;
56#endif
55 57
56/* Track rds_tcp_connection structs so they can be cleaned up */ 58/* Track rds_tcp_connection structs so they can be cleaned up */
57static DEFINE_SPINLOCK(rds_tcp_conn_lock); 59static DEFINE_SPINLOCK(rds_tcp_conn_lock);
@@ -118,7 +120,9 @@ void rds_tcp_restore_callbacks(struct socket *sock,
118 /* done under the callback_lock to serialize with write_space */ 120 /* done under the callback_lock to serialize with write_space */
119 spin_lock(&rds_tcp_tc_list_lock); 121 spin_lock(&rds_tcp_tc_list_lock);
120 list_del_init(&tc->t_list_item); 122 list_del_init(&tc->t_list_item);
123#if IS_ENABLED(CONFIG_IPV6)
121 rds6_tcp_tc_count--; 124 rds6_tcp_tc_count--;
125#endif
122 if (!tc->t_cpath->cp_conn->c_isv6) 126 if (!tc->t_cpath->cp_conn->c_isv6)
123 rds_tcp_tc_count--; 127 rds_tcp_tc_count--;
124 spin_unlock(&rds_tcp_tc_list_lock); 128 spin_unlock(&rds_tcp_tc_list_lock);
@@ -207,7 +211,9 @@ void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp)
207 /* done under the callback_lock to serialize with write_space */ 211 /* done under the callback_lock to serialize with write_space */
208 spin_lock(&rds_tcp_tc_list_lock); 212 spin_lock(&rds_tcp_tc_list_lock);
209 list_add_tail(&tc->t_list_item, &rds_tcp_tc_list); 213 list_add_tail(&tc->t_list_item, &rds_tcp_tc_list);
214#if IS_ENABLED(CONFIG_IPV6)
210 rds6_tcp_tc_count++; 215 rds6_tcp_tc_count++;
216#endif
211 if (!tc->t_cpath->cp_conn->c_isv6) 217 if (!tc->t_cpath->cp_conn->c_isv6)
212 rds_tcp_tc_count++; 218 rds_tcp_tc_count++;
213 spin_unlock(&rds_tcp_tc_list_lock); 219 spin_unlock(&rds_tcp_tc_list_lock);
@@ -273,6 +279,7 @@ out:
273 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags); 279 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags);
274} 280}
275 281
282#if IS_ENABLED(CONFIG_IPV6)
276/* Handle RDS6_INFO_TCP_SOCKETS socket option. It returns both IPv4 and 283/* Handle RDS6_INFO_TCP_SOCKETS socket option. It returns both IPv4 and
277 * IPv6 connections. IPv4 connection address is returned in an IPv4 mapped 284 * IPv6 connections. IPv4 connection address is returned in an IPv4 mapped
278 * address. 285 * address.
@@ -314,12 +321,15 @@ out:
314 321
315 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags); 322 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags);
316} 323}
324#endif
317 325
318static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr, 326static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
319 __u32 scope_id) 327 __u32 scope_id)
320{ 328{
321 struct net_device *dev = NULL; 329 struct net_device *dev = NULL;
330#if IS_ENABLED(CONFIG_IPV6)
322 int ret; 331 int ret;
332#endif
323 333
324 if (ipv6_addr_v4mapped(addr)) { 334 if (ipv6_addr_v4mapped(addr)) {
325 if (inet_addr_type(net, addr->s6_addr32[3]) == RTN_LOCAL) 335 if (inet_addr_type(net, addr->s6_addr32[3]) == RTN_LOCAL)
@@ -340,9 +350,11 @@ static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
340 } 350 }
341 rcu_read_unlock(); 351 rcu_read_unlock();
342 } 352 }
353#if IS_ENABLED(CONFIG_IPV6)
343 ret = ipv6_chk_addr(net, addr, dev, 0); 354 ret = ipv6_chk_addr(net, addr, dev, 0);
344 if (ret) 355 if (ret)
345 return 0; 356 return 0;
357#endif
346 return -EADDRNOTAVAIL; 358 return -EADDRNOTAVAIL;
347} 359}
348 360
@@ -545,18 +557,27 @@ static __net_init int rds_tcp_init_net(struct net *net)
545 err = -ENOMEM; 557 err = -ENOMEM;
546 goto fail; 558 goto fail;
547 } 559 }
560
561#if IS_ENABLED(CONFIG_IPV6)
548 rtn->rds_tcp_listen_sock = rds_tcp_listen_init(net, true); 562 rtn->rds_tcp_listen_sock = rds_tcp_listen_init(net, true);
563#else
564 rtn->rds_tcp_listen_sock = rds_tcp_listen_init(net, false);
565#endif
549 if (!rtn->rds_tcp_listen_sock) { 566 if (!rtn->rds_tcp_listen_sock) {
550 pr_warn("could not set up IPv6 listen sock\n"); 567 pr_warn("could not set up IPv6 listen sock\n");
551 568
569#if IS_ENABLED(CONFIG_IPV6)
552 /* Try IPv4 as some systems disable IPv6 */ 570 /* Try IPv4 as some systems disable IPv6 */
553 rtn->rds_tcp_listen_sock = rds_tcp_listen_init(net, false); 571 rtn->rds_tcp_listen_sock = rds_tcp_listen_init(net, false);
554 if (!rtn->rds_tcp_listen_sock) { 572 if (!rtn->rds_tcp_listen_sock) {
573#endif
555 unregister_net_sysctl_table(rtn->rds_tcp_sysctl); 574 unregister_net_sysctl_table(rtn->rds_tcp_sysctl);
556 rtn->rds_tcp_sysctl = NULL; 575 rtn->rds_tcp_sysctl = NULL;
557 err = -EAFNOSUPPORT; 576 err = -EAFNOSUPPORT;
558 goto fail; 577 goto fail;
578#if IS_ENABLED(CONFIG_IPV6)
559 } 579 }
580#endif
560 } 581 }
561 INIT_WORK(&rtn->rds_tcp_accept_w, rds_tcp_accept_worker); 582 INIT_WORK(&rtn->rds_tcp_accept_w, rds_tcp_accept_worker);
562 return 0; 583 return 0;
@@ -670,7 +691,9 @@ static void rds_tcp_exit(void)
670 rds_tcp_set_unloading(); 691 rds_tcp_set_unloading();
671 synchronize_rcu(); 692 synchronize_rcu();
672 rds_info_deregister_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info); 693 rds_info_deregister_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info);
694#if IS_ENABLED(CONFIG_IPV6)
673 rds_info_deregister_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info); 695 rds_info_deregister_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info);
696#endif
674 unregister_pernet_device(&rds_tcp_net_ops); 697 unregister_pernet_device(&rds_tcp_net_ops);
675 rds_tcp_destroy_conns(); 698 rds_tcp_destroy_conns();
676 rds_trans_unregister(&rds_tcp_transport); 699 rds_trans_unregister(&rds_tcp_transport);
@@ -702,7 +725,9 @@ static int rds_tcp_init(void)
702 rds_trans_register(&rds_tcp_transport); 725 rds_trans_register(&rds_tcp_transport);
703 726
704 rds_info_register_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info); 727 rds_info_register_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info);
728#if IS_ENABLED(CONFIG_IPV6)
705 rds_info_register_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info); 729 rds_info_register_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info);
730#endif
706 731
707 goto out; 732 goto out;
708out_recv: 733out_recv:
diff --git a/net/rds/tcp_listen.c b/net/rds/tcp_listen.c
index 0cf0147117d8..c12203f646da 100644
--- a/net/rds/tcp_listen.c
+++ b/net/rds/tcp_listen.c
@@ -132,7 +132,10 @@ int rds_tcp_accept_one(struct socket *sock)
132 int conn_state; 132 int conn_state;
133 struct rds_conn_path *cp; 133 struct rds_conn_path *cp;
134 struct in6_addr *my_addr, *peer_addr; 134 struct in6_addr *my_addr, *peer_addr;
135 int dev_if; 135#if !IS_ENABLED(CONFIG_IPV6)
136 struct in6_addr saddr, daddr;
137#endif
138 int dev_if = 0;
136 139
137 if (!sock) /* module unload or netns delete in progress */ 140 if (!sock) /* module unload or netns delete in progress */
138 return -ENETUNREACH; 141 return -ENETUNREACH;
@@ -165,12 +168,21 @@ int rds_tcp_accept_one(struct socket *sock)
165 168
166 inet = inet_sk(new_sock->sk); 169 inet = inet_sk(new_sock->sk);
167 170
171#if IS_ENABLED(CONFIG_IPV6)
168 my_addr = &new_sock->sk->sk_v6_rcv_saddr; 172 my_addr = &new_sock->sk->sk_v6_rcv_saddr;
169 peer_addr = &new_sock->sk->sk_v6_daddr; 173 peer_addr = &new_sock->sk->sk_v6_daddr;
170 rdsdebug("accepted tcp %pI6c:%u -> %pI6c:%u\n", 174#else
175 ipv6_addr_set_v4mapped(inet->inet_saddr, &saddr);
176 ipv6_addr_set_v4mapped(inet->inet_daddr, &daddr);
177 my_addr = &saddr;
178 peer_addr = &daddr;
179#endif
180 rdsdebug("accepted family %d tcp %pI6c:%u -> %pI6c:%u\n",
181 sock->sk->sk_family,
171 my_addr, ntohs(inet->inet_sport), 182 my_addr, ntohs(inet->inet_sport),
172 peer_addr, ntohs(inet->inet_dport)); 183 peer_addr, ntohs(inet->inet_dport));
173 184
185#if IS_ENABLED(CONFIG_IPV6)
174 /* sk_bound_dev_if is not set if the peer address is not link local 186 /* sk_bound_dev_if is not set if the peer address is not link local
175 * address. In this case, it happens that mcast_oif is set. So 187 * address. In this case, it happens that mcast_oif is set. So
176 * just use it. 188 * just use it.
@@ -184,9 +196,10 @@ int rds_tcp_accept_one(struct socket *sock)
184 } else { 196 } else {
185 dev_if = new_sock->sk->sk_bound_dev_if; 197 dev_if = new_sock->sk->sk_bound_dev_if;
186 } 198 }
199#endif
200
187 conn = rds_conn_create(sock_net(sock->sk), 201 conn = rds_conn_create(sock_net(sock->sk),
188 &new_sock->sk->sk_v6_rcv_saddr, 202 my_addr, peer_addr,
189 &new_sock->sk->sk_v6_daddr,
190 &rds_tcp_transport, GFP_KERNEL, dev_if); 203 &rds_tcp_transport, GFP_KERNEL, dev_if);
191 204
192 if (IS_ERR(conn)) { 205 if (IS_ERR(conn)) {