]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mptcp: getsockopt: add support for IP_TOS
authorFlorian Westphal <fw@strlen.de>
Fri, 3 Dec 2021 22:35:37 +0000 (14:35 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Dec 2021 19:36:30 +0000 (11:36 -0800)
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: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/sockopt.c

index 11cda8629993ba4d056504ea834fa395a0b7546b..44e0a37c567cd3dfbe71688fa1be1215af644937 100644 (file)
@@ -1053,15 +1053,24 @@ static int mptcp_put_int_option(struct mptcp_sock *msk, char __user *optval,
 
        if (get_user(len, optlen))
                return -EFAULT;
-
-       len = min_t(unsigned int, len, sizeof(int));
        if (len < 0)
                return -EINVAL;
 
-       if (put_user(len, optlen))
-               return -EFAULT;
-       if (copy_to_user(optval, &val, len))
-               return -EFAULT;
+       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))
+                       return -EFAULT;
+               if (copy_to_user(optval, &val, len))
+                       return -EFAULT;
+       }
 
        return 0;
 }
@@ -1082,6 +1091,19 @@ static int mptcp_getsockopt_sol_tcp(struct mptcp_sock *msk, int optname,
        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,
                                      char __user *optval, int __user *optlen)
 {
@@ -1117,6 +1139,8 @@ int mptcp_getsockopt(struct sock *sk, int level, int optname,
        if (ssk)
                return tcp_getsockopt(ssk, level, optname, optval, option);
 
+       if (level == SOL_IP)
+               return mptcp_getsockopt_v4(msk, optname, optval, option);
        if (level == SOL_TCP)
                return mptcp_getsockopt_sol_tcp(msk, optname, optval, option);
        if (level == SOL_MPTCP)