PageRenderTime 730ms CodeModel.GetById 14ms RepoModel.GetById 20ms app.codeStats 0ms

/drivers/isdn/mISDN/socket.c

https://gitlab.com/kush/linux
C | 833 lines | 703 code | 113 blank | 17 comment | 120 complexity | 88b784c46b777d18463eb60eaa84a7f9 MD5 | raw file
  1. /*
  2. *
  3. * Author Karsten Keil <kkeil@novell.com>
  4. *
  5. * Copyright 2008 by Karsten Keil <kkeil@novell.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. */
  17. #include <linux/mISDNif.h>
  18. #include <linux/slab.h>
  19. #include <linux/export.h>
  20. #include "core.h"
  21. static u_int *debug;
  22. static struct proto mISDN_proto = {
  23. .name = "misdn",
  24. .owner = THIS_MODULE,
  25. .obj_size = sizeof(struct mISDN_sock)
  26. };
  27. #define _pms(sk) ((struct mISDN_sock *)sk)
  28. static struct mISDN_sock_list data_sockets = {
  29. .lock = __RW_LOCK_UNLOCKED(data_sockets.lock)
  30. };
  31. static struct mISDN_sock_list base_sockets = {
  32. .lock = __RW_LOCK_UNLOCKED(base_sockets.lock)
  33. };
  34. #define L2_HEADER_LEN 4
  35. static inline struct sk_buff *
  36. _l2_alloc_skb(unsigned int len, gfp_t gfp_mask)
  37. {
  38. struct sk_buff *skb;
  39. skb = alloc_skb(len + L2_HEADER_LEN, gfp_mask);
  40. if (likely(skb))
  41. skb_reserve(skb, L2_HEADER_LEN);
  42. return skb;
  43. }
  44. static void
  45. mISDN_sock_link(struct mISDN_sock_list *l, struct sock *sk)
  46. {
  47. write_lock_bh(&l->lock);
  48. sk_add_node(sk, &l->head);
  49. write_unlock_bh(&l->lock);
  50. }
  51. static void mISDN_sock_unlink(struct mISDN_sock_list *l, struct sock *sk)
  52. {
  53. write_lock_bh(&l->lock);
  54. sk_del_node_init(sk);
  55. write_unlock_bh(&l->lock);
  56. }
  57. static int
  58. mISDN_send(struct mISDNchannel *ch, struct sk_buff *skb)
  59. {
  60. struct mISDN_sock *msk;
  61. int err;
  62. msk = container_of(ch, struct mISDN_sock, ch);
  63. if (*debug & DEBUG_SOCKET)
  64. printk(KERN_DEBUG "%s len %d %p\n", __func__, skb->len, skb);
  65. if (msk->sk.sk_state == MISDN_CLOSED)
  66. return -EUNATCH;
  67. __net_timestamp(skb);
  68. err = sock_queue_rcv_skb(&msk->sk, skb);
  69. if (err)
  70. printk(KERN_WARNING "%s: error %d\n", __func__, err);
  71. return err;
  72. }
  73. static int
  74. mISDN_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
  75. {
  76. struct mISDN_sock *msk;
  77. msk = container_of(ch, struct mISDN_sock, ch);
  78. if (*debug & DEBUG_SOCKET)
  79. printk(KERN_DEBUG "%s(%p, %x, %p)\n", __func__, ch, cmd, arg);
  80. switch (cmd) {
  81. case CLOSE_CHANNEL:
  82. msk->sk.sk_state = MISDN_CLOSED;
  83. break;
  84. }
  85. return 0;
  86. }
  87. static inline void
  88. mISDN_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
  89. {
  90. struct __kernel_old_timeval tv;
  91. if (_pms(sk)->cmask & MISDN_TIME_STAMP) {
  92. skb_get_timestamp(skb, &tv);
  93. put_cmsg(msg, SOL_MISDN, MISDN_TIME_STAMP, sizeof(tv), &tv);
  94. }
  95. }
  96. static int
  97. mISDN_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
  98. int flags)
  99. {
  100. struct sk_buff *skb;
  101. struct sock *sk = sock->sk;
  102. int copied, err;
  103. if (*debug & DEBUG_SOCKET)
  104. printk(KERN_DEBUG "%s: len %d, flags %x ch.nr %d, proto %x\n",
  105. __func__, (int)len, flags, _pms(sk)->ch.nr,
  106. sk->sk_protocol);
  107. if (flags & (MSG_OOB))
  108. return -EOPNOTSUPP;
  109. if (sk->sk_state == MISDN_CLOSED)
  110. return 0;
  111. skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err);
  112. if (!skb)
  113. return err;
  114. if (msg->msg_name) {
  115. DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name);
  116. maddr->family = AF_ISDN;
  117. maddr->dev = _pms(sk)->dev->id;
  118. if ((sk->sk_protocol == ISDN_P_LAPD_TE) ||
  119. (sk->sk_protocol == ISDN_P_LAPD_NT)) {
  120. maddr->channel = (mISDN_HEAD_ID(skb) >> 16) & 0xff;
  121. maddr->tei = (mISDN_HEAD_ID(skb) >> 8) & 0xff;
  122. maddr->sapi = mISDN_HEAD_ID(skb) & 0xff;
  123. } else {
  124. maddr->channel = _pms(sk)->ch.nr;
  125. maddr->sapi = _pms(sk)->ch.addr & 0xFF;
  126. maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xFF;
  127. }
  128. msg->msg_namelen = sizeof(*maddr);
  129. }
  130. copied = skb->len + MISDN_HEADER_LEN;
  131. if (len < copied) {
  132. if (flags & MSG_PEEK)
  133. refcount_dec(&skb->users);
  134. else
  135. skb_queue_head(&sk->sk_receive_queue, skb);
  136. return -ENOSPC;
  137. }
  138. memcpy(skb_push(skb, MISDN_HEADER_LEN), mISDN_HEAD_P(skb),
  139. MISDN_HEADER_LEN);
  140. err = skb_copy_datagram_msg(skb, 0, msg, copied);
  141. mISDN_sock_cmsg(sk, msg, skb);
  142. skb_free_datagram(sk, skb);
  143. return err ? : copied;
  144. }
  145. static int
  146. mISDN_sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
  147. {
  148. struct sock *sk = sock->sk;
  149. struct sk_buff *skb;
  150. int err = -ENOMEM;
  151. if (*debug & DEBUG_SOCKET)
  152. printk(KERN_DEBUG "%s: len %d flags %x ch %d proto %x\n",
  153. __func__, (int)len, msg->msg_flags, _pms(sk)->ch.nr,
  154. sk->sk_protocol);
  155. if (msg->msg_flags & MSG_OOB)
  156. return -EOPNOTSUPP;
  157. if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_NOSIGNAL | MSG_ERRQUEUE))
  158. return -EINVAL;
  159. if (len < MISDN_HEADER_LEN)
  160. return -EINVAL;
  161. if (sk->sk_state != MISDN_BOUND)
  162. return -EBADFD;
  163. lock_sock(sk);
  164. skb = _l2_alloc_skb(len, GFP_KERNEL);
  165. if (!skb)
  166. goto done;
  167. if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
  168. err = -EFAULT;
  169. goto done;
  170. }
  171. memcpy(mISDN_HEAD_P(skb), skb->data, MISDN_HEADER_LEN);
  172. skb_pull(skb, MISDN_HEADER_LEN);
  173. if (msg->msg_namelen >= sizeof(struct sockaddr_mISDN)) {
  174. /* if we have a address, we use it */
  175. DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name);
  176. mISDN_HEAD_ID(skb) = maddr->channel;
  177. } else { /* use default for L2 messages */
  178. if ((sk->sk_protocol == ISDN_P_LAPD_TE) ||
  179. (sk->sk_protocol == ISDN_P_LAPD_NT))
  180. mISDN_HEAD_ID(skb) = _pms(sk)->ch.nr;
  181. }
  182. if (*debug & DEBUG_SOCKET)
  183. printk(KERN_DEBUG "%s: ID:%x\n",
  184. __func__, mISDN_HEAD_ID(skb));
  185. err = -ENODEV;
  186. if (!_pms(sk)->ch.peer)
  187. goto done;
  188. err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb);
  189. if (err)
  190. goto done;
  191. else {
  192. skb = NULL;
  193. err = len;
  194. }
  195. done:
  196. kfree_skb(skb);
  197. release_sock(sk);
  198. return err;
  199. }
  200. static int
  201. data_sock_release(struct socket *sock)
  202. {
  203. struct sock *sk = sock->sk;
  204. if (*debug & DEBUG_SOCKET)
  205. printk(KERN_DEBUG "%s(%p) sk=%p\n", __func__, sock, sk);
  206. if (!sk)
  207. return 0;
  208. switch (sk->sk_protocol) {
  209. case ISDN_P_TE_S0:
  210. case ISDN_P_NT_S0:
  211. case ISDN_P_TE_E1:
  212. case ISDN_P_NT_E1:
  213. if (sk->sk_state == MISDN_BOUND)
  214. delete_channel(&_pms(sk)->ch);
  215. else
  216. mISDN_sock_unlink(&data_sockets, sk);
  217. break;
  218. case ISDN_P_LAPD_TE:
  219. case ISDN_P_LAPD_NT:
  220. case ISDN_P_B_RAW:
  221. case ISDN_P_B_HDLC:
  222. case ISDN_P_B_X75SLP:
  223. case ISDN_P_B_L2DTMF:
  224. case ISDN_P_B_L2DSP:
  225. case ISDN_P_B_L2DSPHDLC:
  226. delete_channel(&_pms(sk)->ch);
  227. mISDN_sock_unlink(&data_sockets, sk);
  228. break;
  229. }
  230. lock_sock(sk);
  231. sock_orphan(sk);
  232. skb_queue_purge(&sk->sk_receive_queue);
  233. release_sock(sk);
  234. sock_put(sk);
  235. return 0;
  236. }
  237. static int
  238. data_sock_ioctl_bound(struct sock *sk, unsigned int cmd, void __user *p)
  239. {
  240. struct mISDN_ctrl_req cq;
  241. int err = -EINVAL, val[2];
  242. struct mISDNchannel *bchan, *next;
  243. lock_sock(sk);
  244. if (!_pms(sk)->dev) {
  245. err = -ENODEV;
  246. goto done;
  247. }
  248. switch (cmd) {
  249. case IMCTRLREQ:
  250. if (copy_from_user(&cq, p, sizeof(cq))) {
  251. err = -EFAULT;
  252. break;
  253. }
  254. if ((sk->sk_protocol & ~ISDN_P_B_MASK) == ISDN_P_B_START) {
  255. list_for_each_entry_safe(bchan, next,
  256. &_pms(sk)->dev->bchannels, list) {
  257. if (bchan->nr == cq.channel) {
  258. err = bchan->ctrl(bchan,
  259. CONTROL_CHANNEL, &cq);
  260. break;
  261. }
  262. }
  263. } else
  264. err = _pms(sk)->dev->D.ctrl(&_pms(sk)->dev->D,
  265. CONTROL_CHANNEL, &cq);
  266. if (err)
  267. break;
  268. if (copy_to_user(p, &cq, sizeof(cq)))
  269. err = -EFAULT;
  270. break;
  271. case IMCLEAR_L2:
  272. if (sk->sk_protocol != ISDN_P_LAPD_NT) {
  273. err = -EINVAL;
  274. break;
  275. }
  276. val[0] = cmd;
  277. if (get_user(val[1], (int __user *)p)) {
  278. err = -EFAULT;
  279. break;
  280. }
  281. err = _pms(sk)->dev->teimgr->ctrl(_pms(sk)->dev->teimgr,
  282. CONTROL_CHANNEL, val);
  283. break;
  284. case IMHOLD_L1:
  285. if (sk->sk_protocol != ISDN_P_LAPD_NT
  286. && sk->sk_protocol != ISDN_P_LAPD_TE) {
  287. err = -EINVAL;
  288. break;
  289. }
  290. val[0] = cmd;
  291. if (get_user(val[1], (int __user *)p)) {
  292. err = -EFAULT;
  293. break;
  294. }
  295. err = _pms(sk)->dev->teimgr->ctrl(_pms(sk)->dev->teimgr,
  296. CONTROL_CHANNEL, val);
  297. break;
  298. default:
  299. err = -EINVAL;
  300. break;
  301. }
  302. done:
  303. release_sock(sk);
  304. return err;
  305. }
  306. static int
  307. data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  308. {
  309. int err = 0, id;
  310. struct sock *sk = sock->sk;
  311. struct mISDNdevice *dev;
  312. struct mISDNversion ver;
  313. switch (cmd) {
  314. case IMGETVERSION:
  315. ver.major = MISDN_MAJOR_VERSION;
  316. ver.minor = MISDN_MINOR_VERSION;
  317. ver.release = MISDN_RELEASE;
  318. if (copy_to_user((void __user *)arg, &ver, sizeof(ver)))
  319. err = -EFAULT;
  320. break;
  321. case IMGETCOUNT:
  322. id = get_mdevice_count();
  323. if (put_user(id, (int __user *)arg))
  324. err = -EFAULT;
  325. break;
  326. case IMGETDEVINFO:
  327. if (get_user(id, (int __user *)arg)) {
  328. err = -EFAULT;
  329. break;
  330. }
  331. dev = get_mdevice(id);
  332. if (dev) {
  333. struct mISDN_devinfo di;
  334. memset(&di, 0, sizeof(di));
  335. di.id = dev->id;
  336. di.Dprotocols = dev->Dprotocols;
  337. di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
  338. di.protocol = dev->D.protocol;
  339. memcpy(di.channelmap, dev->channelmap,
  340. sizeof(di.channelmap));
  341. di.nrbchan = dev->nrbchan;
  342. strcpy(di.name, dev_name(&dev->dev));
  343. if (copy_to_user((void __user *)arg, &di, sizeof(di)))
  344. err = -EFAULT;
  345. } else
  346. err = -ENODEV;
  347. break;
  348. default:
  349. if (sk->sk_state == MISDN_BOUND)
  350. err = data_sock_ioctl_bound(sk, cmd,
  351. (void __user *)arg);
  352. else
  353. err = -ENOTCONN;
  354. }
  355. return err;
  356. }
  357. static int data_sock_setsockopt(struct socket *sock, int level, int optname,
  358. char __user *optval, unsigned int len)
  359. {
  360. struct sock *sk = sock->sk;
  361. int err = 0, opt = 0;
  362. if (*debug & DEBUG_SOCKET)
  363. printk(KERN_DEBUG "%s(%p, %d, %x, %p, %d)\n", __func__, sock,
  364. level, optname, optval, len);
  365. lock_sock(sk);
  366. switch (optname) {
  367. case MISDN_TIME_STAMP:
  368. if (get_user(opt, (int __user *)optval)) {
  369. err = -EFAULT;
  370. break;
  371. }
  372. if (opt)
  373. _pms(sk)->cmask |= MISDN_TIME_STAMP;
  374. else
  375. _pms(sk)->cmask &= ~MISDN_TIME_STAMP;
  376. break;
  377. default:
  378. err = -ENOPROTOOPT;
  379. break;
  380. }
  381. release_sock(sk);
  382. return err;
  383. }
  384. static int data_sock_getsockopt(struct socket *sock, int level, int optname,
  385. char __user *optval, int __user *optlen)
  386. {
  387. struct sock *sk = sock->sk;
  388. int len, opt;
  389. if (get_user(len, optlen))
  390. return -EFAULT;
  391. if (len != sizeof(char))
  392. return -EINVAL;
  393. switch (optname) {
  394. case MISDN_TIME_STAMP:
  395. if (_pms(sk)->cmask & MISDN_TIME_STAMP)
  396. opt = 1;
  397. else
  398. opt = 0;
  399. if (put_user(opt, optval))
  400. return -EFAULT;
  401. break;
  402. default:
  403. return -ENOPROTOOPT;
  404. }
  405. return 0;
  406. }
  407. static int
  408. data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
  409. {
  410. struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
  411. struct sock *sk = sock->sk;
  412. struct sock *csk;
  413. int err = 0;
  414. if (*debug & DEBUG_SOCKET)
  415. printk(KERN_DEBUG "%s(%p) sk=%p\n", __func__, sock, sk);
  416. if (addr_len != sizeof(struct sockaddr_mISDN))
  417. return -EINVAL;
  418. if (!maddr || maddr->family != AF_ISDN)
  419. return -EINVAL;
  420. lock_sock(sk);
  421. if (_pms(sk)->dev) {
  422. err = -EALREADY;
  423. goto done;
  424. }
  425. _pms(sk)->dev = get_mdevice(maddr->dev);
  426. if (!_pms(sk)->dev) {
  427. err = -ENODEV;
  428. goto done;
  429. }
  430. if (sk->sk_protocol < ISDN_P_B_START) {
  431. read_lock_bh(&data_sockets.lock);
  432. sk_for_each(csk, &data_sockets.head) {
  433. if (sk == csk)
  434. continue;
  435. if (_pms(csk)->dev != _pms(sk)->dev)
  436. continue;
  437. if (csk->sk_protocol >= ISDN_P_B_START)
  438. continue;
  439. if (IS_ISDN_P_TE(csk->sk_protocol)
  440. == IS_ISDN_P_TE(sk->sk_protocol))
  441. continue;
  442. read_unlock_bh(&data_sockets.lock);
  443. err = -EBUSY;
  444. goto done;
  445. }
  446. read_unlock_bh(&data_sockets.lock);
  447. }
  448. _pms(sk)->ch.send = mISDN_send;
  449. _pms(sk)->ch.ctrl = mISDN_ctrl;
  450. switch (sk->sk_protocol) {
  451. case ISDN_P_TE_S0:
  452. case ISDN_P_NT_S0:
  453. case ISDN_P_TE_E1:
  454. case ISDN_P_NT_E1:
  455. mISDN_sock_unlink(&data_sockets, sk);
  456. err = connect_layer1(_pms(sk)->dev, &_pms(sk)->ch,
  457. sk->sk_protocol, maddr);
  458. if (err)
  459. mISDN_sock_link(&data_sockets, sk);
  460. break;
  461. case ISDN_P_LAPD_TE:
  462. case ISDN_P_LAPD_NT:
  463. err = create_l2entity(_pms(sk)->dev, &_pms(sk)->ch,
  464. sk->sk_protocol, maddr);
  465. break;
  466. case ISDN_P_B_RAW:
  467. case ISDN_P_B_HDLC:
  468. case ISDN_P_B_X75SLP:
  469. case ISDN_P_B_L2DTMF:
  470. case ISDN_P_B_L2DSP:
  471. case ISDN_P_B_L2DSPHDLC:
  472. err = connect_Bstack(_pms(sk)->dev, &_pms(sk)->ch,
  473. sk->sk_protocol, maddr);
  474. break;
  475. default:
  476. err = -EPROTONOSUPPORT;
  477. }
  478. if (err)
  479. goto done;
  480. sk->sk_state = MISDN_BOUND;
  481. _pms(sk)->ch.protocol = sk->sk_protocol;
  482. done:
  483. release_sock(sk);
  484. return err;
  485. }
  486. static int
  487. data_sock_getname(struct socket *sock, struct sockaddr *addr,
  488. int peer)
  489. {
  490. struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
  491. struct sock *sk = sock->sk;
  492. if (!_pms(sk)->dev)
  493. return -EBADFD;
  494. lock_sock(sk);
  495. maddr->family = AF_ISDN;
  496. maddr->dev = _pms(sk)->dev->id;
  497. maddr->channel = _pms(sk)->ch.nr;
  498. maddr->sapi = _pms(sk)->ch.addr & 0xff;
  499. maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xff;
  500. release_sock(sk);
  501. return sizeof(*maddr);
  502. }
  503. static const struct proto_ops data_sock_ops = {
  504. .family = PF_ISDN,
  505. .owner = THIS_MODULE,
  506. .release = data_sock_release,
  507. .ioctl = data_sock_ioctl,
  508. .bind = data_sock_bind,
  509. .getname = data_sock_getname,
  510. .sendmsg = mISDN_sock_sendmsg,
  511. .recvmsg = mISDN_sock_recvmsg,
  512. .poll = datagram_poll,
  513. .listen = sock_no_listen,
  514. .shutdown = sock_no_shutdown,
  515. .setsockopt = data_sock_setsockopt,
  516. .getsockopt = data_sock_getsockopt,
  517. .connect = sock_no_connect,
  518. .socketpair = sock_no_socketpair,
  519. .accept = sock_no_accept,
  520. .mmap = sock_no_mmap
  521. };
  522. static int
  523. data_sock_create(struct net *net, struct socket *sock, int protocol, int kern)
  524. {
  525. struct sock *sk;
  526. if (sock->type != SOCK_DGRAM)
  527. return -ESOCKTNOSUPPORT;
  528. sk = sk_alloc(net, PF_ISDN, GFP_KERNEL, &mISDN_proto, kern);
  529. if (!sk)
  530. return -ENOMEM;
  531. sock_init_data(sock, sk);
  532. sock->ops = &data_sock_ops;
  533. sock->state = SS_UNCONNECTED;
  534. sock_reset_flag(sk, SOCK_ZAPPED);
  535. sk->sk_protocol = protocol;
  536. sk->sk_state = MISDN_OPEN;
  537. mISDN_sock_link(&data_sockets, sk);
  538. return 0;
  539. }
  540. static int
  541. base_sock_release(struct socket *sock)
  542. {
  543. struct sock *sk = sock->sk;
  544. printk(KERN_DEBUG "%s(%p) sk=%p\n", __func__, sock, sk);
  545. if (!sk)
  546. return 0;
  547. mISDN_sock_unlink(&base_sockets, sk);
  548. sock_orphan(sk);
  549. sock_put(sk);
  550. return 0;
  551. }
  552. static int
  553. base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
  554. {
  555. int err = 0, id;
  556. struct mISDNdevice *dev;
  557. struct mISDNversion ver;
  558. switch (cmd) {
  559. case IMGETVERSION:
  560. ver.major = MISDN_MAJOR_VERSION;
  561. ver.minor = MISDN_MINOR_VERSION;
  562. ver.release = MISDN_RELEASE;
  563. if (copy_to_user((void __user *)arg, &ver, sizeof(ver)))
  564. err = -EFAULT;
  565. break;
  566. case IMGETCOUNT:
  567. id = get_mdevice_count();
  568. if (put_user(id, (int __user *)arg))
  569. err = -EFAULT;
  570. break;
  571. case IMGETDEVINFO:
  572. if (get_user(id, (int __user *)arg)) {
  573. err = -EFAULT;
  574. break;
  575. }
  576. dev = get_mdevice(id);
  577. if (dev) {
  578. struct mISDN_devinfo di;
  579. memset(&di, 0, sizeof(di));
  580. di.id = dev->id;
  581. di.Dprotocols = dev->Dprotocols;
  582. di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
  583. di.protocol = dev->D.protocol;
  584. memcpy(di.channelmap, dev->channelmap,
  585. sizeof(di.channelmap));
  586. di.nrbchan = dev->nrbchan;
  587. strcpy(di.name, dev_name(&dev->dev));
  588. if (copy_to_user((void __user *)arg, &di, sizeof(di)))
  589. err = -EFAULT;
  590. } else
  591. err = -ENODEV;
  592. break;
  593. case IMSETDEVNAME:
  594. {
  595. struct mISDN_devrename dn;
  596. if (copy_from_user(&dn, (void __user *)arg,
  597. sizeof(dn))) {
  598. err = -EFAULT;
  599. break;
  600. }
  601. dev = get_mdevice(dn.id);
  602. if (dev)
  603. err = device_rename(&dev->dev, dn.name);
  604. else
  605. err = -ENODEV;
  606. }
  607. break;
  608. default:
  609. err = -EINVAL;
  610. }
  611. return err;
  612. }
  613. static int
  614. base_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
  615. {
  616. struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
  617. struct sock *sk = sock->sk;
  618. int err = 0;
  619. if (addr_len < sizeof(struct sockaddr_mISDN))
  620. return -EINVAL;
  621. if (!maddr || maddr->family != AF_ISDN)
  622. return -EINVAL;
  623. lock_sock(sk);
  624. if (_pms(sk)->dev) {
  625. err = -EALREADY;
  626. goto done;
  627. }
  628. _pms(sk)->dev = get_mdevice(maddr->dev);
  629. if (!_pms(sk)->dev) {
  630. err = -ENODEV;
  631. goto done;
  632. }
  633. sk->sk_state = MISDN_BOUND;
  634. done:
  635. release_sock(sk);
  636. return err;
  637. }
  638. static const struct proto_ops base_sock_ops = {
  639. .family = PF_ISDN,
  640. .owner = THIS_MODULE,
  641. .release = base_sock_release,
  642. .ioctl = base_sock_ioctl,
  643. .bind = base_sock_bind,
  644. .getname = sock_no_getname,
  645. .sendmsg = sock_no_sendmsg,
  646. .recvmsg = sock_no_recvmsg,
  647. .listen = sock_no_listen,
  648. .shutdown = sock_no_shutdown,
  649. .setsockopt = sock_no_setsockopt,
  650. .getsockopt = sock_no_getsockopt,
  651. .connect = sock_no_connect,
  652. .socketpair = sock_no_socketpair,
  653. .accept = sock_no_accept,
  654. .mmap = sock_no_mmap
  655. };
  656. static int
  657. base_sock_create(struct net *net, struct socket *sock, int protocol, int kern)
  658. {
  659. struct sock *sk;
  660. if (sock->type != SOCK_RAW)
  661. return -ESOCKTNOSUPPORT;
  662. sk = sk_alloc(net, PF_ISDN, GFP_KERNEL, &mISDN_proto, kern);
  663. if (!sk)
  664. return -ENOMEM;
  665. sock_init_data(sock, sk);
  666. sock->ops = &base_sock_ops;
  667. sock->state = SS_UNCONNECTED;
  668. sock_reset_flag(sk, SOCK_ZAPPED);
  669. sk->sk_protocol = protocol;
  670. sk->sk_state = MISDN_OPEN;
  671. mISDN_sock_link(&base_sockets, sk);
  672. return 0;
  673. }
  674. static int
  675. mISDN_sock_create(struct net *net, struct socket *sock, int proto, int kern)
  676. {
  677. int err = -EPROTONOSUPPORT;
  678. switch (proto) {
  679. case ISDN_P_BASE:
  680. err = base_sock_create(net, sock, proto, kern);
  681. break;
  682. case ISDN_P_TE_S0:
  683. case ISDN_P_NT_S0:
  684. case ISDN_P_TE_E1:
  685. case ISDN_P_NT_E1:
  686. case ISDN_P_LAPD_TE:
  687. case ISDN_P_LAPD_NT:
  688. case ISDN_P_B_RAW:
  689. case ISDN_P_B_HDLC:
  690. case ISDN_P_B_X75SLP:
  691. case ISDN_P_B_L2DTMF:
  692. case ISDN_P_B_L2DSP:
  693. case ISDN_P_B_L2DSPHDLC:
  694. err = data_sock_create(net, sock, proto, kern);
  695. break;
  696. default:
  697. return err;
  698. }
  699. return err;
  700. }
  701. static const struct net_proto_family mISDN_sock_family_ops = {
  702. .owner = THIS_MODULE,
  703. .family = PF_ISDN,
  704. .create = mISDN_sock_create,
  705. };
  706. int
  707. misdn_sock_init(u_int *deb)
  708. {
  709. int err;
  710. debug = deb;
  711. err = sock_register(&mISDN_sock_family_ops);
  712. if (err)
  713. printk(KERN_ERR "%s: error(%d)\n", __func__, err);
  714. return err;
  715. }
  716. void
  717. misdn_sock_cleanup(void)
  718. {
  719. sock_unregister(PF_ISDN);
  720. }