Re: [PATCH v4 net-next 2/3] rds: Enable RDS IPv6 support
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
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
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
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
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
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;