cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

socket.c (17772B)


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