PageRenderTime 61ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/isdn/mISDN/socket.c

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