Skip to content

Commit 2c20795

Browse files
kcp-gitvijay-suman
authored andcommitted
rds: Remove RDS dependency on IPv6
This patch removes the IPv6 dependency from RDS. This is not really needed for UEK as IPv6 is always available. But it is desirable to have UEK code be similar to upstream RDS stack. The internal representation of an address is not changed. Only specific IPv6 handling code which relies on IPv6 module is conditionally not compiled in if IPv6 is not enabled in kernel configuration. Orabug: 28466876 Signed-off-by: Ka-Cheong Poon <[email protected]> Reviewed-by: Santosh Shilimkar <[email protected]> Orabug: 33590097 UEK6 => UEK7 (cherry picked from commit f73e27b) cherry-pick-repo=UEK/production/linux-uek.git Signed-off-by: Gerd Rausch <[email protected]> Reviewed-by: William Kucharski <[email protected]> Orabug: 33590087 UEK7 => LUCI (cherry picked from commit a35d97d) cherry-pick-repo=UEK/production/linux-uek.git Signed-off-by: Gerd Rausch <[email protected]> Reviewed-by: William Kucharski <[email protected]>
1 parent 0ad1294 commit 2c20795

File tree

11 files changed

+144
-20
lines changed

11 files changed

+144
-20
lines changed

net/rds/af_rds.c

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,25 @@ static int rds_getname(struct socket *sock, struct sockaddr *uaddr,
185185
memset(sin, 0, sizeof(*sin));
186186
sin->sin_family = AF_UNSPEC;
187187
*uaddr_len = sizeof(*sin);
188+
return 0;
188189
}
189190

190-
if (ipv6_addr_type(&rs->rs_conn_addr) &
191-
IPV6_ADDR_MAPPED) {
192-
sin = (struct sockaddr_in *)uaddr;
193-
memset(sin, 0, sizeof(*sin));
194-
sin->sin_family = AF_INET;
195-
*uaddr_len = sizeof(*sin);
191+
#if IS_ENABLED(CONFIG_IPV6)
192+
if (!(ipv6_addr_type(&rs->rs_conn_addr) &
193+
IPV6_ADDR_MAPPED)) {
194+
sin6 = (struct sockaddr_in6 *)uaddr;
195+
memset(sin, 0, sizeof(*sin6));
196+
sin->sin_family = AF_INET6;
197+
*uaddr_len = sizeof(*sin6);
198+
return 0;
196199
}
200+
#endif
197201

198-
sin6 = (struct sockaddr_in6 *)uaddr;
199-
memset(sin6, 0, sizeof(*sin6));
200-
sin6->sin6_family = AF_INET6;
201-
*uaddr_len = sizeof(*sin6);
202+
sin = (struct sockaddr_in *)uaddr;
203+
memset(sin, 0, sizeof(*sin));
204+
sin->sin_family = AF_INET;
205+
*uaddr_len = sizeof(*sin);
206+
return 0;
202207
}
203208
if (ipv6_addr_v4mapped(&rs->rs_bound_addr)) {
204209
sin = (struct sockaddr_in *)uaddr;
@@ -454,6 +459,7 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
454459
return 0;
455460
}
456461

462+
#if IS_ENABLED(CONFIG_IPV6)
457463
static int rds6_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
458464
{
459465
struct rds6_reset reset;
@@ -498,6 +504,7 @@ static int rds6_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
498504
done:
499505
return 0;
500506
}
507+
#endif
501508

502509
static int rds_set_transport(struct rds_sock *rs, char __user *optval,
503510
int optlen)
@@ -605,13 +612,15 @@ static int rds_setsockopt(struct socket *sock, int level, int optname,
605612
}
606613
ret = rds_user_reset(rs, optval, optlen);
607614
break;
615+
#if IS_ENABLED(CONFIG_IPV6)
608616
case RDS6_CONN_RESET:
609617
if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) {
610618
ret = -EACCES;
611619
break;
612620
}
613621
ret = rds6_user_reset(rs, optval, optlen);
614622
break;
623+
#endif
615624
case SO_RDS_TRANSPORT:
616625
lock_sock(sock->sk);
617626
ret = rds_set_transport(rs, optval, optlen);
@@ -690,9 +699,7 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
690699
{
691700
struct sock *sk = sock->sk;
692701
struct sockaddr_in *sin;
693-
struct sockaddr_in6 *sin6;
694702
struct rds_sock *rs = rds_sk_to_rs(sk);
695-
int addr_type;
696703
int ret = 0;
697704

698705
lock_sock(sk);
@@ -717,7 +724,11 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
717724
rs->rs_conn_port = sin->sin_port;
718725
break;
719726

720-
case AF_INET6:
727+
#if IS_ENABLED(CONFIG_IPV6)
728+
case AF_INET6: {
729+
struct sockaddr_in6 *sin6;
730+
int addr_type;
731+
721732
sin6 = (struct sockaddr_in6 *)uaddr;
722733
if (addr_len < sizeof(struct sockaddr_in6)) {
723734
ret = -EINVAL;
@@ -763,6 +774,8 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
763774
rs->rs_conn_addr = sin6->sin6_addr;
764775
rs->rs_conn_port = sin6->sin6_port;
765776
break;
777+
}
778+
#endif
766779

767780
default:
768781
ret = -EINVAL;
@@ -946,6 +959,7 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len,
946959
lens->each = sizeof(struct rds_info_message);
947960
}
948961

962+
#if IS_ENABLED(CONFIG_IPV6)
949963
static void rds6_sock_inc_info(struct socket *sock, unsigned int len,
950964
struct rds_info_iterator *iter,
951965
struct rds_info_lengths *lens)
@@ -977,6 +991,7 @@ static void rds6_sock_inc_info(struct socket *sock, unsigned int len,
977991
lens->nr = total;
978992
lens->each = sizeof(struct rds6_info_message);
979993
}
994+
#endif
980995

981996
static void rds_sock_info(struct socket *sock, unsigned int len,
982997
struct rds_info_iterator *iter,
@@ -1011,6 +1026,7 @@ static void rds_sock_info(struct socket *sock, unsigned int len,
10111026
spin_unlock_bh(&rds_sock_lock);
10121027
}
10131028

1029+
#if IS_ENABLED(CONFIG_IPV6)
10141030
static void rds6_sock_info(struct socket *sock, unsigned int len,
10151031
struct rds_info_iterator *iter,
10161032
struct rds_info_lengths *lens)
@@ -1043,6 +1059,7 @@ static void rds6_sock_info(struct socket *sock, unsigned int len,
10431059

10441060
spin_unlock_bh(&rds_sock_lock);
10451061
}
1062+
#endif
10461063

10471064
static unsigned long parse_ul(char *ptr, unsigned long max)
10481065
{
@@ -1155,8 +1172,10 @@ static void __exit rds_exit(void)
11551172
rds_page_exit();
11561173
rds_info_deregister_func(RDS_INFO_SOCKETS, rds_sock_info);
11571174
rds_info_deregister_func(RDS_INFO_RECV_MESSAGES, rds_sock_inc_info);
1175+
#if IS_ENABLED(CONFIG_IPV6)
11581176
rds_info_deregister_func(RDS6_INFO_SOCKETS, rds6_sock_info);
11591177
rds_info_deregister_func(RDS6_INFO_RECV_MESSAGES, rds6_sock_inc_info);
1178+
#endif
11601179
}
11611180

11621181
module_exit(rds_exit);
@@ -1192,8 +1211,10 @@ static int __init rds_init(void)
11921211

11931212
rds_info_register_func(RDS_INFO_SOCKETS, rds_sock_info);
11941213
rds_info_register_func(RDS_INFO_RECV_MESSAGES, rds_sock_inc_info);
1214+
#if IS_ENABLED(CONFIG_IPV6)
11951215
rds_info_register_func(RDS6_INFO_SOCKETS, rds6_sock_info);
11961216
rds_info_register_func(RDS6_INFO_RECV_MESSAGES, rds6_sock_inc_info);
1217+
#endif
11971218

11981219
rds_qos_threshold_init();
11991220

net/rds/bind.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,6 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
191191
struct in6_addr v6addr, *binding_addr;
192192
struct rds_transport *trans;
193193
__u32 scope_id = 0;
194-
int addr_type;
195194
int ret = 0;
196195
__be16 port;
197196

@@ -209,8 +208,10 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
209208
ipv6_addr_set_v4mapped(sin->sin_addr.s_addr, &v6addr);
210209
binding_addr = &v6addr;
211210
port = sin->sin_port;
211+
#if IS_ENABLED(CONFIG_IPV6)
212212
} else if (uaddr->sa_family == AF_INET6) {
213213
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)uaddr;
214+
int addr_type;
214215

215216
if (addr_len < sizeof(struct sockaddr_in6))
216217
return -EINVAL;
@@ -238,6 +239,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
238239
}
239240
binding_addr = &sin6->sin6_addr;
240241
port = sin6->sin6_port;
242+
#endif
241243
} else {
242244
return -EINVAL;
243245
}

net/rds/connection.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,13 @@ static struct hlist_head *rds_conn_bucket(const struct in6_addr *laddr,
6060
net_get_random_once(&rds6_hash_secret, sizeof(rds6_hash_secret));
6161

6262
lhash = (__force u32)laddr->s6_addr32[3];
63+
#if IS_ENABLED(CONFIG_IPV6)
6364
fhash = __ipv6_addr_jhash(faddr, rds6_hash_secret);
64-
hash = __inet6_ehashfn(lhash, 0, fhash, 0, rds_hash_secret);
65+
#else
66+
fhash = (__force u32)faddr->s6_addr32[3];
67+
#endif
68+
hash = __inet_ehashfn((__force __be32)lhash, 0, (__force __be32)fhash,
69+
0, rds_hash_secret);
6570

6671
return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK];
6772
}
@@ -221,6 +226,8 @@ static struct rds_connection *__rds_conn_create(struct net *net,
221226
conn->c_isv6 = !ipv6_addr_v4mapped(laddr);
222227
conn->c_faddr = *faddr;
223228
conn->c_dev_if = dev_if;
229+
230+
#if IS_ENABLED(CONFIG_IPV6)
224231
/* If the local address is link local, set c_bound_if to be the
225232
* index used for this connection. Otherwise, set it to 0 as
226233
* the socket is not bound to an interface. c_bound_if is used
@@ -229,6 +236,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
229236
if (ipv6_addr_type(laddr) & IPV6_ADDR_LINKLOCAL)
230237
conn->c_bound_if = dev_if;
231238
else
239+
#endif
232240
conn->c_bound_if = 0;
233241

234242
rds_conn_net_set(conn, net);
@@ -570,9 +578,11 @@ static void __rds_inc_msg_cp(struct rds_incoming *inc,
570578
struct rds_info_iterator *iter,
571579
void *saddr, void *daddr, int flip, bool isv6)
572580
{
581+
#if IS_ENABLED(CONFIG_IPV6)
573582
if (isv6)
574583
rds6_inc_info_copy(inc, iter, saddr, daddr, flip);
575584
else
585+
#endif
576586
rds_inc_info_copy(inc, iter, *(__be32 *)saddr,
577587
*(__be32 *)daddr, flip);
578588
}
@@ -650,13 +660,15 @@ static void rds_conn_message_info(struct socket *sock, unsigned int len,
650660
rds_conn_message_info_cmn(sock, len, iter, lens, want_send, false);
651661
}
652662

663+
#if IS_ENABLED(CONFIG_IPV6)
653664
static void rds6_conn_message_info(struct socket *sock, unsigned int len,
654665
struct rds_info_iterator *iter,
655666
struct rds_info_lengths *lens,
656667
int want_send)
657668
{
658669
rds_conn_message_info_cmn(sock, len, iter, lens, want_send, true);
659670
}
671+
#endif
660672

661673
static void rds_conn_message_info_send(struct socket *sock, unsigned int len,
662674
struct rds_info_iterator *iter,
@@ -665,12 +677,14 @@ static void rds_conn_message_info_send(struct socket *sock, unsigned int len,
665677
rds_conn_message_info(sock, len, iter, lens, 1);
666678
}
667679

680+
#if IS_ENABLED(CONFIG_IPV6)
668681
static void rds6_conn_message_info_send(struct socket *sock, unsigned int len,
669682
struct rds_info_iterator *iter,
670683
struct rds_info_lengths *lens)
671684
{
672685
rds6_conn_message_info(sock, len, iter, lens, 1);
673686
}
687+
#endif
674688

675689
static void rds_conn_message_info_retrans(struct socket *sock,
676690
unsigned int len,
@@ -680,13 +694,15 @@ static void rds_conn_message_info_retrans(struct socket *sock,
680694
rds_conn_message_info(sock, len, iter, lens, 0);
681695
}
682696

697+
#if IS_ENABLED(CONFIG_IPV6)
683698
static void rds6_conn_message_info_retrans(struct socket *sock,
684699
unsigned int len,
685700
struct rds_info_iterator *iter,
686701
struct rds_info_lengths *lens)
687702
{
688703
rds6_conn_message_info(sock, len, iter, lens, 0);
689704
}
705+
#endif
690706

691707
void rds_for_each_conn_info(struct socket *sock, unsigned int len,
692708
struct rds_info_iterator *iter,
@@ -807,6 +823,7 @@ static int rds_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
807823
return 1;
808824
}
809825

826+
#if IS_ENABLED(CONFIG_IPV6)
810827
static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
811828
{
812829
struct rds6_info_connection *cinfo6 = buffer;
@@ -837,6 +854,7 @@ static int rds6_conn_info_visitor(struct rds_conn_path *cp, void *buffer)
837854
*/
838855
return 1;
839856
}
857+
#endif
840858

841859
static void rds_conn_info(struct socket *sock, unsigned int len,
842860
struct rds_info_iterator *iter,
@@ -849,6 +867,7 @@ static void rds_conn_info(struct socket *sock, unsigned int len,
849867
sizeof(struct rds_info_connection));
850868
}
851869

870+
#if IS_ENABLED(CONFIG_IPV6)
852871
static void rds6_conn_info(struct socket *sock, unsigned int len,
853872
struct rds_info_iterator *iter,
854873
struct rds_info_lengths *lens)
@@ -859,6 +878,7 @@ static void rds6_conn_info(struct socket *sock, unsigned int len,
859878
rds6_conn_info_visitor, buffer,
860879
sizeof(struct rds6_info_connection));
861880
}
881+
#endif
862882

863883
int rds_conn_init(void)
864884
{
@@ -873,11 +893,13 @@ int rds_conn_init(void)
873893
rds_conn_message_info_send);
874894
rds_info_register_func(RDS_INFO_RETRANS_MESSAGES,
875895
rds_conn_message_info_retrans);
896+
#if IS_ENABLED(CONFIG_IPV6)
876897
rds_info_register_func(RDS6_INFO_CONNECTIONS, rds6_conn_info);
877898
rds_info_register_func(RDS6_INFO_SEND_MESSAGES,
878899
rds6_conn_message_info_send);
879900
rds_info_register_func(RDS6_INFO_RETRANS_MESSAGES,
880901
rds6_conn_message_info_retrans);
902+
#endif
881903

882904
return 0;
883905
}
@@ -895,11 +917,13 @@ void rds_conn_exit(void)
895917
rds_conn_message_info_send);
896918
rds_info_deregister_func(RDS_INFO_RETRANS_MESSAGES,
897919
rds_conn_message_info_retrans);
920+
#if IS_ENABLED(CONFIG_IPV6)
898921
rds_info_deregister_func(RDS6_INFO_CONNECTIONS, rds6_conn_info);
899922
rds_info_deregister_func(RDS6_INFO_SEND_MESSAGES,
900923
rds6_conn_message_info_send);
901924
rds_info_deregister_func(RDS6_INFO_RETRANS_MESSAGES,
902925
rds6_conn_message_info_retrans);
926+
#endif
903927
}
904928

905929
static char *conn_drop_reasons[] = {

0 commit comments

Comments
 (0)