diff options
Diffstat (limited to 'net/rds/tcp.c')
-rw-r--r-- | net/rds/tcp.c | 25 |
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 | */ |
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: |