svc.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* net/atm/svc.c - ATM SVC sockets */
  3. /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
  4. #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
  5. #include <linux/string.h>
  6. #include <linux/net.h> /* struct socket, struct proto_ops */
  7. #include <linux/errno.h> /* error codes */
  8. #include <linux/kernel.h> /* printk */
  9. #include <linux/skbuff.h>
  10. #include <linux/wait.h>
  11. #include <linux/sched/signal.h>
  12. #include <linux/fcntl.h> /* O_NONBLOCK */
  13. #include <linux/init.h>
  14. #include <linux/atm.h> /* ATM stuff */
  15. #include <linux/atmsap.h>
  16. #include <linux/atmsvc.h>
  17. #include <linux/atmdev.h>
  18. #include <linux/bitops.h>
  19. #include <net/sock.h> /* for sock_no_* */
  20. #include <linux/uaccess.h>
  21. #include <linux/export.h>
  22. #include "resources.h"
  23. #include "common.h" /* common for PVCs and SVCs */
  24. #include "signaling.h"
  25. #include "addr.h"
  26. #ifdef CONFIG_COMPAT
  27. /* It actually takes struct sockaddr_atmsvc, not struct atm_iobuf */
  28. #define COMPAT_ATM_ADDPARTY _IOW('a', ATMIOC_SPECIAL + 4, struct compat_atm_iobuf)
  29. #endif
  30. static int svc_create(struct net *net, struct socket *sock, int protocol,
  31. int kern);
  32. /*
  33. * Note: since all this is still nicely synchronized with the signaling demon,
  34. * there's no need to protect sleep loops with clis. If signaling is
  35. * moved into the kernel, that would change.
  36. */
  37. static int svc_shutdown(struct socket *sock, int how)
  38. {
  39. return 0;
  40. }
  41. static void svc_disconnect(struct atm_vcc *vcc)
  42. {
  43. DEFINE_WAIT(wait);
  44. struct sk_buff *skb;
  45. struct sock *sk = sk_atm(vcc);
  46. pr_debug("%p\n", vcc);
  47. if (test_bit(ATM_VF_REGIS, &vcc->flags)) {
  48. sigd_enq(vcc, as_close, NULL, NULL, NULL);
  49. for (;;) {
  50. prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
  51. if (test_bit(ATM_VF_RELEASED, &vcc->flags) || !sigd)
  52. break;
  53. schedule();
  54. }
  55. finish_wait(sk_sleep(sk), &wait);
  56. }
  57. /* beware - socket is still in use by atmsigd until the last
  58. as_indicate has been answered */
  59. while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
  60. atm_return(vcc, skb->truesize);
  61. pr_debug("LISTEN REL\n");
  62. sigd_enq2(NULL, as_reject, vcc, NULL, NULL, &vcc->qos, 0);
  63. dev_kfree_skb(skb);
  64. }
  65. clear_bit(ATM_VF_REGIS, &vcc->flags);
  66. /* ... may retry later */
  67. }
  68. static int svc_release(struct socket *sock)
  69. {
  70. struct sock *sk = sock->sk;
  71. struct atm_vcc *vcc;
  72. if (sk) {
  73. vcc = ATM_SD(sock);
  74. pr_debug("%p\n", vcc);
  75. clear_bit(ATM_VF_READY, &vcc->flags);
  76. /*
  77. * VCC pointer is used as a reference,
  78. * so we must not free it (thereby subjecting it to re-use)
  79. * before all pending connections are closed
  80. */
  81. svc_disconnect(vcc);
  82. vcc_release(sock);
  83. }
  84. return 0;
  85. }
  86. static int svc_bind(struct socket *sock, struct sockaddr *sockaddr,
  87. int sockaddr_len)
  88. {
  89. DEFINE_WAIT(wait);
  90. struct sock *sk = sock->sk;
  91. struct sockaddr_atmsvc *addr;
  92. struct atm_vcc *vcc;
  93. int error;
  94. if (sockaddr_len != sizeof(struct sockaddr_atmsvc))
  95. return -EINVAL;
  96. lock_sock(sk);
  97. if (sock->state == SS_CONNECTED) {
  98. error = -EISCONN;
  99. goto out;
  100. }
  101. if (sock->state != SS_UNCONNECTED) {
  102. error = -EINVAL;
  103. goto out;
  104. }
  105. vcc = ATM_SD(sock);
  106. addr = (struct sockaddr_atmsvc *) sockaddr;
  107. if (addr->sas_family != AF_ATMSVC) {
  108. error = -EAFNOSUPPORT;
  109. goto out;
  110. }
  111. clear_bit(ATM_VF_BOUND, &vcc->flags);
  112. /* failing rebind will kill old binding */
  113. /* @@@ check memory (de)allocation on rebind */
  114. if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) {
  115. error = -EBADFD;
  116. goto out;
  117. }
  118. vcc->local = *addr;
  119. set_bit(ATM_VF_WAITING, &vcc->flags);
  120. sigd_enq(vcc, as_bind, NULL, NULL, &vcc->local);
  121. for (;;) {
  122. prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
  123. if (!test_bit(ATM_VF_WAITING, &vcc->flags) || !sigd)
  124. break;
  125. schedule();
  126. }
  127. finish_wait(sk_sleep(sk), &wait);
  128. clear_bit(ATM_VF_REGIS, &vcc->flags); /* doesn't count */
  129. if (!sigd) {
  130. error = -EUNATCH;
  131. goto out;
  132. }
  133. if (!sk->sk_err)
  134. set_bit(ATM_VF_BOUND, &vcc->flags);
  135. error = -sk->sk_err;
  136. out:
  137. release_sock(sk);
  138. return error;
  139. }
  140. static int svc_connect(struct socket *sock, struct sockaddr *sockaddr,
  141. int sockaddr_len, int flags)
  142. {
  143. DEFINE_WAIT(wait);
  144. struct sock *sk = sock->sk;
  145. struct sockaddr_atmsvc *addr;
  146. struct atm_vcc *vcc = ATM_SD(sock);
  147. int error;
  148. pr_debug("%p\n", vcc);
  149. lock_sock(sk);
  150. if (sockaddr_len != sizeof(struct sockaddr_atmsvc)) {
  151. error = -EINVAL;
  152. goto out;
  153. }
  154. switch (sock->state) {
  155. default:
  156. error = -EINVAL;
  157. goto out;
  158. case SS_CONNECTED:
  159. error = -EISCONN;
  160. goto out;
  161. case SS_CONNECTING:
  162. if (test_bit(ATM_VF_WAITING, &vcc->flags)) {
  163. error = -EALREADY;
  164. goto out;
  165. }
  166. sock->state = SS_UNCONNECTED;
  167. if (sk->sk_err) {
  168. error = -sk->sk_err;
  169. goto out;
  170. }
  171. break;
  172. case SS_UNCONNECTED:
  173. addr = (struct sockaddr_atmsvc *) sockaddr;
  174. if (addr->sas_family != AF_ATMSVC) {
  175. error = -EAFNOSUPPORT;
  176. goto out;
  177. }
  178. if (!test_bit(ATM_VF_HASQOS, &vcc->flags)) {
  179. error = -EBADFD;
  180. goto out;
  181. }
  182. if (vcc->qos.txtp.traffic_class == ATM_ANYCLASS ||
  183. vcc->qos.rxtp.traffic_class == ATM_ANYCLASS) {
  184. error = -EINVAL;
  185. goto out;
  186. }
  187. if (!vcc->qos.txtp.traffic_class &&
  188. !vcc->qos.rxtp.traffic_class) {
  189. error = -EINVAL;
  190. goto out;
  191. }
  192. vcc->remote = *addr;
  193. set_bit(ATM_VF_WAITING, &vcc->flags);
  194. sigd_enq(vcc, as_connect, NULL, NULL, &vcc->remote);
  195. if (flags & O_NONBLOCK) {
  196. sock->state = SS_CONNECTING;
  197. error = -EINPROGRESS;
  198. goto out;
  199. }
  200. error = 0;
  201. prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
  202. while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
  203. schedule();
  204. if (!signal_pending(current)) {
  205. prepare_to_wait(sk_sleep(sk), &wait,
  206. TASK_INTERRUPTIBLE);
  207. continue;
  208. }
  209. pr_debug("*ABORT*\n");
  210. /*
  211. * This is tricky:
  212. * Kernel ---close--> Demon
  213. * Kernel <--close--- Demon
  214. * or
  215. * Kernel ---close--> Demon
  216. * Kernel <--error--- Demon
  217. * or
  218. * Kernel ---close--> Demon
  219. * Kernel <--okay---- Demon
  220. * Kernel <--close--- Demon
  221. */
  222. sigd_enq(vcc, as_close, NULL, NULL, NULL);
  223. while (test_bit(ATM_VF_WAITING, &vcc->flags) && sigd) {
  224. prepare_to_wait(sk_sleep(sk), &wait,
  225. TASK_INTERRUPTIBLE);
  226. schedule();
  227. }
  228. if (!sk->sk_err)
  229. while (!test_bit(ATM_VF_RELEASED, &vcc->flags) &&
  230. sigd) {
  231. prepare_to_wait(sk_sleep(sk), &wait,
  232. TASK_INTERRUPTIBLE);
  233. schedule();
  234. }
  235. clear_bit(ATM_VF_REGIS, &vcc->flags);
  236. clear_bit(ATM_VF_RELEASED, &vcc->flags);
  237. clear_bit(ATM_VF_CLOSE, &vcc->flags);
  238. /* we're gone now but may connect later */
  239. error = -EINTR;
  240. break;
  241. }
  242. finish_wait(sk_sleep(sk), &wait);
  243. if (error)
  244. goto out;
  245. if (!sigd) {
  246. error = -EUNATCH;
  247. goto out;
  248. }
  249. if (sk->sk_err) {
  250. error = -sk->sk_err;
  251. goto out;
  252. }
  253. }
  254. vcc->qos.txtp.max_pcr = SELECT_TOP_PCR(vcc->qos.txtp);
  255. vcc->qos.txtp.pcr = 0;
  256. vcc->qos.txtp.min_pcr = 0;
  257. error = vcc_connect(sock, vcc->itf, vcc->vpi, vcc->vci);
  258. if (!error)
  259. sock->state = SS_CONNECTED;
  260. else
  261. (void)svc_disconnect(vcc);
  262. out:
  263. release_sock(sk);
  264. return error;
  265. }
  266. static int svc_listen(struct socket *sock, int backlog)
  267. {
  268. DEFINE_WAIT(wait);
  269. struct sock *sk = sock->sk;
  270. struct atm_vcc *vcc = ATM_SD(sock);
  271. int error;
  272. pr_debug("%p\n", vcc);
  273. lock_sock(sk);
  274. /* let server handle listen on unbound sockets */
  275. if (test_bit(ATM_VF_SESSION, &vcc->flags)) {
  276. error = -EINVAL;
  277. goto out;
  278. }
  279. if (test_bit(ATM_VF_LISTEN, &vcc->flags)) {
  280. error = -EADDRINUSE;
  281. goto out;
  282. }
  283. set_bit(ATM_VF_WAITING, &vcc->flags);
  284. sigd_enq(vcc, as_listen, NULL, NULL, &vcc->local);
  285. for (;;) {
  286. prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
  287. if (!test_bit(ATM_VF_WAITING, &vcc->flags) || !sigd)
  288. break;
  289. schedule();
  290. }
  291. finish_wait(sk_sleep(sk), &wait);
  292. if (!sigd) {
  293. error = -EUNATCH;
  294. goto out;
  295. }
  296. set_bit(ATM_VF_LISTEN, &vcc->flags);
  297. vcc_insert_socket(sk);
  298. sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT;
  299. error = -sk->sk_err;
  300. out:
  301. release_sock(sk);
  302. return error;
  303. }
  304. static int svc_accept(struct socket *sock, struct socket *newsock,
  305. struct proto_accept_arg *arg)
  306. {
  307. struct sock *sk = sock->sk;
  308. struct sk_buff *skb;
  309. struct atmsvc_msg *msg;
  310. struct atm_vcc *old_vcc = ATM_SD(sock);
  311. struct atm_vcc *new_vcc;
  312. int error;
  313. lock_sock(sk);
  314. error = svc_create(sock_net(sk), newsock, 0, arg->kern);
  315. if (error)
  316. goto out;
  317. new_vcc = ATM_SD(newsock);
  318. pr_debug("%p -> %p\n", old_vcc, new_vcc);
  319. while (1) {
  320. DEFINE_WAIT(wait);
  321. prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
  322. while (!(skb = skb_dequeue(&sk->sk_receive_queue)) &&
  323. sigd) {
  324. if (test_bit(ATM_VF_RELEASED, &old_vcc->flags))
  325. break;
  326. if (test_bit(ATM_VF_CLOSE, &old_vcc->flags)) {
  327. error = -sk->sk_err;
  328. break;
  329. }
  330. if (arg->flags & O_NONBLOCK) {
  331. error = -EAGAIN;
  332. break;
  333. }
  334. release_sock(sk);
  335. schedule();
  336. lock_sock(sk);
  337. if (signal_pending(current)) {
  338. error = -ERESTARTSYS;
  339. break;
  340. }
  341. prepare_to_wait(sk_sleep(sk), &wait,
  342. TASK_INTERRUPTIBLE);
  343. }
  344. finish_wait(sk_sleep(sk), &wait);
  345. if (error)
  346. goto out;
  347. if (!skb) {
  348. error = -EUNATCH;
  349. goto out;
  350. }
  351. msg = (struct atmsvc_msg *)skb->data;
  352. new_vcc->qos = msg->qos;
  353. set_bit(ATM_VF_HASQOS, &new_vcc->flags);
  354. new_vcc->remote = msg->svc;
  355. new_vcc->local = msg->local;
  356. new_vcc->sap = msg->sap;
  357. error = vcc_connect(newsock, msg->pvc.sap_addr.itf,
  358. msg->pvc.sap_addr.vpi,
  359. msg->pvc.sap_addr.vci);
  360. dev_kfree_skb(skb);
  361. sk_acceptq_removed(sk);
  362. if (error) {
  363. sigd_enq2(NULL, as_reject, old_vcc, NULL, NULL,
  364. &old_vcc->qos, error);
  365. error = error == -EAGAIN ? -EBUSY : error;
  366. goto out;
  367. }
  368. /* wait should be short, so we ignore the non-blocking flag */
  369. set_bit(ATM_VF_WAITING, &new_vcc->flags);
  370. sigd_enq(new_vcc, as_accept, old_vcc, NULL, NULL);
  371. for (;;) {
  372. prepare_to_wait(sk_sleep(sk_atm(new_vcc)), &wait,
  373. TASK_UNINTERRUPTIBLE);
  374. if (!test_bit(ATM_VF_WAITING, &new_vcc->flags) || !sigd)
  375. break;
  376. release_sock(sk);
  377. schedule();
  378. lock_sock(sk);
  379. }
  380. finish_wait(sk_sleep(sk_atm(new_vcc)), &wait);
  381. if (!sigd) {
  382. error = -EUNATCH;
  383. goto out;
  384. }
  385. if (!sk_atm(new_vcc)->sk_err)
  386. break;
  387. if (sk_atm(new_vcc)->sk_err != ERESTARTSYS) {
  388. error = -sk_atm(new_vcc)->sk_err;
  389. goto out;
  390. }
  391. }
  392. newsock->state = SS_CONNECTED;
  393. out:
  394. release_sock(sk);
  395. return error;
  396. }
  397. static int svc_getname(struct socket *sock, struct sockaddr *sockaddr,
  398. int peer)
  399. {
  400. struct sockaddr_atmsvc *addr;
  401. addr = (struct sockaddr_atmsvc *) sockaddr;
  402. memcpy(addr, peer ? &ATM_SD(sock)->remote : &ATM_SD(sock)->local,
  403. sizeof(struct sockaddr_atmsvc));
  404. return sizeof(struct sockaddr_atmsvc);
  405. }
  406. int svc_change_qos(struct atm_vcc *vcc, struct atm_qos *qos)
  407. {
  408. struct sock *sk = sk_atm(vcc);
  409. DEFINE_WAIT(wait);
  410. set_bit(ATM_VF_WAITING, &vcc->flags);
  411. sigd_enq2(vcc, as_modify, NULL, NULL, &vcc->local, qos, 0);
  412. for (;;) {
  413. prepare_to_wait(sk_sleep(sk), &wait, TASK_UNINTERRUPTIBLE);
  414. if (!test_bit(ATM_VF_WAITING, &vcc->flags) ||
  415. test_bit(ATM_VF_RELEASED, &vcc->flags) || !sigd) {
  416. break;
  417. }
  418. schedule();
  419. }
  420. finish_wait(sk_sleep(sk), &wait);
  421. if (!sigd)
  422. return -EUNATCH;
  423. return -sk->sk_err;
  424. }
  425. static int svc_setsockopt(struct socket *sock, int level, int optname,
  426. sockptr_t optval, unsigned int optlen)
  427. {
  428. struct sock *sk = sock->sk;
  429. struct atm_vcc *vcc = ATM_SD(sock);
  430. int value, error = 0;
  431. lock_sock(sk);
  432. switch (optname) {
  433. case SO_ATMSAP:
  434. if (level != SOL_ATM || optlen != sizeof(struct atm_sap)) {
  435. error = -EINVAL;
  436. goto out;
  437. }
  438. if (copy_from_sockptr(&vcc->sap, optval, optlen)) {
  439. error = -EFAULT;
  440. goto out;
  441. }
  442. set_bit(ATM_VF_HASSAP, &vcc->flags);
  443. break;
  444. case SO_MULTIPOINT:
  445. if (level != SOL_ATM || optlen != sizeof(int)) {
  446. error = -EINVAL;
  447. goto out;
  448. }
  449. if (copy_from_sockptr(&value, optval, sizeof(int))) {
  450. error = -EFAULT;
  451. goto out;
  452. }
  453. if (value == 1)
  454. set_bit(ATM_VF_SESSION, &vcc->flags);
  455. else if (value == 0)
  456. clear_bit(ATM_VF_SESSION, &vcc->flags);
  457. else
  458. error = -EINVAL;
  459. break;
  460. default:
  461. error = vcc_setsockopt(sock, level, optname, optval, optlen);
  462. }
  463. out:
  464. release_sock(sk);
  465. return error;
  466. }
  467. static int svc_getsockopt(struct socket *sock, int level, int optname,
  468. char __user *optval, int __user *optlen)
  469. {
  470. struct sock *sk = sock->sk;
  471. int error = 0, len;
  472. lock_sock(sk);
  473. if (!__SO_LEVEL_MATCH(optname, level) || optname != SO_ATMSAP) {
  474. error = vcc_getsockopt(sock, level, optname, optval, optlen);
  475. goto out;
  476. }
  477. if (get_user(len, optlen)) {
  478. error = -EFAULT;
  479. goto out;
  480. }
  481. if (len != sizeof(struct atm_sap)) {
  482. error = -EINVAL;
  483. goto out;
  484. }
  485. if (copy_to_user(optval, &ATM_SD(sock)->sap, sizeof(struct atm_sap))) {
  486. error = -EFAULT;
  487. goto out;
  488. }
  489. out:
  490. release_sock(sk);
  491. return error;
  492. }
  493. static int svc_addparty(struct socket *sock, struct sockaddr *sockaddr,
  494. int sockaddr_len, int flags)
  495. {
  496. DEFINE_WAIT(wait);
  497. struct sock *sk = sock->sk;
  498. struct atm_vcc *vcc = ATM_SD(sock);
  499. int error;
  500. lock_sock(sk);
  501. set_bit(ATM_VF_WAITING, &vcc->flags);
  502. sigd_enq(vcc, as_addparty, NULL, NULL,
  503. (struct sockaddr_atmsvc *) sockaddr);
  504. if (flags & O_NONBLOCK) {
  505. error = -EINPROGRESS;
  506. goto out;
  507. }
  508. pr_debug("added wait queue\n");
  509. for (;;) {
  510. prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
  511. if (!test_bit(ATM_VF_WAITING, &vcc->flags) || !sigd)
  512. break;
  513. schedule();
  514. }
  515. finish_wait(sk_sleep(sk), &wait);
  516. error = -xchg(&sk->sk_err_soft, 0);
  517. out:
  518. release_sock(sk);
  519. return error;
  520. }
  521. static int svc_dropparty(struct socket *sock, int ep_ref)
  522. {
  523. DEFINE_WAIT(wait);
  524. struct sock *sk = sock->sk;
  525. struct atm_vcc *vcc = ATM_SD(sock);
  526. int error;
  527. lock_sock(sk);
  528. set_bit(ATM_VF_WAITING, &vcc->flags);
  529. sigd_enq2(vcc, as_dropparty, NULL, NULL, NULL, NULL, ep_ref);
  530. for (;;) {
  531. prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
  532. if (!test_bit(ATM_VF_WAITING, &vcc->flags) || !sigd)
  533. break;
  534. schedule();
  535. }
  536. finish_wait(sk_sleep(sk), &wait);
  537. if (!sigd) {
  538. error = -EUNATCH;
  539. goto out;
  540. }
  541. error = -xchg(&sk->sk_err_soft, 0);
  542. out:
  543. release_sock(sk);
  544. return error;
  545. }
  546. static int svc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  547. {
  548. int error, ep_ref;
  549. struct sockaddr_atmsvc sa;
  550. struct atm_vcc *vcc = ATM_SD(sock);
  551. switch (cmd) {
  552. case ATM_ADDPARTY:
  553. if (!test_bit(ATM_VF_SESSION, &vcc->flags))
  554. return -EINVAL;
  555. if (copy_from_user(&sa, (void __user *) arg, sizeof(sa)))
  556. return -EFAULT;
  557. error = svc_addparty(sock, (struct sockaddr *)&sa, sizeof(sa),
  558. 0);
  559. break;
  560. case ATM_DROPPARTY:
  561. if (!test_bit(ATM_VF_SESSION, &vcc->flags))
  562. return -EINVAL;
  563. if (copy_from_user(&ep_ref, (void __user *) arg, sizeof(int)))
  564. return -EFAULT;
  565. error = svc_dropparty(sock, ep_ref);
  566. break;
  567. default:
  568. error = vcc_ioctl(sock, cmd, arg);
  569. }
  570. return error;
  571. }
  572. #ifdef CONFIG_COMPAT
  573. static int svc_compat_ioctl(struct socket *sock, unsigned int cmd,
  574. unsigned long arg)
  575. {
  576. /* The definition of ATM_ADDPARTY uses the size of struct atm_iobuf.
  577. But actually it takes a struct sockaddr_atmsvc, which doesn't need
  578. compat handling. So all we have to do is fix up cmd... */
  579. if (cmd == COMPAT_ATM_ADDPARTY)
  580. cmd = ATM_ADDPARTY;
  581. if (cmd == ATM_ADDPARTY || cmd == ATM_DROPPARTY)
  582. return svc_ioctl(sock, cmd, arg);
  583. else
  584. return vcc_compat_ioctl(sock, cmd, arg);
  585. }
  586. #endif /* CONFIG_COMPAT */
  587. static const struct proto_ops svc_proto_ops = {
  588. .family = PF_ATMSVC,
  589. .owner = THIS_MODULE,
  590. .release = svc_release,
  591. .bind = svc_bind,
  592. .connect = svc_connect,
  593. .socketpair = sock_no_socketpair,
  594. .accept = svc_accept,
  595. .getname = svc_getname,
  596. .poll = vcc_poll,
  597. .ioctl = svc_ioctl,
  598. #ifdef CONFIG_COMPAT
  599. .compat_ioctl = svc_compat_ioctl,
  600. #endif
  601. .gettstamp = sock_gettstamp,
  602. .listen = svc_listen,
  603. .shutdown = svc_shutdown,
  604. .setsockopt = svc_setsockopt,
  605. .getsockopt = svc_getsockopt,
  606. .sendmsg = vcc_sendmsg,
  607. .recvmsg = vcc_recvmsg,
  608. .mmap = sock_no_mmap,
  609. };
  610. static int svc_create(struct net *net, struct socket *sock, int protocol,
  611. int kern)
  612. {
  613. int error;
  614. if (!net_eq(net, &init_net))
  615. return -EAFNOSUPPORT;
  616. sock->ops = &svc_proto_ops;
  617. error = vcc_create(net, sock, protocol, AF_ATMSVC, kern);
  618. if (error)
  619. return error;
  620. ATM_SD(sock)->local.sas_family = AF_ATMSVC;
  621. ATM_SD(sock)->remote.sas_family = AF_ATMSVC;
  622. return 0;
  623. }
  624. static const struct net_proto_family svc_family_ops = {
  625. .family = PF_ATMSVC,
  626. .create = svc_create,
  627. .owner = THIS_MODULE,
  628. };
  629. /*
  630. * Initialize the ATM SVC protocol family
  631. */
  632. int __init atmsvc_init(void)
  633. {
  634. return sock_register(&svc_family_ops);
  635. }
  636. void atmsvc_exit(void)
  637. {
  638. sock_unregister(PF_ATMSVC);
  639. }