6 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
8 #include <linux/module.h>
10 #include <linux/net.h>
11 #include <linux/atm.h>
12 #include <linux/atmdev.h>
15 #include <linux/capability.h>
16 #include <linux/sonet.h>
22 #include <asm/ioctls.h>
50 static int do_vcc_ioctl(
struct socket *
sock,
unsigned int cmd,
51 unsigned long arg,
int compat)
53 struct sock *
sk = sock->
sk;
68 (
int __user *)argp) ? -
EFAULT : 0;
80 (
int __user *)argp) ? -
EFAULT : 0;
143 request_module(
"pppoatm");
146 request_module(
"br2684");
153 request_module(
"mpoa");
156 request_module(
"clip");
159 request_module(
"lec");
168 if (try_module_get(ic->
owner)) {
169 error = ic->
ioctl(sock, cmd, arg);
170 module_put(ic->
owner);
188 return do_vcc_ioctl(sock, cmd, arg, 0);
202 #define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct compat_atmif_sioc)
203 #define ATM_GETNAMES32 _IOW('a', ATMIOC_ITF+3, struct compat_atm_iobuf)
204 #define ATM_GETTYPE32 _IOW('a', ATMIOC_ITF+4, struct compat_atmif_sioc)
205 #define ATM_GETESI32 _IOW('a', ATMIOC_ITF+5, struct compat_atmif_sioc)
206 #define ATM_GETADDR32 _IOW('a', ATMIOC_ITF+6, struct compat_atmif_sioc)
207 #define ATM_RSTADDR32 _IOW('a', ATMIOC_ITF+7, struct compat_atmif_sioc)
208 #define ATM_ADDADDR32 _IOW('a', ATMIOC_ITF+8, struct compat_atmif_sioc)
209 #define ATM_DELADDR32 _IOW('a', ATMIOC_ITF+9, struct compat_atmif_sioc)
210 #define ATM_GETCIRANGE32 _IOW('a', ATMIOC_ITF+10, struct compat_atmif_sioc)
211 #define ATM_SETCIRANGE32 _IOW('a', ATMIOC_ITF+11, struct compat_atmif_sioc)
212 #define ATM_SETESI32 _IOW('a', ATMIOC_ITF+12, struct compat_atmif_sioc)
213 #define ATM_SETESIF32 _IOW('a', ATMIOC_ITF+13, struct compat_atmif_sioc)
214 #define ATM_GETSTAT32 _IOW('a', ATMIOC_SARCOM+0, struct compat_atmif_sioc)
215 #define ATM_GETSTATZ32 _IOW('a', ATMIOC_SARCOM+1, struct compat_atmif_sioc)
216 #define ATM_GETLOOP32 _IOW('a', ATMIOC_SARCOM+2, struct compat_atmif_sioc)
217 #define ATM_SETLOOP32 _IOW('a', ATMIOC_SARCOM+3, struct compat_atmif_sioc)
218 #define ATM_QUERYLOOP32 _IOW('a', ATMIOC_SARCOM+4, struct compat_atmif_sioc)
223 } atm_ioctl_map[] = {
243 #define NR_ATM_IOCTL ARRAY_SIZE(atm_ioctl_map)
245 static int do_atm_iobuf(
struct socket *sock,
unsigned int cmd,
249 struct compat_atm_iobuf
__user *iobuf32;
255 iobuf32 = compat_ptr(arg);
257 if (
get_user(len, &iobuf32->length) ||
260 datap = compat_ptr(data);
265 err = do_vcc_ioctl(sock, cmd, (
unsigned long) iobuf, 0);
276 static int do_atmif_sioc(
struct socket *sock,
unsigned int cmd,
280 struct compat_atmif_sioc
__user *sioc32;
286 sioc32 = compat_ptr(arg);
291 datap = compat_ptr(data);
295 err = do_vcc_ioctl(sock, cmd, (
unsigned long) sioc, 0);
305 static int do_atm_ioctl(
struct socket *sock,
unsigned int cmd32,
309 unsigned int cmd = 0;
320 return do_atmif_sioc(sock, cmd32, arg);
323 for (i = 0; i < NR_ATM_IOCTL; i++) {
324 if (cmd32 == atm_ioctl_map[i].cmd32) {
325 cmd = atm_ioctl_map[
i].cmd;
329 if (i == NR_ATM_IOCTL)
334 return do_atm_iobuf(sock, cmd, arg);
352 return do_atmif_sioc(sock, cmd, arg);
363 ret = do_vcc_ioctl(sock, cmd, arg, 1);
367 return do_atm_ioctl(sock, cmd, arg);