Commit a45e8399 authored by Chas Williams's avatar Chas Williams Committed by David S. Miller

[ATM]: [ioctl][8/8] Use new code for atmtcp (from levon@movementarian.org)

parent ee45a5d2
......@@ -431,32 +431,52 @@ int atmtcp_remove_persistent(int itf)
return 0;
}
static int atmtcp_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{
int err = 0;
struct atm_vcc *vcc = ATM_SD(sock);
if (cmd != SIOCSIFATMTCP && cmd != ATMTCP_CREATE && cmd != ATMTCP_REMOVE)
return -ENOIOCTLCMD;
if (!capable(CAP_NET_ADMIN))
return -EPERM;
switch (cmd) {
case SIOCSIFATMTCP:
err = atmtcp_attach(vcc, (int) arg);
if (err >= 0) {
sock->state = SS_CONNECTED;
__module_get(THIS_MODULE);
}
break;
case ATMTCP_CREATE:
err = atmtcp_create_persistent((int) arg);
break;
case ATMTCP_REMOVE:
err = atmtcp_remove_persistent((int) arg);
break;
}
return err;
}
#ifdef MODULE
static struct atm_ioctl atmtcp_ioctl_ops = {
.owner = THIS_MODULE,
.ioctl = atmtcp_ioctl,
};
int init_module(void)
static __init int atmtcp_init(void)
{
atm_tcp_ops.attach = atmtcp_attach;
atm_tcp_ops.create_persistent = atmtcp_create_persistent;
atm_tcp_ops.remove_persistent = atmtcp_remove_persistent;
register_atm_ioctl(&atmtcp_ioctl_ops);
return 0;
}
void cleanup_module(void)
static void __exit atmtcp_exit(void)
{
atm_tcp_ops.attach = NULL;
atm_tcp_ops.create_persistent = NULL;
atm_tcp_ops.remove_persistent = NULL;
deregister_atm_ioctl(&atmtcp_ioctl_ops);
}
MODULE_LICENSE("GPL");
#else
struct atm_tcp_ops atm_tcp_ops = {
atmtcp_attach, /* attach */
atmtcp_create_persistent, /* create_persistent */
atmtcp_remove_persistent /* remove_persistent */
};
#endif
module_init(atmtcp_init);
module_exit(atmtcp_exit);
......@@ -53,14 +53,6 @@ EXPORT_SYMBOL(atm_lane_ops_set);
#endif
#endif
#if defined(CONFIG_ATM_TCP) || defined(CONFIG_ATM_TCP_MODULE)
#include <linux/atm_tcp.h>
#ifdef CONFIG_ATM_TCP_MODULE
struct atm_tcp_ops atm_tcp_ops;
EXPORT_SYMBOL(atm_tcp_ops);
#endif
#endif
static DECLARE_MUTEX(ioctl_mutex);
static LIST_HEAD(ioctl_list);
......@@ -185,49 +177,6 @@ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
} else
error = -ENOSYS;
goto done;
#endif
#if defined(CONFIG_ATM_TCP) || defined(CONFIG_ATM_TCP_MODULE)
case SIOCSIFATMTCP:
if (!capable(CAP_NET_ADMIN)) {
error = -EPERM;
goto done;
}
if (!atm_tcp_ops.attach) {
error = -ENOPKG;
goto done;
}
fops_get(&atm_tcp_ops);
error = atm_tcp_ops.attach(vcc, (int) arg);
if (error >= 0)
sock->state = SS_CONNECTED;
else
fops_put (&atm_tcp_ops);
goto done;
case ATMTCP_CREATE:
if (!capable(CAP_NET_ADMIN)) {
error = -EPERM;
goto done;
}
if (!atm_tcp_ops.create_persistent) {
error = -ENOPKG;
goto done;
}
error = atm_tcp_ops.create_persistent((int) arg);
if (error < 0)
fops_put (&atm_tcp_ops);
goto done;
case ATMTCP_REMOVE:
if (!capable(CAP_NET_ADMIN)) {
error = -EPERM;
goto done;
}
if (!atm_tcp_ops.remove_persistent) {
error = -ENOPKG;
goto done;
}
error = atm_tcp_ops.remove_persistent((int) arg);
fops_put(&atm_tcp_ops);
goto done;
#endif
default:
break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment