brintos

brintos / linux-shallow public Read only

0
0
Text · 38.9 KiB · a5ad88a Raw
1506 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 4 * l1oip.c  low level driver for tunneling layer 1 over IP5 *6 * NOTE: It is not compatible with TDMoIP nor "ISDN over IP".7 *8 * Author	Andreas Eversberg (jolly@eversberg.eu)9 */10 11/* module parameters:12 * type:13 Value 1	= BRI14 Value 2	= PRI15 Value 3 = BRI (multi channel frame, not supported yet)16 Value 4 = PRI (multi channel frame, not supported yet)17 A multi channel frame reduces overhead to a single frame for all18 b-channels, but increases delay.19 (NOTE: Multi channel frames are not implemented yet.)20 21 * codec:22 Value 0 = transparent (default)23 Value 1 = transfer ALAW24 Value 2 = transfer ULAW25 Value 3 = transfer generic 4 bit compression.26 27 * ulaw:28 0 = we use a-Law (default)29 1 = we use u-Law30 31 * limit:32 limitation of B-channels to control bandwidth (1...126)33 BRI: 1 or 234 PRI: 1-30, 31-126 (126, because dchannel ist not counted here)35 Also limited ressources are used for stack, resulting in less channels.36 It is possible to have more channels than 30 in PRI mode, this must37 be supported by the application.38 39 * ip:40 byte representation of remote ip address (127.0.0.1 -> 127,0,0,1)41 If not given or four 0, no remote address is set.42 For multiple interfaces, concat ip addresses. (127,0,0,1,127,0,0,1)43 44 * port:45 port number (local interface)46 If not given or 0, port 931 is used for fist instance, 932 for next...47 For multiple interfaces, different ports must be given.48 49 * remoteport:50 port number (remote interface)51 If not given or 0, remote port equals local port52 For multiple interfaces on equal sites, different ports must be given.53 54 * ondemand:55 0 = fixed (always transmit packets, even when remote side timed out)56 1 = on demand (only transmit packets, when remote side is detected)57 the default is 058 NOTE: ID must also be set for on demand.59 60 * id:61 optional value to identify frames. This value must be equal on both62 peers and should be random. If omitted or 0, no ID is transmitted.63 64 * debug:65 NOTE: only one debug value must be given for all cards66 enable debugging (see l1oip.h for debug options)67 68 69 Special mISDN controls:70 71 op = MISDN_CTRL_SETPEER*72 p1 = bytes 0-3 : remote IP address in network order (left element first)73 p2 = bytes 1-2 : remote port in network order (high byte first)74 optional:75 p2 = bytes 3-4 : local port in network order (high byte first)76 77 op = MISDN_CTRL_UNSETPEER*78 79 * Use l1oipctrl for comfortable setting or removing ip address.80 (Layer 1 Over IP CTRL)81 82 83 L1oIP-Protocol84 --------------85 86 Frame Header:87 88 7 6 5 4 3 2 1 089 +---------------+90 |Ver|T|I|Coding |91 +---------------+92 |  ID byte 3 *  |93 +---------------+94 |  ID byte 2 *  |95 +---------------+96 |  ID byte 1 *  |97 +---------------+98 |  ID byte 0 *  |99 +---------------+100 |M|   Channel   |101 +---------------+102 |    Length *   |103 +---------------+104 | Time Base MSB |105 +---------------+106 | Time Base LSB |107 +---------------+108 | Data....	|109 110 ...111 112 |               |113 +---------------+114 |M|   Channel   |115 +---------------+116 |    Length *   |117 +---------------+118 | Time Base MSB |119 +---------------+120 | Time Base LSB |121 +---------------+122 | Data....	|123 124 ...125 126 127 * Only included in some cases.128 129 - Ver = Version130 If version is missmatch, the frame must be ignored.131 132 - T = Type of interface133 Must be 0 for S0 or 1 for E1.134 135 - I = Id present136 If bit is set, four ID bytes are included in frame.137 138 - ID = Connection ID139 Additional ID to prevent Denial of Service attacs. Also it prevents hijacking140 connections with dynamic IP. The ID should be random and must not be 0.141 142 - Coding = Type of codec143 Must be 0 for no transcoding. Also for D-channel and other HDLC frames.144 1 and 2 are reserved for explicitly use of a-LAW or u-LAW codec.145 3 is used for generic table compressor.146 147 - M = More channels to come. If this flag is 1, the following byte contains148 the length of the channel data. After the data block, the next channel will149 be defined. The flag for the last channel block (or if only one channel is150 transmitted), must be 0 and no length is given.151 152 - Channel = Channel number153 0 reserved154 1-3 channel data for S0 (3 is D-channel)155 1-31 channel data for E1 (16 is D-channel)156 32-127 channel data for extended E1 (16 is D-channel)157 158 - The length is used if the M-flag is 1. It is used to find the next channel159 inside frame.160 NOTE: A value of 0 equals 256 bytes of data.161 -> For larger data blocks, a single frame must be used.162 -> For larger streams, a single frame or multiple blocks with same channel ID163 must be used.164 165 - Time Base = Timestamp of first sample in frame166 The "Time Base" is used to rearange packets and to detect packet loss.167 The 16 bits are sent in network order (MSB first) and count 1/8000 th of a168 second. This causes a wrap around each 8,192 seconds. There is no requirement169 for the initial "Time Base", but 0 should be used for the first packet.170 In case of HDLC data, this timestamp counts the packet or byte number.171 172 173 Two Timers:174 175 After initialisation, a timer of 15 seconds is started. Whenever a packet is176 transmitted, the timer is reset to 15 seconds again. If the timer expires, an177 empty packet is transmitted. This keep the connection alive.178 179 When a valid packet is received, a timer 65 seconds is started. The interface180 become ACTIVE. If the timer expires, the interface becomes INACTIVE.181 182 183 Dynamic IP handling:184 185 To allow dynamic IP, the ID must be non 0. In this case, any packet with the186 correct port number and ID will be accepted. If the remote side changes its IP187 the new IP is used for all transmitted packets until it changes again.188 189 190 On Demand:191 192 If the ondemand parameter is given, the remote IP is set to 0 on timeout.193 This will stop keepalive traffic to remote. If the remote is online again,194 traffic will continue to the remote address. This is useful for road warriors.195 This feature only works with ID set, otherwhise it is highly unsecure.196 197 198 Socket and Thread199 -----------------200 201 The complete socket opening and closing is done by a thread.202 When the thread opened a socket, the hc->socket descriptor is set. Whenever a203 packet shall be sent to the socket, the hc->socket must be checked whether not204 NULL. To prevent change in socket descriptor, the hc->socket_lock must be used.205 To change the socket, a recall of l1oip_socket_open() will safely kill the206 socket process and create a new one.207 208*/209 210#define L1OIP_VERSION	0	/* 0...3 */211 212#include <linux/module.h>213#include <linux/delay.h>214#include <linux/mISDNif.h>215#include <linux/mISDNhw.h>216#include <linux/mISDNdsp.h>217#include <linux/init.h>218#include <linux/in.h>219#include <linux/inet.h>220#include <linux/workqueue.h>221#include <linux/kthread.h>222#include <linux/slab.h>223#include <linux/sched/signal.h>224 225#include <net/sock.h>226#include "core.h"227#include "l1oip.h"228 229static const char *l1oip_revision = "2.00";230 231static int l1oip_cnt;232static DEFINE_SPINLOCK(l1oip_lock);233static LIST_HEAD(l1oip_ilist);234 235#define MAX_CARDS	16236static u_int type[MAX_CARDS];237static u_int codec[MAX_CARDS];238static u_int ip[MAX_CARDS * 4];239static u_int port[MAX_CARDS];240static u_int remoteport[MAX_CARDS];241static u_int ondemand[MAX_CARDS];242static u_int limit[MAX_CARDS];243static u_int id[MAX_CARDS];244static int debug;245static int ulaw;246 247MODULE_AUTHOR("Andreas Eversberg");248MODULE_DESCRIPTION("mISDN driver for tunneling layer 1 over IP");249MODULE_LICENSE("GPL");250module_param_array(type, uint, NULL, S_IRUGO | S_IWUSR);251module_param_array(codec, uint, NULL, S_IRUGO | S_IWUSR);252module_param_array(ip, uint, NULL, S_IRUGO | S_IWUSR);253module_param_array(port, uint, NULL, S_IRUGO | S_IWUSR);254module_param_array(remoteport, uint, NULL, S_IRUGO | S_IWUSR);255module_param_array(ondemand, uint, NULL, S_IRUGO | S_IWUSR);256module_param_array(limit, uint, NULL, S_IRUGO | S_IWUSR);257module_param_array(id, uint, NULL, S_IRUGO | S_IWUSR);258module_param(ulaw, uint, S_IRUGO | S_IWUSR);259module_param(debug, uint, S_IRUGO | S_IWUSR);260 261/*262 * send a frame via socket, if open and restart timer263 */264static int265l1oip_socket_send(struct l1oip *hc, u8 localcodec, u8 channel, u32 chanmask,266		  u16 timebase, u8 *buf, int len)267{268	u8 *p;269	u8 frame[MAX_DFRAME_LEN_L1 + 32];270	struct socket *socket = NULL;271 272	if (debug & DEBUG_L1OIP_MSG)273		printk(KERN_DEBUG "%s: sending data to socket (len = %d)\n",274		       __func__, len);275 276	p = frame;277 278	/* restart timer */279	if (time_before(hc->keep_tl.expires, jiffies + 5 * HZ) && !hc->shutdown)280		mod_timer(&hc->keep_tl, jiffies + L1OIP_KEEPALIVE * HZ);281	else282		hc->keep_tl.expires = jiffies + L1OIP_KEEPALIVE * HZ;283 284	if (debug & DEBUG_L1OIP_MSG)285		printk(KERN_DEBUG "%s: resetting timer\n", __func__);286 287	/* drop if we have no remote ip or port */288	if (!hc->sin_remote.sin_addr.s_addr || !hc->sin_remote.sin_port) {289		if (debug & DEBUG_L1OIP_MSG)290			printk(KERN_DEBUG "%s: dropping frame, because remote "291			       "IP is not set.\n", __func__);292		return len;293	}294 295	/* assemble frame */296	*p++ = (L1OIP_VERSION << 6) /* version and coding */297		| (hc->pri ? 0x20 : 0x00) /* type */298		| (hc->id ? 0x10 : 0x00) /* id */299		| localcodec;300	if (hc->id) {301		*p++ = hc->id >> 24; /* id */302		*p++ = hc->id >> 16;303		*p++ = hc->id >> 8;304		*p++ = hc->id;305	}306	*p++ =  0x00 + channel; /* m-flag, channel */307	*p++ = timebase >> 8; /* time base */308	*p++ = timebase;309 310	if (buf && len) { /* add data to frame */311		if (localcodec == 1 && ulaw)312			l1oip_ulaw_to_alaw(buf, len, p);313		else if (localcodec == 2 && !ulaw)314			l1oip_alaw_to_ulaw(buf, len, p);315		else if (localcodec == 3)316			len = l1oip_law_to_4bit(buf, len, p,317						&hc->chan[channel].codecstate);318		else319			memcpy(p, buf, len);320	}321	len += p - frame;322 323	/* check for socket in safe condition */324	spin_lock(&hc->socket_lock);325	if (!hc->socket) {326		spin_unlock(&hc->socket_lock);327		return 0;328	}329	/* seize socket */330	socket = hc->socket;331	hc->socket = NULL;332	spin_unlock(&hc->socket_lock);333	/* send packet */334	if (debug & DEBUG_L1OIP_MSG)335		printk(KERN_DEBUG "%s: sending packet to socket (len "336		       "= %d)\n", __func__, len);337	hc->sendiov.iov_base = frame;338	hc->sendiov.iov_len  = len;339	len = kernel_sendmsg(socket, &hc->sendmsg, &hc->sendiov, 1, len);340	/* give socket back */341	hc->socket = socket; /* no locking required */342 343	return len;344}345 346 347/*348 * receive channel data from socket349 */350static void351l1oip_socket_recv(struct l1oip *hc, u8 remotecodec, u8 channel, u16 timebase,352		  u8 *buf, int len)353{354	struct sk_buff *nskb;355	struct bchannel *bch;356	struct dchannel *dch;357	u8 *p;358	u32 rx_counter;359 360	if (len == 0) {361		if (debug & DEBUG_L1OIP_MSG)362			printk(KERN_DEBUG "%s: received empty keepalive data, "363			       "ignoring\n", __func__);364		return;365	}366 367	if (debug & DEBUG_L1OIP_MSG)368		printk(KERN_DEBUG "%s: received data, sending to mISDN (%d)\n",369		       __func__, len);370 371	if (channel < 1 || channel > 127) {372		printk(KERN_WARNING "%s: packet error - channel %d out of "373		       "range\n", __func__, channel);374		return;375	}376	dch = hc->chan[channel].dch;377	bch = hc->chan[channel].bch;378	if (!dch && !bch) {379		printk(KERN_WARNING "%s: packet error - channel %d not in "380		       "stack\n", __func__, channel);381		return;382	}383 384	/* prepare message */385	nskb = mI_alloc_skb((remotecodec == 3) ? (len << 1) : len, GFP_ATOMIC);386	if (!nskb) {387		printk(KERN_ERR "%s: No mem for skb.\n", __func__);388		return;389	}390	p = skb_put(nskb, (remotecodec == 3) ? (len << 1) : len);391 392	if (remotecodec == 1 && ulaw)393		l1oip_alaw_to_ulaw(buf, len, p);394	else if (remotecodec == 2 && !ulaw)395		l1oip_ulaw_to_alaw(buf, len, p);396	else if (remotecodec == 3)397		len = l1oip_4bit_to_law(buf, len, p);398	else399		memcpy(p, buf, len);400 401	/* send message up */402	if (dch && len >= 2) {403		dch->rx_skb = nskb;404		recv_Dchannel(dch);405	}406	if (bch) {407		/* expand 16 bit sequence number to 32 bit sequence number */408		rx_counter = hc->chan[channel].rx_counter;409		if (((s16)(timebase - rx_counter)) >= 0) {410			/* time has changed forward */411			if (timebase >= (rx_counter & 0xffff))412				rx_counter =413					(rx_counter & 0xffff0000) | timebase;414			else415				rx_counter = ((rx_counter & 0xffff0000) + 0x10000)416					| timebase;417		} else {418			/* time has changed backwards */419			if (timebase < (rx_counter & 0xffff))420				rx_counter =421					(rx_counter & 0xffff0000) | timebase;422			else423				rx_counter = ((rx_counter & 0xffff0000) - 0x10000)424					| timebase;425		}426		hc->chan[channel].rx_counter = rx_counter;427 428#ifdef REORDER_DEBUG429		if (hc->chan[channel].disorder_flag) {430			swap(hc->chan[channel].disorder_skb, nskb);431			swap(hc->chan[channel].disorder_cnt, rx_counter);432		}433		hc->chan[channel].disorder_flag ^= 1;434		if (nskb)435#endif436			queue_ch_frame(&bch->ch, PH_DATA_IND, rx_counter, nskb);437	}438}439 440 441/*442 * parse frame and extract channel data443 */444static void445l1oip_socket_parse(struct l1oip *hc, struct sockaddr_in *sin, u8 *buf, int len)446{447	u32			packet_id;448	u8			channel;449	u8			remotecodec;450	u16			timebase;451	int			m, mlen;452	int			len_start = len; /* initial frame length */453	struct dchannel		*dch = hc->chan[hc->d_idx].dch;454 455	if (debug & DEBUG_L1OIP_MSG)456		printk(KERN_DEBUG "%s: received frame, parsing... (%d)\n",457		       __func__, len);458 459	/* check length */460	if (len < 1 + 1 + 2) {461		printk(KERN_WARNING "%s: packet error - length %d below "462		       "4 bytes\n", __func__, len);463		return;464	}465 466	/* check version */467	if (((*buf) >> 6) != L1OIP_VERSION) {468		printk(KERN_WARNING "%s: packet error - unknown version %d\n",469		       __func__, buf[0]>>6);470		return;471	}472 473	/* check type */474	if (((*buf) & 0x20) && !hc->pri) {475		printk(KERN_WARNING "%s: packet error - received E1 packet "476		       "on S0 interface\n", __func__);477		return;478	}479	if (!((*buf) & 0x20) && hc->pri) {480		printk(KERN_WARNING "%s: packet error - received S0 packet "481		       "on E1 interface\n", __func__);482		return;483	}484 485	/* get id flag */486	packet_id = (*buf >> 4) & 1;487 488	/* check coding */489	remotecodec = (*buf) & 0x0f;490	if (remotecodec > 3) {491		printk(KERN_WARNING "%s: packet error - remotecodec %d "492		       "unsupported\n", __func__, remotecodec);493		return;494	}495	buf++;496	len--;497 498	/* check packet_id */499	if (packet_id) {500		if (!hc->id) {501			printk(KERN_WARNING "%s: packet error - packet has id "502			       "0x%x, but we have not\n", __func__, packet_id);503			return;504		}505		if (len < 4) {506			printk(KERN_WARNING "%s: packet error - packet too "507			       "short for ID value\n", __func__);508			return;509		}510		packet_id = (*buf++) << 24;511		packet_id += (*buf++) << 16;512		packet_id += (*buf++) << 8;513		packet_id += (*buf++);514		len -= 4;515 516		if (packet_id != hc->id) {517			printk(KERN_WARNING "%s: packet error - ID mismatch, "518			       "got 0x%x, we 0x%x\n",519			       __func__, packet_id, hc->id);520			return;521		}522	} else {523		if (hc->id) {524			printk(KERN_WARNING "%s: packet error - packet has no "525			       "ID, but we have\n", __func__);526			return;527		}528	}529 530multiframe:531	if (len < 1) {532		printk(KERN_WARNING "%s: packet error - packet too short, "533		       "channel expected at position %d.\n",534		       __func__, len-len_start + 1);535		return;536	}537 538	/* get channel and multiframe flag */539	channel = *buf & 0x7f;540	m = *buf >> 7;541	buf++;542	len--;543 544	/* check length on multiframe */545	if (m) {546		if (len < 1) {547			printk(KERN_WARNING "%s: packet error - packet too "548			       "short, length expected at position %d.\n",549			       __func__, len_start - len - 1);550			return;551		}552 553		mlen = *buf++;554		len--;555		if (mlen == 0)556			mlen = 256;557		if (len < mlen + 3) {558			printk(KERN_WARNING "%s: packet error - length %d at "559			       "position %d exceeds total length %d.\n",560			       __func__, mlen, len_start-len - 1, len_start);561			return;562		}563		if (len == mlen + 3) {564			printk(KERN_WARNING "%s: packet error - length %d at "565			       "position %d will not allow additional "566			       "packet.\n",567			       __func__, mlen, len_start-len + 1);568			return;569		}570	} else571		mlen = len - 2; /* single frame, subtract timebase */572 573	if (len < 2) {574		printk(KERN_WARNING "%s: packet error - packet too short, time "575		       "base expected at position %d.\n",576		       __func__, len-len_start + 1);577		return;578	}579 580	/* get time base */581	timebase = (*buf++) << 8;582	timebase |= (*buf++);583	len -= 2;584 585	/* if inactive, we send up a PH_ACTIVATE and activate */586	if (!test_bit(FLG_ACTIVE, &dch->Flags)) {587		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))588			printk(KERN_DEBUG "%s: interface become active due to "589			       "received packet\n", __func__);590		test_and_set_bit(FLG_ACTIVE, &dch->Flags);591		_queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY, 0,592			    NULL, GFP_ATOMIC);593	}594 595	/* distribute packet */596	l1oip_socket_recv(hc, remotecodec, channel, timebase, buf, mlen);597	buf += mlen;598	len -= mlen;599 600	/* multiframe */601	if (m)602		goto multiframe;603 604	/* restart timer */605	if ((time_before(hc->timeout_tl.expires, jiffies + 5 * HZ) ||606	     !hc->timeout_on) &&607	    !hc->shutdown) {608		hc->timeout_on = 1;609		mod_timer(&hc->timeout_tl, jiffies + L1OIP_TIMEOUT * HZ);610	} else /* only adjust timer */611		hc->timeout_tl.expires = jiffies + L1OIP_TIMEOUT * HZ;612 613	/* if ip or source port changes */614	if ((hc->sin_remote.sin_addr.s_addr != sin->sin_addr.s_addr)615	    || (hc->sin_remote.sin_port != sin->sin_port)) {616		if (debug & DEBUG_L1OIP_SOCKET)617			printk(KERN_DEBUG "%s: remote address changes from "618			       "0x%08x to 0x%08x (port %d to %d)\n", __func__,619			       ntohl(hc->sin_remote.sin_addr.s_addr),620			       ntohl(sin->sin_addr.s_addr),621			       ntohs(hc->sin_remote.sin_port),622			       ntohs(sin->sin_port));623		hc->sin_remote.sin_addr.s_addr = sin->sin_addr.s_addr;624		hc->sin_remote.sin_port = sin->sin_port;625	}626}627 628 629/*630 * socket stuff631 */632static int633l1oip_socket_thread(void *data)634{635	struct l1oip *hc = (struct l1oip *)data;636	int ret = 0;637	struct sockaddr_in sin_rx;638	struct kvec iov;639	struct msghdr msg = {.msg_name = &sin_rx,640			     .msg_namelen = sizeof(sin_rx)};641	unsigned char *recvbuf;642	size_t recvbuf_size = 1500;643	int recvlen;644	struct socket *socket = NULL;645	DECLARE_COMPLETION_ONSTACK(wait);646 647	/* allocate buffer memory */648	recvbuf = kmalloc(recvbuf_size, GFP_KERNEL);649	if (!recvbuf) {650		printk(KERN_ERR "%s: Failed to alloc recvbuf.\n", __func__);651		ret = -ENOMEM;652		goto fail;653	}654 655	iov.iov_base = recvbuf;656	iov.iov_len = recvbuf_size;657 658	/* make daemon */659	allow_signal(SIGTERM);660 661	/* create socket */662	if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &socket)) {663		printk(KERN_ERR "%s: Failed to create socket.\n", __func__);664		ret = -EIO;665		goto fail;666	}667 668	/* set incoming address */669	hc->sin_local.sin_family = AF_INET;670	hc->sin_local.sin_addr.s_addr = INADDR_ANY;671	hc->sin_local.sin_port = htons((unsigned short)hc->localport);672 673	/* set outgoing address */674	hc->sin_remote.sin_family = AF_INET;675	hc->sin_remote.sin_addr.s_addr = htonl(hc->remoteip);676	hc->sin_remote.sin_port = htons((unsigned short)hc->remoteport);677 678	/* bind to incoming port */679	if (socket->ops->bind(socket, (struct sockaddr *)&hc->sin_local,680			      sizeof(hc->sin_local))) {681		printk(KERN_ERR "%s: Failed to bind socket to port %d.\n",682		       __func__, hc->localport);683		ret = -EINVAL;684		goto fail;685	}686 687	/* check sk */688	if (socket->sk == NULL) {689		printk(KERN_ERR "%s: socket->sk == NULL\n", __func__);690		ret = -EIO;691		goto fail;692	}693 694	/* build send message */695	hc->sendmsg.msg_name = &hc->sin_remote;696	hc->sendmsg.msg_namelen = sizeof(hc->sin_remote);697	hc->sendmsg.msg_control = NULL;698	hc->sendmsg.msg_controllen = 0;699 700	/* give away socket */701	spin_lock(&hc->socket_lock);702	hc->socket = socket;703	spin_unlock(&hc->socket_lock);704 705	/* read loop */706	if (debug & DEBUG_L1OIP_SOCKET)707		printk(KERN_DEBUG "%s: socket created and open\n",708		       __func__);709	while (!signal_pending(current)) {710		iov_iter_kvec(&msg.msg_iter, ITER_DEST, &iov, 1, recvbuf_size);711		recvlen = sock_recvmsg(socket, &msg, 0);712		if (recvlen > 0) {713			l1oip_socket_parse(hc, &sin_rx, recvbuf, recvlen);714		} else {715			if (debug & DEBUG_L1OIP_SOCKET)716				printk(KERN_WARNING717				       "%s: broken pipe on socket\n", __func__);718		}719	}720 721	/* get socket back, check first if in use, maybe by send function */722	spin_lock(&hc->socket_lock);723	/* if hc->socket is NULL, it is in use until it is given back */724	while (!hc->socket) {725		spin_unlock(&hc->socket_lock);726		schedule_timeout(HZ / 10);727		spin_lock(&hc->socket_lock);728	}729	hc->socket = NULL;730	spin_unlock(&hc->socket_lock);731 732	if (debug & DEBUG_L1OIP_SOCKET)733		printk(KERN_DEBUG "%s: socket thread terminating\n",734		       __func__);735 736fail:737	/* free recvbuf */738	kfree(recvbuf);739 740	/* close socket */741	if (socket)742		sock_release(socket);743 744	/* if we got killed, signal completion */745	complete(&hc->socket_complete);746	hc->socket_thread = NULL; /* show termination of thread */747 748	if (debug & DEBUG_L1OIP_SOCKET)749		printk(KERN_DEBUG "%s: socket thread terminated\n",750		       __func__);751	return ret;752}753 754static void755l1oip_socket_close(struct l1oip *hc)756{757	struct dchannel *dch = hc->chan[hc->d_idx].dch;758 759	/* kill thread */760	if (hc->socket_thread) {761		if (debug & DEBUG_L1OIP_SOCKET)762			printk(KERN_DEBUG "%s: socket thread exists, "763			       "killing...\n", __func__);764		send_sig(SIGTERM, hc->socket_thread, 0);765		wait_for_completion(&hc->socket_complete);766	}767 768	/* if active, we send up a PH_DEACTIVATE and deactivate */769	if (test_bit(FLG_ACTIVE, &dch->Flags)) {770		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))771			printk(KERN_DEBUG "%s: interface become deactivated "772			       "due to timeout\n", __func__);773		test_and_clear_bit(FLG_ACTIVE, &dch->Flags);774		_queue_data(&dch->dev.D, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,775			    NULL, GFP_ATOMIC);776	}777}778 779static int780l1oip_socket_open(struct l1oip *hc)781{782	/* in case of reopen, we need to close first */783	l1oip_socket_close(hc);784 785	init_completion(&hc->socket_complete);786 787	/* create receive process */788	hc->socket_thread = kthread_run(l1oip_socket_thread, hc, "l1oip_%s",789					hc->name);790	if (IS_ERR(hc->socket_thread)) {791		int err = PTR_ERR(hc->socket_thread);792		printk(KERN_ERR "%s: Failed (%d) to create socket process.\n",793		       __func__, err);794		hc->socket_thread = NULL;795		sock_release(hc->socket);796		return err;797	}798	if (debug & DEBUG_L1OIP_SOCKET)799		printk(KERN_DEBUG "%s: socket thread created\n", __func__);800 801	return 0;802}803 804 805static void806l1oip_send_bh(struct work_struct *work)807{808	struct l1oip *hc = container_of(work, struct l1oip, workq);809 810	if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))811		printk(KERN_DEBUG "%s: keepalive timer expired, sending empty "812		       "frame on dchannel\n", __func__);813 814	/* send an empty l1oip frame at D-channel */815	l1oip_socket_send(hc, 0, hc->d_idx, 0, 0, NULL, 0);816}817 818 819/*820 * timer stuff821 */822static void823l1oip_keepalive(struct timer_list *t)824{825	struct l1oip *hc = from_timer(hc, t, keep_tl);826 827	schedule_work(&hc->workq);828}829 830static void831l1oip_timeout(struct timer_list *t)832{833	struct l1oip			*hc = from_timer(hc, t,834								  timeout_tl);835	struct dchannel		*dch = hc->chan[hc->d_idx].dch;836 837	if (debug & DEBUG_L1OIP_MSG)838		printk(KERN_DEBUG "%s: timeout timer expired, turn layer one "839		       "down.\n", __func__);840 841	hc->timeout_on = 0; /* state that timer must be initialized next time */842 843	/* if timeout, we send up a PH_DEACTIVATE and deactivate */844	if (test_bit(FLG_ACTIVE, &dch->Flags)) {845		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))846			printk(KERN_DEBUG "%s: interface become deactivated "847			       "due to timeout\n", __func__);848		test_and_clear_bit(FLG_ACTIVE, &dch->Flags);849		_queue_data(&dch->dev.D, PH_DEACTIVATE_IND, MISDN_ID_ANY, 0,850			    NULL, GFP_ATOMIC);851	}852 853	/* if we have ondemand set, we remove ip address */854	if (hc->ondemand) {855		if (debug & DEBUG_L1OIP_MSG)856			printk(KERN_DEBUG "%s: on demand causes ip address to "857			       "be removed\n", __func__);858		hc->sin_remote.sin_addr.s_addr = 0;859	}860}861 862 863/*864 * message handling865 */866static int867handle_dmsg(struct mISDNchannel *ch, struct sk_buff *skb)868{869	struct mISDNdevice	*dev = container_of(ch, struct mISDNdevice, D);870	struct dchannel		*dch = container_of(dev, struct dchannel, dev);871	struct l1oip			*hc = dch->hw;872	struct mISDNhead	*hh = mISDN_HEAD_P(skb);873	int			ret = -EINVAL;874	int			l, ll;875	unsigned char		*p;876 877	switch (hh->prim) {878	case PH_DATA_REQ:879		if (skb->len < 1) {880			printk(KERN_WARNING "%s: skb too small\n",881			       __func__);882			break;883		}884		if (skb->len > MAX_DFRAME_LEN_L1 || skb->len > L1OIP_MAX_LEN) {885			printk(KERN_WARNING "%s: skb too large\n",886			       __func__);887			break;888		}889		/* send frame */890		p = skb->data;891		l = skb->len;892		while (l) {893			/*894			 * This is technically bounded by L1OIP_MAX_PERFRAME but895			 * MAX_DFRAME_LEN_L1 < L1OIP_MAX_PERFRAME896			 */897			ll = (l < MAX_DFRAME_LEN_L1) ? l : MAX_DFRAME_LEN_L1;898			l1oip_socket_send(hc, 0, dch->slot, 0,899					  hc->chan[dch->slot].tx_counter++, p, ll);900			p += ll;901			l -= ll;902		}903		skb_trim(skb, 0);904		queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);905		return 0;906	case PH_ACTIVATE_REQ:907		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))908			printk(KERN_DEBUG "%s: PH_ACTIVATE channel %d (1..%d)\n"909			       , __func__, dch->slot, hc->b_num + 1);910		skb_trim(skb, 0);911		if (test_bit(FLG_ACTIVE, &dch->Flags))912			queue_ch_frame(ch, PH_ACTIVATE_IND, hh->id, skb);913		else914			queue_ch_frame(ch, PH_DEACTIVATE_IND, hh->id, skb);915		return 0;916	case PH_DEACTIVATE_REQ:917		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))918			printk(KERN_DEBUG "%s: PH_DEACTIVATE channel %d "919			       "(1..%d)\n", __func__, dch->slot,920			       hc->b_num + 1);921		skb_trim(skb, 0);922		if (test_bit(FLG_ACTIVE, &dch->Flags))923			queue_ch_frame(ch, PH_ACTIVATE_IND, hh->id, skb);924		else925			queue_ch_frame(ch, PH_DEACTIVATE_IND, hh->id, skb);926		return 0;927	}928	if (!ret)929		dev_kfree_skb(skb);930	return ret;931}932 933static int934channel_dctrl(struct dchannel *dch, struct mISDN_ctrl_req *cq)935{936	int	ret = 0;937	struct l1oip	*hc = dch->hw;938 939	switch (cq->op) {940	case MISDN_CTRL_GETOP:941		cq->op = MISDN_CTRL_SETPEER | MISDN_CTRL_UNSETPEER942			| MISDN_CTRL_GETPEER;943		break;944	case MISDN_CTRL_SETPEER:945		hc->remoteip = (u32)cq->p1;946		hc->remoteport = cq->p2 & 0xffff;947		hc->localport = cq->p2 >> 16;948		if (!hc->remoteport)949			hc->remoteport = hc->localport;950		if (debug & DEBUG_L1OIP_SOCKET)951			printk(KERN_DEBUG "%s: got new ip address from user "952			       "space.\n", __func__);953		l1oip_socket_open(hc);954		break;955	case MISDN_CTRL_UNSETPEER:956		if (debug & DEBUG_L1OIP_SOCKET)957			printk(KERN_DEBUG "%s: removing ip address.\n",958			       __func__);959		hc->remoteip = 0;960		l1oip_socket_open(hc);961		break;962	case MISDN_CTRL_GETPEER:963		if (debug & DEBUG_L1OIP_SOCKET)964			printk(KERN_DEBUG "%s: getting ip address.\n",965			       __func__);966		cq->p1 = hc->remoteip;967		cq->p2 = hc->remoteport | (hc->localport << 16);968		break;969	default:970		printk(KERN_WARNING "%s: unknown Op %x\n",971		       __func__, cq->op);972		ret = -EINVAL;973		break;974	}975	return ret;976}977 978static int979open_dchannel(struct l1oip *hc, struct dchannel *dch, struct channel_req *rq)980{981	if (debug & DEBUG_HW_OPEN)982		printk(KERN_DEBUG "%s: dev(%d) open from %p\n", __func__,983		       dch->dev.id, __builtin_return_address(0));984	if (rq->protocol == ISDN_P_NONE)985		return -EINVAL;986	if ((dch->dev.D.protocol != ISDN_P_NONE) &&987	    (dch->dev.D.protocol != rq->protocol)) {988		if (debug & DEBUG_HW_OPEN)989			printk(KERN_WARNING "%s: change protocol %x to %x\n",990			       __func__, dch->dev.D.protocol, rq->protocol);991	}992	if (dch->dev.D.protocol != rq->protocol)993		dch->dev.D.protocol = rq->protocol;994 995	if (test_bit(FLG_ACTIVE, &dch->Flags)) {996		_queue_data(&dch->dev.D, PH_ACTIVATE_IND, MISDN_ID_ANY,997			    0, NULL, GFP_KERNEL);998	}999	rq->ch = &dch->dev.D;1000	if (!try_module_get(THIS_MODULE))1001		printk(KERN_WARNING "%s:cannot get module\n", __func__);1002	return 0;1003}1004 1005static int1006open_bchannel(struct l1oip *hc, struct dchannel *dch, struct channel_req *rq)1007{1008	struct bchannel	*bch;1009	int		ch;1010 1011	if (!test_channelmap(rq->adr.channel, dch->dev.channelmap))1012		return -EINVAL;1013	if (rq->protocol == ISDN_P_NONE)1014		return -EINVAL;1015	ch = rq->adr.channel; /* BRI: 1=B1 2=B2  PRI: 1..15,17.. */1016	bch = hc->chan[ch].bch;1017	if (!bch) {1018		printk(KERN_ERR "%s:internal error ch %d has no bch\n",1019		       __func__, ch);1020		return -EINVAL;1021	}1022	if (test_and_set_bit(FLG_OPEN, &bch->Flags))1023		return -EBUSY; /* b-channel can be only open once */1024	bch->ch.protocol = rq->protocol;1025	rq->ch = &bch->ch;1026	if (!try_module_get(THIS_MODULE))1027		printk(KERN_WARNING "%s:cannot get module\n", __func__);1028	return 0;1029}1030 1031static int1032l1oip_dctrl(struct mISDNchannel *ch, u_int cmd, void *arg)1033{1034	struct mISDNdevice	*dev = container_of(ch, struct mISDNdevice, D);1035	struct dchannel		*dch = container_of(dev, struct dchannel, dev);1036	struct l1oip			*hc = dch->hw;1037	struct channel_req	*rq;1038	int			err = 0;1039 1040	if (dch->debug & DEBUG_HW)1041		printk(KERN_DEBUG "%s: cmd:%x %p\n",1042		       __func__, cmd, arg);1043	switch (cmd) {1044	case OPEN_CHANNEL:1045		rq = arg;1046		switch (rq->protocol) {1047		case ISDN_P_TE_S0:1048		case ISDN_P_NT_S0:1049			if (hc->pri) {1050				err = -EINVAL;1051				break;1052			}1053			err = open_dchannel(hc, dch, rq);1054			break;1055		case ISDN_P_TE_E1:1056		case ISDN_P_NT_E1:1057			if (!hc->pri) {1058				err = -EINVAL;1059				break;1060			}1061			err = open_dchannel(hc, dch, rq);1062			break;1063		default:1064			err = open_bchannel(hc, dch, rq);1065		}1066		break;1067	case CLOSE_CHANNEL:1068		if (debug & DEBUG_HW_OPEN)1069			printk(KERN_DEBUG "%s: dev(%d) close from %p\n",1070			       __func__, dch->dev.id,1071			       __builtin_return_address(0));1072		module_put(THIS_MODULE);1073		break;1074	case CONTROL_CHANNEL:1075		err = channel_dctrl(dch, arg);1076		break;1077	default:1078		if (dch->debug & DEBUG_HW)1079			printk(KERN_DEBUG "%s: unknown command %x\n",1080			       __func__, cmd);1081		err = -EINVAL;1082	}1083	return err;1084}1085 1086static int1087handle_bmsg(struct mISDNchannel *ch, struct sk_buff *skb)1088{1089	struct bchannel		*bch = container_of(ch, struct bchannel, ch);1090	struct l1oip			*hc = bch->hw;1091	int			ret = -EINVAL;1092	struct mISDNhead	*hh = mISDN_HEAD_P(skb);1093	int			l, ll;1094	unsigned char		*p;1095 1096	switch (hh->prim) {1097	case PH_DATA_REQ:1098		if (skb->len <= 0) {1099			printk(KERN_WARNING "%s: skb too small\n",1100			       __func__);1101			break;1102		}1103		if (skb->len > MAX_DFRAME_LEN_L1 || skb->len > L1OIP_MAX_LEN) {1104			printk(KERN_WARNING "%s: skb too large\n",1105			       __func__);1106			break;1107		}1108		/* check for AIS / ulaw-silence */1109		l = skb->len;1110		if (!memchr_inv(skb->data, 0xff, l)) {1111			if (debug & DEBUG_L1OIP_MSG)1112				printk(KERN_DEBUG "%s: got AIS, not sending, "1113				       "but counting\n", __func__);1114			hc->chan[bch->slot].tx_counter += l;1115			skb_trim(skb, 0);1116			queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);1117			return 0;1118		}1119		/* check for silence */1120		l = skb->len;1121		if (!memchr_inv(skb->data, 0x2a, l)) {1122			if (debug & DEBUG_L1OIP_MSG)1123				printk(KERN_DEBUG "%s: got silence, not sending"1124				       ", but counting\n", __func__);1125			hc->chan[bch->slot].tx_counter += l;1126			skb_trim(skb, 0);1127			queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);1128			return 0;1129		}1130 1131		/* send frame */1132		p = skb->data;1133		l = skb->len;1134		while (l) {1135			/*1136			 * This is technically bounded by L1OIP_MAX_PERFRAME but1137			 * MAX_DFRAME_LEN_L1 < L1OIP_MAX_PERFRAME1138			 */1139			ll = (l < MAX_DFRAME_LEN_L1) ? l : MAX_DFRAME_LEN_L1;1140			l1oip_socket_send(hc, hc->codec, bch->slot, 0,1141					  hc->chan[bch->slot].tx_counter, p, ll);1142			hc->chan[bch->slot].tx_counter += ll;1143			p += ll;1144			l -= ll;1145		}1146		skb_trim(skb, 0);1147		queue_ch_frame(ch, PH_DATA_CNF, hh->id, skb);1148		return 0;1149	case PH_ACTIVATE_REQ:1150		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))1151			printk(KERN_DEBUG "%s: PH_ACTIVATE channel %d (1..%d)\n"1152			       , __func__, bch->slot, hc->b_num + 1);1153		hc->chan[bch->slot].codecstate = 0;1154		test_and_set_bit(FLG_ACTIVE, &bch->Flags);1155		skb_trim(skb, 0);1156		queue_ch_frame(ch, PH_ACTIVATE_IND, hh->id, skb);1157		return 0;1158	case PH_DEACTIVATE_REQ:1159		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))1160			printk(KERN_DEBUG "%s: PH_DEACTIVATE channel %d "1161			       "(1..%d)\n", __func__, bch->slot,1162			       hc->b_num + 1);1163		test_and_clear_bit(FLG_ACTIVE, &bch->Flags);1164		skb_trim(skb, 0);1165		queue_ch_frame(ch, PH_DEACTIVATE_IND, hh->id, skb);1166		return 0;1167	}1168	if (!ret)1169		dev_kfree_skb(skb);1170	return ret;1171}1172 1173static int1174channel_bctrl(struct bchannel *bch, struct mISDN_ctrl_req *cq)1175{1176	int			ret = 0;1177	struct dsp_features	*features =1178		(struct dsp_features *)(*((u_long *)&cq->p1));1179 1180	switch (cq->op) {1181	case MISDN_CTRL_GETOP:1182		cq->op = MISDN_CTRL_HW_FEATURES_OP;1183		break;1184	case MISDN_CTRL_HW_FEATURES: /* fill features structure */1185		if (debug & DEBUG_L1OIP_MSG)1186			printk(KERN_DEBUG "%s: HW_FEATURE request\n",1187			       __func__);1188		/* create confirm */1189		features->unclocked = 1;1190		features->unordered = 1;1191		break;1192	default:1193		printk(KERN_WARNING "%s: unknown Op %x\n",1194		       __func__, cq->op);1195		ret = -EINVAL;1196		break;1197	}1198	return ret;1199}1200 1201static int1202l1oip_bctrl(struct mISDNchannel *ch, u_int cmd, void *arg)1203{1204	struct bchannel	*bch = container_of(ch, struct bchannel, ch);1205	int		err = -EINVAL;1206 1207	if (bch->debug & DEBUG_HW)1208		printk(KERN_DEBUG "%s: cmd:%x %p\n",1209		       __func__, cmd, arg);1210	switch (cmd) {1211	case CLOSE_CHANNEL:1212		test_and_clear_bit(FLG_OPEN, &bch->Flags);1213		test_and_clear_bit(FLG_ACTIVE, &bch->Flags);1214		ch->protocol = ISDN_P_NONE;1215		ch->peer = NULL;1216		module_put(THIS_MODULE);1217		err = 0;1218		break;1219	case CONTROL_CHANNEL:1220		err = channel_bctrl(bch, arg);1221		break;1222	default:1223		printk(KERN_WARNING "%s: unknown prim(%x)\n",1224		       __func__, cmd);1225	}1226	return err;1227}1228 1229 1230/*1231 * cleanup module and stack1232 */1233static void1234release_card(struct l1oip *hc)1235{1236	int	ch;1237 1238	hc->shutdown = true;1239 1240	timer_shutdown_sync(&hc->keep_tl);1241	timer_shutdown_sync(&hc->timeout_tl);1242 1243	cancel_work_sync(&hc->workq);1244 1245	if (hc->socket_thread)1246		l1oip_socket_close(hc);1247 1248	if (hc->registered && hc->chan[hc->d_idx].dch)1249		mISDN_unregister_device(&hc->chan[hc->d_idx].dch->dev);1250	for (ch = 0; ch < 128; ch++) {1251		if (hc->chan[ch].dch) {1252			mISDN_freedchannel(hc->chan[ch].dch);1253			kfree(hc->chan[ch].dch);1254		}1255		if (hc->chan[ch].bch) {1256			mISDN_freebchannel(hc->chan[ch].bch);1257			kfree(hc->chan[ch].bch);1258#ifdef REORDER_DEBUG1259			dev_kfree_skb(hc->chan[ch].disorder_skb);1260#endif1261		}1262	}1263 1264	spin_lock(&l1oip_lock);1265	list_del(&hc->list);1266	spin_unlock(&l1oip_lock);1267 1268	kfree(hc);1269}1270 1271static void1272l1oip_cleanup(void)1273{1274	struct l1oip *hc, *next;1275 1276	list_for_each_entry_safe(hc, next, &l1oip_ilist, list)1277		release_card(hc);1278 1279	l1oip_4bit_free();1280}1281 1282 1283/*1284 * module and stack init1285 */1286static int1287init_card(struct l1oip *hc, int pri, int bundle)1288{1289	struct dchannel	*dch;1290	struct bchannel	*bch;1291	int		ret;1292	int		i, ch;1293 1294	spin_lock_init(&hc->socket_lock);1295	hc->idx = l1oip_cnt;1296	hc->pri = pri;1297	hc->d_idx = pri ? 16 : 3;1298	hc->b_num = pri ? 30 : 2;1299	hc->bundle = bundle;1300	if (hc->pri)1301		sprintf(hc->name, "l1oip-e1.%d", l1oip_cnt + 1);1302	else1303		sprintf(hc->name, "l1oip-s0.%d", l1oip_cnt + 1);1304 1305	switch (codec[l1oip_cnt]) {1306	case 0: /* as is */1307	case 1: /* alaw */1308	case 2: /* ulaw */1309	case 3: /* 4bit */1310		break;1311	default:1312		printk(KERN_ERR "Codec(%d) not supported.\n",1313		       codec[l1oip_cnt]);1314		return -EINVAL;1315	}1316	hc->codec = codec[l1oip_cnt];1317	if (debug & DEBUG_L1OIP_INIT)1318		printk(KERN_DEBUG "%s: using codec %d\n",1319		       __func__, hc->codec);1320 1321	if (id[l1oip_cnt] == 0) {1322		printk(KERN_WARNING "Warning: No 'id' value given or "1323		       "0, this is highly unsecure. Please use 32 "1324		       "bit random number 0x...\n");1325	}1326	hc->id = id[l1oip_cnt];1327	if (debug & DEBUG_L1OIP_INIT)1328		printk(KERN_DEBUG "%s: using id 0x%x\n", __func__, hc->id);1329 1330	hc->ondemand = ondemand[l1oip_cnt];1331	if (hc->ondemand && !hc->id) {1332		printk(KERN_ERR "%s: ondemand option only allowed in "1333		       "conjunction with non 0 ID\n", __func__);1334		return -EINVAL;1335	}1336 1337	if (limit[l1oip_cnt])1338		hc->b_num = limit[l1oip_cnt];1339	if (!pri && hc->b_num > 2) {1340		printk(KERN_ERR "Maximum limit for BRI interface is 2 "1341		       "channels.\n");1342		return -EINVAL;1343	}1344	if (pri && hc->b_num > 126) {1345		printk(KERN_ERR "Maximum limit for PRI interface is 126 "1346		       "channels.\n");1347		return -EINVAL;1348	}1349	if (pri && hc->b_num > 30) {1350		printk(KERN_WARNING "Maximum limit for BRI interface is 30 "1351		       "channels.\n");1352		printk(KERN_WARNING "Your selection of %d channels must be "1353		       "supported by application.\n", hc->limit);1354	}1355 1356	hc->remoteip = ip[l1oip_cnt << 2] << 241357		| ip[(l1oip_cnt << 2) + 1] << 161358		| ip[(l1oip_cnt << 2) + 2] << 81359		| ip[(l1oip_cnt << 2) + 3];1360	hc->localport = port[l1oip_cnt]?:(L1OIP_DEFAULTPORT + l1oip_cnt);1361	if (remoteport[l1oip_cnt])1362		hc->remoteport = remoteport[l1oip_cnt];1363	else1364		hc->remoteport = hc->localport;1365	if (debug & DEBUG_L1OIP_INIT)1366		printk(KERN_DEBUG "%s: using local port %d remote ip "1367		       "%d.%d.%d.%d port %d ondemand %d\n", __func__,1368		       hc->localport, hc->remoteip >> 24,1369		       (hc->remoteip >> 16) & 0xff,1370		       (hc->remoteip >> 8) & 0xff, hc->remoteip & 0xff,1371		       hc->remoteport, hc->ondemand);1372 1373	dch = kzalloc(sizeof(struct dchannel), GFP_KERNEL);1374	if (!dch)1375		return -ENOMEM;1376	dch->debug = debug;1377	mISDN_initdchannel(dch, MAX_DFRAME_LEN_L1, NULL);1378	dch->hw = hc;1379	if (pri)1380		dch->dev.Dprotocols = (1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1);1381	else1382		dch->dev.Dprotocols = (1 << ISDN_P_TE_S0) | (1 << ISDN_P_NT_S0);1383	dch->dev.Bprotocols = (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK)) |1384		(1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK));1385	dch->dev.D.send = handle_dmsg;1386	dch->dev.D.ctrl = l1oip_dctrl;1387	dch->dev.nrbchan = hc->b_num;1388	dch->slot = hc->d_idx;1389	hc->chan[hc->d_idx].dch = dch;1390	i = 1;1391	for (ch = 0; ch < dch->dev.nrbchan; ch++) {1392		if (ch == 15)1393			i++;1394		bch = kzalloc(sizeof(struct bchannel), GFP_KERNEL);1395		if (!bch) {1396			printk(KERN_ERR "%s: no memory for bchannel\n",1397			       __func__);1398			return -ENOMEM;1399		}1400		bch->nr = i + ch;1401		bch->slot = i + ch;1402		bch->debug = debug;1403		mISDN_initbchannel(bch, MAX_DATA_MEM, 0);1404		bch->hw = hc;1405		bch->ch.send = handle_bmsg;1406		bch->ch.ctrl = l1oip_bctrl;1407		bch->ch.nr = i + ch;1408		list_add(&bch->ch.list, &dch->dev.bchannels);1409		hc->chan[i + ch].bch = bch;1410		set_channelmap(bch->nr, dch->dev.channelmap);1411	}1412	/* TODO: create a parent device for this driver */1413	ret = mISDN_register_device(&dch->dev, NULL, hc->name);1414	if (ret)1415		return ret;1416	hc->registered = 1;1417 1418	if (debug & DEBUG_L1OIP_INIT)1419		printk(KERN_DEBUG "%s: Setting up network card(%d)\n",1420		       __func__, l1oip_cnt + 1);1421	ret = l1oip_socket_open(hc);1422	if (ret)1423		return ret;1424 1425	timer_setup(&hc->keep_tl, l1oip_keepalive, 0);1426	hc->keep_tl.expires = jiffies + 2 * HZ; /* two seconds first time */1427	add_timer(&hc->keep_tl);1428 1429	timer_setup(&hc->timeout_tl, l1oip_timeout, 0);1430	hc->timeout_on = 0; /* state that we have timer off */1431 1432	return 0;1433}1434 1435static int __init1436l1oip_init(void)1437{1438	int		pri, bundle;1439	struct l1oip		*hc;1440	int		ret;1441 1442	printk(KERN_INFO "mISDN: Layer-1-over-IP driver Rev. %s\n",1443	       l1oip_revision);1444 1445	if (l1oip_4bit_alloc(ulaw))1446		return -ENOMEM;1447 1448	l1oip_cnt = 0;1449	while (l1oip_cnt < MAX_CARDS && type[l1oip_cnt]) {1450		switch (type[l1oip_cnt] & 0xff) {1451		case 1:1452			pri = 0;1453			bundle = 0;1454			break;1455		case 2:1456			pri = 1;1457			bundle = 0;1458			break;1459		case 3:1460			pri = 0;1461			bundle = 1;1462			break;1463		case 4:1464			pri = 1;1465			bundle = 1;1466			break;1467		default:1468			printk(KERN_ERR "Card type(%d) not supported.\n",1469			       type[l1oip_cnt] & 0xff);1470			l1oip_cleanup();1471			return -EINVAL;1472		}1473 1474		if (debug & DEBUG_L1OIP_INIT)1475			printk(KERN_DEBUG "%s: interface %d is %s with %s.\n",1476			       __func__, l1oip_cnt, pri ? "PRI" : "BRI",1477			       bundle ? "bundled IP packet for all B-channels" :1478			       "separate IP packets for every B-channel");1479 1480		hc = kzalloc(sizeof(struct l1oip), GFP_ATOMIC);1481		if (!hc) {1482			printk(KERN_ERR "No kmem for L1-over-IP driver.\n");1483			l1oip_cleanup();1484			return -ENOMEM;1485		}1486		INIT_WORK(&hc->workq, (void *)l1oip_send_bh);1487 1488		spin_lock(&l1oip_lock);1489		list_add_tail(&hc->list, &l1oip_ilist);1490		spin_unlock(&l1oip_lock);1491 1492		ret = init_card(hc, pri, bundle);1493		if (ret) {1494			l1oip_cleanup();1495			return ret;1496		}1497 1498		l1oip_cnt++;1499	}1500	printk(KERN_INFO "%d virtual devices registered\n", l1oip_cnt);1501	return 0;1502}1503 1504module_init(l1oip_init);1505module_exit(l1oip_cleanup);1506