Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *
0004  * Author   Karsten Keil <kkeil@novell.com>
0005  *
0006  * Copyright 2008  by Karsten Keil <kkeil@novell.com>
0007  */
0008 
0009 #include <linux/mISDNif.h>
0010 #include <linux/slab.h>
0011 #include <linux/export.h>
0012 #include "core.h"
0013 
0014 static u_int    *debug;
0015 
0016 static struct proto mISDN_proto = {
0017     .name       = "misdn",
0018     .owner      = THIS_MODULE,
0019     .obj_size   = sizeof(struct mISDN_sock)
0020 };
0021 
0022 #define _pms(sk)    ((struct mISDN_sock *)sk)
0023 
0024 static struct mISDN_sock_list   data_sockets = {
0025     .lock = __RW_LOCK_UNLOCKED(data_sockets.lock)
0026 };
0027 
0028 static struct mISDN_sock_list   base_sockets = {
0029     .lock = __RW_LOCK_UNLOCKED(base_sockets.lock)
0030 };
0031 
0032 #define L2_HEADER_LEN   4
0033 
0034 static inline struct sk_buff *
0035 _l2_alloc_skb(unsigned int len, gfp_t gfp_mask)
0036 {
0037     struct sk_buff  *skb;
0038 
0039     skb = alloc_skb(len + L2_HEADER_LEN, gfp_mask);
0040     if (likely(skb))
0041         skb_reserve(skb, L2_HEADER_LEN);
0042     return skb;
0043 }
0044 
0045 static void
0046 mISDN_sock_link(struct mISDN_sock_list *l, struct sock *sk)
0047 {
0048     write_lock_bh(&l->lock);
0049     sk_add_node(sk, &l->head);
0050     write_unlock_bh(&l->lock);
0051 }
0052 
0053 static void mISDN_sock_unlink(struct mISDN_sock_list *l, struct sock *sk)
0054 {
0055     write_lock_bh(&l->lock);
0056     sk_del_node_init(sk);
0057     write_unlock_bh(&l->lock);
0058 }
0059 
0060 static int
0061 mISDN_send(struct mISDNchannel *ch, struct sk_buff *skb)
0062 {
0063     struct mISDN_sock *msk;
0064     int err;
0065 
0066     msk = container_of(ch, struct mISDN_sock, ch);
0067     if (*debug & DEBUG_SOCKET)
0068         printk(KERN_DEBUG "%s len %d %p\n", __func__, skb->len, skb);
0069     if (msk->sk.sk_state == MISDN_CLOSED)
0070         return -EUNATCH;
0071     __net_timestamp(skb);
0072     err = sock_queue_rcv_skb(&msk->sk, skb);
0073     if (err)
0074         printk(KERN_WARNING "%s: error %d\n", __func__, err);
0075     return err;
0076 }
0077 
0078 static int
0079 mISDN_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
0080 {
0081     struct mISDN_sock *msk;
0082 
0083     msk = container_of(ch, struct mISDN_sock, ch);
0084     if (*debug & DEBUG_SOCKET)
0085         printk(KERN_DEBUG "%s(%p, %x, %p)\n", __func__, ch, cmd, arg);
0086     switch (cmd) {
0087     case CLOSE_CHANNEL:
0088         msk->sk.sk_state = MISDN_CLOSED;
0089         break;
0090     }
0091     return 0;
0092 }
0093 
0094 static inline void
0095 mISDN_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
0096 {
0097     struct __kernel_old_timeval tv;
0098 
0099     if (_pms(sk)->cmask & MISDN_TIME_STAMP) {
0100         skb_get_timestamp(skb, &tv);
0101         put_cmsg(msg, SOL_MISDN, MISDN_TIME_STAMP, sizeof(tv), &tv);
0102     }
0103 }
0104 
0105 static int
0106 mISDN_sock_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
0107            int flags)
0108 {
0109     struct sk_buff      *skb;
0110     struct sock     *sk = sock->sk;
0111 
0112     int     copied, err;
0113 
0114     if (*debug & DEBUG_SOCKET)
0115         printk(KERN_DEBUG "%s: len %d, flags %x ch.nr %d, proto %x\n",
0116                __func__, (int)len, flags, _pms(sk)->ch.nr,
0117                sk->sk_protocol);
0118     if (flags & (MSG_OOB))
0119         return -EOPNOTSUPP;
0120 
0121     if (sk->sk_state == MISDN_CLOSED)
0122         return 0;
0123 
0124     skb = skb_recv_datagram(sk, flags, &err);
0125     if (!skb)
0126         return err;
0127 
0128     if (msg->msg_name) {
0129         DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name);
0130 
0131         maddr->family = AF_ISDN;
0132         maddr->dev = _pms(sk)->dev->id;
0133         if ((sk->sk_protocol == ISDN_P_LAPD_TE) ||
0134             (sk->sk_protocol == ISDN_P_LAPD_NT)) {
0135             maddr->channel = (mISDN_HEAD_ID(skb) >> 16) & 0xff;
0136             maddr->tei =  (mISDN_HEAD_ID(skb) >> 8) & 0xff;
0137             maddr->sapi = mISDN_HEAD_ID(skb) & 0xff;
0138         } else {
0139             maddr->channel = _pms(sk)->ch.nr;
0140             maddr->sapi = _pms(sk)->ch.addr & 0xFF;
0141             maddr->tei =  (_pms(sk)->ch.addr >> 8) & 0xFF;
0142         }
0143         msg->msg_namelen = sizeof(*maddr);
0144     }
0145 
0146     copied = skb->len + MISDN_HEADER_LEN;
0147     if (len < copied) {
0148         if (flags & MSG_PEEK)
0149             refcount_dec(&skb->users);
0150         else
0151             skb_queue_head(&sk->sk_receive_queue, skb);
0152         return -ENOSPC;
0153     }
0154     memcpy(skb_push(skb, MISDN_HEADER_LEN), mISDN_HEAD_P(skb),
0155            MISDN_HEADER_LEN);
0156 
0157     err = skb_copy_datagram_msg(skb, 0, msg, copied);
0158 
0159     mISDN_sock_cmsg(sk, msg, skb);
0160 
0161     skb_free_datagram(sk, skb);
0162 
0163     return err ? : copied;
0164 }
0165 
0166 static int
0167 mISDN_sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
0168 {
0169     struct sock     *sk = sock->sk;
0170     struct sk_buff      *skb;
0171     int         err = -ENOMEM;
0172 
0173     if (*debug & DEBUG_SOCKET)
0174         printk(KERN_DEBUG "%s: len %d flags %x ch %d proto %x\n",
0175                __func__, (int)len, msg->msg_flags, _pms(sk)->ch.nr,
0176                sk->sk_protocol);
0177 
0178     if (msg->msg_flags & MSG_OOB)
0179         return -EOPNOTSUPP;
0180 
0181     if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_NOSIGNAL | MSG_ERRQUEUE))
0182         return -EINVAL;
0183 
0184     if (len < MISDN_HEADER_LEN)
0185         return -EINVAL;
0186 
0187     if (sk->sk_state != MISDN_BOUND)
0188         return -EBADFD;
0189 
0190     lock_sock(sk);
0191 
0192     skb = _l2_alloc_skb(len, GFP_KERNEL);
0193     if (!skb)
0194         goto done;
0195 
0196     if (memcpy_from_msg(skb_put(skb, len), msg, len)) {
0197         err = -EFAULT;
0198         goto done;
0199     }
0200 
0201     memcpy(mISDN_HEAD_P(skb), skb->data, MISDN_HEADER_LEN);
0202     skb_pull(skb, MISDN_HEADER_LEN);
0203 
0204     if (msg->msg_namelen >= sizeof(struct sockaddr_mISDN)) {
0205         /* if we have a address, we use it */
0206         DECLARE_SOCKADDR(struct sockaddr_mISDN *, maddr, msg->msg_name);
0207         mISDN_HEAD_ID(skb) = maddr->channel;
0208     } else { /* use default for L2 messages */
0209         if ((sk->sk_protocol == ISDN_P_LAPD_TE) ||
0210             (sk->sk_protocol == ISDN_P_LAPD_NT))
0211             mISDN_HEAD_ID(skb) = _pms(sk)->ch.nr;
0212     }
0213 
0214     if (*debug & DEBUG_SOCKET)
0215         printk(KERN_DEBUG "%s: ID:%x\n",
0216                __func__, mISDN_HEAD_ID(skb));
0217 
0218     err = -ENODEV;
0219     if (!_pms(sk)->ch.peer)
0220         goto done;
0221     err = _pms(sk)->ch.recv(_pms(sk)->ch.peer, skb);
0222     if (err)
0223         goto done;
0224     else {
0225         skb = NULL;
0226         err = len;
0227     }
0228 
0229 done:
0230     kfree_skb(skb);
0231     release_sock(sk);
0232     return err;
0233 }
0234 
0235 static int
0236 data_sock_release(struct socket *sock)
0237 {
0238     struct sock *sk = sock->sk;
0239 
0240     if (*debug & DEBUG_SOCKET)
0241         printk(KERN_DEBUG "%s(%p) sk=%p\n", __func__, sock, sk);
0242     if (!sk)
0243         return 0;
0244     switch (sk->sk_protocol) {
0245     case ISDN_P_TE_S0:
0246     case ISDN_P_NT_S0:
0247     case ISDN_P_TE_E1:
0248     case ISDN_P_NT_E1:
0249         if (sk->sk_state == MISDN_BOUND)
0250             delete_channel(&_pms(sk)->ch);
0251         else
0252             mISDN_sock_unlink(&data_sockets, sk);
0253         break;
0254     case ISDN_P_LAPD_TE:
0255     case ISDN_P_LAPD_NT:
0256     case ISDN_P_B_RAW:
0257     case ISDN_P_B_HDLC:
0258     case ISDN_P_B_X75SLP:
0259     case ISDN_P_B_L2DTMF:
0260     case ISDN_P_B_L2DSP:
0261     case ISDN_P_B_L2DSPHDLC:
0262         delete_channel(&_pms(sk)->ch);
0263         mISDN_sock_unlink(&data_sockets, sk);
0264         break;
0265     }
0266 
0267     lock_sock(sk);
0268 
0269     sock_orphan(sk);
0270     skb_queue_purge(&sk->sk_receive_queue);
0271 
0272     release_sock(sk);
0273     sock_put(sk);
0274 
0275     return 0;
0276 }
0277 
0278 static int
0279 data_sock_ioctl_bound(struct sock *sk, unsigned int cmd, void __user *p)
0280 {
0281     struct mISDN_ctrl_req   cq;
0282     int         err = -EINVAL, val[2];
0283     struct mISDNchannel *bchan, *next;
0284 
0285     lock_sock(sk);
0286     if (!_pms(sk)->dev) {
0287         err = -ENODEV;
0288         goto done;
0289     }
0290     switch (cmd) {
0291     case IMCTRLREQ:
0292         if (copy_from_user(&cq, p, sizeof(cq))) {
0293             err = -EFAULT;
0294             break;
0295         }
0296         if ((sk->sk_protocol & ~ISDN_P_B_MASK) == ISDN_P_B_START) {
0297             list_for_each_entry_safe(bchan, next,
0298                          &_pms(sk)->dev->bchannels, list) {
0299                 if (bchan->nr == cq.channel) {
0300                     err = bchan->ctrl(bchan,
0301                               CONTROL_CHANNEL, &cq);
0302                     break;
0303                 }
0304             }
0305         } else
0306             err = _pms(sk)->dev->D.ctrl(&_pms(sk)->dev->D,
0307                             CONTROL_CHANNEL, &cq);
0308         if (err)
0309             break;
0310         if (copy_to_user(p, &cq, sizeof(cq)))
0311             err = -EFAULT;
0312         break;
0313     case IMCLEAR_L2:
0314         if (sk->sk_protocol != ISDN_P_LAPD_NT) {
0315             err = -EINVAL;
0316             break;
0317         }
0318         val[0] = cmd;
0319         if (get_user(val[1], (int __user *)p)) {
0320             err = -EFAULT;
0321             break;
0322         }
0323         err = _pms(sk)->dev->teimgr->ctrl(_pms(sk)->dev->teimgr,
0324                           CONTROL_CHANNEL, val);
0325         break;
0326     case IMHOLD_L1:
0327         if (sk->sk_protocol != ISDN_P_LAPD_NT
0328             && sk->sk_protocol != ISDN_P_LAPD_TE) {
0329             err = -EINVAL;
0330             break;
0331         }
0332         val[0] = cmd;
0333         if (get_user(val[1], (int __user *)p)) {
0334             err = -EFAULT;
0335             break;
0336         }
0337         err = _pms(sk)->dev->teimgr->ctrl(_pms(sk)->dev->teimgr,
0338                           CONTROL_CHANNEL, val);
0339         break;
0340     default:
0341         err = -EINVAL;
0342         break;
0343     }
0344 done:
0345     release_sock(sk);
0346     return err;
0347 }
0348 
0349 static int
0350 data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
0351 {
0352     int         err = 0, id;
0353     struct sock     *sk = sock->sk;
0354     struct mISDNdevice  *dev;
0355     struct mISDNversion ver;
0356 
0357     switch (cmd) {
0358     case IMGETVERSION:
0359         ver.major = MISDN_MAJOR_VERSION;
0360         ver.minor = MISDN_MINOR_VERSION;
0361         ver.release = MISDN_RELEASE;
0362         if (copy_to_user((void __user *)arg, &ver, sizeof(ver)))
0363             err = -EFAULT;
0364         break;
0365     case IMGETCOUNT:
0366         id = get_mdevice_count();
0367         if (put_user(id, (int __user *)arg))
0368             err = -EFAULT;
0369         break;
0370     case IMGETDEVINFO:
0371         if (get_user(id, (int __user *)arg)) {
0372             err = -EFAULT;
0373             break;
0374         }
0375         dev = get_mdevice(id);
0376         if (dev) {
0377             struct mISDN_devinfo di;
0378 
0379             memset(&di, 0, sizeof(di));
0380             di.id = dev->id;
0381             di.Dprotocols = dev->Dprotocols;
0382             di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
0383             di.protocol = dev->D.protocol;
0384             memcpy(di.channelmap, dev->channelmap,
0385                    sizeof(di.channelmap));
0386             di.nrbchan = dev->nrbchan;
0387             strscpy(di.name, dev_name(&dev->dev), sizeof(di.name));
0388             if (copy_to_user((void __user *)arg, &di, sizeof(di)))
0389                 err = -EFAULT;
0390         } else
0391             err = -ENODEV;
0392         break;
0393     default:
0394         if (sk->sk_state == MISDN_BOUND)
0395             err = data_sock_ioctl_bound(sk, cmd,
0396                             (void __user *)arg);
0397         else
0398             err = -ENOTCONN;
0399     }
0400     return err;
0401 }
0402 
0403 static int data_sock_setsockopt(struct socket *sock, int level, int optname,
0404                 sockptr_t optval, unsigned int len)
0405 {
0406     struct sock *sk = sock->sk;
0407     int err = 0, opt = 0;
0408 
0409     if (*debug & DEBUG_SOCKET)
0410         printk(KERN_DEBUG "%s(%p, %d, %x, optval, %d)\n", __func__, sock,
0411                level, optname, len);
0412 
0413     lock_sock(sk);
0414 
0415     switch (optname) {
0416     case MISDN_TIME_STAMP:
0417         if (copy_from_sockptr(&opt, optval, sizeof(int))) {
0418             err = -EFAULT;
0419             break;
0420         }
0421 
0422         if (opt)
0423             _pms(sk)->cmask |= MISDN_TIME_STAMP;
0424         else
0425             _pms(sk)->cmask &= ~MISDN_TIME_STAMP;
0426         break;
0427     default:
0428         err = -ENOPROTOOPT;
0429         break;
0430     }
0431     release_sock(sk);
0432     return err;
0433 }
0434 
0435 static int data_sock_getsockopt(struct socket *sock, int level, int optname,
0436                 char __user *optval, int __user *optlen)
0437 {
0438     struct sock *sk = sock->sk;
0439     int len, opt;
0440 
0441     if (get_user(len, optlen))
0442         return -EFAULT;
0443 
0444     if (len != sizeof(char))
0445         return -EINVAL;
0446 
0447     switch (optname) {
0448     case MISDN_TIME_STAMP:
0449         if (_pms(sk)->cmask & MISDN_TIME_STAMP)
0450             opt = 1;
0451         else
0452             opt = 0;
0453 
0454         if (put_user(opt, optval))
0455             return -EFAULT;
0456         break;
0457     default:
0458         return -ENOPROTOOPT;
0459     }
0460 
0461     return 0;
0462 }
0463 
0464 static int
0465 data_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
0466 {
0467     struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
0468     struct sock *sk = sock->sk;
0469     struct sock *csk;
0470     int err = 0;
0471 
0472     if (*debug & DEBUG_SOCKET)
0473         printk(KERN_DEBUG "%s(%p) sk=%p\n", __func__, sock, sk);
0474     if (addr_len != sizeof(struct sockaddr_mISDN))
0475         return -EINVAL;
0476     if (!maddr || maddr->family != AF_ISDN)
0477         return -EINVAL;
0478 
0479     lock_sock(sk);
0480 
0481     if (_pms(sk)->dev) {
0482         err = -EALREADY;
0483         goto done;
0484     }
0485     _pms(sk)->dev = get_mdevice(maddr->dev);
0486     if (!_pms(sk)->dev) {
0487         err = -ENODEV;
0488         goto done;
0489     }
0490 
0491     if (sk->sk_protocol < ISDN_P_B_START) {
0492         read_lock_bh(&data_sockets.lock);
0493         sk_for_each(csk, &data_sockets.head) {
0494             if (sk == csk)
0495                 continue;
0496             if (_pms(csk)->dev != _pms(sk)->dev)
0497                 continue;
0498             if (csk->sk_protocol >= ISDN_P_B_START)
0499                 continue;
0500             if (IS_ISDN_P_TE(csk->sk_protocol)
0501                 == IS_ISDN_P_TE(sk->sk_protocol))
0502                 continue;
0503             read_unlock_bh(&data_sockets.lock);
0504             err = -EBUSY;
0505             goto done;
0506         }
0507         read_unlock_bh(&data_sockets.lock);
0508     }
0509 
0510     _pms(sk)->ch.send = mISDN_send;
0511     _pms(sk)->ch.ctrl = mISDN_ctrl;
0512 
0513     switch (sk->sk_protocol) {
0514     case ISDN_P_TE_S0:
0515     case ISDN_P_NT_S0:
0516     case ISDN_P_TE_E1:
0517     case ISDN_P_NT_E1:
0518         mISDN_sock_unlink(&data_sockets, sk);
0519         err = connect_layer1(_pms(sk)->dev, &_pms(sk)->ch,
0520                      sk->sk_protocol, maddr);
0521         if (err)
0522             mISDN_sock_link(&data_sockets, sk);
0523         break;
0524     case ISDN_P_LAPD_TE:
0525     case ISDN_P_LAPD_NT:
0526         err = create_l2entity(_pms(sk)->dev, &_pms(sk)->ch,
0527                       sk->sk_protocol, maddr);
0528         break;
0529     case ISDN_P_B_RAW:
0530     case ISDN_P_B_HDLC:
0531     case ISDN_P_B_X75SLP:
0532     case ISDN_P_B_L2DTMF:
0533     case ISDN_P_B_L2DSP:
0534     case ISDN_P_B_L2DSPHDLC:
0535         err = connect_Bstack(_pms(sk)->dev, &_pms(sk)->ch,
0536                      sk->sk_protocol, maddr);
0537         break;
0538     default:
0539         err = -EPROTONOSUPPORT;
0540     }
0541     if (err)
0542         goto done;
0543     sk->sk_state = MISDN_BOUND;
0544     _pms(sk)->ch.protocol = sk->sk_protocol;
0545 
0546 done:
0547     release_sock(sk);
0548     return err;
0549 }
0550 
0551 static int
0552 data_sock_getname(struct socket *sock, struct sockaddr *addr,
0553           int peer)
0554 {
0555     struct sockaddr_mISDN   *maddr = (struct sockaddr_mISDN *) addr;
0556     struct sock     *sk = sock->sk;
0557 
0558     if (!_pms(sk)->dev)
0559         return -EBADFD;
0560 
0561     lock_sock(sk);
0562 
0563     maddr->family = AF_ISDN;
0564     maddr->dev = _pms(sk)->dev->id;
0565     maddr->channel = _pms(sk)->ch.nr;
0566     maddr->sapi = _pms(sk)->ch.addr & 0xff;
0567     maddr->tei = (_pms(sk)->ch.addr >> 8) & 0xff;
0568     release_sock(sk);
0569     return sizeof(*maddr);
0570 }
0571 
0572 static const struct proto_ops data_sock_ops = {
0573     .family     = PF_ISDN,
0574     .owner      = THIS_MODULE,
0575     .release    = data_sock_release,
0576     .ioctl      = data_sock_ioctl,
0577     .bind       = data_sock_bind,
0578     .getname    = data_sock_getname,
0579     .sendmsg    = mISDN_sock_sendmsg,
0580     .recvmsg    = mISDN_sock_recvmsg,
0581     .poll       = datagram_poll,
0582     .listen     = sock_no_listen,
0583     .shutdown   = sock_no_shutdown,
0584     .setsockopt = data_sock_setsockopt,
0585     .getsockopt = data_sock_getsockopt,
0586     .connect    = sock_no_connect,
0587     .socketpair = sock_no_socketpair,
0588     .accept     = sock_no_accept,
0589     .mmap       = sock_no_mmap
0590 };
0591 
0592 static int
0593 data_sock_create(struct net *net, struct socket *sock, int protocol, int kern)
0594 {
0595     struct sock *sk;
0596 
0597     if (sock->type != SOCK_DGRAM)
0598         return -ESOCKTNOSUPPORT;
0599 
0600     sk = sk_alloc(net, PF_ISDN, GFP_KERNEL, &mISDN_proto, kern);
0601     if (!sk)
0602         return -ENOMEM;
0603 
0604     sock_init_data(sock, sk);
0605 
0606     sock->ops = &data_sock_ops;
0607     sock->state = SS_UNCONNECTED;
0608     sock_reset_flag(sk, SOCK_ZAPPED);
0609 
0610     sk->sk_protocol = protocol;
0611     sk->sk_state    = MISDN_OPEN;
0612     mISDN_sock_link(&data_sockets, sk);
0613 
0614     return 0;
0615 }
0616 
0617 static int
0618 base_sock_release(struct socket *sock)
0619 {
0620     struct sock *sk = sock->sk;
0621 
0622     printk(KERN_DEBUG "%s(%p) sk=%p\n", __func__, sock, sk);
0623     if (!sk)
0624         return 0;
0625 
0626     mISDN_sock_unlink(&base_sockets, sk);
0627     sock_orphan(sk);
0628     sock_put(sk);
0629 
0630     return 0;
0631 }
0632 
0633 static int
0634 base_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
0635 {
0636     int         err = 0, id;
0637     struct mISDNdevice  *dev;
0638     struct mISDNversion ver;
0639 
0640     switch (cmd) {
0641     case IMGETVERSION:
0642         ver.major = MISDN_MAJOR_VERSION;
0643         ver.minor = MISDN_MINOR_VERSION;
0644         ver.release = MISDN_RELEASE;
0645         if (copy_to_user((void __user *)arg, &ver, sizeof(ver)))
0646             err = -EFAULT;
0647         break;
0648     case IMGETCOUNT:
0649         id = get_mdevice_count();
0650         if (put_user(id, (int __user *)arg))
0651             err = -EFAULT;
0652         break;
0653     case IMGETDEVINFO:
0654         if (get_user(id, (int __user *)arg)) {
0655             err = -EFAULT;
0656             break;
0657         }
0658         dev = get_mdevice(id);
0659         if (dev) {
0660             struct mISDN_devinfo di;
0661 
0662             memset(&di, 0, sizeof(di));
0663             di.id = dev->id;
0664             di.Dprotocols = dev->Dprotocols;
0665             di.Bprotocols = dev->Bprotocols | get_all_Bprotocols();
0666             di.protocol = dev->D.protocol;
0667             memcpy(di.channelmap, dev->channelmap,
0668                    sizeof(di.channelmap));
0669             di.nrbchan = dev->nrbchan;
0670             strscpy(di.name, dev_name(&dev->dev), sizeof(di.name));
0671             if (copy_to_user((void __user *)arg, &di, sizeof(di)))
0672                 err = -EFAULT;
0673         } else
0674             err = -ENODEV;
0675         break;
0676     case IMSETDEVNAME:
0677     {
0678         struct mISDN_devrename dn;
0679         if (copy_from_user(&dn, (void __user *)arg,
0680                    sizeof(dn))) {
0681             err = -EFAULT;
0682             break;
0683         }
0684         dn.name[sizeof(dn.name) - 1] = '\0';
0685         dev = get_mdevice(dn.id);
0686         if (dev)
0687             err = device_rename(&dev->dev, dn.name);
0688         else
0689             err = -ENODEV;
0690     }
0691     break;
0692     default:
0693         err = -EINVAL;
0694     }
0695     return err;
0696 }
0697 
0698 static int
0699 base_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
0700 {
0701     struct sockaddr_mISDN *maddr = (struct sockaddr_mISDN *) addr;
0702     struct sock *sk = sock->sk;
0703     int err = 0;
0704 
0705     if (addr_len < sizeof(struct sockaddr_mISDN))
0706         return -EINVAL;
0707 
0708     if (!maddr || maddr->family != AF_ISDN)
0709         return -EINVAL;
0710 
0711     lock_sock(sk);
0712 
0713     if (_pms(sk)->dev) {
0714         err = -EALREADY;
0715         goto done;
0716     }
0717 
0718     _pms(sk)->dev = get_mdevice(maddr->dev);
0719     if (!_pms(sk)->dev) {
0720         err = -ENODEV;
0721         goto done;
0722     }
0723     sk->sk_state = MISDN_BOUND;
0724 
0725 done:
0726     release_sock(sk);
0727     return err;
0728 }
0729 
0730 static const struct proto_ops base_sock_ops = {
0731     .family     = PF_ISDN,
0732     .owner      = THIS_MODULE,
0733     .release    = base_sock_release,
0734     .ioctl      = base_sock_ioctl,
0735     .bind       = base_sock_bind,
0736     .getname    = sock_no_getname,
0737     .sendmsg    = sock_no_sendmsg,
0738     .recvmsg    = sock_no_recvmsg,
0739     .listen     = sock_no_listen,
0740     .shutdown   = sock_no_shutdown,
0741     .connect    = sock_no_connect,
0742     .socketpair = sock_no_socketpair,
0743     .accept     = sock_no_accept,
0744     .mmap       = sock_no_mmap
0745 };
0746 
0747 
0748 static int
0749 base_sock_create(struct net *net, struct socket *sock, int protocol, int kern)
0750 {
0751     struct sock *sk;
0752 
0753     if (sock->type != SOCK_RAW)
0754         return -ESOCKTNOSUPPORT;
0755     if (!capable(CAP_NET_RAW))
0756         return -EPERM;
0757 
0758     sk = sk_alloc(net, PF_ISDN, GFP_KERNEL, &mISDN_proto, kern);
0759     if (!sk)
0760         return -ENOMEM;
0761 
0762     sock_init_data(sock, sk);
0763     sock->ops = &base_sock_ops;
0764     sock->state = SS_UNCONNECTED;
0765     sock_reset_flag(sk, SOCK_ZAPPED);
0766     sk->sk_protocol = protocol;
0767     sk->sk_state    = MISDN_OPEN;
0768     mISDN_sock_link(&base_sockets, sk);
0769 
0770     return 0;
0771 }
0772 
0773 static int
0774 mISDN_sock_create(struct net *net, struct socket *sock, int proto, int kern)
0775 {
0776     int err = -EPROTONOSUPPORT;
0777 
0778     switch (proto) {
0779     case ISDN_P_BASE:
0780         err = base_sock_create(net, sock, proto, kern);
0781         break;
0782     case ISDN_P_TE_S0:
0783     case ISDN_P_NT_S0:
0784     case ISDN_P_TE_E1:
0785     case ISDN_P_NT_E1:
0786     case ISDN_P_LAPD_TE:
0787     case ISDN_P_LAPD_NT:
0788     case ISDN_P_B_RAW:
0789     case ISDN_P_B_HDLC:
0790     case ISDN_P_B_X75SLP:
0791     case ISDN_P_B_L2DTMF:
0792     case ISDN_P_B_L2DSP:
0793     case ISDN_P_B_L2DSPHDLC:
0794         err = data_sock_create(net, sock, proto, kern);
0795         break;
0796     default:
0797         return err;
0798     }
0799 
0800     return err;
0801 }
0802 
0803 static const struct net_proto_family mISDN_sock_family_ops = {
0804     .owner  = THIS_MODULE,
0805     .family = PF_ISDN,
0806     .create = mISDN_sock_create,
0807 };
0808 
0809 int
0810 misdn_sock_init(u_int *deb)
0811 {
0812     int err;
0813 
0814     debug = deb;
0815     err = sock_register(&mISDN_sock_family_ops);
0816     if (err)
0817         printk(KERN_ERR "%s: error(%d)\n", __func__, err);
0818     return err;
0819 }
0820 
0821 void
0822 misdn_sock_cleanup(void)
0823 {
0824     sock_unregister(PF_ISDN);
0825 }