diff options
author | Sowmini Varadhan <sowmini.varadhan@oracle.com> | 2015-05-29 17:28:09 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-05-31 21:47:23 -0700 |
commit | 8ba38460f363e4d26d666aae9bc7fd3afa5f8e43 (patch) | |
tree | 006c24e39896b5d0911c957533b02defc4e4b12b /net/rds | |
parent | d97dac54bf83b2a3df85fba37595e355627e0f2b (diff) |
net/rds Add getsockopt support for SO_RDS_TRANSPORT
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.
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/rds')
-rw-r--r-- | net/rds/af_rds.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index 04877441fb01..2ad9032372b2 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -339,6 +339,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; @@ -364,6 +365,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; } |