Skip to content

Commit

Permalink
l2tp: handle PPPIOC[GS]MRU and PPPIOC[GS]FLAGS in pppol2tp_ioctl()
Browse files Browse the repository at this point in the history
Let pppol2tp_ioctl() handle ioctl commands directly. It still relies on
pppol2tp_{session,tunnel}_ioctl() for PPPIOCGL2TPSTATS.

Signed-off-by: Guillaume Nault <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Guillaume Nault authored and davem330 committed Aug 11, 2018
1 parent bdd0292 commit 79e6760
Showing 1 changed file with 44 additions and 29 deletions.
73 changes: 44 additions & 29 deletions net/l2tp/l2tp_ppp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1045,7 +1045,6 @@ static int pppol2tp_session_ioctl(struct l2tp_session *session,
{
int err = 0;
struct sock *sk;
int val = (int) arg;
struct l2tp_tunnel *tunnel = session->tunnel;
struct pppol2tp_ioc_stats stats;

Expand All @@ -1058,22 +1057,6 @@ static int pppol2tp_session_ioctl(struct l2tp_session *session,
return -EBADR;

switch (cmd) {
case PPPIOCGMRU:
case PPPIOCGFLAGS:
err = -EFAULT;
if (put_user(0, (int __user *)arg))
break;
err = 0;
break;

case PPPIOCSMRU:
case PPPIOCSFLAGS:
err = -EFAULT;
if (get_user(val, (int __user *)arg))
break;
err = 0;
break;

case PPPIOCGL2TPSTATS:
err = -ENXIO;
if (!(sk->sk_state & PPPOX_CONNECTED))
Expand Down Expand Up @@ -1180,23 +1163,55 @@ static int pppol2tp_ioctl(struct socket *sock, unsigned int cmd,
unsigned long arg)
{
struct l2tp_session *session;
struct l2tp_tunnel *tunnel;
int val;

switch (cmd) {
case PPPIOCGMRU:
case PPPIOCGFLAGS:
session = sock->sk->sk_user_data;
if (!session)
return -ENOTCONN;

session = sock->sk->sk_user_data;
if (!session)
return -ENOTCONN;
/* Not defined for tunnels */
if (!session->session_id && !session->peer_session_id)
return -ENOSYS;

/* Special case: if session's session_id is zero, treat ioctl as a
* tunnel ioctl
*/
if ((session->session_id == 0) &&
(session->peer_session_id == 0)) {
tunnel = session->tunnel;
if (put_user(0, (int __user *)arg))
return -EFAULT;
break;

case PPPIOCSMRU:
case PPPIOCSFLAGS:
session = sock->sk->sk_user_data;
if (!session)
return -ENOTCONN;

return pppol2tp_tunnel_ioctl(tunnel, cmd, arg);
/* Not defined for tunnels */
if (!session->session_id && !session->peer_session_id)
return -ENOSYS;

if (get_user(val, (int __user *)arg))
return -EFAULT;
break;

case PPPIOCGL2TPSTATS:
session = sock->sk->sk_user_data;
if (!session)
return -ENOTCONN;

/* Session 0 represents the parent tunnel */
if (!session->session_id && !session->peer_session_id)
return pppol2tp_tunnel_ioctl(session->tunnel, cmd,
arg);
else
return pppol2tp_session_ioctl(session, cmd, arg);
break;

default:
return -ENOSYS;
}

return pppol2tp_session_ioctl(session, cmd, arg);
return 0;
}

/*****************************************************************************
Expand Down

0 comments on commit 79e6760

Please sign in to comment.