Commit 3b1e21eb authored by Florian Westphal's avatar Florian Westphal Committed by Jakub Kicinski
Browse files

mptcp: getsockopt: add support for IP_TOS



earlier patch added IP_TOS setsockopt support, this allows to get
the value set by earlier setsockopt.

Extends mptcp_put_int_option to handle u8 input/output by
adding required cast.

Reviewed-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 602837e8
Loading
Loading
Loading
Loading
+30 −6
Original line number Original line Diff line number Diff line
@@ -1053,15 +1053,24 @@ static int mptcp_put_int_option(struct mptcp_sock *msk, char __user *optval,


	if (get_user(len, optlen))
	if (get_user(len, optlen))
		return -EFAULT;
		return -EFAULT;

	len = min_t(unsigned int, len, sizeof(int));
	if (len < 0)
	if (len < 0)
		return -EINVAL;
		return -EINVAL;


	if (len < sizeof(int) && len > 0 && val >= 0 && val <= 255) {
		unsigned char ucval = (unsigned char)val;

		len = 1;
		if (put_user(len, optlen))
			return -EFAULT;
		if (copy_to_user(optval, &ucval, 1))
			return -EFAULT;
	} else {
		len = min_t(unsigned int, len, sizeof(int));
		if (put_user(len, optlen))
		if (put_user(len, optlen))
			return -EFAULT;
			return -EFAULT;
		if (copy_to_user(optval, &val, len))
		if (copy_to_user(optval, &val, len))
			return -EFAULT;
			return -EFAULT;
	}


	return 0;
	return 0;
}
}
@@ -1082,6 +1091,19 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
	return -EOPNOTSUPP;
	return -EOPNOTSUPP;
}
}


static int mptcp_getsockopt_v4(struct mptcp_sock *msk, int optname,
			       char __user *optval, int __user *optlen)
{
	struct sock *sk = (void *)msk;

	switch (optname) {
	case IP_TOS:
		return mptcp_put_int_option(msk, optval, optlen, inet_sk(sk)->tos);
	}

	return -EOPNOTSUPP;
}

static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname,
static int mptcp_getsockopt_sol_mptcp(struct mptcp_sock *msk, int optname,
				      char __user *optval, int __user *optlen)
				      char __user *optval, int __user *optlen)
{
{
@@ -1117,6 +1139,8 @@ int mptcp_getsockopt(struct sock *sk, int level, int optname,
	if (ssk)
	if (ssk)
		return tcp_getsockopt(ssk, level, optname, optval, option);
		return tcp_getsockopt(ssk, level, optname, optval, option);


	if (level == SOL_IP)
		return mptcp_getsockopt_v4(msk, optname, optval, option);
	if (level == SOL_TCP)
	if (level == SOL_TCP)
		return mptcp_getsockopt_sol_tcp(msk, optname, optval, option);
		return mptcp_getsockopt_sol_tcp(msk, optname, optval, option);
	if (level == SOL_MPTCP)
	if (level == SOL_MPTCP)