Re: [PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support

2018-07-23 Thread Ka-Cheong Poon

On 07/24/2018 11:20 AM, David Miller wrote:

From: Ka-Cheong Poon 
Date: Tue, 24 Jul 2018 11:18:24 +0800


On 07/24/2018 02:15 AM, David Miller wrote:

From: Ka-Cheong Poon 
Date: Mon, 23 Jul 2018 07:16:11 -0700


@@ -163,15 +165,29 @@ int rds_tcp_accept_one(struct socket *sock)
inet = inet_sk(new_sock->sk);
   +my_addr = _sock->sk->sk_v6_rcv_saddr;
+   peer_addr = _sock->sk->sk_v6_daddr,
rdsdebug("accepted tcp %pI6c:%u -> %pI6c:%u\n",

Note that comma, instead of a semicolon, at the end of the peer_addr
assignment.
This doesn't even compile.



Strange, the compiler did not complain.  Will check why's
that.


Try allmodconfig



That catches it.  Thanks!


--
K. Poon
ka-cheong.p...@oracle.com




Re: [PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support

2018-07-23 Thread David Miller
From: Ka-Cheong Poon 
Date: Tue, 24 Jul 2018 11:18:24 +0800

> On 07/24/2018 02:15 AM, David Miller wrote:
>> From: Ka-Cheong Poon 
>> Date: Mon, 23 Jul 2018 07:16:11 -0700
>> 
>>> @@ -163,15 +165,29 @@ int rds_tcp_accept_one(struct socket *sock)
>>> inet = inet_sk(new_sock->sk);
>>>   + my_addr = _sock->sk->sk_v6_rcv_saddr;
>>> +   peer_addr = _sock->sk->sk_v6_daddr,
>>> rdsdebug("accepted tcp %pI6c:%u -> %pI6c:%u\n",
>> Note that comma, instead of a semicolon, at the end of the peer_addr
>> assignment.
>> This doesn't even compile.
> 
> 
> Strange, the compiler did not complain.  Will check why's
> that.

Try allmodconfig


Re: [PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support

2018-07-23 Thread Ka-Cheong Poon

On 07/24/2018 02:15 AM, David Miller wrote:

From: Ka-Cheong Poon 
Date: Mon, 23 Jul 2018 07:16:11 -0700


@@ -163,15 +165,29 @@ int rds_tcp_accept_one(struct socket *sock)
  
  	inet = inet_sk(new_sock->sk);
  
+	my_addr = _sock->sk->sk_v6_rcv_saddr;

+   peer_addr = _sock->sk->sk_v6_daddr,
rdsdebug("accepted tcp %pI6c:%u -> %pI6c:%u\n",


Note that comma, instead of a semicolon, at the end of the peer_addr
assignment.

This doesn't even compile.



Strange, the compiler did not complain.  Will check why's
that.

Thanks.


--
K. Poon
ka-cheong.p...@oracle.com




Re: [PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support

2018-07-23 Thread David Miller
From: Ka-Cheong Poon 
Date: Mon, 23 Jul 2018 07:16:11 -0700

> @@ -163,15 +165,29 @@ int rds_tcp_accept_one(struct socket *sock)
>  
>   inet = inet_sk(new_sock->sk);
>  
> + my_addr = _sock->sk->sk_v6_rcv_saddr;
> + peer_addr = _sock->sk->sk_v6_daddr,
>   rdsdebug("accepted tcp %pI6c:%u -> %pI6c:%u\n",

Note that comma, instead of a semicolon, at the end of the peer_addr
assignment.

This doesn't even compile.


Re: [PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support

2018-07-23 Thread Santosh Shilimkar

On 7/23/2018 7:16 AM, Ka-Cheong Poon wrote:

This patch enables RDS to use IPv6 addresses. For RDS/TCP, the
listener is now an IPv6 endpoint which accepts both IPv4 and IPv6
connection requests.  RDS/RDMA/IB uses a private data (struct
rds_ib_connect_private) exchange between endpoints at RDS connection
establishment time to support RDMA. This private data exchange uses a
32 bit integer to represent an IP address. This needs to be changed in
order to support IPv6. A new private data struct
rds6_ib_connect_private is introduced to handle this. To ensure
backward compatibility, an IPv6 capable RDS stack uses another RDMA
listener port (RDS_CM_PORT) to accept IPv6 connection. And it
continues to use the original RDS_PORT for IPv4 RDS connections. When
it needs to communicate with an IPv6 peer, it uses the RDS_CM_PORT to
send the connection set up request.

v4: Changed port history comments in rds.h (Sowmini Varadhan).

v3: Added support to set up IPv4 connection using mapped address
 (David Miller).
 Added support to set up connection between link local and non-link
 addresses.
 Various review comments from Santosh Shilimkar and Sowmini Varadhan.

v2: Fixed bound and peer address scope mismatched issue.
 Added back rds_connect() IPv6 changes.

Signed-off-by: Ka-Cheong Poon 
---

Looks good to me now. Thanks !!

Acked-by: Santosh Shilimkar 



[PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support

2018-07-23 Thread Ka-Cheong Poon
This patch enables RDS to use IPv6 addresses. For RDS/TCP, the
listener is now an IPv6 endpoint which accepts both IPv4 and IPv6
connection requests.  RDS/RDMA/IB uses a private data (struct
rds_ib_connect_private) exchange between endpoints at RDS connection
establishment time to support RDMA. This private data exchange uses a
32 bit integer to represent an IP address. This needs to be changed in
order to support IPv6. A new private data struct
rds6_ib_connect_private is introduced to handle this. To ensure
backward compatibility, an IPv6 capable RDS stack uses another RDMA
listener port (RDS_CM_PORT) to accept IPv6 connection. And it
continues to use the original RDS_PORT for IPv4 RDS connections. When
it needs to communicate with an IPv6 peer, it uses the RDS_CM_PORT to
send the connection set up request.

v4: Changed port history comments in rds.h (Sowmini Varadhan).

v3: Added support to set up IPv4 connection using mapped address
(David Miller).
Added support to set up connection between link local and non-link
addresses.
Various review comments from Santosh Shilimkar and Sowmini Varadhan.

v2: Fixed bound and peer address scope mismatched issue.
Added back rds_connect() IPv6 changes.

Signed-off-by: Ka-Cheong Poon 
---
 net/rds/af_rds.c | 91 
 net/rds/bind.c   | 59 ++-
 net/rds/connection.c | 54 
 net/rds/ib.c | 55 -
 net/rds/ib_cm.c  | 20 ---
 net/rds/rdma_transport.c | 30 +++-
 net/rds/rdma_transport.h |  5 +++
 net/rds/rds.h| 22 +++-
 net/rds/recv.c   |  2 +-
 net/rds/send.c   | 61 
 net/rds/tcp.c| 54 +---
 net/rds/tcp.h|  2 +-
 net/rds/tcp_connect.c| 54 +---
 net/rds/tcp_listen.c | 64 +++---
 14 files changed, 459 insertions(+), 114 deletions(-)

diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c
index fc1a5c6..fc5c48b 100644
--- a/net/rds/af_rds.c
+++ b/net/rds/af_rds.c
@@ -142,15 +142,32 @@ static int rds_getname(struct socket *sock, struct 
sockaddr *uaddr,
uaddr_len = sizeof(*sin6);
}
} else {
-   /* If socket is not yet bound, set the return address family
-* to be AF_UNSPEC (value 0) and the address size to be that
-* of an IPv4 address.
+   /* If socket is not yet bound and the socket is connected,
+* set the return address family to be the same as the
+* connected address, but with 0 address value.  If it is not
+* connected, set the family to be AF_UNSPEC (value 0) and
+* the address size to be that of an IPv4 address.
 */
if (ipv6_addr_any(>rs_bound_addr)) {
-   sin = (struct sockaddr_in *)uaddr;
-   memset(sin, 0, sizeof(*sin));
-   sin->sin_family = AF_UNSPEC;
-   return sizeof(*sin);
+   if (ipv6_addr_any(>rs_conn_addr)) {
+   sin = (struct sockaddr_in *)uaddr;
+   memset(sin, 0, sizeof(*sin));
+   sin->sin_family = AF_UNSPEC;
+   return sizeof(*sin);
+   }
+
+   if (ipv6_addr_type(>rs_conn_addr) &
+   IPV6_ADDR_MAPPED) {
+   sin = (struct sockaddr_in *)uaddr;
+   memset(sin, 0, sizeof(*sin));
+   sin->sin_family = AF_INET;
+   return sizeof(*sin);
+   }
+
+   sin6 = (struct sockaddr_in6 *)uaddr;
+   memset(sin6, 0, sizeof(*sin6));
+   sin6->sin6_family = AF_INET6;
+   return sizeof(*sin6);
}
if (ipv6_addr_v4mapped(>rs_bound_addr)) {
sin = (struct sockaddr_in *)uaddr;
@@ -484,16 +501,18 @@ static int rds_connect(struct socket *sock, struct 
sockaddr *uaddr,
 {
struct sock *sk = sock->sk;
struct sockaddr_in *sin;
+   struct sockaddr_in6 *sin6;
struct rds_sock *rs = rds_sk_to_rs(sk);
+   int addr_type;
int ret = 0;
 
lock_sock(sk);
 
-   switch (addr_len) {
-   case sizeof(struct sockaddr_in):
+   switch (uaddr->sa_family) {
+   case AF_INET:
sin = (struct sockaddr_in *)uaddr;
-   if (sin->sin_family != AF_INET) {
-   ret = -EAFNOSUPPORT;
+   if (addr_len < sizeof(struct sockaddr_in)) {
+   ret = -EINVAL;