1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* ATM ioctl handling */ 2 /* ATM ioctl handling */ 3 3 4 /* Written 1995-2000 by Werner Almesberger, EP 4 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */ 5 /* 2003 John Levon <levon@movementarian.org> 5 /* 2003 John Levon <levon@movementarian.org> */ 6 6 7 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt 7 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ 8 8 9 #include <linux/module.h> 9 #include <linux/module.h> 10 #include <linux/kmod.h> 10 #include <linux/kmod.h> 11 #include <linux/net.h> /* struct sock 11 #include <linux/net.h> /* struct socket, struct proto_ops */ 12 #include <linux/atm.h> /* ATM stuff * 12 #include <linux/atm.h> /* ATM stuff */ 13 #include <linux/atmdev.h> 13 #include <linux/atmdev.h> 14 #include <linux/atmclip.h> /* CLIP_*ENCAP 14 #include <linux/atmclip.h> /* CLIP_*ENCAP */ 15 #include <linux/atmarp.h> /* manifest co 15 #include <linux/atmarp.h> /* manifest constants */ 16 #include <linux/capability.h> 16 #include <linux/capability.h> 17 #include <linux/sonet.h> /* for ioctls 17 #include <linux/sonet.h> /* for ioctls */ 18 #include <linux/atmsvc.h> 18 #include <linux/atmsvc.h> 19 #include <linux/atmmpc.h> 19 #include <linux/atmmpc.h> 20 #include <net/atmclip.h> 20 #include <net/atmclip.h> 21 #include <linux/atmlec.h> 21 #include <linux/atmlec.h> 22 #include <linux/mutex.h> 22 #include <linux/mutex.h> 23 #include <asm/ioctls.h> 23 #include <asm/ioctls.h> 24 #include <net/compat.h> 24 #include <net/compat.h> 25 25 26 #include "resources.h" 26 #include "resources.h" 27 #include "signaling.h" /* for WAITING 27 #include "signaling.h" /* for WAITING and sigd_attach */ 28 #include "common.h" 28 #include "common.h" 29 29 30 30 31 static DEFINE_MUTEX(ioctl_mutex); 31 static DEFINE_MUTEX(ioctl_mutex); 32 static LIST_HEAD(ioctl_list); 32 static LIST_HEAD(ioctl_list); 33 33 34 34 35 void register_atm_ioctl(struct atm_ioctl *ioct 35 void register_atm_ioctl(struct atm_ioctl *ioctl) 36 { 36 { 37 mutex_lock(&ioctl_mutex); 37 mutex_lock(&ioctl_mutex); 38 list_add_tail(&ioctl->list, &ioctl_lis 38 list_add_tail(&ioctl->list, &ioctl_list); 39 mutex_unlock(&ioctl_mutex); 39 mutex_unlock(&ioctl_mutex); 40 } 40 } 41 EXPORT_SYMBOL(register_atm_ioctl); 41 EXPORT_SYMBOL(register_atm_ioctl); 42 42 43 void deregister_atm_ioctl(struct atm_ioctl *io 43 void deregister_atm_ioctl(struct atm_ioctl *ioctl) 44 { 44 { 45 mutex_lock(&ioctl_mutex); 45 mutex_lock(&ioctl_mutex); 46 list_del(&ioctl->list); 46 list_del(&ioctl->list); 47 mutex_unlock(&ioctl_mutex); 47 mutex_unlock(&ioctl_mutex); 48 } 48 } 49 EXPORT_SYMBOL(deregister_atm_ioctl); 49 EXPORT_SYMBOL(deregister_atm_ioctl); 50 50 51 static int do_vcc_ioctl(struct socket *sock, u 51 static int do_vcc_ioctl(struct socket *sock, unsigned int cmd, 52 unsigned long arg, int 52 unsigned long arg, int compat) 53 { 53 { 54 struct sock *sk = sock->sk; 54 struct sock *sk = sock->sk; 55 struct atm_vcc *vcc; 55 struct atm_vcc *vcc; 56 int error; 56 int error; 57 struct list_head *pos; 57 struct list_head *pos; 58 void __user *argp = (void __user *)arg 58 void __user *argp = (void __user *)arg; 59 void __user *buf; 59 void __user *buf; 60 int __user *len; 60 int __user *len; 61 61 62 vcc = ATM_SD(sock); 62 vcc = ATM_SD(sock); 63 switch (cmd) { 63 switch (cmd) { 64 case SIOCOUTQ: 64 case SIOCOUTQ: 65 if (sock->state != SS_CONNECTE 65 if (sock->state != SS_CONNECTED || 66 !test_bit(ATM_VF_READY, &v 66 !test_bit(ATM_VF_READY, &vcc->flags)) { 67 error = -EINVAL; 67 error = -EINVAL; 68 goto done; 68 goto done; 69 } 69 } 70 error = put_user(sk->sk_sndbuf 70 error = put_user(sk->sk_sndbuf - sk_wmem_alloc_get(sk), 71 (int __user * !! 71 (int __user *)argp) ? -EFAULT : 0; 72 goto done; 72 goto done; 73 case SIOCINQ: 73 case SIOCINQ: 74 { 74 { 75 struct sk_buff *skb; 75 struct sk_buff *skb; 76 int amount; << 77 76 78 if (sock->state != SS_CONNECTE 77 if (sock->state != SS_CONNECTED) { 79 error = -EINVAL; 78 error = -EINVAL; 80 goto done; 79 goto done; 81 } 80 } 82 spin_lock_irq(&sk->sk_receive_ << 83 skb = skb_peek(&sk->sk_receive 81 skb = skb_peek(&sk->sk_receive_queue); 84 amount = skb ? skb->len : 0; !! 82 error = put_user(skb ? skb->len : 0, 85 spin_unlock_irq(&sk->sk_receiv !! 83 (int __user *)argp) ? -EFAULT : 0; 86 error = put_user(amount, (int << 87 goto done; 84 goto done; 88 } 85 } 89 case ATM_SETSC: 86 case ATM_SETSC: 90 net_warn_ratelimited("ATM_SETS 87 net_warn_ratelimited("ATM_SETSC is obsolete; used by %s:%d\n", 91 current-> 88 current->comm, task_pid_nr(current)); 92 error = 0; 89 error = 0; 93 goto done; 90 goto done; 94 case ATMSIGD_CTRL: 91 case ATMSIGD_CTRL: 95 if (!capable(CAP_NET_ADMIN)) { 92 if (!capable(CAP_NET_ADMIN)) { 96 error = -EPERM; 93 error = -EPERM; 97 goto done; 94 goto done; 98 } 95 } 99 /* 96 /* 100 * The user/kernel protocol fo 97 * The user/kernel protocol for exchanging signalling 101 * info uses kernel pointers a 98 * info uses kernel pointers as opaque references, 102 * so the holder of the file d 99 * so the holder of the file descriptor can scribble 103 * on the kernel... so we shou 100 * on the kernel... so we should make sure that we 104 * have the same privileges th 101 * have the same privileges that /proc/kcore needs 105 */ 102 */ 106 if (!capable(CAP_SYS_RAWIO)) { 103 if (!capable(CAP_SYS_RAWIO)) { 107 error = -EPERM; 104 error = -EPERM; 108 goto done; 105 goto done; 109 } 106 } 110 #ifdef CONFIG_COMPAT 107 #ifdef CONFIG_COMPAT 111 /* WTF? I don't even want to _ 108 /* WTF? I don't even want to _think_ about making this 112 work for 32-bit userspace. 109 work for 32-bit userspace. TBH I don't really want 113 to think about it at all. d 110 to think about it at all. dwmw2. */ 114 if (compat) { 111 if (compat) { 115 net_warn_ratelimited(" 112 net_warn_ratelimited("32-bit task cannot be atmsigd\n"); 116 error = -EINVAL; 113 error = -EINVAL; 117 goto done; 114 goto done; 118 } 115 } 119 #endif 116 #endif 120 error = sigd_attach(vcc); 117 error = sigd_attach(vcc); 121 if (!error) 118 if (!error) 122 sock->state = SS_CONNE 119 sock->state = SS_CONNECTED; 123 goto done; 120 goto done; 124 case ATM_SETBACKEND: 121 case ATM_SETBACKEND: 125 case ATM_NEWBACKENDIF: 122 case ATM_NEWBACKENDIF: 126 { 123 { 127 atm_backend_t backend; 124 atm_backend_t backend; 128 error = get_user(backend, (atm 125 error = get_user(backend, (atm_backend_t __user *)argp); 129 if (error) 126 if (error) 130 goto done; 127 goto done; 131 switch (backend) { 128 switch (backend) { 132 case ATM_BACKEND_PPP: 129 case ATM_BACKEND_PPP: 133 request_module("pppoat 130 request_module("pppoatm"); 134 break; 131 break; 135 case ATM_BACKEND_BR2684: 132 case ATM_BACKEND_BR2684: 136 request_module("br2684 133 request_module("br2684"); 137 break; 134 break; 138 } 135 } 139 break; 136 break; 140 } 137 } 141 case ATMMPC_CTRL: 138 case ATMMPC_CTRL: 142 case ATMMPC_DATA: 139 case ATMMPC_DATA: 143 request_module("mpoa"); 140 request_module("mpoa"); 144 break; 141 break; 145 case ATMARPD_CTRL: 142 case ATMARPD_CTRL: 146 request_module("clip"); 143 request_module("clip"); 147 break; 144 break; 148 case ATMLEC_CTRL: 145 case ATMLEC_CTRL: 149 request_module("lec"); 146 request_module("lec"); 150 break; 147 break; 151 } 148 } 152 149 153 error = -ENOIOCTLCMD; 150 error = -ENOIOCTLCMD; 154 151 155 mutex_lock(&ioctl_mutex); 152 mutex_lock(&ioctl_mutex); 156 list_for_each(pos, &ioctl_list) { 153 list_for_each(pos, &ioctl_list) { 157 struct atm_ioctl *ic = list_en 154 struct atm_ioctl *ic = list_entry(pos, struct atm_ioctl, list); 158 if (try_module_get(ic->owner)) 155 if (try_module_get(ic->owner)) { 159 error = ic->ioctl(sock 156 error = ic->ioctl(sock, cmd, arg); 160 module_put(ic->owner); 157 module_put(ic->owner); 161 if (error != -ENOIOCTL 158 if (error != -ENOIOCTLCMD) 162 break; 159 break; 163 } 160 } 164 } 161 } 165 mutex_unlock(&ioctl_mutex); 162 mutex_unlock(&ioctl_mutex); 166 163 167 if (error != -ENOIOCTLCMD) 164 if (error != -ENOIOCTLCMD) 168 goto done; 165 goto done; 169 166 170 if (cmd == ATM_GETNAMES) { 167 if (cmd == ATM_GETNAMES) { 171 if (IS_ENABLED(CONFIG_COMPAT) 168 if (IS_ENABLED(CONFIG_COMPAT) && compat) { 172 #ifdef CONFIG_COMPAT 169 #ifdef CONFIG_COMPAT 173 struct compat_atm_iobu 170 struct compat_atm_iobuf __user *ciobuf = argp; 174 compat_uptr_t cbuf; 171 compat_uptr_t cbuf; 175 len = &ciobuf->length; 172 len = &ciobuf->length; 176 if (get_user(cbuf, &ci 173 if (get_user(cbuf, &ciobuf->buffer)) 177 return -EFAULT 174 return -EFAULT; 178 buf = compat_ptr(cbuf) 175 buf = compat_ptr(cbuf); 179 #endif 176 #endif 180 } else { 177 } else { 181 struct atm_iobuf __use 178 struct atm_iobuf __user *iobuf = argp; 182 len = &iobuf->length; 179 len = &iobuf->length; 183 if (get_user(buf, &iob 180 if (get_user(buf, &iobuf->buffer)) 184 return -EFAULT 181 return -EFAULT; 185 } 182 } 186 error = atm_getnames(buf, len) 183 error = atm_getnames(buf, len); 187 } else { 184 } else { 188 int number; 185 int number; 189 186 190 if (IS_ENABLED(CONFIG_COMPAT) 187 if (IS_ENABLED(CONFIG_COMPAT) && compat) { 191 #ifdef CONFIG_COMPAT 188 #ifdef CONFIG_COMPAT 192 struct compat_atmif_si 189 struct compat_atmif_sioc __user *csioc = argp; 193 compat_uptr_t carg; 190 compat_uptr_t carg; 194 191 195 len = &csioc->length; 192 len = &csioc->length; 196 if (get_user(carg, &cs 193 if (get_user(carg, &csioc->arg)) 197 return -EFAULT 194 return -EFAULT; 198 buf = compat_ptr(carg) 195 buf = compat_ptr(carg); 199 if (get_user(number, & 196 if (get_user(number, &csioc->number)) 200 return -EFAULT 197 return -EFAULT; 201 #endif 198 #endif 202 } else { 199 } else { 203 struct atmif_sioc __us 200 struct atmif_sioc __user *sioc = argp; 204 201 205 len = &sioc->length; 202 len = &sioc->length; 206 if (get_user(buf, &sio 203 if (get_user(buf, &sioc->arg)) 207 return -EFAULT 204 return -EFAULT; 208 if (get_user(number, & 205 if (get_user(number, &sioc->number)) 209 return -EFAULT 206 return -EFAULT; 210 } 207 } 211 error = atm_dev_ioctl(cmd, buf 208 error = atm_dev_ioctl(cmd, buf, len, number, compat); 212 } 209 } 213 210 214 done: 211 done: 215 return error; 212 return error; 216 } 213 } 217 214 218 int vcc_ioctl(struct socket *sock, unsigned in 215 int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 219 { 216 { 220 return do_vcc_ioctl(sock, cmd, arg, 0) 217 return do_vcc_ioctl(sock, cmd, arg, 0); 221 } 218 } 222 219 223 #ifdef CONFIG_COMPAT 220 #ifdef CONFIG_COMPAT 224 /* 221 /* 225 * FIXME: 222 * FIXME: 226 * The compat_ioctl handling is duplicated, us 223 * The compat_ioctl handling is duplicated, using both these conversion 227 * routines and the compat argument to the act 224 * routines and the compat argument to the actual handlers. Both 228 * versions are somewhat incomplete and should 225 * versions are somewhat incomplete and should be merged, e.g. by 229 * moving the ioctl number translation into th 226 * moving the ioctl number translation into the actual handlers and 230 * killing the conversion code. 227 * killing the conversion code. 231 * 228 * 232 * -arnd, November 2009 229 * -arnd, November 2009 233 */ 230 */ 234 #define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF 231 #define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct compat_atmif_sioc) 235 #define ATM_GETNAMES32 _IOW('a', ATMIOC_ITF 232 #define ATM_GETNAMES32 _IOW('a', ATMIOC_ITF+3, struct compat_atm_iobuf) 236 #define ATM_GETTYPE32 _IOW('a', ATMIOC_ITF 233 #define ATM_GETTYPE32 _IOW('a', ATMIOC_ITF+4, struct compat_atmif_sioc) 237 #define ATM_GETESI32 _IOW('a', ATMIOC_ITF 234 #define ATM_GETESI32 _IOW('a', ATMIOC_ITF+5, struct compat_atmif_sioc) 238 #define ATM_GETADDR32 _IOW('a', ATMIOC_ITF 235 #define ATM_GETADDR32 _IOW('a', ATMIOC_ITF+6, struct compat_atmif_sioc) 239 #define ATM_RSTADDR32 _IOW('a', ATMIOC_ITF 236 #define ATM_RSTADDR32 _IOW('a', ATMIOC_ITF+7, struct compat_atmif_sioc) 240 #define ATM_ADDADDR32 _IOW('a', ATMIOC_ITF 237 #define ATM_ADDADDR32 _IOW('a', ATMIOC_ITF+8, struct compat_atmif_sioc) 241 #define ATM_DELADDR32 _IOW('a', ATMIOC_ITF 238 #define ATM_DELADDR32 _IOW('a', ATMIOC_ITF+9, struct compat_atmif_sioc) 242 #define ATM_GETCIRANGE32 _IOW('a', ATMIOC_ITF 239 #define ATM_GETCIRANGE32 _IOW('a', ATMIOC_ITF+10, struct compat_atmif_sioc) 243 #define ATM_SETCIRANGE32 _IOW('a', ATMIOC_ITF 240 #define ATM_SETCIRANGE32 _IOW('a', ATMIOC_ITF+11, struct compat_atmif_sioc) 244 #define ATM_SETESI32 _IOW('a', ATMIOC_ITF 241 #define ATM_SETESI32 _IOW('a', ATMIOC_ITF+12, struct compat_atmif_sioc) 245 #define ATM_SETESIF32 _IOW('a', ATMIOC_ITF 242 #define ATM_SETESIF32 _IOW('a', ATMIOC_ITF+13, struct compat_atmif_sioc) 246 #define ATM_GETSTAT32 _IOW('a', ATMIOC_SAR 243 #define ATM_GETSTAT32 _IOW('a', ATMIOC_SARCOM+0, struct compat_atmif_sioc) 247 #define ATM_GETSTATZ32 _IOW('a', ATMIOC_SAR 244 #define ATM_GETSTATZ32 _IOW('a', ATMIOC_SARCOM+1, struct compat_atmif_sioc) 248 #define ATM_GETLOOP32 _IOW('a', ATMIOC_SAR 245 #define ATM_GETLOOP32 _IOW('a', ATMIOC_SARCOM+2, struct compat_atmif_sioc) 249 #define ATM_SETLOOP32 _IOW('a', ATMIOC_SAR 246 #define ATM_SETLOOP32 _IOW('a', ATMIOC_SARCOM+3, struct compat_atmif_sioc) 250 #define ATM_QUERYLOOP32 _IOW('a', ATMIOC_SAR 247 #define ATM_QUERYLOOP32 _IOW('a', ATMIOC_SARCOM+4, struct compat_atmif_sioc) 251 248 252 static struct { 249 static struct { 253 unsigned int cmd32; 250 unsigned int cmd32; 254 unsigned int cmd; 251 unsigned int cmd; 255 } atm_ioctl_map[] = { 252 } atm_ioctl_map[] = { 256 { ATM_GETLINKRATE32, ATM_GETLINKRATE } 253 { ATM_GETLINKRATE32, ATM_GETLINKRATE }, 257 { ATM_GETNAMES32, ATM_GETNAMES }, 254 { ATM_GETNAMES32, ATM_GETNAMES }, 258 { ATM_GETTYPE32, ATM_GETTYPE }, 255 { ATM_GETTYPE32, ATM_GETTYPE }, 259 { ATM_GETESI32, ATM_GETESI }, 256 { ATM_GETESI32, ATM_GETESI }, 260 { ATM_GETADDR32, ATM_GETADDR }, 257 { ATM_GETADDR32, ATM_GETADDR }, 261 { ATM_RSTADDR32, ATM_RSTADDR }, 258 { ATM_RSTADDR32, ATM_RSTADDR }, 262 { ATM_ADDADDR32, ATM_ADDADDR }, 259 { ATM_ADDADDR32, ATM_ADDADDR }, 263 { ATM_DELADDR32, ATM_DELADDR }, 260 { ATM_DELADDR32, ATM_DELADDR }, 264 { ATM_GETCIRANGE32, ATM_GETCIRANGE }, 261 { ATM_GETCIRANGE32, ATM_GETCIRANGE }, 265 { ATM_SETCIRANGE32, ATM_SETCIRANGE }, 262 { ATM_SETCIRANGE32, ATM_SETCIRANGE }, 266 { ATM_SETESI32, ATM_SETESI }, 263 { ATM_SETESI32, ATM_SETESI }, 267 { ATM_SETESIF32, ATM_SETESIF }, 264 { ATM_SETESIF32, ATM_SETESIF }, 268 { ATM_GETSTAT32, ATM_GETSTAT }, 265 { ATM_GETSTAT32, ATM_GETSTAT }, 269 { ATM_GETSTATZ32, ATM_GETSTATZ }, 266 { ATM_GETSTATZ32, ATM_GETSTATZ }, 270 { ATM_GETLOOP32, ATM_GETLOOP }, 267 { ATM_GETLOOP32, ATM_GETLOOP }, 271 { ATM_SETLOOP32, ATM_SETLOOP }, 268 { ATM_SETLOOP32, ATM_SETLOOP }, 272 { ATM_QUERYLOOP32, ATM_QUERYLOOP }, 269 { ATM_QUERYLOOP32, ATM_QUERYLOOP }, 273 }; 270 }; 274 271 275 #define NR_ATM_IOCTL ARRAY_SIZE(atm_ioctl_map) 272 #define NR_ATM_IOCTL ARRAY_SIZE(atm_ioctl_map) 276 273 277 static int do_atm_iobuf(struct socket *sock, u 274 static int do_atm_iobuf(struct socket *sock, unsigned int cmd, 278 unsigned long arg) 275 unsigned long arg) 279 { 276 { 280 struct compat_atm_iobuf __user *iobuf3 277 struct compat_atm_iobuf __user *iobuf32 = compat_ptr(arg); 281 u32 data; 278 u32 data; 282 279 283 if (get_user(data, &iobuf32->buffer)) 280 if (get_user(data, &iobuf32->buffer)) 284 return -EFAULT; 281 return -EFAULT; 285 282 286 return atm_getnames(&iobuf32->length, 283 return atm_getnames(&iobuf32->length, compat_ptr(data)); 287 } 284 } 288 285 289 static int do_atmif_sioc(struct socket *sock, 286 static int do_atmif_sioc(struct socket *sock, unsigned int cmd, 290 unsigned long arg) 287 unsigned long arg) 291 { 288 { 292 struct compat_atmif_sioc __user *sioc3 289 struct compat_atmif_sioc __user *sioc32 = compat_ptr(arg); 293 int number; 290 int number; 294 u32 data; 291 u32 data; 295 292 296 if (get_user(data, &sioc32->arg) || ge 293 if (get_user(data, &sioc32->arg) || get_user(number, &sioc32->number)) 297 return -EFAULT; 294 return -EFAULT; 298 return atm_dev_ioctl(cmd, compat_ptr(d 295 return atm_dev_ioctl(cmd, compat_ptr(data), &sioc32->length, number, 0); 299 } 296 } 300 297 301 static int do_atm_ioctl(struct socket *sock, u 298 static int do_atm_ioctl(struct socket *sock, unsigned int cmd32, 302 unsigned long arg) 299 unsigned long arg) 303 { 300 { 304 int i; 301 int i; 305 unsigned int cmd = 0; 302 unsigned int cmd = 0; 306 303 307 switch (cmd32) { 304 switch (cmd32) { 308 case SONET_GETSTAT: 305 case SONET_GETSTAT: 309 case SONET_GETSTATZ: 306 case SONET_GETSTATZ: 310 case SONET_GETDIAG: 307 case SONET_GETDIAG: 311 case SONET_SETDIAG: 308 case SONET_SETDIAG: 312 case SONET_CLRDIAG: 309 case SONET_CLRDIAG: 313 case SONET_SETFRAMING: 310 case SONET_SETFRAMING: 314 case SONET_GETFRAMING: 311 case SONET_GETFRAMING: 315 case SONET_GETFRSENSE: 312 case SONET_GETFRSENSE: 316 return do_atmif_sioc(sock, cmd 313 return do_atmif_sioc(sock, cmd32, arg); 317 } 314 } 318 315 319 for (i = 0; i < NR_ATM_IOCTL; i++) { 316 for (i = 0; i < NR_ATM_IOCTL; i++) { 320 if (cmd32 == atm_ioctl_map[i]. 317 if (cmd32 == atm_ioctl_map[i].cmd32) { 321 cmd = atm_ioctl_map[i] 318 cmd = atm_ioctl_map[i].cmd; 322 break; 319 break; 323 } 320 } 324 } 321 } 325 if (i == NR_ATM_IOCTL) 322 if (i == NR_ATM_IOCTL) 326 return -EINVAL; 323 return -EINVAL; 327 324 328 switch (cmd) { 325 switch (cmd) { 329 case ATM_GETNAMES: 326 case ATM_GETNAMES: 330 return do_atm_iobuf(sock, cmd, 327 return do_atm_iobuf(sock, cmd, arg); 331 328 332 case ATM_GETLINKRATE: 329 case ATM_GETLINKRATE: 333 case ATM_GETTYPE: 330 case ATM_GETTYPE: 334 case ATM_GETESI: 331 case ATM_GETESI: 335 case ATM_GETADDR: 332 case ATM_GETADDR: 336 case ATM_RSTADDR: 333 case ATM_RSTADDR: 337 case ATM_ADDADDR: 334 case ATM_ADDADDR: 338 case ATM_DELADDR: 335 case ATM_DELADDR: 339 case ATM_GETCIRANGE: 336 case ATM_GETCIRANGE: 340 case ATM_SETCIRANGE: 337 case ATM_SETCIRANGE: 341 case ATM_SETESI: 338 case ATM_SETESI: 342 case ATM_SETESIF: 339 case ATM_SETESIF: 343 case ATM_GETSTAT: 340 case ATM_GETSTAT: 344 case ATM_GETSTATZ: 341 case ATM_GETSTATZ: 345 case ATM_GETLOOP: 342 case ATM_GETLOOP: 346 case ATM_SETLOOP: 343 case ATM_SETLOOP: 347 case ATM_QUERYLOOP: 344 case ATM_QUERYLOOP: 348 return do_atmif_sioc(sock, cmd 345 return do_atmif_sioc(sock, cmd, arg); 349 } 346 } 350 347 351 return -EINVAL; 348 return -EINVAL; 352 } 349 } 353 350 354 int vcc_compat_ioctl(struct socket *sock, unsi 351 int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, 355 unsigned long arg) 352 unsigned long arg) 356 { 353 { 357 int ret; 354 int ret; 358 355 359 ret = do_vcc_ioctl(sock, cmd, arg, 1); 356 ret = do_vcc_ioctl(sock, cmd, arg, 1); 360 if (ret != -ENOIOCTLCMD) 357 if (ret != -ENOIOCTLCMD) 361 return ret; 358 return ret; 362 359 363 return do_atm_ioctl(sock, cmd, arg); 360 return do_atm_ioctl(sock, cmd, arg); 364 } 361 } 365 #endif 362 #endif 366 363
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.