common.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. /* net/atm/common.c - ATM sockets (common part for PVC and SVC) */
  2. /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
  3. #include <linux/config.h>
  4. #include <linux/module.h>
  5. #include <linux/kmod.h>
  6. #include <linux/net.h> /* struct socket, struct proto_ops */
  7. #include <linux/atm.h> /* ATM stuff */
  8. #include <linux/atmdev.h>
  9. #include <linux/socket.h> /* SOL_SOCKET */
  10. #include <linux/errno.h> /* error codes */
  11. #include <linux/capability.h>
  12. #include <linux/mm.h>
  13. #include <linux/sched.h>
  14. #include <linux/time.h> /* struct timeval */
  15. #include <linux/skbuff.h>
  16. #include <linux/bitops.h>
  17. #include <linux/init.h>
  18. #include <net/sock.h> /* struct sock */
  19. #include <asm/uaccess.h>
  20. #include <asm/atomic.h>
  21. #include <asm/poll.h>
  22. #include "resources.h" /* atm_find_dev */
  23. #include "common.h" /* prototypes */
  24. #include "protocols.h" /* atm_init_<transport> */
  25. #include "addr.h" /* address registry */
  26. #include "signaling.h" /* for WAITING and sigd_attach */
  27. #if 0
  28. #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)
  29. #else
  30. #define DPRINTK(format,args...)
  31. #endif
  32. struct hlist_head vcc_hash[VCC_HTABLE_SIZE];
  33. DEFINE_RWLOCK(vcc_sklist_lock);
  34. static void __vcc_insert_socket(struct sock *sk)
  35. {
  36. struct atm_vcc *vcc = atm_sk(sk);
  37. struct hlist_head *head = &vcc_hash[vcc->vci &
  38. (VCC_HTABLE_SIZE - 1)];
  39. sk->sk_hashent = vcc->vci & (VCC_HTABLE_SIZE - 1);
  40. sk_add_node(sk, head);
  41. }
  42. void vcc_insert_socket(struct sock *sk)
  43. {
  44. write_lock_irq(&vcc_sklist_lock);
  45. __vcc_insert_socket(sk);
  46. write_unlock_irq(&vcc_sklist_lock);
  47. }
  48. static void vcc_remove_socket(struct sock *sk)
  49. {
  50. write_lock_irq(&vcc_sklist_lock);
  51. sk_del_node_init(sk);
  52. write_unlock_irq(&vcc_sklist_lock);
  53. }
  54. static struct sk_buff *alloc_tx(struct atm_vcc *vcc,unsigned int size)
  55. {
  56. struct sk_buff *skb;
  57. struct sock *sk = sk_atm(vcc);
  58. if (atomic_read(&sk->sk_wmem_alloc) && !atm_may_send(vcc, size)) {
  59. DPRINTK("Sorry: wmem_alloc = %d, size = %d, sndbuf = %d\n",
  60. atomic_read(&sk->sk_wmem_alloc), size,
  61. sk->sk_sndbuf);
  62. return NULL;
  63. }
  64. while (!(skb = alloc_skb(size,GFP_KERNEL))) schedule();
  65. DPRINTK("AlTx %d += %d\n", atomic_read(&sk->sk_wmem_alloc),
  66. skb->truesize);
  67. atomic_add(skb->truesize, &sk->sk_wmem_alloc);
  68. return skb;
  69. }
  70. EXPORT_SYMBOL(vcc_hash);
  71. EXPORT_SYMBOL(vcc_sklist_lock);
  72. EXPORT_SYMBOL(vcc_insert_socket);
  73. static void vcc_sock_destruct(struct sock *sk)
  74. {
  75. if (atomic_read(&sk->sk_rmem_alloc))
  76. printk(KERN_DEBUG "vcc_sock_destruct: rmem leakage (%d bytes) detected.\n", atomic_read(&sk->sk_rmem_alloc));
  77. if (atomic_read(&sk->sk_wmem_alloc))
  78. printk(KERN_DEBUG "vcc_sock_destruct: wmem leakage (%d bytes) detected.\n", atomic_read(&sk->sk_wmem_alloc));
  79. }
  80. static void vcc_def_wakeup(struct sock *sk)
  81. {
  82. read_lock(&sk->sk_callback_lock);
  83. if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
  84. wake_up(sk->sk_sleep);
  85. read_unlock(&sk->sk_callback_lock);
  86. }
  87. static inline int vcc_writable(struct sock *sk)
  88. {
  89. struct atm_vcc *vcc = atm_sk(sk);
  90. return (vcc->qos.txtp.max_sdu +
  91. atomic_read(&sk->sk_wmem_alloc)) <= sk->sk_sndbuf;
  92. }
  93. static void vcc_write_space(struct sock *sk)
  94. {
  95. read_lock(&sk->sk_callback_lock);
  96. if (vcc_writable(sk)) {
  97. if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
  98. wake_up_interruptible(sk->sk_sleep);
  99. sk_wake_async(sk, 2, POLL_OUT);
  100. }
  101. read_unlock(&sk->sk_callback_lock);
  102. }
  103. static struct proto vcc_proto = {
  104. .name = "VCC",
  105. .owner = THIS_MODULE,
  106. .obj_size = sizeof(struct atm_vcc),
  107. };
  108. int vcc_create(struct socket *sock, int protocol, int family)
  109. {
  110. struct sock *sk;
  111. struct atm_vcc *vcc;
  112. sock->sk = NULL;
  113. if (sock->type == SOCK_STREAM)
  114. return -EINVAL;
  115. sk = sk_alloc(family, GFP_KERNEL, &vcc_proto, 1);
  116. if (!sk)
  117. return -ENOMEM;
  118. sock_init_data(sock, sk);
  119. sk->sk_state_change = vcc_def_wakeup;
  120. sk->sk_write_space = vcc_write_space;
  121. vcc = atm_sk(sk);
  122. vcc->dev = NULL;
  123. memset(&vcc->local,0,sizeof(struct sockaddr_atmsvc));
  124. memset(&vcc->remote,0,sizeof(struct sockaddr_atmsvc));
  125. vcc->qos.txtp.max_sdu = 1 << 16; /* for meta VCs */
  126. atomic_set(&sk->sk_wmem_alloc, 0);
  127. atomic_set(&sk->sk_rmem_alloc, 0);
  128. vcc->push = NULL;
  129. vcc->pop = NULL;
  130. vcc->push_oam = NULL;
  131. vcc->vpi = vcc->vci = 0; /* no VCI/VPI yet */
  132. vcc->atm_options = vcc->aal_options = 0;
  133. sk->sk_destruct = vcc_sock_destruct;
  134. return 0;
  135. }
  136. static void vcc_destroy_socket(struct sock *sk)
  137. {
  138. struct atm_vcc *vcc = atm_sk(sk);
  139. struct sk_buff *skb;
  140. set_bit(ATM_VF_CLOSE, &vcc->flags);
  141. clear_bit(ATM_VF_READY, &vcc->flags);
  142. if (vcc->dev) {
  143. if (vcc->dev->ops->close)
  144. vcc->dev->ops->close(vcc);
  145. if (vcc->push)
  146. vcc->push(vcc, NULL); /* atmarpd has no push */
  147. vcc_remove_socket(sk); /* no more receive */
  148. while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) {
  149. atm_return(vcc,skb->truesize);
  150. kfree_skb(skb);
  151. }
  152. module_put(vcc->dev->ops->owner);
  153. atm_dev_put(vcc->dev);
  154. }
  155. }
  156. int vcc_release(struct socket *sock)
  157. {
  158. struct sock *sk = sock->sk;
  159. if (sk) {
  160. lock_sock(sk);
  161. vcc_destroy_socket(sock->sk);
  162. release_sock(sk);
  163. sock_put(sk);
  164. }
  165. return 0;
  166. }
  167. void vcc_release_async(struct atm_vcc *vcc, int reply)
  168. {
  169. struct sock *sk = sk_atm(vcc);
  170. set_bit(ATM_VF_CLOSE, &vcc->flags);
  171. sk->sk_shutdown |= RCV_SHUTDOWN;
  172. sk->sk_err = -reply;
  173. clear_bit(ATM_VF_WAITING, &vcc->flags);
  174. sk->sk_state_change(sk);
  175. }
  176. EXPORT_SYMBOL(vcc_release_async);
  177. static int adjust_tp(struct atm_trafprm *tp,unsigned char aal)
  178. {
  179. int max_sdu;
  180. if (!tp->traffic_class) return 0;
  181. switch (aal) {
  182. case ATM_AAL0:
  183. max_sdu = ATM_CELL_SIZE-1;
  184. break;
  185. case ATM_AAL34:
  186. max_sdu = ATM_MAX_AAL34_PDU;
  187. break;
  188. default:
  189. printk(KERN_WARNING "ATM: AAL problems ... "
  190. "(%d)\n",aal);
  191. /* fall through */
  192. case ATM_AAL5:
  193. max_sdu = ATM_MAX_AAL5_PDU;
  194. }
  195. if (!tp->max_sdu) tp->max_sdu = max_sdu;
  196. else if (tp->max_sdu > max_sdu) return -EINVAL;
  197. if (!tp->max_cdv) tp->max_cdv = ATM_MAX_CDV;
  198. return 0;
  199. }
  200. static int check_ci(struct atm_vcc *vcc, short vpi, int vci)
  201. {
  202. struct hlist_head *head = &vcc_hash[vci &
  203. (VCC_HTABLE_SIZE - 1)];
  204. struct hlist_node *node;
  205. struct sock *s;
  206. struct atm_vcc *walk;
  207. sk_for_each(s, node, head) {
  208. walk = atm_sk(s);
  209. if (walk->dev != vcc->dev)
  210. continue;
  211. if (test_bit(ATM_VF_ADDR, &walk->flags) && walk->vpi == vpi &&
  212. walk->vci == vci && ((walk->qos.txtp.traffic_class !=
  213. ATM_NONE && vcc->qos.txtp.traffic_class != ATM_NONE) ||
  214. (walk->qos.rxtp.traffic_class != ATM_NONE &&
  215. vcc->qos.rxtp.traffic_class != ATM_NONE)))
  216. return -EADDRINUSE;
  217. }
  218. /* allow VCCs with same VPI/VCI iff they don't collide on
  219. TX/RX (but we may refuse such sharing for other reasons,
  220. e.g. if protocol requires to have both channels) */
  221. return 0;
  222. }
  223. static int find_ci(struct atm_vcc *vcc, short *vpi, int *vci)
  224. {
  225. static short p; /* poor man's per-device cache */
  226. static int c;
  227. short old_p;
  228. int old_c;
  229. int err;
  230. if (*vpi != ATM_VPI_ANY && *vci != ATM_VCI_ANY) {
  231. err = check_ci(vcc, *vpi, *vci);
  232. return err;
  233. }
  234. /* last scan may have left values out of bounds for current device */
  235. if (*vpi != ATM_VPI_ANY)
  236. p = *vpi;
  237. else if (p >= 1 << vcc->dev->ci_range.vpi_bits)
  238. p = 0;
  239. if (*vci != ATM_VCI_ANY)
  240. c = *vci;
  241. else if (c < ATM_NOT_RSV_VCI || c >= 1 << vcc->dev->ci_range.vci_bits)
  242. c = ATM_NOT_RSV_VCI;
  243. old_p = p;
  244. old_c = c;
  245. do {
  246. if (!check_ci(vcc, p, c)) {
  247. *vpi = p;
  248. *vci = c;
  249. return 0;
  250. }
  251. if (*vci == ATM_VCI_ANY) {
  252. c++;
  253. if (c >= 1 << vcc->dev->ci_range.vci_bits)
  254. c = ATM_NOT_RSV_VCI;
  255. }
  256. if ((c == ATM_NOT_RSV_VCI || *vci != ATM_VCI_ANY) &&
  257. *vpi == ATM_VPI_ANY) {
  258. p++;
  259. if (p >= 1 << vcc->dev->ci_range.vpi_bits) p = 0;
  260. }
  261. }
  262. while (old_p != p || old_c != c);
  263. return -EADDRINUSE;
  264. }
  265. static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, short vpi,
  266. int vci)
  267. {
  268. struct sock *sk = sk_atm(vcc);
  269. int error;
  270. if ((vpi != ATM_VPI_UNSPEC && vpi != ATM_VPI_ANY &&
  271. vpi >> dev->ci_range.vpi_bits) || (vci != ATM_VCI_UNSPEC &&
  272. vci != ATM_VCI_ANY && vci >> dev->ci_range.vci_bits))
  273. return -EINVAL;
  274. if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE))
  275. return -EPERM;
  276. error = 0;
  277. if (!try_module_get(dev->ops->owner))
  278. return -ENODEV;
  279. vcc->dev = dev;
  280. write_lock_irq(&vcc_sklist_lock);
  281. if ((error = find_ci(vcc, &vpi, &vci))) {
  282. write_unlock_irq(&vcc_sklist_lock);
  283. goto fail_module_put;
  284. }
  285. vcc->vpi = vpi;
  286. vcc->vci = vci;
  287. __vcc_insert_socket(sk);
  288. write_unlock_irq(&vcc_sklist_lock);
  289. switch (vcc->qos.aal) {
  290. case ATM_AAL0:
  291. error = atm_init_aal0(vcc);
  292. vcc->stats = &dev->stats.aal0;
  293. break;
  294. case ATM_AAL34:
  295. error = atm_init_aal34(vcc);
  296. vcc->stats = &dev->stats.aal34;
  297. break;
  298. case ATM_NO_AAL:
  299. /* ATM_AAL5 is also used in the "0 for default" case */
  300. vcc->qos.aal = ATM_AAL5;
  301. /* fall through */
  302. case ATM_AAL5:
  303. error = atm_init_aal5(vcc);
  304. vcc->stats = &dev->stats.aal5;
  305. break;
  306. default:
  307. error = -EPROTOTYPE;
  308. }
  309. if (!error) error = adjust_tp(&vcc->qos.txtp,vcc->qos.aal);
  310. if (!error) error = adjust_tp(&vcc->qos.rxtp,vcc->qos.aal);
  311. if (error)
  312. goto fail;
  313. DPRINTK("VCC %d.%d, AAL %d\n",vpi,vci,vcc->qos.aal);
  314. DPRINTK(" TX: %d, PCR %d..%d, SDU %d\n",vcc->qos.txtp.traffic_class,
  315. vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu);
  316. DPRINTK(" RX: %d, PCR %d..%d, SDU %d\n",vcc->qos.rxtp.traffic_class,
  317. vcc->qos.rxtp.min_pcr,vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu);
  318. if (dev->ops->open) {
  319. if ((error = dev->ops->open(vcc)))
  320. goto fail;
  321. }
  322. return 0;
  323. fail:
  324. vcc_remove_socket(sk);
  325. fail_module_put:
  326. module_put(dev->ops->owner);
  327. /* ensure we get dev module ref count correct */
  328. vcc->dev = NULL;
  329. return error;
  330. }
  331. int vcc_connect(struct socket *sock, int itf, short vpi, int vci)
  332. {
  333. struct atm_dev *dev;
  334. struct atm_vcc *vcc = ATM_SD(sock);
  335. int error;
  336. DPRINTK("vcc_connect (vpi %d, vci %d)\n",vpi,vci);
  337. if (sock->state == SS_CONNECTED)
  338. return -EISCONN;
  339. if (sock->state != SS_UNCONNECTED)
  340. return -EINVAL;
  341. if (!(vpi || vci))
  342. return -EINVAL;
  343. if (vpi != ATM_VPI_UNSPEC && vci != ATM_VCI_UNSPEC)
  344. clear_bit(ATM_VF_PARTIAL,&vcc->flags);
  345. else
  346. if (test_bit(ATM_VF_PARTIAL,&vcc->flags))
  347. return -EINVAL;
  348. DPRINTK("vcc_connect (TX: cl %d,bw %d-%d,sdu %d; "
  349. "RX: cl %d,bw %d-%d,sdu %d,AAL %s%d)\n",
  350. vcc->qos.txtp.traffic_class,vcc->qos.txtp.min_pcr,
  351. vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu,
  352. vcc->qos.rxtp.traffic_class,vcc->qos.rxtp.min_pcr,
  353. vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu,
  354. vcc->qos.aal == ATM_AAL5 ? "" : vcc->qos.aal == ATM_AAL0 ? "" :
  355. " ??? code ",vcc->qos.aal == ATM_AAL0 ? 0 : vcc->qos.aal);
  356. if (!test_bit(ATM_VF_HASQOS, &vcc->flags))
  357. return -EBADFD;
  358. if (vcc->qos.txtp.traffic_class == ATM_ANYCLASS ||
  359. vcc->qos.rxtp.traffic_class == ATM_ANYCLASS)
  360. return -EINVAL;
  361. if (itf != ATM_ITF_ANY) {
  362. dev = atm_dev_lookup(itf);
  363. if (!dev)
  364. return -ENODEV;
  365. error = __vcc_connect(vcc, dev, vpi, vci);
  366. if (error) {
  367. atm_dev_put(dev);
  368. return error;
  369. }
  370. } else {
  371. struct list_head *p, *next;
  372. dev = NULL;
  373. spin_lock(&atm_dev_lock);
  374. list_for_each_safe(p, next, &atm_devs) {
  375. dev = list_entry(p, struct atm_dev, dev_list);
  376. atm_dev_hold(dev);
  377. spin_unlock(&atm_dev_lock);
  378. if (!__vcc_connect(vcc, dev, vpi, vci))
  379. break;
  380. atm_dev_put(dev);
  381. dev = NULL;
  382. spin_lock(&atm_dev_lock);
  383. }
  384. spin_unlock(&atm_dev_lock);
  385. if (!dev)
  386. return -ENODEV;
  387. }
  388. if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC)
  389. set_bit(ATM_VF_PARTIAL,&vcc->flags);
  390. if (test_bit(ATM_VF_READY,&ATM_SD(sock)->flags))
  391. sock->state = SS_CONNECTED;
  392. return 0;
  393. }
  394. int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
  395. size_t size, int flags)
  396. {
  397. struct sock *sk = sock->sk;
  398. struct atm_vcc *vcc;
  399. struct sk_buff *skb;
  400. int copied, error = -EINVAL;
  401. if (sock->state != SS_CONNECTED)
  402. return -ENOTCONN;
  403. if (flags & ~MSG_DONTWAIT) /* only handle MSG_DONTWAIT */
  404. return -EOPNOTSUPP;
  405. vcc = ATM_SD(sock);
  406. if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
  407. test_bit(ATM_VF_CLOSE,&vcc->flags) ||
  408. !test_bit(ATM_VF_READY, &vcc->flags))
  409. return 0;
  410. skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &error);
  411. if (!skb)
  412. return error;
  413. copied = skb->len;
  414. if (copied > size) {
  415. copied = size;
  416. msg->msg_flags |= MSG_TRUNC;
  417. }
  418. error = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
  419. if (error)
  420. return error;
  421. sock_recv_timestamp(msg, sk, skb);
  422. DPRINTK("RcvM %d -= %d\n", atomic_read(&sk->rmem_alloc), skb->truesize);
  423. atm_return(vcc, skb->truesize);
  424. skb_free_datagram(sk, skb);
  425. return copied;
  426. }
  427. int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
  428. size_t total_len)
  429. {
  430. struct sock *sk = sock->sk;
  431. DEFINE_WAIT(wait);
  432. struct atm_vcc *vcc;
  433. struct sk_buff *skb;
  434. int eff,error;
  435. const void __user *buff;
  436. int size;
  437. lock_sock(sk);
  438. if (sock->state != SS_CONNECTED) {
  439. error = -ENOTCONN;
  440. goto out;
  441. }
  442. if (m->msg_name) {
  443. error = -EISCONN;
  444. goto out;
  445. }
  446. if (m->msg_iovlen != 1) {
  447. error = -ENOSYS; /* fix this later @@@ */
  448. goto out;
  449. }
  450. buff = m->msg_iov->iov_base;
  451. size = m->msg_iov->iov_len;
  452. vcc = ATM_SD(sock);
  453. if (test_bit(ATM_VF_RELEASED, &vcc->flags) ||
  454. test_bit(ATM_VF_CLOSE, &vcc->flags) ||
  455. !test_bit(ATM_VF_READY, &vcc->flags)) {
  456. error = -EPIPE;
  457. send_sig(SIGPIPE, current, 0);
  458. goto out;
  459. }
  460. if (!size) {
  461. error = 0;
  462. goto out;
  463. }
  464. if (size < 0 || size > vcc->qos.txtp.max_sdu) {
  465. error = -EMSGSIZE;
  466. goto out;
  467. }
  468. eff = (size+3) & ~3; /* align to word boundary */
  469. prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
  470. error = 0;
  471. while (!(skb = alloc_tx(vcc,eff))) {
  472. if (m->msg_flags & MSG_DONTWAIT) {
  473. error = -EAGAIN;
  474. break;
  475. }
  476. schedule();
  477. if (signal_pending(current)) {
  478. error = -ERESTARTSYS;
  479. break;
  480. }
  481. if (test_bit(ATM_VF_RELEASED,&vcc->flags) ||
  482. test_bit(ATM_VF_CLOSE,&vcc->flags) ||
  483. !test_bit(ATM_VF_READY,&vcc->flags)) {
  484. error = -EPIPE;
  485. send_sig(SIGPIPE, current, 0);
  486. break;
  487. }
  488. prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
  489. }
  490. finish_wait(sk->sk_sleep, &wait);
  491. if (error)
  492. goto out;
  493. skb->dev = NULL; /* for paths shared with net_device interfaces */
  494. ATM_SKB(skb)->atm_options = vcc->atm_options;
  495. if (copy_from_user(skb_put(skb,size),buff,size)) {
  496. kfree_skb(skb);
  497. error = -EFAULT;
  498. goto out;
  499. }
  500. if (eff != size) memset(skb->data+size,0,eff-size);
  501. error = vcc->dev->ops->send(vcc,skb);
  502. error = error ? error : size;
  503. out:
  504. release_sock(sk);
  505. return error;
  506. }
  507. unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
  508. {
  509. struct sock *sk = sock->sk;
  510. struct atm_vcc *vcc;
  511. unsigned int mask;
  512. poll_wait(file, sk->sk_sleep, wait);
  513. mask = 0;
  514. vcc = ATM_SD(sock);
  515. /* exceptional events */
  516. if (sk->sk_err)
  517. mask = POLLERR;
  518. if (test_bit(ATM_VF_RELEASED, &vcc->flags) ||
  519. test_bit(ATM_VF_CLOSE, &vcc->flags))
  520. mask |= POLLHUP;
  521. /* readable? */
  522. if (!skb_queue_empty(&sk->sk_receive_queue))
  523. mask |= POLLIN | POLLRDNORM;
  524. /* writable? */
  525. if (sock->state == SS_CONNECTING &&
  526. test_bit(ATM_VF_WAITING, &vcc->flags))
  527. return mask;
  528. if (vcc->qos.txtp.traffic_class != ATM_NONE &&
  529. vcc_writable(sk))
  530. mask |= POLLOUT | POLLWRNORM | POLLWRBAND;
  531. return mask;
  532. }
  533. static int atm_change_qos(struct atm_vcc *vcc,struct atm_qos *qos)
  534. {
  535. int error;
  536. /*
  537. * Don't let the QoS change the already connected AAL type nor the
  538. * traffic class.
  539. */
  540. if (qos->aal != vcc->qos.aal ||
  541. qos->rxtp.traffic_class != vcc->qos.rxtp.traffic_class ||
  542. qos->txtp.traffic_class != vcc->qos.txtp.traffic_class)
  543. return -EINVAL;
  544. error = adjust_tp(&qos->txtp,qos->aal);
  545. if (!error) error = adjust_tp(&qos->rxtp,qos->aal);
  546. if (error) return error;
  547. if (!vcc->dev->ops->change_qos) return -EOPNOTSUPP;
  548. if (sk_atm(vcc)->sk_family == AF_ATMPVC)
  549. return vcc->dev->ops->change_qos(vcc,qos,ATM_MF_SET);
  550. return svc_change_qos(vcc,qos);
  551. }
  552. static int check_tp(struct atm_trafprm *tp)
  553. {
  554. /* @@@ Should be merged with adjust_tp */
  555. if (!tp->traffic_class || tp->traffic_class == ATM_ANYCLASS) return 0;
  556. if (tp->traffic_class != ATM_UBR && !tp->min_pcr && !tp->pcr &&
  557. !tp->max_pcr) return -EINVAL;
  558. if (tp->min_pcr == ATM_MAX_PCR) return -EINVAL;
  559. if (tp->min_pcr && tp->max_pcr && tp->max_pcr != ATM_MAX_PCR &&
  560. tp->min_pcr > tp->max_pcr) return -EINVAL;
  561. /*
  562. * We allow pcr to be outside [min_pcr,max_pcr], because later
  563. * adjustment may still push it in the valid range.
  564. */
  565. return 0;
  566. }
  567. static int check_qos(struct atm_qos *qos)
  568. {
  569. int error;
  570. if (!qos->txtp.traffic_class && !qos->rxtp.traffic_class)
  571. return -EINVAL;
  572. if (qos->txtp.traffic_class != qos->rxtp.traffic_class &&
  573. qos->txtp.traffic_class && qos->rxtp.traffic_class &&
  574. qos->txtp.traffic_class != ATM_ANYCLASS &&
  575. qos->rxtp.traffic_class != ATM_ANYCLASS) return -EINVAL;
  576. error = check_tp(&qos->txtp);
  577. if (error) return error;
  578. return check_tp(&qos->rxtp);
  579. }
  580. int vcc_setsockopt(struct socket *sock, int level, int optname,
  581. char __user *optval, int optlen)
  582. {
  583. struct atm_vcc *vcc;
  584. unsigned long value;
  585. int error;
  586. if (__SO_LEVEL_MATCH(optname, level) && optlen != __SO_SIZE(optname))
  587. return -EINVAL;
  588. vcc = ATM_SD(sock);
  589. switch (optname) {
  590. case SO_ATMQOS:
  591. {
  592. struct atm_qos qos;
  593. if (copy_from_user(&qos,optval,sizeof(qos)))
  594. return -EFAULT;
  595. error = check_qos(&qos);
  596. if (error) return error;
  597. if (sock->state == SS_CONNECTED)
  598. return atm_change_qos(vcc,&qos);
  599. if (sock->state != SS_UNCONNECTED)
  600. return -EBADFD;
  601. vcc->qos = qos;
  602. set_bit(ATM_VF_HASQOS,&vcc->flags);
  603. return 0;
  604. }
  605. case SO_SETCLP:
  606. if (get_user(value,(unsigned long __user *)optval))
  607. return -EFAULT;
  608. if (value) vcc->atm_options |= ATM_ATMOPT_CLP;
  609. else vcc->atm_options &= ~ATM_ATMOPT_CLP;
  610. return 0;
  611. default:
  612. if (level == SOL_SOCKET) return -EINVAL;
  613. break;
  614. }
  615. if (!vcc->dev || !vcc->dev->ops->setsockopt) return -EINVAL;
  616. return vcc->dev->ops->setsockopt(vcc,level,optname,optval,optlen);
  617. }
  618. int vcc_getsockopt(struct socket *sock, int level, int optname,
  619. char __user *optval, int __user *optlen)
  620. {
  621. struct atm_vcc *vcc;
  622. int len;
  623. if (get_user(len, optlen))
  624. return -EFAULT;
  625. if (__SO_LEVEL_MATCH(optname, level) && len != __SO_SIZE(optname))
  626. return -EINVAL;
  627. vcc = ATM_SD(sock);
  628. switch (optname) {
  629. case SO_ATMQOS:
  630. if (!test_bit(ATM_VF_HASQOS,&vcc->flags))
  631. return -EINVAL;
  632. return copy_to_user(optval,&vcc->qos,sizeof(vcc->qos)) ?
  633. -EFAULT : 0;
  634. case SO_SETCLP:
  635. return put_user(vcc->atm_options & ATM_ATMOPT_CLP ? 1 :
  636. 0,(unsigned long __user *)optval) ? -EFAULT : 0;
  637. case SO_ATMPVC:
  638. {
  639. struct sockaddr_atmpvc pvc;
  640. if (!vcc->dev ||
  641. !test_bit(ATM_VF_ADDR,&vcc->flags))
  642. return -ENOTCONN;
  643. pvc.sap_family = AF_ATMPVC;
  644. pvc.sap_addr.itf = vcc->dev->number;
  645. pvc.sap_addr.vpi = vcc->vpi;
  646. pvc.sap_addr.vci = vcc->vci;
  647. return copy_to_user(optval,&pvc,sizeof(pvc)) ?
  648. -EFAULT : 0;
  649. }
  650. default:
  651. if (level == SOL_SOCKET) return -EINVAL;
  652. break;
  653. }
  654. if (!vcc->dev || !vcc->dev->ops->getsockopt) return -EINVAL;
  655. return vcc->dev->ops->getsockopt(vcc, level, optname, optval, len);
  656. }
  657. static int __init atm_init(void)
  658. {
  659. int error;
  660. if ((error = proto_register(&vcc_proto, 0)) < 0)
  661. goto out;
  662. if ((error = atmpvc_init()) < 0) {
  663. printk(KERN_ERR "atmpvc_init() failed with %d\n", error);
  664. goto out_unregister_vcc_proto;
  665. }
  666. if ((error = atmsvc_init()) < 0) {
  667. printk(KERN_ERR "atmsvc_init() failed with %d\n", error);
  668. goto out_atmpvc_exit;
  669. }
  670. if ((error = atm_proc_init()) < 0) {
  671. printk(KERN_ERR "atm_proc_init() failed with %d\n",error);
  672. goto out_atmsvc_exit;
  673. }
  674. out:
  675. return error;
  676. out_atmsvc_exit:
  677. atmsvc_exit();
  678. out_atmpvc_exit:
  679. atmsvc_exit();
  680. out_unregister_vcc_proto:
  681. proto_unregister(&vcc_proto);
  682. goto out;
  683. }
  684. static void __exit atm_exit(void)
  685. {
  686. atm_proc_exit();
  687. atmsvc_exit();
  688. atmpvc_exit();
  689. proto_unregister(&vcc_proto);
  690. }
  691. module_init(atm_init);
  692. module_exit(atm_exit);
  693. MODULE_LICENSE("GPL");
  694. MODULE_ALIAS_NETPROTO(PF_ATMPVC);
  695. MODULE_ALIAS_NETPROTO(PF_ATMSVC);