aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds/tcp.c
diff options
context:
space:
mode:
authorKa-Cheong Poon <ka-cheong.poon@oracle.com>2018-07-23 23:51:23 -0400
committerDavid S. Miller <davem@davemloft.net>2018-07-24 00:17:44 -0400
commitb7ff8b1036f0b0df1390ba6b5e9bc7ec458e857a (patch)
tree398bab1a171b7da3be14fe9f7f1d5936032b7f74 /net/rds/tcp.c
parent1e2b44e78eead7bcadfbf96f70d95773191541c9 (diff)
rds: Extend RDS API for IPv6 support
There are many data structures (RDS socket options) used by RDS apps which use a 32 bit integer to store IP address. To support IPv6, struct in6_addr needs to be used. To ensure backward compatibility, a new data structure is introduced for each of those data structures which use a 32 bit integer to represent an IP address. And new socket options are introduced to use those new structures. This means that existing apps should work without a problem with the new RDS module. For apps which want to use IPv6, those new data structures and socket options can be used. IPv4 mapped address is used to represent IPv4 address in the new data structures. v4: Revert changes to SO_RDS_TRANSPORT 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/tcp.c')
-rw-r--r--net/rds/tcp.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index 890d0e1d8908..7028d6e51947 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -273,6 +273,48 @@ out:
273 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags); 273 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags);
274} 274}
275 275
276/* Handle RDS6_INFO_TCP_SOCKETS socket option. It returns both IPv4 and
277 * IPv6 connections. IPv4 connection address is returned in an IPv4 mapped
278 * address.
279 */
280static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
281 struct rds_info_iterator *iter,
282 struct rds_info_lengths *lens)
283{
284 struct rds6_info_tcp_socket tsinfo6;
285 struct rds_tcp_connection *tc;
286 unsigned long flags;
287
288 spin_lock_irqsave(&rds_tcp_tc_list_lock, flags);
289
290 if (len / sizeof(tsinfo6) < rds6_tcp_tc_count)
291 goto out;
292
293 list_for_each_entry(tc, &rds_tcp_tc_list, t_list_item) {
294 struct sock *sk = tc->t_sock->sk;
295 struct inet_sock *inet = inet_sk(sk);
296
297 tsinfo6.local_addr = sk->sk_v6_rcv_saddr;
298 tsinfo6.local_port = inet->inet_sport;
299 tsinfo6.peer_addr = sk->sk_v6_daddr;
300 tsinfo6.peer_port = inet->inet_dport;
301
302 tsinfo6.hdr_rem = tc->t_tinc_hdr_rem;
303 tsinfo6.data_rem = tc->t_tinc_data_rem;
304 tsinfo6.last_sent_nxt = tc->t_last_sent_nxt;
305 tsinfo6.last_expected_una = tc->t_last_expected_una;
306 tsinfo6.last_seen_una = tc->t_last_seen_una;
307
308 rds_info_copy(iter, &tsinfo6, sizeof(tsinfo6));
309 }
310
311out:
312 lens->nr = rds6_tcp_tc_count;
313 lens->each = sizeof(tsinfo6);
314
315 spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags);
316}
317
276static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr, 318static int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
277 __u32 scope_id) 319 __u32 scope_id)
278{ 320{
@@ -628,6 +670,7 @@ static void rds_tcp_exit(void)
628 rds_tcp_set_unloading(); 670 rds_tcp_set_unloading();
629 synchronize_rcu(); 671 synchronize_rcu();
630 rds_info_deregister_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info); 672 rds_info_deregister_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info);
673 rds_info_deregister_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info);
631 unregister_pernet_device(&rds_tcp_net_ops); 674 unregister_pernet_device(&rds_tcp_net_ops);
632 rds_tcp_destroy_conns(); 675 rds_tcp_destroy_conns();
633 rds_trans_unregister(&rds_tcp_transport); 676 rds_trans_unregister(&rds_tcp_transport);
@@ -659,6 +702,7 @@ static int rds_tcp_init(void)
659 rds_trans_register(&rds_tcp_transport); 702 rds_trans_register(&rds_tcp_transport);
660 703
661 rds_info_register_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info); 704 rds_info_register_func(RDS_INFO_TCP_SOCKETS, rds_tcp_tc_info);
705 rds_info_register_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info);
662 706
663 goto out; 707 goto out;
664out_recv: 708out_recv: