18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* ATM ioctl handling */ 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ 58c2ecf20Sopenharmony_ci/* 2003 John Levon <levon@movementarian.org> */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/module.h> 108c2ecf20Sopenharmony_ci#include <linux/kmod.h> 118c2ecf20Sopenharmony_ci#include <linux/net.h> /* struct socket, struct proto_ops */ 128c2ecf20Sopenharmony_ci#include <linux/atm.h> /* ATM stuff */ 138c2ecf20Sopenharmony_ci#include <linux/atmdev.h> 148c2ecf20Sopenharmony_ci#include <linux/atmclip.h> /* CLIP_*ENCAP */ 158c2ecf20Sopenharmony_ci#include <linux/atmarp.h> /* manifest constants */ 168c2ecf20Sopenharmony_ci#include <linux/capability.h> 178c2ecf20Sopenharmony_ci#include <linux/sonet.h> /* for ioctls */ 188c2ecf20Sopenharmony_ci#include <linux/atmsvc.h> 198c2ecf20Sopenharmony_ci#include <linux/atmmpc.h> 208c2ecf20Sopenharmony_ci#include <net/atmclip.h> 218c2ecf20Sopenharmony_ci#include <linux/atmlec.h> 228c2ecf20Sopenharmony_ci#include <linux/mutex.h> 238c2ecf20Sopenharmony_ci#include <asm/ioctls.h> 248c2ecf20Sopenharmony_ci#include <net/compat.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include "resources.h" 278c2ecf20Sopenharmony_ci#include "signaling.h" /* for WAITING and sigd_attach */ 288c2ecf20Sopenharmony_ci#include "common.h" 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic DEFINE_MUTEX(ioctl_mutex); 328c2ecf20Sopenharmony_cistatic LIST_HEAD(ioctl_list); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_civoid register_atm_ioctl(struct atm_ioctl *ioctl) 368c2ecf20Sopenharmony_ci{ 378c2ecf20Sopenharmony_ci mutex_lock(&ioctl_mutex); 388c2ecf20Sopenharmony_ci list_add_tail(&ioctl->list, &ioctl_list); 398c2ecf20Sopenharmony_ci mutex_unlock(&ioctl_mutex); 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ciEXPORT_SYMBOL(register_atm_ioctl); 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_civoid deregister_atm_ioctl(struct atm_ioctl *ioctl) 448c2ecf20Sopenharmony_ci{ 458c2ecf20Sopenharmony_ci mutex_lock(&ioctl_mutex); 468c2ecf20Sopenharmony_ci list_del(&ioctl->list); 478c2ecf20Sopenharmony_ci mutex_unlock(&ioctl_mutex); 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ciEXPORT_SYMBOL(deregister_atm_ioctl); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic int do_vcc_ioctl(struct socket *sock, unsigned int cmd, 528c2ecf20Sopenharmony_ci unsigned long arg, int compat) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci struct sock *sk = sock->sk; 558c2ecf20Sopenharmony_ci struct atm_vcc *vcc; 568c2ecf20Sopenharmony_ci int error; 578c2ecf20Sopenharmony_ci struct list_head *pos; 588c2ecf20Sopenharmony_ci void __user *argp = (void __user *)arg; 598c2ecf20Sopenharmony_ci void __user *buf; 608c2ecf20Sopenharmony_ci int __user *len; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci vcc = ATM_SD(sock); 638c2ecf20Sopenharmony_ci switch (cmd) { 648c2ecf20Sopenharmony_ci case SIOCOUTQ: 658c2ecf20Sopenharmony_ci if (sock->state != SS_CONNECTED || 668c2ecf20Sopenharmony_ci !test_bit(ATM_VF_READY, &vcc->flags)) { 678c2ecf20Sopenharmony_ci error = -EINVAL; 688c2ecf20Sopenharmony_ci goto done; 698c2ecf20Sopenharmony_ci } 708c2ecf20Sopenharmony_ci error = put_user(sk->sk_sndbuf - sk_wmem_alloc_get(sk), 718c2ecf20Sopenharmony_ci (int __user *)argp) ? -EFAULT : 0; 728c2ecf20Sopenharmony_ci goto done; 738c2ecf20Sopenharmony_ci case SIOCINQ: 748c2ecf20Sopenharmony_ci { 758c2ecf20Sopenharmony_ci struct sk_buff *skb; 768c2ecf20Sopenharmony_ci int amount; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci if (sock->state != SS_CONNECTED) { 798c2ecf20Sopenharmony_ci error = -EINVAL; 808c2ecf20Sopenharmony_ci goto done; 818c2ecf20Sopenharmony_ci } 828c2ecf20Sopenharmony_ci spin_lock_irq(&sk->sk_receive_queue.lock); 838c2ecf20Sopenharmony_ci skb = skb_peek(&sk->sk_receive_queue); 848c2ecf20Sopenharmony_ci amount = skb ? skb->len : 0; 858c2ecf20Sopenharmony_ci spin_unlock_irq(&sk->sk_receive_queue.lock); 868c2ecf20Sopenharmony_ci error = put_user(amount, (int __user *)argp) ? -EFAULT : 0; 878c2ecf20Sopenharmony_ci goto done; 888c2ecf20Sopenharmony_ci } 898c2ecf20Sopenharmony_ci case ATM_SETSC: 908c2ecf20Sopenharmony_ci net_warn_ratelimited("ATM_SETSC is obsolete; used by %s:%d\n", 918c2ecf20Sopenharmony_ci current->comm, task_pid_nr(current)); 928c2ecf20Sopenharmony_ci error = 0; 938c2ecf20Sopenharmony_ci goto done; 948c2ecf20Sopenharmony_ci case ATMSIGD_CTRL: 958c2ecf20Sopenharmony_ci if (!capable(CAP_NET_ADMIN)) { 968c2ecf20Sopenharmony_ci error = -EPERM; 978c2ecf20Sopenharmony_ci goto done; 988c2ecf20Sopenharmony_ci } 998c2ecf20Sopenharmony_ci /* 1008c2ecf20Sopenharmony_ci * The user/kernel protocol for exchanging signalling 1018c2ecf20Sopenharmony_ci * info uses kernel pointers as opaque references, 1028c2ecf20Sopenharmony_ci * so the holder of the file descriptor can scribble 1038c2ecf20Sopenharmony_ci * on the kernel... so we should make sure that we 1048c2ecf20Sopenharmony_ci * have the same privileges that /proc/kcore needs 1058c2ecf20Sopenharmony_ci */ 1068c2ecf20Sopenharmony_ci if (!capable(CAP_SYS_RAWIO)) { 1078c2ecf20Sopenharmony_ci error = -EPERM; 1088c2ecf20Sopenharmony_ci goto done; 1098c2ecf20Sopenharmony_ci } 1108c2ecf20Sopenharmony_ci#ifdef CONFIG_COMPAT 1118c2ecf20Sopenharmony_ci /* WTF? I don't even want to _think_ about making this 1128c2ecf20Sopenharmony_ci work for 32-bit userspace. TBH I don't really want 1138c2ecf20Sopenharmony_ci to think about it at all. dwmw2. */ 1148c2ecf20Sopenharmony_ci if (compat) { 1158c2ecf20Sopenharmony_ci net_warn_ratelimited("32-bit task cannot be atmsigd\n"); 1168c2ecf20Sopenharmony_ci error = -EINVAL; 1178c2ecf20Sopenharmony_ci goto done; 1188c2ecf20Sopenharmony_ci } 1198c2ecf20Sopenharmony_ci#endif 1208c2ecf20Sopenharmony_ci error = sigd_attach(vcc); 1218c2ecf20Sopenharmony_ci if (!error) 1228c2ecf20Sopenharmony_ci sock->state = SS_CONNECTED; 1238c2ecf20Sopenharmony_ci goto done; 1248c2ecf20Sopenharmony_ci case ATM_SETBACKEND: 1258c2ecf20Sopenharmony_ci case ATM_NEWBACKENDIF: 1268c2ecf20Sopenharmony_ci { 1278c2ecf20Sopenharmony_ci atm_backend_t backend; 1288c2ecf20Sopenharmony_ci error = get_user(backend, (atm_backend_t __user *)argp); 1298c2ecf20Sopenharmony_ci if (error) 1308c2ecf20Sopenharmony_ci goto done; 1318c2ecf20Sopenharmony_ci switch (backend) { 1328c2ecf20Sopenharmony_ci case ATM_BACKEND_PPP: 1338c2ecf20Sopenharmony_ci request_module("pppoatm"); 1348c2ecf20Sopenharmony_ci break; 1358c2ecf20Sopenharmony_ci case ATM_BACKEND_BR2684: 1368c2ecf20Sopenharmony_ci request_module("br2684"); 1378c2ecf20Sopenharmony_ci break; 1388c2ecf20Sopenharmony_ci } 1398c2ecf20Sopenharmony_ci break; 1408c2ecf20Sopenharmony_ci } 1418c2ecf20Sopenharmony_ci case ATMMPC_CTRL: 1428c2ecf20Sopenharmony_ci case ATMMPC_DATA: 1438c2ecf20Sopenharmony_ci request_module("mpoa"); 1448c2ecf20Sopenharmony_ci break; 1458c2ecf20Sopenharmony_ci case ATMARPD_CTRL: 1468c2ecf20Sopenharmony_ci request_module("clip"); 1478c2ecf20Sopenharmony_ci break; 1488c2ecf20Sopenharmony_ci case ATMLEC_CTRL: 1498c2ecf20Sopenharmony_ci request_module("lec"); 1508c2ecf20Sopenharmony_ci break; 1518c2ecf20Sopenharmony_ci } 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci error = -ENOIOCTLCMD; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci mutex_lock(&ioctl_mutex); 1568c2ecf20Sopenharmony_ci list_for_each(pos, &ioctl_list) { 1578c2ecf20Sopenharmony_ci struct atm_ioctl *ic = list_entry(pos, struct atm_ioctl, list); 1588c2ecf20Sopenharmony_ci if (try_module_get(ic->owner)) { 1598c2ecf20Sopenharmony_ci error = ic->ioctl(sock, cmd, arg); 1608c2ecf20Sopenharmony_ci module_put(ic->owner); 1618c2ecf20Sopenharmony_ci if (error != -ENOIOCTLCMD) 1628c2ecf20Sopenharmony_ci break; 1638c2ecf20Sopenharmony_ci } 1648c2ecf20Sopenharmony_ci } 1658c2ecf20Sopenharmony_ci mutex_unlock(&ioctl_mutex); 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci if (error != -ENOIOCTLCMD) 1688c2ecf20Sopenharmony_ci goto done; 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci if (cmd == ATM_GETNAMES) { 1718c2ecf20Sopenharmony_ci if (IS_ENABLED(CONFIG_COMPAT) && compat) { 1728c2ecf20Sopenharmony_ci#ifdef CONFIG_COMPAT 1738c2ecf20Sopenharmony_ci struct compat_atm_iobuf __user *ciobuf = argp; 1748c2ecf20Sopenharmony_ci compat_uptr_t cbuf; 1758c2ecf20Sopenharmony_ci len = &ciobuf->length; 1768c2ecf20Sopenharmony_ci if (get_user(cbuf, &ciobuf->buffer)) 1778c2ecf20Sopenharmony_ci return -EFAULT; 1788c2ecf20Sopenharmony_ci buf = compat_ptr(cbuf); 1798c2ecf20Sopenharmony_ci#endif 1808c2ecf20Sopenharmony_ci } else { 1818c2ecf20Sopenharmony_ci struct atm_iobuf __user *iobuf = argp; 1828c2ecf20Sopenharmony_ci len = &iobuf->length; 1838c2ecf20Sopenharmony_ci if (get_user(buf, &iobuf->buffer)) 1848c2ecf20Sopenharmony_ci return -EFAULT; 1858c2ecf20Sopenharmony_ci } 1868c2ecf20Sopenharmony_ci error = atm_getnames(buf, len); 1878c2ecf20Sopenharmony_ci } else { 1888c2ecf20Sopenharmony_ci int number; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci if (IS_ENABLED(CONFIG_COMPAT) && compat) { 1918c2ecf20Sopenharmony_ci#ifdef CONFIG_COMPAT 1928c2ecf20Sopenharmony_ci struct compat_atmif_sioc __user *csioc = argp; 1938c2ecf20Sopenharmony_ci compat_uptr_t carg; 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci len = &csioc->length; 1968c2ecf20Sopenharmony_ci if (get_user(carg, &csioc->arg)) 1978c2ecf20Sopenharmony_ci return -EFAULT; 1988c2ecf20Sopenharmony_ci buf = compat_ptr(carg); 1998c2ecf20Sopenharmony_ci if (get_user(number, &csioc->number)) 2008c2ecf20Sopenharmony_ci return -EFAULT; 2018c2ecf20Sopenharmony_ci#endif 2028c2ecf20Sopenharmony_ci } else { 2038c2ecf20Sopenharmony_ci struct atmif_sioc __user *sioc = argp; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci len = &sioc->length; 2068c2ecf20Sopenharmony_ci if (get_user(buf, &sioc->arg)) 2078c2ecf20Sopenharmony_ci return -EFAULT; 2088c2ecf20Sopenharmony_ci if (get_user(number, &sioc->number)) 2098c2ecf20Sopenharmony_ci return -EFAULT; 2108c2ecf20Sopenharmony_ci } 2118c2ecf20Sopenharmony_ci error = atm_dev_ioctl(cmd, buf, len, number, compat); 2128c2ecf20Sopenharmony_ci } 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cidone: 2158c2ecf20Sopenharmony_ci return error; 2168c2ecf20Sopenharmony_ci} 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ciint vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci return do_vcc_ioctl(sock, cmd, arg, 0); 2218c2ecf20Sopenharmony_ci} 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci#ifdef CONFIG_COMPAT 2248c2ecf20Sopenharmony_ci/* 2258c2ecf20Sopenharmony_ci * FIXME: 2268c2ecf20Sopenharmony_ci * The compat_ioctl handling is duplicated, using both these conversion 2278c2ecf20Sopenharmony_ci * routines and the compat argument to the actual handlers. Both 2288c2ecf20Sopenharmony_ci * versions are somewhat incomplete and should be merged, e.g. by 2298c2ecf20Sopenharmony_ci * moving the ioctl number translation into the actual handlers and 2308c2ecf20Sopenharmony_ci * killing the conversion code. 2318c2ecf20Sopenharmony_ci * 2328c2ecf20Sopenharmony_ci * -arnd, November 2009 2338c2ecf20Sopenharmony_ci */ 2348c2ecf20Sopenharmony_ci#define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct compat_atmif_sioc) 2358c2ecf20Sopenharmony_ci#define ATM_GETNAMES32 _IOW('a', ATMIOC_ITF+3, struct compat_atm_iobuf) 2368c2ecf20Sopenharmony_ci#define ATM_GETTYPE32 _IOW('a', ATMIOC_ITF+4, struct compat_atmif_sioc) 2378c2ecf20Sopenharmony_ci#define ATM_GETESI32 _IOW('a', ATMIOC_ITF+5, struct compat_atmif_sioc) 2388c2ecf20Sopenharmony_ci#define ATM_GETADDR32 _IOW('a', ATMIOC_ITF+6, struct compat_atmif_sioc) 2398c2ecf20Sopenharmony_ci#define ATM_RSTADDR32 _IOW('a', ATMIOC_ITF+7, struct compat_atmif_sioc) 2408c2ecf20Sopenharmony_ci#define ATM_ADDADDR32 _IOW('a', ATMIOC_ITF+8, struct compat_atmif_sioc) 2418c2ecf20Sopenharmony_ci#define ATM_DELADDR32 _IOW('a', ATMIOC_ITF+9, struct compat_atmif_sioc) 2428c2ecf20Sopenharmony_ci#define ATM_GETCIRANGE32 _IOW('a', ATMIOC_ITF+10, struct compat_atmif_sioc) 2438c2ecf20Sopenharmony_ci#define ATM_SETCIRANGE32 _IOW('a', ATMIOC_ITF+11, struct compat_atmif_sioc) 2448c2ecf20Sopenharmony_ci#define ATM_SETESI32 _IOW('a', ATMIOC_ITF+12, struct compat_atmif_sioc) 2458c2ecf20Sopenharmony_ci#define ATM_SETESIF32 _IOW('a', ATMIOC_ITF+13, struct compat_atmif_sioc) 2468c2ecf20Sopenharmony_ci#define ATM_GETSTAT32 _IOW('a', ATMIOC_SARCOM+0, struct compat_atmif_sioc) 2478c2ecf20Sopenharmony_ci#define ATM_GETSTATZ32 _IOW('a', ATMIOC_SARCOM+1, struct compat_atmif_sioc) 2488c2ecf20Sopenharmony_ci#define ATM_GETLOOP32 _IOW('a', ATMIOC_SARCOM+2, struct compat_atmif_sioc) 2498c2ecf20Sopenharmony_ci#define ATM_SETLOOP32 _IOW('a', ATMIOC_SARCOM+3, struct compat_atmif_sioc) 2508c2ecf20Sopenharmony_ci#define ATM_QUERYLOOP32 _IOW('a', ATMIOC_SARCOM+4, struct compat_atmif_sioc) 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_cistatic struct { 2538c2ecf20Sopenharmony_ci unsigned int cmd32; 2548c2ecf20Sopenharmony_ci unsigned int cmd; 2558c2ecf20Sopenharmony_ci} atm_ioctl_map[] = { 2568c2ecf20Sopenharmony_ci { ATM_GETLINKRATE32, ATM_GETLINKRATE }, 2578c2ecf20Sopenharmony_ci { ATM_GETNAMES32, ATM_GETNAMES }, 2588c2ecf20Sopenharmony_ci { ATM_GETTYPE32, ATM_GETTYPE }, 2598c2ecf20Sopenharmony_ci { ATM_GETESI32, ATM_GETESI }, 2608c2ecf20Sopenharmony_ci { ATM_GETADDR32, ATM_GETADDR }, 2618c2ecf20Sopenharmony_ci { ATM_RSTADDR32, ATM_RSTADDR }, 2628c2ecf20Sopenharmony_ci { ATM_ADDADDR32, ATM_ADDADDR }, 2638c2ecf20Sopenharmony_ci { ATM_DELADDR32, ATM_DELADDR }, 2648c2ecf20Sopenharmony_ci { ATM_GETCIRANGE32, ATM_GETCIRANGE }, 2658c2ecf20Sopenharmony_ci { ATM_SETCIRANGE32, ATM_SETCIRANGE }, 2668c2ecf20Sopenharmony_ci { ATM_SETESI32, ATM_SETESI }, 2678c2ecf20Sopenharmony_ci { ATM_SETESIF32, ATM_SETESIF }, 2688c2ecf20Sopenharmony_ci { ATM_GETSTAT32, ATM_GETSTAT }, 2698c2ecf20Sopenharmony_ci { ATM_GETSTATZ32, ATM_GETSTATZ }, 2708c2ecf20Sopenharmony_ci { ATM_GETLOOP32, ATM_GETLOOP }, 2718c2ecf20Sopenharmony_ci { ATM_SETLOOP32, ATM_SETLOOP }, 2728c2ecf20Sopenharmony_ci { ATM_QUERYLOOP32, ATM_QUERYLOOP }, 2738c2ecf20Sopenharmony_ci}; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci#define NR_ATM_IOCTL ARRAY_SIZE(atm_ioctl_map) 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_cistatic int do_atm_iobuf(struct socket *sock, unsigned int cmd, 2788c2ecf20Sopenharmony_ci unsigned long arg) 2798c2ecf20Sopenharmony_ci{ 2808c2ecf20Sopenharmony_ci struct compat_atm_iobuf __user *iobuf32 = compat_ptr(arg); 2818c2ecf20Sopenharmony_ci u32 data; 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci if (get_user(data, &iobuf32->buffer)) 2848c2ecf20Sopenharmony_ci return -EFAULT; 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci return atm_getnames(&iobuf32->length, compat_ptr(data)); 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_cistatic int do_atmif_sioc(struct socket *sock, unsigned int cmd, 2908c2ecf20Sopenharmony_ci unsigned long arg) 2918c2ecf20Sopenharmony_ci{ 2928c2ecf20Sopenharmony_ci struct compat_atmif_sioc __user *sioc32 = compat_ptr(arg); 2938c2ecf20Sopenharmony_ci int number; 2948c2ecf20Sopenharmony_ci u32 data; 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci if (get_user(data, &sioc32->arg) || get_user(number, &sioc32->number)) 2978c2ecf20Sopenharmony_ci return -EFAULT; 2988c2ecf20Sopenharmony_ci return atm_dev_ioctl(cmd, compat_ptr(data), &sioc32->length, number, 0); 2998c2ecf20Sopenharmony_ci} 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_cistatic int do_atm_ioctl(struct socket *sock, unsigned int cmd32, 3028c2ecf20Sopenharmony_ci unsigned long arg) 3038c2ecf20Sopenharmony_ci{ 3048c2ecf20Sopenharmony_ci int i; 3058c2ecf20Sopenharmony_ci unsigned int cmd = 0; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci switch (cmd32) { 3088c2ecf20Sopenharmony_ci case SONET_GETSTAT: 3098c2ecf20Sopenharmony_ci case SONET_GETSTATZ: 3108c2ecf20Sopenharmony_ci case SONET_GETDIAG: 3118c2ecf20Sopenharmony_ci case SONET_SETDIAG: 3128c2ecf20Sopenharmony_ci case SONET_CLRDIAG: 3138c2ecf20Sopenharmony_ci case SONET_SETFRAMING: 3148c2ecf20Sopenharmony_ci case SONET_GETFRAMING: 3158c2ecf20Sopenharmony_ci case SONET_GETFRSENSE: 3168c2ecf20Sopenharmony_ci return do_atmif_sioc(sock, cmd32, arg); 3178c2ecf20Sopenharmony_ci } 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci for (i = 0; i < NR_ATM_IOCTL; i++) { 3208c2ecf20Sopenharmony_ci if (cmd32 == atm_ioctl_map[i].cmd32) { 3218c2ecf20Sopenharmony_ci cmd = atm_ioctl_map[i].cmd; 3228c2ecf20Sopenharmony_ci break; 3238c2ecf20Sopenharmony_ci } 3248c2ecf20Sopenharmony_ci } 3258c2ecf20Sopenharmony_ci if (i == NR_ATM_IOCTL) 3268c2ecf20Sopenharmony_ci return -EINVAL; 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci switch (cmd) { 3298c2ecf20Sopenharmony_ci case ATM_GETNAMES: 3308c2ecf20Sopenharmony_ci return do_atm_iobuf(sock, cmd, arg); 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci case ATM_GETLINKRATE: 3338c2ecf20Sopenharmony_ci case ATM_GETTYPE: 3348c2ecf20Sopenharmony_ci case ATM_GETESI: 3358c2ecf20Sopenharmony_ci case ATM_GETADDR: 3368c2ecf20Sopenharmony_ci case ATM_RSTADDR: 3378c2ecf20Sopenharmony_ci case ATM_ADDADDR: 3388c2ecf20Sopenharmony_ci case ATM_DELADDR: 3398c2ecf20Sopenharmony_ci case ATM_GETCIRANGE: 3408c2ecf20Sopenharmony_ci case ATM_SETCIRANGE: 3418c2ecf20Sopenharmony_ci case ATM_SETESI: 3428c2ecf20Sopenharmony_ci case ATM_SETESIF: 3438c2ecf20Sopenharmony_ci case ATM_GETSTAT: 3448c2ecf20Sopenharmony_ci case ATM_GETSTATZ: 3458c2ecf20Sopenharmony_ci case ATM_GETLOOP: 3468c2ecf20Sopenharmony_ci case ATM_SETLOOP: 3478c2ecf20Sopenharmony_ci case ATM_QUERYLOOP: 3488c2ecf20Sopenharmony_ci return do_atmif_sioc(sock, cmd, arg); 3498c2ecf20Sopenharmony_ci } 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_ci return -EINVAL; 3528c2ecf20Sopenharmony_ci} 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ciint vcc_compat_ioctl(struct socket *sock, unsigned int cmd, 3558c2ecf20Sopenharmony_ci unsigned long arg) 3568c2ecf20Sopenharmony_ci{ 3578c2ecf20Sopenharmony_ci int ret; 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci ret = do_vcc_ioctl(sock, cmd, arg, 1); 3608c2ecf20Sopenharmony_ci if (ret != -ENOIOCTLCMD) 3618c2ecf20Sopenharmony_ci return ret; 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci return do_atm_ioctl(sock, cmd, arg); 3648c2ecf20Sopenharmony_ci} 3658c2ecf20Sopenharmony_ci#endif 366