summaryrefslogtreecommitdiffstats
path: root/net/rds/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/rds/tcp.c')
-rw-r--r--net/rds/tcp.c25
1 files changed, 25 insertions, 0 deletions
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: