Flags field will be used in further commits (e.g. for keeping
SC_COMP_PROT), so let's bring those back. This commit effectively
reverts commit 1998b5ed9c9b ("l2tp: drop ->flags from struct
pppol2tp_session"), with some cosmetic changes.

Signed-off-by: Sam Protsenko <semen.protse...@linaro.org>
---
 net/l2tp/l2tp_ppp.c | 52 +++++++++++++++++++++++++++++----------------
 1 file changed, 34 insertions(+), 18 deletions(-)

diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index c03c6461f236..145435977b21 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -125,6 +125,7 @@ struct pppol2tp_session {
                                                 * PPPoX socket */
        struct sock             *__sk;          /* Copy of .sk, for cleanup */
        struct rcu_head         rcu;            /* For asynchronous release */
+       int                     flags;          /* accessed by PPPIOCGFLAGS */
 };
 
 static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb);
@@ -1074,44 +1075,60 @@ static int pppol2tp_ioctl(struct socket *sock, unsigned 
int cmd,
 {
        struct pppol2tp_ioc_stats stats;
        struct l2tp_session *session;
+       struct pppol2tp_session *ps;
        int val;
+       bool is_tunnel;
+
+       session = sock->sk->sk_user_data;
+       if (!session)
+               return -ENOTCONN;
+
+       ps = l2tp_session_priv(session);
+       is_tunnel = !session->session_id && !session->peer_session_id;
 
        switch (cmd) {
        case PPPIOCGMRU:
-       case PPPIOCGFLAGS:
-               session = sock->sk->sk_user_data;
-               if (!session)
-                       return -ENOTCONN;
-
                /* Not defined for tunnels */
-               if (!session->session_id && !session->peer_session_id)
+               if (is_tunnel)
                        return -ENOSYS;
 
                if (put_user(0, (int __user *)arg))
                        return -EFAULT;
                break;
+       case PPPIOCGFLAGS:
+               /* Not defined for tunnels */
+               if (is_tunnel)
+                       return -ENOSYS;
 
-       case PPPIOCSMRU:
-       case PPPIOCSFLAGS:
-               session = sock->sk->sk_user_data;
-               if (!session)
-                       return -ENOTCONN;
+               if (put_user(ps->flags, (int __user *)arg))
+                       return -EFAULT;
 
+               l2tp_info(session, L2TP_MSG_CONTROL, "%s: get flags=%d\n",
+                         session->name, ps->flags);
+               break;
+       case PPPIOCSMRU:
                /* Not defined for tunnels */
-               if (!session->session_id && !session->peer_session_id)
+               if (is_tunnel)
                        return -ENOSYS;
 
                if (get_user(val, (int __user *)arg))
                        return -EFAULT;
                break;
+       case PPPIOCSFLAGS:
+               /* Not defined for tunnels */
+               if (is_tunnel)
+                       return -ENOSYS;
 
-       case PPPIOCGL2TPSTATS:
-               session = sock->sk->sk_user_data;
-               if (!session)
-                       return -ENOTCONN;
+               if (get_user(val, (int __user *)arg))
+                       return -EFAULT;
 
+               ps->flags = val;
+               l2tp_info(session, L2TP_MSG_CONTROL, "%s: set flags=%d\n",
+                         session->name, ps->flags);
+               break;
+       case PPPIOCGL2TPSTATS:
                /* Session 0 represents the parent tunnel */
-               if (!session->session_id && !session->peer_session_id) {
+               if (is_tunnel) {
                        u32 session_id;
                        int err;
 
@@ -1136,7 +1153,6 @@ static int pppol2tp_ioctl(struct socket *sock, unsigned 
int cmd,
                if (copy_to_user((void __user *)arg, &stats, sizeof(stats)))
                        return -EFAULT;
                break;
-
        default:
                return -ENOIOCTLCMD;
        }
-- 
2.19.1

Reply via email to