PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/net/atm/svc.c

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