From 2c704cdf304c3f9d06b70fee68a72edbc66552b5 Mon Sep 17 00:00:00 2001 From: Sowmini Varadhan Date: Mon, 1 Jun 2015 20:27:42 -0400 Subject: [PATCH] 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. Orabug: 21061146 Signed-off-by: Sowmini Varadhan Signed-off-by: David S. Miller Signed-off-by: Mukesh Kacker --- net/rds/af_rds.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index 71806cb5587e7..85342de1c8336 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c @@ -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; } -- 2.51.0