]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Add getsockopt support for SO_RDS_TRANSPORT
authorSowmini Varadhan <sowmini.varadhan@oracle.com>
Tue, 2 Jun 2015 00:27:42 +0000 (20:27 -0400)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Wed, 8 Jul 2015 21:00:22 +0000 (14:00 -0700)
The currently attached transport for a PF_RDS socket may be obtained
from user space by invoking getsockopt(2) using the SO_RDS_TRANSPORT
option at the SOL_RDS level. The integer optval returned will be one
of the RDS_TRANS_* constants defined in linux/rds.h.

Orabug: 21061146

Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Mukesh Kacker <mukesh.kacker@oracle.com>
net/rds/af_rds.c

index 71806cb5587e76714bc66386f45d63c3739e10f1..85342de1c8336761ebb048a657cbb4e340ccbf50 100644 (file)
@@ -402,6 +402,7 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
 {
        struct rds_sock *rs = rds_sk_to_rs(sock->sk);
        int ret = -ENOPROTOOPT, len;
+       int trans;
 
        if (level != SOL_RDS)
                goto out;
@@ -427,6 +428,19 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
                else
                        ret = 0;
                break;
+       case SO_RDS_TRANSPORT:
+               if (len < sizeof(int)) {
+                       ret = -EINVAL;
+                       break;
+               }
+               trans = (rs->rs_transport ? rs->rs_transport->t_type :
+                        RDS_TRANS_NONE); /* unbound */
+               if (put_user(trans, (int __user *)optval) ||
+                   put_user(sizeof(int), optlen))
+                       ret = -EFAULT;
+               else
+                       ret = 0;
+               break;
        default:
                break;
        }