diff options
author | Ka-Cheong Poon <ka-cheong.poon@oracle.com> | 2018-07-31 01:48:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-08-01 12:32:35 -0400 |
commit | e65d4d96334e3ff4fe0064612a93a51c63de08de (patch) | |
tree | 3bbc43d81b1e59665ceae7f412c70be52c29d89c /net/rds | |
parent | f394ad28feffbeebab77c8bf9a203bd49b957c9a (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/Kconfig | 2 | ||||
-rw-r--r-- | net/rds/af_rds.c | 32 | ||||
-rw-r--r-- | net/rds/bind.c | 4 | ||||
-rw-r--r-- | net/rds/connection.c | 26 | ||||
-rw-r--r-- | net/rds/ib.c | 31 | ||||
-rw-r--r-- | net/rds/ib_cm.c | 9 | ||||
-rw-r--r-- | net/rds/ib_rdma.c | 2 | ||||
-rw-r--r-- | net/rds/rdma_transport.c | 10 | ||||
-rw-r--r-- | net/rds/recv.c | 2 | ||||
-rw-r--r-- | net/rds/send.c | 2 | ||||
-rw-r--r-- | net/rds/tcp.c | 25 | ||||
-rw-r--r-- | net/rds/tcp_listen.c | 21 |
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 | ||
2 | config RDS | 2 | config 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) | ||
584 | static void rds6_conn_message_info(struct socket *sock, unsigned int len, | 594 | static 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 | ||
592 | static void rds_conn_message_info_send(struct socket *sock, unsigned int len, | 603 | static 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) | ||
599 | static void rds6_conn_message_info_send(struct socket *sock, unsigned int len, | 611 | static 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 | ||
606 | static void rds_conn_message_info_retrans(struct socket *sock, | 619 | static 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) | ||
614 | static void rds6_conn_message_info_retrans(struct socket *sock, | 628 | static 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 | ||
622 | void rds_for_each_conn_info(struct socket *sock, unsigned int len, | 637 | void 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) | ||
737 | static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer) | 753 | static 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 | ||
765 | static void rds_conn_info(struct socket *sock, unsigned int len, | 782 | static 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) | ||
777 | static void rds6_conn_info(struct socket *sock, unsigned int len, | 795 | static 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 | ||
789 | int rds_conn_init(void) | 808 | int 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(). */ |
325 | static int rds6_ib_conn_info_visitor(struct rds_connection *conn, | 326 | static 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 | ||
361 | static void rds_ib_ic_info(struct socket *sock, unsigned int len, | 363 | static 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(). */ |
374 | static void rds6_ib_ic_info(struct socket *sock, unsigned int len, | 377 | static 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 | ||
480 | out: | ||
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 | ||
708 | int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id, | 710 | int 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) | ||
183 | void rds6_ib_get_mr_info(struct rds_ib_device *rds_ibdev, | 184 | void 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 | ||
192 | struct rds_ib_mr *rds_ib_reuse_mr(struct rds_ib_mr_pool *pool) | 194 | struct 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 */ |
41 | static struct rdma_cm_id *rds_rdma_listen_id; | 41 | static struct rdma_cm_id *rds_rdma_listen_id; |
42 | #if IS_ENABLED(CONFIG_IPV6) | ||
42 | static struct rdma_cm_id *rds6_rdma_listen_id; | 43 | static struct rdma_cm_id *rds6_rdma_listen_id; |
44 | #endif | ||
43 | 45 | ||
44 | static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, | 46 | static 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) | ||
158 | int rds6_rdma_cm_event_handler(struct rdma_cm_id *cm_id, | 161 | int 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 | ||
164 | static int rds_rdma_listen_init_common(rdma_cm_event_handler handler, | 168 | static int rds_rdma_listen_init_common(rdma_cm_event_handler handler, |
165 | struct sockaddr *sa, | 169 | struct sockaddr *sa, |
@@ -214,7 +218,9 @@ out: | |||
214 | static int rds_rdma_listen_init(void) | 218 | static 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 | ||
257 | static int rds_rdma_init(void) | 267 | static 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) | ||
796 | void rds6_inc_info_copy(struct rds_incoming *inc, | 797 | void 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 | */ |
53 | static unsigned int rds_tcp_tc_count; | 53 | static unsigned int rds_tcp_tc_count; |
54 | #if IS_ENABLED(CONFIG_IPV6) | ||
54 | static unsigned int rds6_tcp_tc_count; | 55 | static 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 */ |
57 | static DEFINE_SPINLOCK(rds_tcp_conn_lock); | 59 | static 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 | ||
318 | static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr, | 326 | static 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; |
708 | out_recv: | 733 | out_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)) { |