Skip to content

Commit e65d4d9

Browse files
kcp-gitdavem330
authored andcommitted
rds: Remove IPv6 dependency
This patch removes the IPv6 dependency from RDS. Signed-off-by: Ka-Cheong Poon <[email protected]> Acked-by: Santosh Shilimkar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f394ad2 commit e65d4d9

File tree

12 files changed

+140
-26
lines changed

12 files changed

+140
-26
lines changed

net/rds/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
config RDS
33
tristate "The RDS Protocol"
4-
depends on INET && IPV6
4+
depends on INET
55
---help---
66
The RDS (Reliable Datagram Sockets) protocol provides reliable,
77
sequenced delivery of datagrams over Infiniband or TCP.

net/rds/af_rds.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -156,18 +156,20 @@ static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
156156
return sizeof(*sin);
157157
}
158158

159-
if (ipv6_addr_type(&rs->rs_conn_addr) &
160-
IPV6_ADDR_MAPPED) {
161-
sin = (struct sockaddr_in *)uaddr;
162-
memset(sin, 0, sizeof(*sin));
163-
sin->sin_family = AF_INET;
164-
return sizeof(*sin);
159+
#if IS_ENABLED(CONFIG_IPV6)
160+
if (!(ipv6_addr_type(&rs->rs_conn_addr) &
161+
IPV6_ADDR_MAPPED)) {
162+
sin6 = (struct sockaddr_in6 *)uaddr;
163+
memset(sin6, 0, sizeof(*sin6));
164+
sin6->sin6_family = AF_INET6;
165+
return sizeof(*sin6);
165166
}
167+
#endif
166168

167-
sin6 = (struct sockaddr_in6 *)uaddr;
168-
memset(sin6, 0, sizeof(*sin6));
169-
sin6->sin6_family = AF_INET6;
170-
return sizeof(*sin6);
169+
sin = (struct sockaddr_in *)uaddr;
170+
memset(sin, 0, sizeof(*sin));
171+
sin->sin_family = AF_INET;
172+
return sizeof(*sin);
171173
}
172174
if (ipv6_addr_v4mapped(&rs->rs_bound_addr)) {
173175
sin = (struct sockaddr_in *)uaddr;
@@ -501,9 +503,7 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
501503
{
502504
struct sock *sk = sock->sk;
503505
struct sockaddr_in *sin;
504-
struct sockaddr_in6 *sin6;
505506
struct rds_sock *rs = rds_sk_to_rs(sk);
506-
int addr_type;
507507
int ret = 0;
508508

509509
lock_sock(sk);
@@ -528,7 +528,11 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
528528
rs->rs_conn_port = sin->sin_port;
529529
break;
530530

531-
case AF_INET6:
531+
#if IS_ENABLED(CONFIG_IPV6)
532+
case AF_INET6: {
533+
struct sockaddr_in6 *sin6;
534+
int addr_type;
535+
532536
sin6 = (struct sockaddr_in6 *)uaddr;
533537
if (addr_len < sizeof(struct sockaddr_in6)) {
534538
ret = -EINVAL;
@@ -575,6 +579,8 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
575579
rs->rs_conn_addr = sin6->sin6_addr;
576580
rs->rs_conn_port = sin6->sin6_port;
577581
break;
582+
}
583+
#endif
578584

579585
default:
580586
ret = -EAFNOSUPPORT;

net/rds/bind.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
165165
struct in6_addr v6addr, *binding_addr;
166166
struct rds_transport *trans;
167167
__u32 scope_id = 0;
168-
int addr_type;
169168
int ret = 0;
170169
__be16 port;
171170

@@ -183,8 +182,10 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
183182
ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, &v6addr);
184183
binding_addr = &v6addr;
185184
port = sin->sin_port;
185+
#if IS_ENABLED(CONFIG_IPV6)
186186
} else if (uaddr->sa_family == AF_INET6) {
187187
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)uaddr;
188+
int addr_type;
188189

189190
if (addr_len < sizeof(struct sockaddr_in6))
190191
return -EINVAL;
@@ -212,6 +213,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
212213
}
213214
binding_addr = &sin6->sin6_addr;
214215
port = sin6->sin6_port;
216+
#endif
215217
} else {
216218
return -EINVAL;
217219
}

net/rds/connection.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,12 @@ static struct hlist_head *rds_conn_bucket(const struct in6_addr *laddr,
6363
net_get_random_once(&rds6_hash_secret, sizeof(rds6_hash_secret));
6464

6565
lhash = (__force u32)laddr->s6_addr32[3];
66+
#if IS_ENABLED(CONFIG_IPV6)
6667
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);
6872

6973
return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK];
7074
}
@@ -201,6 +205,8 @@ static struct rds_connection *__rds_conn_create(struct net *net,
201205
conn->c_isv6 = !ipv6_addr_v4mapped(laddr);
202206
conn->c_faddr = *faddr;
203207
conn->c_dev_if = dev_if;
208+
209+
#if IS_ENABLED(CONFIG_IPV6)
204210
/* If the local address is link local, set c_bound_if to be the
205211
* index used for this connection. Otherwise, set it to 0 as
206212
* 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,
209215
if (ipv6_addr_type(laddr) & IPV6_ADDR_LINKLOCAL)
210216
conn->c_bound_if = dev_if;
211217
else
218+
#endif
212219
conn->c_bound_if = 0;
213220

214221
rds_conn_net_set(conn, net);
@@ -500,9 +507,11 @@ static void __rds_inc_msg_cp(struct rds_incoming *inc,
500507
struct rds_info_iterator *iter,
501508
void *saddr, void *daddr, int flip, bool isv6)
502509
{
510+
#if IS_ENABLED(CONFIG_IPV6)
503511
if (isv6)
504512
rds6_inc_info_copy(inc, iter, saddr, daddr, flip);
505513
else
514+
#endif
506515
rds_inc_info_copy(inc, iter, *(__be32 *)saddr,
507516
*(__be32 *)daddr, flip);
508517
}
@@ -581,13 +590,15 @@ static void rds_conn_message_info(struct socket *sock, unsigned int len,
581590
rds_conn_message_info_cmn(sock, len, iter, lens, want_send, false);
582591
}
583592

593+
#if IS_ENABLED(CONFIG_IPV6)
584594
static void rds6_conn_message_info(struct socket *sock, unsigned int len,
585595
struct rds_info_iterator *iter,
586596
struct rds_info_lengths *lens,
587597
int want_send)
588598
{
589599
rds_conn_message_info_cmn(sock, len, iter, lens, want_send, true);
590600
}
601+
#endif
591602

592603
static void rds_conn_message_info_send(struct socket *sock, unsigned int len,
593604
struct rds_info_iterator *iter,
@@ -596,12 +607,14 @@ static void rds_conn_message_info_send(struct socket *sock, unsigned int len,
596607
rds_conn_message_info(sock, len, iter, lens, 1);
597608
}
598609

610+
#if IS_ENABLED(CONFIG_IPV6)
599611
static void rds6_conn_message_info_send(struct socket *sock, unsigned int len,
600612
struct rds_info_iterator *iter,
601613
struct rds_info_lengths *lens)
602614
{
603615
rds6_conn_message_info(sock, len, iter, lens, 1);
604616
}
617+
#endif
605618

606619
static void rds_conn_message_info_retrans(struct socket *sock,
607620
unsigned int len,
@@ -611,13 +624,15 @@ static void rds_conn_message_info_retrans(struct socket *sock,
611624
rds_conn_message_info(sock, len, iter, lens, 0);
612625
}
613626

627+
#if IS_ENABLED(CONFIG_IPV6)
614628
static void rds6_conn_message_info_retrans(struct socket *sock,
615629
unsigned int len,
616630
struct rds_info_iterator *iter,
617631
struct rds_info_lengths *lens)
618632
{
619633
rds6_conn_message_info(sock, len, iter, lens, 0);
620634
}
635+
#endif
621636

622637
void rds_for_each_conn_info(struct socket *sock, unsigned int len,
623638
struct rds_info_iterator *iter,
@@ -734,6 +749,7 @@ static int rds_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
734749
return 1;
735750
}
736751

752+
#if IS_ENABLED(CONFIG_IPV6)
737753
static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
738754
{
739755
struct rds6_info_connection *cinfo6 = buffer;
@@ -761,6 +777,7 @@ static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
761777
*/
762778
return 1;
763779
}
780+
#endif
764781

765782
static void rds_conn_info(struct socket *sock, unsigned int len,
766783
struct rds_info_iterator *iter,
@@ -774,6 +791,7 @@ static void rds_conn_info(struct socket *sock, unsigned int len,
774791
sizeof(struct rds_info_connection));
775792
}
776793

794+
#if IS_ENABLED(CONFIG_IPV6)
777795
static void rds6_conn_info(struct socket *sock, unsigned int len,
778796
struct rds_info_iterator *iter,
779797
struct rds_info_lengths *lens)
@@ -785,6 +803,7 @@ static void rds6_conn_info(struct socket *sock, unsigned int len,
785803
buffer,
786804
sizeof(struct rds6_info_connection));
787805
}
806+
#endif
788807

789808
int rds_conn_init(void)
790809
{
@@ -807,12 +826,13 @@ int rds_conn_init(void)
807826
rds_conn_message_info_send);
808827
rds_info_register_func(RDS_INFO_RETRANS_MESSAGES,
809828
rds_conn_message_info_retrans);
829+
#if IS_ENABLED(CONFIG_IPV6)
810830
rds_info_register_func(RDS6_INFO_CONNECTIONS, rds6_conn_info);
811831
rds_info_register_func(RDS6_INFO_SEND_MESSAGES,
812832
rds6_conn_message_info_send);
813833
rds_info_register_func(RDS6_INFO_RETRANS_MESSAGES,
814834
rds6_conn_message_info_retrans);
815-
835+
#endif
816836
return 0;
817837
}
818838

@@ -830,11 +850,13 @@ void rds_conn_exit(void)
830850
rds_conn_message_info_send);
831851
rds_info_deregister_func(RDS_INFO_RETRANS_MESSAGES,
832852
rds_conn_message_info_retrans);
853+
#if IS_ENABLED(CONFIG_IPV6)
833854
rds_info_deregister_func(RDS6_INFO_CONNECTIONS, rds6_conn_info);
834855
rds_info_deregister_func(RDS6_INFO_SEND_MESSAGES,
835856
rds6_conn_message_info_send);
836857
rds_info_deregister_func(RDS6_INFO_RETRANS_MESSAGES,
837858
rds6_conn_message_info_retrans);
859+
#endif
838860
}
839861

840862
/*

net/rds/ib.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ static int rds_ib_conn_info_visitor(struct rds_connection *conn,
321321
return 1;
322322
}
323323

324+
#if IS_ENABLED(CONFIG_IPV6)
324325
/* IPv6 version of rds_ib_conn_info_visitor(). */
325326
static int rds6_ib_conn_info_visitor(struct rds_connection *conn,
326327
void *buffer)
@@ -357,6 +358,7 @@ static int rds6_ib_conn_info_visitor(struct rds_connection *conn,
357358
}
358359
return 1;
359360
}
361+
#endif
360362

361363
static void rds_ib_ic_info(struct socket *sock, unsigned int len,
362364
struct rds_info_iterator *iter,
@@ -370,6 +372,7 @@ static void rds_ib_ic_info(struct socket *sock, unsigned int len,
370372
sizeof(struct rds_info_rdma_connection));
371373
}
372374

375+
#if IS_ENABLED(CONFIG_IPV6)
373376
/* IPv6 version of rds_ib_ic_info(). */
374377
static void rds6_ib_ic_info(struct socket *sock, unsigned int len,
375378
struct rds_info_iterator *iter,
@@ -382,6 +385,7 @@ static void rds6_ib_ic_info(struct socket *sock, unsigned int len,
382385
buffer,
383386
sizeof(struct rds6_info_rdma_connection));
384387
}
388+
#endif
385389

386390
/*
387391
* 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,
398402
{
399403
int ret;
400404
struct rdma_cm_id *cm_id;
405+
#if IS_ENABLED(CONFIG_IPV6)
401406
struct sockaddr_in6 sin6;
407+
#endif
402408
struct sockaddr_in sin;
403409
struct sockaddr *sa;
404410
bool isv4;
@@ -418,6 +424,7 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
418424
sin.sin_addr.s_addr = addr->s6_addr32[3];
419425
sa = (struct sockaddr *)&sin;
420426
} else {
427+
#if IS_ENABLED(CONFIG_IPV6)
421428
memset(&sin6, 0, sizeof(sin6));
422429
sin6.sin6_family = AF_INET6;
423430
sin6.sin6_addr = *addr;
@@ -432,21 +439,30 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
432439
if (ipv6_addr_type(addr) & IPV6_ADDR_LINKLOCAL) {
433440
struct net_device *dev;
434441

435-
if (scope_id == 0)
436-
return -EADDRNOTAVAIL;
442+
if (scope_id == 0) {
443+
ret = -EADDRNOTAVAIL;
444+
goto out;
445+
}
437446

438447
/* Use init_net for now as RDS is not network
439448
* name space aware.
440449
*/
441450
dev = dev_get_by_index(&init_net, scope_id);
442-
if (!dev)
443-
return -EADDRNOTAVAIL;
451+
if (!dev) {
452+
ret = -EADDRNOTAVAIL;
453+
goto out;
454+
}
444455
if (!ipv6_chk_addr(&init_net, addr, dev, 1)) {
445456
dev_put(dev);
446-
return -EADDRNOTAVAIL;
457+
ret = -EADDRNOTAVAIL;
458+
goto out;
447459
}
448460
dev_put(dev);
449461
}
462+
#else
463+
ret = -EADDRNOTAVAIL;
464+
goto out;
465+
#endif
450466
}
451467

452468
/* 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,
461477
addr, scope_id, ret,
462478
cm_id->device ? cm_id->device->node_type : -1);
463479

480+
out:
464481
rdma_destroy_id(cm_id);
465482

466483
return ret;
@@ -491,7 +508,9 @@ void rds_ib_exit(void)
491508
rds_ib_set_unloading();
492509
synchronize_rcu();
493510
rds_info_deregister_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
511+
#if IS_ENABLED(CONFIG_IPV6)
494512
rds_info_deregister_func(RDS6_INFO_IB_CONNECTIONS, rds6_ib_ic_info);
513+
#endif
495514
rds_ib_unregister_client();
496515
rds_ib_destroy_nodev_conns();
497516
rds_ib_sysctl_exit();
@@ -553,7 +572,9 @@ int rds_ib_init(void)
553572
rds_trans_register(&rds_ib_transport);
554573

555574
rds_info_register_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
575+
#if IS_ENABLED(CONFIG_IPV6)
556576
rds_info_register_func(RDS6_INFO_IB_CONNECTIONS, rds6_ib_ic_info);
577+
#endif
557578

558579
goto out;
559580

0 commit comments

Comments
 (0)