Linux Audio

Check our new training course

Loading...
v3.1
   1/* $Id: isdn_ppp.c,v 1.1.2.3 2004/02/10 01:07:13 keil Exp $
   2 *
   3 * Linux ISDN subsystem, functions for synchronous PPP (linklevel).
   4 *
   5 * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de)
   6 *
   7 * This software may be used and distributed according to the terms
   8 * of the GNU General Public License, incorporated herein by reference.
   9 *
  10 */
  11
  12#include <linux/isdn.h>
  13#include <linux/poll.h>
  14#include <linux/ppp-comp.h>
  15#include <linux/slab.h>
  16#ifdef CONFIG_IPPP_FILTER
  17#include <linux/filter.h>
  18#endif
  19
  20#include "isdn_common.h"
  21#include "isdn_ppp.h"
  22#include "isdn_net.h"
  23
  24#ifndef PPP_IPX
  25#define PPP_IPX 0x002b
  26#endif
  27
  28/* Prototypes */
  29static int isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot);
  30static int isdn_ppp_closewait(int slot);
  31static void isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp,
  32				 struct sk_buff *skb, int proto);
  33static int isdn_ppp_if_get_unit(char *namebuf);
  34static int isdn_ppp_set_compressor(struct ippp_struct *is,struct isdn_ppp_comp_data *);
  35static struct sk_buff *isdn_ppp_decompress(struct sk_buff *,
  36				struct ippp_struct *,struct ippp_struct *,int *proto);
  37static void isdn_ppp_receive_ccp(isdn_net_dev * net_dev, isdn_net_local * lp,
  38				struct sk_buff *skb,int proto);
  39static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
  40	struct ippp_struct *is,struct ippp_struct *master,int type);
  41static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
  42	 struct sk_buff *skb);
  43
  44/* New CCP stuff */
  45static void isdn_ppp_ccp_kickup(struct ippp_struct *is);
  46static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
  47				    unsigned char code, unsigned char id,
  48				    unsigned char *data, int len);
  49static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is);
  50static void isdn_ppp_ccp_reset_free(struct ippp_struct *is);
  51static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
  52					  unsigned char id);
  53static void isdn_ppp_ccp_timer_callback(unsigned long closure);
  54static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
  55						      unsigned char id);
  56static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
  57				     struct isdn_ppp_resetparams *rp);
  58static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
  59					unsigned char id);
  60
  61
  62
  63#ifdef CONFIG_ISDN_MPP
  64static ippp_bundle * isdn_ppp_bundle_arr = NULL;
  65 
  66static int isdn_ppp_mp_bundle_array_init(void);
  67static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to );
  68static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, 
  69							struct sk_buff *skb);
  70static void isdn_ppp_mp_cleanup( isdn_net_local * lp );
  71
  72static int isdn_ppp_bundle(struct ippp_struct *, int unit);
  73#endif	/* CONFIG_ISDN_MPP */
  74  
  75char *isdn_ppp_revision = "$Revision: 1.1.2.3 $";
  76
  77static struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS];
  78
  79static struct isdn_ppp_compressor *ipc_head = NULL;
  80
  81/*
  82 * frame log (debug)
  83 */
  84static void
  85isdn_ppp_frame_log(char *info, char *data, int len, int maxlen,int unit,int slot)
  86{
  87	int cnt,
  88	 j,
  89	 i;
  90	char buf[80];
  91
  92	if (len < maxlen)
  93		maxlen = len;
  94
  95	for (i = 0, cnt = 0; cnt < maxlen; i++) {
  96		for (j = 0; j < 16 && cnt < maxlen; j++, cnt++)
  97			sprintf(buf + j * 3, "%02x ", (unsigned char) data[cnt]);
  98		printk(KERN_DEBUG "[%d/%d].%s[%d]: %s\n",unit,slot, info, i, buf);
  99	}
 100}
 101
 102/*
 103 * unbind isdn_net_local <=> ippp-device
 104 * note: it can happen, that we hangup/free the master before the slaves
 105 *       in this case we bind another lp to the master device
 106 */
 107int
 108isdn_ppp_free(isdn_net_local * lp)
 109{
 110	struct ippp_struct *is;
 111
 112	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
 113		printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
 114			__func__, lp->ppp_slot);
 115		return 0;
 116	}
 117
 118#ifdef CONFIG_ISDN_MPP
 119	spin_lock(&lp->netdev->pb->lock);
 120#endif
 121	isdn_net_rm_from_bundle(lp);
 122#ifdef CONFIG_ISDN_MPP
 123	if (lp->netdev->pb->ref_ct == 1)	/* last link in queue? */
 124		isdn_ppp_mp_cleanup(lp);
 125
 126	lp->netdev->pb->ref_ct--;
 127	spin_unlock(&lp->netdev->pb->lock);
 128#endif /* CONFIG_ISDN_MPP */
 129	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
 130		printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n",
 131			__func__, lp->ppp_slot);
 132		return 0;
 133	}
 134	is = ippp_table[lp->ppp_slot];
 135	if ((is->state & IPPP_CONNECT))
 136		isdn_ppp_closewait(lp->ppp_slot);	/* force wakeup on ippp device */
 137	else if (is->state & IPPP_ASSIGNED)
 138		is->state = IPPP_OPEN;	/* fallback to 'OPEN but not ASSIGNED' state */
 139
 140	if (is->debug & 0x1)
 141		printk(KERN_DEBUG "isdn_ppp_free %d %lx %lx\n", lp->ppp_slot, (long) lp, (long) is->lp);
 142
 143	is->lp = NULL;          /* link is down .. set lp to NULL */
 144	lp->ppp_slot = -1;      /* is this OK ?? */
 145
 146	return 0;
 147}
 148
 149/*
 150 * bind isdn_net_local <=> ippp-device
 151 *
 152 * This function is allways called with holding dev->lock so
 153 * no additional lock is needed
 154 */
 155int
 156isdn_ppp_bind(isdn_net_local * lp)
 157{
 158	int i;
 159	int unit = 0;
 160	struct ippp_struct *is;
 161	int retval;
 162
 163	if (lp->pppbind < 0) {  /* device bounded to ippp device ? */
 164		isdn_net_dev *net_dev = dev->netdev;
 165		char exclusive[ISDN_MAX_CHANNELS];	/* exclusive flags */
 166		memset(exclusive, 0, ISDN_MAX_CHANNELS);
 167		while (net_dev) {	/* step through net devices to find exclusive minors */
 168			isdn_net_local *lp = net_dev->local;
 169			if (lp->pppbind >= 0)
 170				exclusive[lp->pppbind] = 1;
 171			net_dev = net_dev->next;
 172		}
 173		/*
 174		 * search a free device / slot
 175		 */
 176		for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 177			if (ippp_table[i]->state == IPPP_OPEN && !exclusive[ippp_table[i]->minor]) {	/* OPEN, but not connected! */
 178				break;
 179			}
 180		}
 181	} else {
 182		for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 183			if (ippp_table[i]->minor == lp->pppbind &&
 184			    (ippp_table[i]->state & IPPP_OPEN) == IPPP_OPEN)
 185				break;
 186		}
 187	}
 188
 189	if (i >= ISDN_MAX_CHANNELS) {
 190		printk(KERN_WARNING "isdn_ppp_bind: Can't find a (free) connection to the ipppd daemon.\n");
 191		retval = -1;
 192		goto out;
 193	}
 194	/* get unit number from interface name .. ugly! */
 195	unit = isdn_ppp_if_get_unit(lp->netdev->dev->name);
 196	if (unit < 0) {
 197		printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n",
 198			lp->netdev->dev->name);
 199		retval = -1;
 200		goto out;
 201	}
 202	
 203	lp->ppp_slot = i;
 204	is = ippp_table[i];
 205	is->lp = lp;
 206	is->unit = unit;
 207	is->state = IPPP_OPEN | IPPP_ASSIGNED;	/* assigned to a netdevice but not connected */
 208#ifdef CONFIG_ISDN_MPP
 209	retval = isdn_ppp_mp_init(lp, NULL);
 210	if (retval < 0)
 211		goto out;
 212#endif /* CONFIG_ISDN_MPP */
 213
 214	retval = lp->ppp_slot;
 215
 216 out:
 217	return retval;
 218}
 219
 220/*
 221 * kick the ipppd on the device
 222 * (wakes up daemon after B-channel connect)
 223 */
 224
 225void
 226isdn_ppp_wakeup_daemon(isdn_net_local * lp)
 227{
 228	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
 229		printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
 230			__func__, lp->ppp_slot);
 231		return;
 232	}
 233	ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK;
 234	wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq);
 235}
 236
 237/*
 238 * there was a hangup on the netdevice
 239 * force wakeup of the ippp device
 240 * go into 'device waits for release' state
 241 */
 242static int
 243isdn_ppp_closewait(int slot)
 244{
 245	struct ippp_struct *is;
 246
 247	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
 248		printk(KERN_ERR "%s: slot(%d) out of range\n",
 249			__func__, slot);
 250		return 0;
 251	}
 252	is = ippp_table[slot];
 253	if (is->state)
 254		wake_up_interruptible(&is->wq);
 255	is->state = IPPP_CLOSEWAIT;
 256	return 1;
 257}
 258
 259/*
 260 * isdn_ppp_find_slot / isdn_ppp_free_slot
 261 */
 262
 263static int
 264isdn_ppp_get_slot(void)
 265{
 266	int i;
 267	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 268		if (!ippp_table[i]->state)
 269			return i;
 270	}
 271	return -1;
 272}
 273
 274/*
 275 * isdn_ppp_open
 276 */
 277
 278int
 279isdn_ppp_open(int min, struct file *file)
 280{
 281	int slot;
 282	struct ippp_struct *is;
 283
 284	if (min < 0 || min >= ISDN_MAX_CHANNELS)
 285		return -ENODEV;
 286
 287	slot = isdn_ppp_get_slot();
 288	if (slot < 0) {
 289		return -EBUSY;
 290	}
 291	is = file->private_data = ippp_table[slot];
 292	
 293	printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n",
 294	       slot, min, is->state);
 295
 296	/* compression stuff */
 297	is->link_compressor   = is->compressor = NULL;
 298	is->link_decompressor = is->decompressor = NULL;
 299	is->link_comp_stat    = is->comp_stat = NULL;
 300	is->link_decomp_stat  = is->decomp_stat = NULL;
 301	is->compflags = 0;
 302
 303	is->reset = isdn_ppp_ccp_reset_alloc(is);
 304
 305	is->lp = NULL;
 306	is->mp_seqno = 0;       /* MP sequence number */
 307	is->pppcfg = 0;         /* ppp configuration */
 308	is->mpppcfg = 0;        /* mppp configuration */
 309	is->last_link_seqno = -1;	/* MP: maybe set to Bundle-MIN, when joining a bundle ?? */
 310	is->unit = -1;          /* set, when we have our interface */
 311	is->mru = 1524;         /* MRU, default 1524 */
 312	is->maxcid = 16;        /* VJ: maxcid */
 313	is->tk = current;
 314	init_waitqueue_head(&is->wq);
 315	is->first = is->rq + NUM_RCV_BUFFS - 1;	/* receive queue */
 316	is->last = is->rq;
 317	is->minor = min;
 318#ifdef CONFIG_ISDN_PPP_VJ
 319	/*
 320	 * VJ header compression init
 321	 */
 322	is->slcomp = slhc_init(16, 16);	/* not necessary for 2. link in bundle */
 323#endif
 324#ifdef CONFIG_IPPP_FILTER
 325	is->pass_filter = NULL;
 326	is->active_filter = NULL;
 327#endif
 328	is->state = IPPP_OPEN;
 329
 330	return 0;
 331}
 332
 333/*
 334 * release ippp device
 335 */
 336void
 337isdn_ppp_release(int min, struct file *file)
 338{
 339	int i;
 340	struct ippp_struct *is;
 341
 342	if (min < 0 || min >= ISDN_MAX_CHANNELS)
 343		return;
 344	is = file->private_data;
 345
 346	if (!is) {
 347		printk(KERN_ERR "%s: no file->private_data\n", __func__);
 348		return;
 349	}
 350	if (is->debug & 0x1)
 351		printk(KERN_DEBUG "ippp: release, minor: %d %lx\n", min, (long) is->lp);
 352
 353	if (is->lp) {           /* a lp address says: this link is still up */
 354		isdn_net_dev *p = is->lp->netdev;
 355
 356		if (!p) {
 357			printk(KERN_ERR "%s: no lp->netdev\n", __func__);
 358			return;
 359		}
 360		is->state &= ~IPPP_CONNECT;	/* -> effect: no call of wakeup */
 361		/*
 362		 * isdn_net_hangup() calls isdn_ppp_free()
 363		 * isdn_ppp_free() sets is->lp to NULL and lp->ppp_slot to -1
 364		 * removing the IPPP_CONNECT flag omits calling of isdn_ppp_wakeup_daemon()
 365		 */
 366		isdn_net_hangup(p->dev);
 367	}
 368	for (i = 0; i < NUM_RCV_BUFFS; i++) {
 369		kfree(is->rq[i].buf);
 370		is->rq[i].buf = NULL;
 371	}
 372	is->first = is->rq + NUM_RCV_BUFFS - 1;	/* receive queue */
 373	is->last = is->rq;
 374
 375#ifdef CONFIG_ISDN_PPP_VJ
 376/* TODO: if this was the previous master: link the slcomp to the new master */
 377	slhc_free(is->slcomp);
 378	is->slcomp = NULL;
 379#endif
 380#ifdef CONFIG_IPPP_FILTER
 381	kfree(is->pass_filter);
 382	is->pass_filter = NULL;
 383	kfree(is->active_filter);
 384	is->active_filter = NULL;
 385#endif
 386
 387/* TODO: if this was the previous master: link the stuff to the new master */
 388	if(is->comp_stat)
 389		is->compressor->free(is->comp_stat);
 390	if(is->link_comp_stat)
 391		is->link_compressor->free(is->link_comp_stat);
 392	if(is->link_decomp_stat)
 393		is->link_decompressor->free(is->link_decomp_stat);
 394	if(is->decomp_stat)
 395		is->decompressor->free(is->decomp_stat);
 396        is->compressor   = is->link_compressor   = NULL;
 397        is->decompressor = is->link_decompressor = NULL;
 398	is->comp_stat    = is->link_comp_stat    = NULL;
 399        is->decomp_stat  = is->link_decomp_stat  = NULL;
 400
 401	/* Clean up if necessary */
 402	if(is->reset)
 403		isdn_ppp_ccp_reset_free(is);
 404
 405	/* this slot is ready for new connections */
 406	is->state = 0;
 407}
 408
 409/*
 410 * get_arg .. ioctl helper
 411 */
 412static int
 413get_arg(void __user *b, void *val, int len)
 414{
 415	if (len <= 0)
 416		len = sizeof(void *);
 417	if (copy_from_user(val, b, len))
 418		return -EFAULT;
 419	return 0;
 420}
 421
 422/*
 423 * set arg .. ioctl helper
 424 */
 425static int
 426set_arg(void __user *b, void *val,int len)
 427{
 428	if(len <= 0)
 429		len = sizeof(void *);
 430	if (copy_to_user(b, val, len))
 431		return -EFAULT;
 432	return 0;
 433}
 434
 435#ifdef CONFIG_IPPP_FILTER
 436static int get_filter(void __user *arg, struct sock_filter **p)
 437{
 438	struct sock_fprog uprog;
 439	struct sock_filter *code = NULL;
 440	int len, err;
 441
 442	if (copy_from_user(&uprog, arg, sizeof(uprog)))
 443		return -EFAULT;
 444
 445	if (!uprog.len) {
 446		*p = NULL;
 447		return 0;
 448	}
 449
 450	/* uprog.len is unsigned short, so no overflow here */
 451	len = uprog.len * sizeof(struct sock_filter);
 452	code = memdup_user(uprog.filter, len);
 453	if (IS_ERR(code))
 454		return PTR_ERR(code);
 455
 456	err = sk_chk_filter(code, uprog.len);
 457	if (err) {
 458		kfree(code);
 459		return err;
 460	}
 461
 462	*p = code;
 463	return uprog.len;
 464}
 465#endif /* CONFIG_IPPP_FILTER */
 466
 467/*
 468 * ippp device ioctl
 469 */
 470int
 471isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
 472{
 473	unsigned long val;
 474	int r,i,j;
 475	struct ippp_struct *is;
 476	isdn_net_local *lp;
 477	struct isdn_ppp_comp_data data;
 478	void __user *argp = (void __user *)arg;
 479
 480	is = file->private_data;
 481	lp = is->lp;
 482
 483	if (is->debug & 0x1)
 484		printk(KERN_DEBUG "isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min, cmd, is->state);
 485
 486	if (!(is->state & IPPP_OPEN))
 487		return -EINVAL;
 488
 489	switch (cmd) {
 490		case PPPIOCBUNDLE:
 491#ifdef CONFIG_ISDN_MPP
 492			if (!(is->state & IPPP_CONNECT))
 493				return -EINVAL;
 494			if ((r = get_arg(argp, &val, sizeof(val) )))
 495				return r;
 496			printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
 497			       (int) min, (int) is->unit, (int) val);
 498			return isdn_ppp_bundle(is, val);
 499#else
 500			return -1;
 501#endif
 502			break;
 503		case PPPIOCGUNIT:	/* get ppp/isdn unit number */
 504			if ((r = set_arg(argp, &is->unit, sizeof(is->unit) )))
 505				return r;
 506			break;
 507		case PPPIOCGIFNAME:
 508			if(!lp)
 509				return -EINVAL;
 510			if ((r = set_arg(argp, lp->netdev->dev->name,
 511				strlen(lp->netdev->dev->name))))
 512				return r;
 513			break;
 514		case PPPIOCGMPFLAGS:	/* get configuration flags */
 515			if ((r = set_arg(argp, &is->mpppcfg, sizeof(is->mpppcfg) )))
 516				return r;
 517			break;
 518		case PPPIOCSMPFLAGS:	/* set configuration flags */
 519			if ((r = get_arg(argp, &val, sizeof(val) )))
 520				return r;
 521			is->mpppcfg = val;
 522			break;
 523		case PPPIOCGFLAGS:	/* get configuration flags */
 524			if ((r = set_arg(argp, &is->pppcfg,sizeof(is->pppcfg) )))
 525				return r;
 526			break;
 527		case PPPIOCSFLAGS:	/* set configuration flags */
 528			if ((r = get_arg(argp, &val, sizeof(val) ))) {
 529				return r;
 530			}
 531			if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
 532				if (lp) {
 533					/* OK .. we are ready to send buffers */
 534					is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
 535					netif_wake_queue(lp->netdev->dev);
 536					break;
 537				}
 538			}
 539			is->pppcfg = val;
 540			break;
 541		case PPPIOCGIDLE:	/* get idle time information */
 542			if (lp) {
 543				struct ppp_idle pidle;
 544				pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
 545				if ((r = set_arg(argp, &pidle,sizeof(struct ppp_idle))))
 546					 return r;
 547			}
 548			break;
 549		case PPPIOCSMRU:	/* set receive unit size for PPP */
 550			if ((r = get_arg(argp, &val, sizeof(val) )))
 551				return r;
 552			is->mru = val;
 553			break;
 554		case PPPIOCSMPMRU:
 555			break;
 556		case PPPIOCSMPMTU:
 557			break;
 558		case PPPIOCSMAXCID:	/* set the maximum compression slot id */
 559			if ((r = get_arg(argp, &val, sizeof(val) )))
 560				return r;
 561			val++;
 562			if (is->maxcid != val) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 563#ifdef CONFIG_ISDN_PPP_VJ
 564				struct slcompress *sltmp;
 565#endif
 566				if (is->debug & 0x1)
 567					printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
 568				is->maxcid = val;
 569#ifdef CONFIG_ISDN_PPP_VJ
 570				sltmp = slhc_init(16, val);
 571				if (!sltmp) {
 572					printk(KERN_ERR "ippp, can't realloc slhc struct\n");
 573					return -ENOMEM;
 574				}
 575				if (is->slcomp)
 576					slhc_free(is->slcomp);
 577				is->slcomp = sltmp;
 578#endif
 579			}
 580			break;
 581		case PPPIOCGDEBUG:
 582			if ((r = set_arg(argp, &is->debug, sizeof(is->debug) )))
 583				return r;
 584			break;
 585		case PPPIOCSDEBUG:
 586			if ((r = get_arg(argp, &val, sizeof(val) )))
 587				return r;
 588			is->debug = val;
 589			break;
 590		case PPPIOCGCOMPRESSORS:
 591			{
 592				unsigned long protos[8] = {0,};
 593				struct isdn_ppp_compressor *ipc = ipc_head;
 594				while(ipc) {
 595					j = ipc->num / (sizeof(long)*8);
 596					i = ipc->num % (sizeof(long)*8);
 597					if(j < 8)
 598						protos[j] |= (0x1<<i);
 599					ipc = ipc->next;
 600				}
 601				if ((r = set_arg(argp,protos,8*sizeof(long) )))
 602					return r;
 603			}
 604			break;
 605		case PPPIOCSCOMPRESSOR:
 606			if ((r = get_arg(argp, &data, sizeof(struct isdn_ppp_comp_data))))
 607				return r;
 608			return isdn_ppp_set_compressor(is, &data);
 609		case PPPIOCGCALLINFO:
 610			{
 611				struct pppcallinfo pci;
 612				memset((char *) &pci,0,sizeof(struct pppcallinfo));
 613				if(lp)
 614				{
 615					strncpy(pci.local_num,lp->msn,63);
 616					if(lp->dial) {
 617						strncpy(pci.remote_num,lp->dial->num,63);
 618					}
 619					pci.charge_units = lp->charge;
 620					if(lp->outgoing)
 621						pci.calltype = CALLTYPE_OUTGOING;
 622					else
 623						pci.calltype = CALLTYPE_INCOMING;
 624					if(lp->flags & ISDN_NET_CALLBACK)
 625						pci.calltype |= CALLTYPE_CALLBACK;
 626				}
 627				return set_arg(argp,&pci,sizeof(struct pppcallinfo));
 628			}
 629#ifdef CONFIG_IPPP_FILTER
 630		case PPPIOCSPASS:
 631			{
 632				struct sock_filter *code;
 633				int len = get_filter(argp, &code);
 634				if (len < 0)
 635					return len;
 636				kfree(is->pass_filter);
 637				is->pass_filter = code;
 638				is->pass_len = len;
 639				break;
 640			}
 641		case PPPIOCSACTIVE:
 642			{
 643				struct sock_filter *code;
 644				int len = get_filter(argp, &code);
 645				if (len < 0)
 646					return len;
 647				kfree(is->active_filter);
 648				is->active_filter = code;
 649				is->active_len = len;
 650				break;
 651			}
 652#endif /* CONFIG_IPPP_FILTER */
 653		default:
 654			break;
 655	}
 656	return 0;
 657}
 658
 659unsigned int
 660isdn_ppp_poll(struct file *file, poll_table * wait)
 661{
 662	u_int mask;
 663	struct ippp_buf_queue *bf, *bl;
 664	u_long flags;
 665	struct ippp_struct *is;
 666
 667	is = file->private_data;
 668
 669	if (is->debug & 0x2)
 670		printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n",
 671				iminor(file->f_path.dentry->d_inode));
 672
 673	/* just registers wait_queue hook. This doesn't really wait. */
 674	poll_wait(file, &is->wq, wait);
 675
 676	if (!(is->state & IPPP_OPEN)) {
 677		if(is->state == IPPP_CLOSEWAIT)
 678			return POLLHUP;
 679		printk(KERN_DEBUG "isdn_ppp: device not open\n");
 680		return POLLERR;
 681	}
 682	/* we're always ready to send .. */
 683	mask = POLLOUT | POLLWRNORM;
 684
 685	spin_lock_irqsave(&is->buflock, flags);
 686	bl = is->last;
 687	bf = is->first;
 688	/*
 689	 * if IPPP_NOBLOCK is set we return even if we have nothing to read
 690	 */
 691	if (bf->next != bl || (is->state & IPPP_NOBLOCK)) {
 692		is->state &= ~IPPP_NOBLOCK;
 693		mask |= POLLIN | POLLRDNORM;
 694	}
 695	spin_unlock_irqrestore(&is->buflock, flags);
 696	return mask;
 697}
 698
 699/*
 700 *  fill up isdn_ppp_read() queue ..
 701 */
 702
 703static int
 704isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot)
 705{
 706	struct ippp_buf_queue *bf, *bl;
 707	u_long flags;
 708	u_char *nbuf;
 709	struct ippp_struct *is;
 710
 711	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
 712		printk(KERN_WARNING "ippp: illegal slot(%d).\n", slot);
 713		return 0;
 714	}
 715	is = ippp_table[slot];
 716
 717	if (!(is->state & IPPP_CONNECT)) {
 718		printk(KERN_DEBUG "ippp: device not activated.\n");
 719		return 0;
 720	}
 721	nbuf = kmalloc(len + 4, GFP_ATOMIC);
 722	if (!nbuf) {
 723		printk(KERN_WARNING "ippp: Can't alloc buf\n");
 724		return 0;
 725	}
 726	nbuf[0] = PPP_ALLSTATIONS;
 727	nbuf[1] = PPP_UI;
 728	nbuf[2] = proto >> 8;
 729	nbuf[3] = proto & 0xff;
 730	memcpy(nbuf + 4, buf, len);
 731
 732	spin_lock_irqsave(&is->buflock, flags);
 733	bf = is->first;
 734	bl = is->last;
 735
 736	if (bf == bl) {
 737		printk(KERN_WARNING "ippp: Queue is full; discarding first buffer\n");
 738		bf = bf->next;
 739		kfree(bf->buf);
 740		is->first = bf;
 741	}
 742	bl->buf = (char *) nbuf;
 743	bl->len = len + 4;
 744
 745	is->last = bl->next;
 746	spin_unlock_irqrestore(&is->buflock, flags);
 747	wake_up_interruptible(&is->wq);
 748	return len;
 749}
 750
 751/*
 752 * read() .. non-blocking: ipppd calls it only after select()
 753 *           reports, that there is data
 754 */
 755
 756int
 757isdn_ppp_read(int min, struct file *file, char __user *buf, int count)
 758{
 759	struct ippp_struct *is;
 760	struct ippp_buf_queue *b;
 761	u_long flags;
 762	u_char *save_buf;
 763
 764	is = file->private_data;
 765
 766	if (!(is->state & IPPP_OPEN))
 767		return 0;
 768
 769	if (!access_ok(VERIFY_WRITE, buf, count))
 770		return -EFAULT;
 771
 772	spin_lock_irqsave(&is->buflock, flags);
 773	b = is->first->next;
 774	save_buf = b->buf;
 775	if (!save_buf) {
 776		spin_unlock_irqrestore(&is->buflock, flags);
 777		return -EAGAIN;
 778	}
 779	if (b->len < count)
 780		count = b->len;
 781	b->buf = NULL;
 782	is->first = b;
 783
 784	spin_unlock_irqrestore(&is->buflock, flags);
 785	if (copy_to_user(buf, save_buf, count))
 786		count = -EFAULT;
 787	kfree(save_buf);
 788
 789	return count;
 790}
 791
 792/*
 793 * ipppd wanna write a packet to the card .. non-blocking
 794 */
 795
 796int
 797isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
 798{
 799	isdn_net_local *lp;
 800	struct ippp_struct *is;
 801	int proto;
 802	unsigned char protobuf[4];
 803
 804	is = file->private_data;
 805
 806	if (!(is->state & IPPP_CONNECT))
 807		return 0;
 808
 809	lp = is->lp;
 810
 811	/* -> push it directly to the lowlevel interface */
 812
 813	if (!lp)
 814		printk(KERN_DEBUG "isdn_ppp_write: lp == NULL\n");
 815	else {
 816		/*
 817		 * Don't reset huptimer for
 818		 * LCP packets. (Echo requests).
 819		 */
 820		if (copy_from_user(protobuf, buf, 4))
 821			return -EFAULT;
 822		proto = PPP_PROTOCOL(protobuf);
 823		if (proto != PPP_LCP)
 824			lp->huptimer = 0;
 825
 826		if (lp->isdn_device < 0 || lp->isdn_channel < 0)
 827			return 0;
 828
 829		if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
 830			lp->dialstate == 0 &&
 831		    (lp->flags & ISDN_NET_CONNECTED)) {
 832			unsigned short hl;
 833			struct sk_buff *skb;
 834			/*
 835			 * we need to reserve enough space in front of
 836			 * sk_buff. old call to dev_alloc_skb only reserved
 837			 * 16 bytes, now we are looking what the driver want
 838			 */
 839			hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
 840			skb = alloc_skb(hl+count, GFP_ATOMIC);
 841			if (!skb) {
 842				printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
 843				return count;
 844			}
 845			skb_reserve(skb, hl);
 846			if (copy_from_user(skb_put(skb, count), buf, count))
 847			{
 848				kfree_skb(skb);
 849				return -EFAULT;
 850			}
 851			if (is->debug & 0x40) {
 852				printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
 853				isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
 854			}
 855
 856			isdn_ppp_send_ccp(lp->netdev,lp,skb); /* keeps CCP/compression states in sync */
 857
 858			isdn_net_write_super(lp, skb);
 859		}
 860	}
 861	return count;
 862}
 863
 864/*
 865 * init memory, structures etc.
 866 */
 867
 868int
 869isdn_ppp_init(void)
 870{
 871	int i,
 872	 j;
 873	 
 874#ifdef CONFIG_ISDN_MPP
 875	if( isdn_ppp_mp_bundle_array_init() < 0 )
 876		return -ENOMEM;
 877#endif /* CONFIG_ISDN_MPP */
 878
 879	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 880		if (!(ippp_table[i] = kzalloc(sizeof(struct ippp_struct), GFP_KERNEL))) {
 881			printk(KERN_WARNING "isdn_ppp_init: Could not alloc ippp_table\n");
 882			for (j = 0; j < i; j++)
 883				kfree(ippp_table[j]);
 884			return -1;
 885		}
 886		spin_lock_init(&ippp_table[i]->buflock);
 887		ippp_table[i]->state = 0;
 888		ippp_table[i]->first = ippp_table[i]->rq + NUM_RCV_BUFFS - 1;
 889		ippp_table[i]->last = ippp_table[i]->rq;
 890
 891		for (j = 0; j < NUM_RCV_BUFFS; j++) {
 892			ippp_table[i]->rq[j].buf = NULL;
 893			ippp_table[i]->rq[j].last = ippp_table[i]->rq +
 894			    (NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
 895			ippp_table[i]->rq[j].next = ippp_table[i]->rq + (j + 1) % NUM_RCV_BUFFS;
 896		}
 897	}
 898	return 0;
 899}
 900
 901void
 902isdn_ppp_cleanup(void)
 903{
 904	int i;
 905
 906	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
 907		kfree(ippp_table[i]);
 908
 909#ifdef CONFIG_ISDN_MPP
 910	kfree(isdn_ppp_bundle_arr);
 911#endif /* CONFIG_ISDN_MPP */
 912
 913}
 914
 915/*
 916 * check for address/control field and skip if allowed
 917 * retval != 0 -> discard packet silently
 918 */
 919static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb) 
 920{
 921	if (skb->len < 1)
 922		return -1;
 923
 924	if (skb->data[0] == 0xff) {
 925		if (skb->len < 2)
 926			return -1;
 927
 928		if (skb->data[1] != 0x03)
 929			return -1;
 930
 931		// skip address/control (AC) field
 932		skb_pull(skb, 2);
 933	} else { 
 934		if (is->pppcfg & SC_REJ_COMP_AC)
 935			// if AC compression was not negotiated, but used, discard packet
 936			return -1;
 937	}
 938	return 0;
 939}
 940
 941/*
 942 * get the PPP protocol header and pull skb
 943 * retval < 0 -> discard packet silently
 944 */
 945static int isdn_ppp_strip_proto(struct sk_buff *skb) 
 946{
 947	int proto;
 948	
 949	if (skb->len < 1)
 950		return -1;
 951
 952	if (skb->data[0] & 0x1) {
 953		// protocol field is compressed
 954		proto = skb->data[0];
 955		skb_pull(skb, 1);
 956	} else {
 957		if (skb->len < 2)
 958			return -1;
 959		proto = ((int) skb->data[0] << 8) + skb->data[1];
 960		skb_pull(skb, 2);
 961	}
 962	return proto;
 963}
 964
 965
 966/*
 967 * handler for incoming packets on a syncPPP interface
 968 */
 969void isdn_ppp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb)
 970{
 971	struct ippp_struct *is;
 972	int slot;
 973	int proto;
 974
 975	BUG_ON(net_dev->local->master); // we're called with the master device always
 976
 977	slot = lp->ppp_slot;
 978	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
 979		printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
 980			lp->ppp_slot);
 981		kfree_skb(skb);
 982		return;
 983	}
 984	is = ippp_table[slot];
 985
 986	if (is->debug & 0x4) {
 987		printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
 988		       (long)is,(long)lp,lp->ppp_slot,is->unit,(int) skb->len);
 989		isdn_ppp_frame_log("receive", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
 
 
 
 
 
 
 
 
 
 
 990	}
 991
 992 	if (isdn_ppp_skip_ac(is, skb) < 0) {
 993 		kfree_skb(skb);
 994 		return;
 995 	}
 996  	proto = isdn_ppp_strip_proto(skb);
 997 	if (proto < 0) {
 998 		kfree_skb(skb);
 999 		return;
1000 	}
1001  
1002#ifdef CONFIG_ISDN_MPP
1003 	if (is->compflags & SC_LINK_DECOMP_ON) {
1004 		skb = isdn_ppp_decompress(skb, is, NULL, &proto);
1005 		if (!skb) // decompression error
1006 			return;
1007 	}
1008	
1009 	if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
1010  		if (proto == PPP_MP) {
1011  			isdn_ppp_mp_receive(net_dev, lp, skb);
1012 			return;
1013 		}
1014 	} 
1015#endif
1016 	isdn_ppp_push_higher(net_dev, lp, skb, proto);
1017}
1018
1019/*
1020 * we receive a reassembled frame, MPPP has been taken care of before.
1021 * address/control and protocol have been stripped from the skb
1022 * note: net_dev has to be master net_dev
1023 */
1024static void
1025isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff *skb, int proto)
1026{
1027	struct net_device *dev = net_dev->dev;
1028 	struct ippp_struct *is, *mis;
1029	isdn_net_local *mlp = NULL;
1030	int slot;
1031
1032	slot = lp->ppp_slot;
1033	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1034		printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
1035			lp->ppp_slot);
1036		goto drop_packet;
1037	}
1038	is = ippp_table[slot];
1039 	
1040 	if (lp->master) { // FIXME?
1041		mlp = ISDN_MASTER_PRIV(lp);
1042 		slot = mlp->ppp_slot;
1043 		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1044 			printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
1045 				lp->ppp_slot);
1046			goto drop_packet;
1047 		}
1048 	}
1049 	mis = ippp_table[slot];
1050
1051	if (is->debug & 0x10) {
1052		printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
1053		isdn_ppp_frame_log("rpush", skb->data, skb->len, 32,is->unit,lp->ppp_slot);
1054	}
1055	if (mis->compflags & SC_DECOMP_ON) {
1056		skb = isdn_ppp_decompress(skb, is, mis, &proto);
1057		if (!skb) // decompression error
1058  			return;
1059  	}
1060	switch (proto) {
1061		case PPP_IPX:  /* untested */
1062			if (is->debug & 0x20)
1063				printk(KERN_DEBUG "isdn_ppp: IPX\n");
1064			skb->protocol = htons(ETH_P_IPX);
1065			break;
1066		case PPP_IP:
1067			if (is->debug & 0x20)
1068				printk(KERN_DEBUG "isdn_ppp: IP\n");
1069			skb->protocol = htons(ETH_P_IP);
1070			break;
1071		case PPP_COMP:
1072		case PPP_COMPFRAG:
1073			printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
1074			goto drop_packet;
1075#ifdef CONFIG_ISDN_PPP_VJ
1076		case PPP_VJC_UNCOMP:
1077			if (is->debug & 0x20)
1078				printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1079			if (net_dev->local->ppp_slot < 0) {
1080				printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1081					__func__, net_dev->local->ppp_slot);
1082				goto drop_packet;
1083			}
1084			if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
1085				printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
 
 
1086				goto drop_packet;
1087			}
1088			skb->protocol = htons(ETH_P_IP);
1089			break;
1090		case PPP_VJC_COMP:
1091			if (is->debug & 0x20)
1092				printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
1093			{
1094				struct sk_buff *skb_old = skb;
1095				int pkt_len;
1096				skb = dev_alloc_skb(skb_old->len + 128);
1097
1098				if (!skb) {
1099					printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1100					skb = skb_old;
1101					goto drop_packet;
1102				}
1103				skb_put(skb, skb_old->len + 128);
1104				skb_copy_from_linear_data(skb_old, skb->data,
1105							  skb_old->len);
1106				if (net_dev->local->ppp_slot < 0) {
1107					printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1108						__func__, net_dev->local->ppp_slot);
1109					goto drop_packet;
1110				}
1111				pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
1112						skb->data, skb_old->len);
1113				kfree_skb(skb_old);
1114				if (pkt_len < 0)
1115					goto drop_packet;
1116
1117				skb_trim(skb, pkt_len);
1118				skb->protocol = htons(ETH_P_IP);
1119			}
1120			break;
1121#endif
1122		case PPP_CCP:
1123		case PPP_CCPFRAG:
1124			isdn_ppp_receive_ccp(net_dev,lp,skb,proto);
1125			/* Dont pop up ResetReq/Ack stuff to the daemon any
1126			   longer - the job is done already */
1127			if(skb->data[0] == CCP_RESETREQ ||
1128			   skb->data[0] == CCP_RESETACK)
1129				break;
1130			/* fall through */
1131		default:
1132			isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot);	/* push data to pppd device */
1133			kfree_skb(skb);
1134			return;
1135	}
1136
1137#ifdef CONFIG_IPPP_FILTER
1138	/* check if the packet passes the pass and active filters
1139	 * the filter instructions are constructed assuming
1140	 * a four-byte PPP header on each packet (which is still present) */
1141	skb_push(skb, 4);
1142
1143	{
1144		u_int16_t *p = (u_int16_t *) skb->data;
1145
1146		*p = 0;	/* indicate inbound */
1147	}
1148
1149	if (is->pass_filter
1150	    && sk_run_filter(skb, is->pass_filter) == 0) {
1151		if (is->debug & 0x2)
1152			printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");
1153		kfree_skb(skb);
1154		return;
1155	}
1156	if (!(is->active_filter
1157	      && sk_run_filter(skb, is->active_filter) == 0)) {
1158		if (is->debug & 0x2)
1159			printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
1160		lp->huptimer = 0;
1161		if (mlp)
1162			mlp->huptimer = 0;
1163	}
1164	skb_pull(skb, 4);
1165#else /* CONFIG_IPPP_FILTER */
1166	lp->huptimer = 0;
1167	if (mlp)
1168		mlp->huptimer = 0;
1169#endif /* CONFIG_IPPP_FILTER */
1170	skb->dev = dev;
1171	skb_reset_mac_header(skb);
1172	netif_rx(skb);
1173	/* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1174	return;
1175
1176 drop_packet:
1177	net_dev->local->stats.rx_dropped++;
1178	kfree_skb(skb);
1179}
1180
1181/*
1182 * isdn_ppp_skb_push ..
1183 * checks whether we have enough space at the beginning of the skb
1184 * and allocs a new SKB if necessary
1185 */
1186static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p,int len)
1187{
1188	struct sk_buff *skb = *skb_p;
1189
1190	if(skb_headroom(skb) < len) {
1191		struct sk_buff *nskb = skb_realloc_headroom(skb, len);
1192
1193		if (!nskb) {
1194			printk(KERN_ERR "isdn_ppp_skb_push: can't realloc headroom!\n");
1195			dev_kfree_skb(skb);
1196			return NULL;
1197		}
1198		printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n",skb_headroom(skb),len);
1199		dev_kfree_skb(skb);
1200		*skb_p = nskb;
1201		return skb_push(nskb, len);
1202	}
1203	return skb_push(skb,len);
1204}
1205
1206/*
1207 * send ppp frame .. we expect a PIDCOMPressable proto --
1208 *  (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1209 *
1210 * VJ compression may change skb pointer!!! .. requeue with old
1211 * skb isn't allowed!!
1212 */
1213
1214int
1215isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
1216{
1217	isdn_net_local *lp,*mlp;
1218	isdn_net_dev *nd;
1219	unsigned int proto = PPP_IP;     /* 0x21 */
1220	struct ippp_struct *ipt,*ipts;
1221	int slot, retval = NETDEV_TX_OK;
1222
1223	mlp = netdev_priv(netdev);
1224	nd = mlp->netdev;       /* get master lp */
1225
1226	slot = mlp->ppp_slot;
1227	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1228		printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1229			mlp->ppp_slot);
1230		kfree_skb(skb);
1231		goto out;
1232	}
1233	ipts = ippp_table[slot];
1234
1235	if (!(ipts->pppcfg & SC_ENABLE_IP)) {	/* PPP connected ? */
1236		if (ipts->debug & 0x1)
1237			printk(KERN_INFO "%s: IP frame delayed.\n", netdev->name);
1238		retval = NETDEV_TX_BUSY;
1239		goto out;
1240	}
1241
1242	switch (ntohs(skb->protocol)) {
1243		case ETH_P_IP:
1244			proto = PPP_IP;
1245			break;
1246		case ETH_P_IPX:
1247			proto = PPP_IPX;	/* untested */
1248			break;
1249		default:
1250			printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n", 
1251			       skb->protocol);
1252			dev_kfree_skb(skb);
1253			goto out;
1254	}
1255
1256	lp = isdn_net_get_locked_lp(nd);
1257	if (!lp) {
1258		printk(KERN_WARNING "%s: all channels busy - requeuing!\n", netdev->name);
1259		retval = NETDEV_TX_BUSY;
1260		goto out;
1261	}
1262	/* we have our lp locked from now on */
1263
1264	slot = lp->ppp_slot;
1265	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1266		printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1267			lp->ppp_slot);
1268		kfree_skb(skb);
1269		goto unlock;
1270	}
1271	ipt = ippp_table[slot];
1272
1273	/*
1274	 * after this line .. requeueing in the device queue is no longer allowed!!!
1275	 */
1276
1277	/* Pull off the fake header we stuck on earlier to keep
1278	 * the fragmentation code happy.
1279	 */
1280	skb_pull(skb,IPPP_MAX_HEADER);
1281
1282#ifdef CONFIG_IPPP_FILTER
1283	/* check if we should pass this packet
1284	 * the filter instructions are constructed assuming
1285	 * a four-byte PPP header on each packet */
1286	*skb_push(skb, 4) = 1; /* indicate outbound */
1287
1288	{
1289		__be16 *p = (__be16 *)skb->data;
1290
1291		p++;
1292		*p = htons(proto);
1293	}
1294
1295	if (ipt->pass_filter
1296	    && sk_run_filter(skb, ipt->pass_filter) == 0) {
1297		if (ipt->debug & 0x4)
1298			printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");
1299		kfree_skb(skb);
1300		goto unlock;
1301	}
1302	if (!(ipt->active_filter
1303	      && sk_run_filter(skb, ipt->active_filter) == 0)) {
1304		if (ipt->debug & 0x4)
1305			printk(KERN_DEBUG "IPPP: link-active filter: reseting huptimer.\n");
1306		lp->huptimer = 0;
1307	}
1308	skb_pull(skb, 4);
1309#else /* CONFIG_IPPP_FILTER */
1310	lp->huptimer = 0;
1311#endif /* CONFIG_IPPP_FILTER */
1312
1313	if (ipt->debug & 0x4)
1314		printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
1315        if (ipts->debug & 0x40)
1316                isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32,ipts->unit,lp->ppp_slot);
1317
1318#ifdef CONFIG_ISDN_PPP_VJ
1319	if (proto == PPP_IP && ipts->pppcfg & SC_COMP_TCP) {	/* ipts here? probably yes, but check this again */
1320		struct sk_buff *new_skb;
1321	        unsigned short hl;
1322		/*
1323		 * we need to reserve enough space in front of
1324		 * sk_buff. old call to dev_alloc_skb only reserved
1325		 * 16 bytes, now we are looking what the driver want.
1326		 */
1327		hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen + IPPP_MAX_HEADER;
1328		/* 
1329		 * Note: hl might still be insufficient because the method
1330		 * above does not account for a possibible MPPP slave channel
1331		 * which had larger HL header space requirements than the
1332		 * master.
1333		 */
1334		new_skb = alloc_skb(hl+skb->len, GFP_ATOMIC);
1335		if (new_skb) {
1336			u_char *buf;
1337			int pktlen;
1338
1339			skb_reserve(new_skb, hl);
1340			new_skb->dev = skb->dev;
1341			skb_put(new_skb, skb->len);
1342			buf = skb->data;
1343
1344			pktlen = slhc_compress(ipts->slcomp, skb->data, skb->len, new_skb->data,
1345				 &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
1346
1347			if (buf != skb->data) {	
1348				if (new_skb->data != buf)
1349					printk(KERN_ERR "isdn_ppp: FATAL error after slhc_compress!!\n");
1350				dev_kfree_skb(skb);
1351				skb = new_skb;
1352			} else {
1353				dev_kfree_skb(new_skb);
1354			}
1355
1356			skb_trim(skb, pktlen);
1357			if (skb->data[0] & SL_TYPE_COMPRESSED_TCP) {	/* cslip? style -> PPP */
1358				proto = PPP_VJC_COMP;
1359				skb->data[0] ^= SL_TYPE_COMPRESSED_TCP;
1360			} else {
1361				if (skb->data[0] >= SL_TYPE_UNCOMPRESSED_TCP)
1362					proto = PPP_VJC_UNCOMP;
1363				skb->data[0] = (skb->data[0] & 0x0f) | 0x40;
1364			}
1365		}
1366	}
1367#endif
1368
1369	/*
1370	 * normal (single link) or bundle compression
1371	 */
1372	if(ipts->compflags & SC_COMP_ON) {
1373		/* We send compressed only if both down- und upstream
1374		   compression is negotiated, that means, CCP is up */
1375		if(ipts->compflags & SC_DECOMP_ON) {
1376			skb = isdn_ppp_compress(skb,&proto,ipt,ipts,0);
1377		} else {
1378			printk(KERN_DEBUG "isdn_ppp: CCP not yet up - sending as-is\n");
1379		}
1380	}
1381
1382	if (ipt->debug & 0x24)
1383		printk(KERN_DEBUG "xmit2 skb, len %d, proto %04x\n", (int) skb->len, proto);
1384
1385#ifdef CONFIG_ISDN_MPP
1386	if (ipt->mpppcfg & SC_MP_PROT) {
1387		/* we get mp_seqno from static isdn_net_local */
1388		long mp_seqno = ipts->mp_seqno;
1389		ipts->mp_seqno++;
1390		if (ipt->mpppcfg & SC_OUT_SHORT_SEQ) {
1391			unsigned char *data = isdn_ppp_skb_push(&skb, 3);
1392			if(!data)
1393				goto unlock;
1394			mp_seqno &= 0xfff;
1395			data[0] = MP_BEGIN_FRAG | MP_END_FRAG | ((mp_seqno >> 8) & 0xf);	/* (B)egin & (E)ndbit .. */
1396			data[1] = mp_seqno & 0xff;
1397			data[2] = proto;	/* PID compression */
1398		} else {
1399			unsigned char *data = isdn_ppp_skb_push(&skb, 5);
1400			if(!data)
1401				goto unlock;
1402			data[0] = MP_BEGIN_FRAG | MP_END_FRAG;	/* (B)egin & (E)ndbit .. */
1403			data[1] = (mp_seqno >> 16) & 0xff;	/* sequence number: 24bit */
1404			data[2] = (mp_seqno >> 8) & 0xff;
1405			data[3] = (mp_seqno >> 0) & 0xff;
1406			data[4] = proto;	/* PID compression */
1407		}
1408		proto = PPP_MP; /* MP Protocol, 0x003d */
1409	}
1410#endif
1411
1412	/*
1413	 * 'link in bundle' compression  ...
1414	 */
1415	if(ipt->compflags & SC_LINK_COMP_ON)
1416		skb = isdn_ppp_compress(skb,&proto,ipt,ipts,1);
1417
1418	if( (ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff) ) {
1419		unsigned char *data = isdn_ppp_skb_push(&skb,1);
1420		if(!data)
1421			goto unlock;
1422		data[0] = proto & 0xff;
1423	}
1424	else {
1425		unsigned char *data = isdn_ppp_skb_push(&skb,2);
1426		if(!data)
1427			goto unlock;
1428		data[0] = (proto >> 8) & 0xff;
1429		data[1] = proto & 0xff;
1430	}
1431	if(!(ipt->pppcfg & SC_COMP_AC)) {
1432		unsigned char *data = isdn_ppp_skb_push(&skb,2);
1433		if(!data)
1434			goto unlock;
1435		data[0] = 0xff;    /* All Stations */
1436		data[1] = 0x03;    /* Unnumbered information */
1437	}
1438
1439	/* tx-stats are now updated via BSENT-callback */
1440
1441	if (ipts->debug & 0x40) {
1442		printk(KERN_DEBUG "skb xmit: len: %d\n", (int) skb->len);
1443		isdn_ppp_frame_log("xmit", skb->data, skb->len, 32,ipt->unit,lp->ppp_slot);
1444	}
1445	
1446	isdn_net_writebuf_skb(lp, skb);
1447
1448 unlock:
1449	spin_unlock_bh(&lp->xmit_lock);
1450 out:
1451	return retval;
1452}
1453
1454#ifdef CONFIG_IPPP_FILTER
1455/*
1456 * check if this packet may trigger auto-dial.
1457 */
1458
1459int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
1460{
1461	struct ippp_struct *is = ippp_table[lp->ppp_slot];
1462	u_int16_t proto;
1463	int drop = 0;
1464
1465	switch (ntohs(skb->protocol)) {
1466	case ETH_P_IP:
1467		proto = PPP_IP;
1468		break;
1469	case ETH_P_IPX:
1470		proto = PPP_IPX;
1471		break;
1472	default:
1473		printk(KERN_ERR "isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
1474		       skb->protocol);
1475		return 1;
1476	}
1477
1478	/* the filter instructions are constructed assuming
1479	 * a four-byte PPP header on each packet. we have to
1480	 * temporarily remove part of the fake header stuck on
1481	 * earlier.
1482	 */
1483	*skb_pull(skb, IPPP_MAX_HEADER - 4) = 1; /* indicate outbound */
1484
1485	{
1486		__be16 *p = (__be16 *)skb->data;
1487
1488		p++;
1489		*p = htons(proto);
1490	}
1491	
1492	drop |= is->pass_filter
1493	        && sk_run_filter(skb, is->pass_filter) == 0;
1494	drop |= is->active_filter
1495	        && sk_run_filter(skb, is->active_filter) == 0;
1496	
1497	skb_push(skb, IPPP_MAX_HEADER - 4);
1498	return drop;
1499}
1500#endif
1501#ifdef CONFIG_ISDN_MPP
1502
1503/* this is _not_ rfc1990 header, but something we convert both short and long
1504 * headers to for convinience's sake:
1505 * 	byte 0 is flags as in rfc1990
1506 *	bytes 1...4 is 24-bit seqence number converted to host byte order 
1507 */
1508#define MP_HEADER_LEN	5
1509
1510#define MP_LONGSEQ_MASK		0x00ffffff
1511#define MP_SHORTSEQ_MASK	0x00000fff
1512#define MP_LONGSEQ_MAX		MP_LONGSEQ_MASK
1513#define MP_SHORTSEQ_MAX		MP_SHORTSEQ_MASK
1514#define MP_LONGSEQ_MAXBIT	((MP_LONGSEQ_MASK+1)>>1)
1515#define MP_SHORTSEQ_MAXBIT	((MP_SHORTSEQ_MASK+1)>>1)
1516
1517/* sequence-wrap safe comparisons (for long sequence)*/
1518#define MP_LT(a,b)	((a-b)&MP_LONGSEQ_MAXBIT)
1519#define MP_LE(a,b) 	!((b-a)&MP_LONGSEQ_MAXBIT)
1520#define MP_GT(a,b) 	((b-a)&MP_LONGSEQ_MAXBIT)
1521#define MP_GE(a,b)	!((a-b)&MP_LONGSEQ_MAXBIT)
1522
1523#define MP_SEQ(f)	((*(u32*)(f->data+1)))
1524#define MP_FLAGS(f)	(f->data[0])
1525
1526static int isdn_ppp_mp_bundle_array_init(void)
1527{
1528	int i;
1529	int sz = ISDN_MAX_CHANNELS*sizeof(ippp_bundle);
1530	if( (isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL )
1531		return -ENOMEM;
1532	for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
1533		spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
1534	return 0;
1535}
1536
1537static ippp_bundle * isdn_ppp_mp_bundle_alloc(void)
1538{
1539	int i;
1540	for( i = 0; i < ISDN_MAX_CHANNELS; i++ )
1541		if (isdn_ppp_bundle_arr[i].ref_ct <= 0)
1542			return (isdn_ppp_bundle_arr + i);
1543	return NULL;
1544}
1545
1546static int isdn_ppp_mp_init( isdn_net_local * lp, ippp_bundle * add_to )
1547{
1548	struct ippp_struct * is;
1549
1550	if (lp->ppp_slot < 0) {
1551		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1552			__func__, lp->ppp_slot);
1553		return(-EINVAL);
1554	}
1555
1556	is = ippp_table[lp->ppp_slot];
1557	if (add_to) {
1558		if( lp->netdev->pb )
1559			lp->netdev->pb->ref_ct--;
1560		lp->netdev->pb = add_to;
1561	} else {		/* first link in a bundle */
1562		is->mp_seqno = 0;
1563		if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
1564			return -ENOMEM;
1565		lp->next = lp->last = lp;	/* nobody else in a queue */
1566		lp->netdev->pb->frags = NULL;
1567		lp->netdev->pb->frames = 0;
1568		lp->netdev->pb->seq = UINT_MAX;
1569	}
1570	lp->netdev->pb->ref_ct++;
1571	
1572	is->last_link_seqno = 0;
1573	return 0;
1574}
1575
1576static u32 isdn_ppp_mp_get_seq( int short_seq, 
1577					struct sk_buff * skb, u32 last_seq );
1578static struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
1579			struct sk_buff * from, struct sk_buff * to );
1580static void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
1581				struct sk_buff * from, struct sk_buff * to );
1582static void isdn_ppp_mp_free_skb( ippp_bundle * mp, struct sk_buff * skb );
1583static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb );
1584
1585static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, 
1586							struct sk_buff *skb)
1587{
1588	struct ippp_struct *is;
1589	isdn_net_local * lpq;
1590	ippp_bundle * mp;
1591	isdn_mppp_stats * stats;
1592	struct sk_buff * newfrag, * frag, * start, *nextf;
1593	u32 newseq, minseq, thisseq;
1594	unsigned long flags;
1595	int slot;
1596
1597	spin_lock_irqsave(&net_dev->pb->lock, flags);
1598    	mp = net_dev->pb;
1599        stats = &mp->stats;
1600	slot = lp->ppp_slot;
1601	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1602		printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
1603			__func__, lp->ppp_slot);
1604		stats->frame_drops++;
1605		dev_kfree_skb(skb);
1606		spin_unlock_irqrestore(&mp->lock, flags);
1607		return;
1608	}
1609	is = ippp_table[slot];
1610    	if( ++mp->frames > stats->max_queue_len )
1611		stats->max_queue_len = mp->frames;
1612	
1613	if (is->debug & 0x8)
1614		isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
1615
1616	newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ, 
1617						skb, is->last_link_seqno);
1618
1619
1620	/* if this packet seq # is less than last already processed one,
1621	 * toss it right away, but check for sequence start case first 
1622	 */
1623	if( mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT) ) {
1624		mp->seq = newseq;	/* the first packet: required for
1625					 * rfc1990 non-compliant clients --
1626					 * prevents constant packet toss */
1627	} else if( MP_LT(newseq, mp->seq) ) {
1628		stats->frame_drops++;
1629		isdn_ppp_mp_free_skb(mp, skb);
1630		spin_unlock_irqrestore(&mp->lock, flags);
1631		return;
1632	}
1633	
1634	/* find the minimum received sequence number over all links */
1635	is->last_link_seqno = minseq = newseq;
1636	for (lpq = net_dev->queue;;) {
1637		slot = lpq->ppp_slot;
1638		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1639			printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
1640				__func__, lpq->ppp_slot);
1641		} else {
1642			u32 lls = ippp_table[slot]->last_link_seqno;
1643			if (MP_LT(lls, minseq))
1644				minseq = lls;
1645		}
1646		if ((lpq = lpq->next) == net_dev->queue)
1647			break;
1648	}
1649	if (MP_LT(minseq, mp->seq))
1650		minseq = mp->seq;	/* can't go beyond already processed
1651					 * packets */
1652	newfrag = skb;
1653
1654  	/* if this new fragment is before the first one, then enqueue it now. */
1655  	if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
1656		newfrag->next = frag;
1657    		mp->frags = frag = newfrag;
1658    		newfrag = NULL;
1659  	}
1660
1661  	start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
1662				MP_SEQ(frag) == mp->seq ? frag : NULL;
1663
1664	/* 
1665	 * main fragment traversing loop
1666	 *
1667	 * try to accomplish several tasks:
1668	 * - insert new fragment into the proper sequence slot (once that's done
1669	 *   newfrag will be set to NULL)
1670	 * - reassemble any complete fragment sequence (non-null 'start'
1671	 *   indicates there is a contiguous sequence present)
1672	 * - discard any incomplete sequences that are below minseq -- due
1673	 *   to the fact that sender always increment sequence number, if there
1674	 *   is an incomplete sequence below minseq, no new fragments would
1675	 *   come to complete such sequence and it should be discarded
1676	 *
1677	 * loop completes when we accomplished the following tasks:
1678	 * - new fragment is inserted in the proper sequence ('newfrag' is 
1679	 *   set to NULL)
1680	 * - we hit a gap in the sequence, so no reassembly/processing is 
1681	 *   possible ('start' would be set to NULL)
1682	 *
1683	 * algorithm for this code is derived from code in the book
1684	 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1685	 */
1686  	while (start != NULL || newfrag != NULL) {
1687
1688    		thisseq = MP_SEQ(frag);
1689    		nextf = frag->next;
 
 
 
 
 
 
1690
1691    		/* drop any duplicate fragments */
1692    		if (newfrag != NULL && thisseq == newseq) {
1693      			isdn_ppp_mp_free_skb(mp, newfrag);
1694      			newfrag = NULL;
1695    		}
1696
1697    		/* insert new fragment before next element if possible. */
1698    		if (newfrag != NULL && (nextf == NULL || 
1699						MP_LT(newseq, MP_SEQ(nextf)))) {
1700      			newfrag->next = nextf;
1701      			frag->next = nextf = newfrag;
1702      			newfrag = NULL;
1703    		}
1704
1705    		if (start != NULL) {
1706	    		/* check for misplaced start */
1707      			if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
1708				printk(KERN_WARNING"isdn_mppp(seq %d): new "
1709				      "BEGIN flag with no prior END", thisseq);
1710				stats->seqerrs++;
1711				stats->frame_drops++;
1712				start = isdn_ppp_mp_discard(mp, start,frag);
1713				nextf = frag->next;
1714      			}
1715    		} else if (MP_LE(thisseq, minseq)) {		
1716      			if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
1717				start = frag;
1718      			else {
1719				if (MP_FLAGS(frag) & MP_END_FRAG)
1720	  				stats->frame_drops++;
1721				if( mp->frags == frag )
1722					mp->frags = nextf;	
1723				isdn_ppp_mp_free_skb(mp, frag);
1724				frag = nextf;
1725				continue;
1726      			}
1727		}
1728		
1729		/* if start is non-null and we have end fragment, then
1730		 * we have full reassembly sequence -- reassemble 
1731		 * and process packet now
1732		 */
1733    		if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
1734      			minseq = mp->seq = (thisseq+1) & MP_LONGSEQ_MASK;
1735      			/* Reassemble the packet then dispatch it */
1736			isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
1737      
1738      			start = NULL;
1739      			frag = NULL;
1740
1741      			mp->frags = nextf;
1742    		}
 
 
 
1743
1744		/* check if need to update start pointer: if we just
1745		 * reassembled the packet and sequence is contiguous
1746		 * then next fragment should be the start of new reassembly
1747		 * if sequence is contiguous, but we haven't reassembled yet,
1748		 * keep going.
1749		 * if sequence is not contiguous, either clear everything
1750		 * below low watermark and set start to the next frag or
1751		 * clear start ptr.
1752		 */ 
1753    		if (nextf != NULL && 
1754		    ((thisseq+1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
1755      			/* if we just reassembled and the next one is here, 
1756			 * then start another reassembly. */
1757
1758      			if (frag == NULL) {
1759				if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
1760	  				start = nextf;
1761				else
1762				{
1763	  				printk(KERN_WARNING"isdn_mppp(seq %d):"
1764						" END flag with no following "
1765						"BEGIN", thisseq);
1766					stats->seqerrs++;
1767				}
1768			}
1769
1770    		} else {
1771			if ( nextf != NULL && frag != NULL &&
1772						MP_LT(thisseq, minseq)) {
1773				/* we've got a break in the sequence
1774				 * and we not at the end yet
1775				 * and we did not just reassembled
1776				 *(if we did, there wouldn't be anything before)
1777				 * and we below the low watermark 
1778			 	 * discard all the frames below low watermark 
1779				 * and start over */
1780				stats->frame_drops++;
1781				mp->frags = isdn_ppp_mp_discard(mp,start,nextf);
1782			}
1783			/* break in the sequence, no reassembly */
1784      			start = NULL;
1785    		}
1786	  			
1787    		frag = nextf;
1788  	}	/* while -- main loop */
1789	
1790  	if (mp->frags == NULL)
1791    		mp->frags = frag;
1792		
1793	/* rather straighforward way to deal with (not very) possible 
1794	 * queue overflow */
1795	if (mp->frames > MP_MAX_QUEUE_LEN) {
1796		stats->overflows++;
1797		while (mp->frames > MP_MAX_QUEUE_LEN) {
1798			frag = mp->frags->next;
1799			isdn_ppp_mp_free_skb(mp, mp->frags);
1800			mp->frags = frag;
1801		}
1802	}
1803	spin_unlock_irqrestore(&mp->lock, flags);
1804}
1805
1806static void isdn_ppp_mp_cleanup( isdn_net_local * lp )
1807{
1808	struct sk_buff * frag = lp->netdev->pb->frags;
1809	struct sk_buff * nextfrag;
1810    	while( frag ) {
1811		nextfrag = frag->next;
1812		isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
1813		frag = nextfrag;
1814	}
1815	lp->netdev->pb->frags = NULL;
1816}
1817
1818static u32 isdn_ppp_mp_get_seq( int short_seq, 
1819					struct sk_buff * skb, u32 last_seq )
1820{
1821	u32 seq;
1822	int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG);
1823   
1824   	if( !short_seq )
1825	{
1826		seq = ntohl(*(__be32 *)skb->data) & MP_LONGSEQ_MASK;
1827		skb_push(skb,1);
1828	}
1829	else
1830	{
1831		/* convert 12-bit short seq number to 24-bit long one 
1832	 	*/
1833		seq = ntohs(*(__be16 *)skb->data) & MP_SHORTSEQ_MASK;
1834	
1835		/* check for seqence wrap */
1836		if( !(seq &  MP_SHORTSEQ_MAXBIT) && 
1837		     (last_seq &  MP_SHORTSEQ_MAXBIT) && 
1838		     (unsigned long)last_seq <= MP_LONGSEQ_MAX )
1839			seq |= (last_seq + MP_SHORTSEQ_MAX+1) & 
1840					(~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1841		else
1842			seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1843		
1844		skb_push(skb, 3);	/* put converted seqence back in skb */
1845	}
1846	*(u32*)(skb->data+1) = seq; 	/* put seqence back in _host_ byte
1847					 * order */
1848	skb->data[0] = flags;	        /* restore flags */
1849	return seq;
1850}
1851
1852struct sk_buff * isdn_ppp_mp_discard( ippp_bundle * mp,
1853			struct sk_buff * from, struct sk_buff * to )
1854{
1855	if( from )
1856		while (from != to) {
1857	  		struct sk_buff * next = from->next;
1858			isdn_ppp_mp_free_skb(mp, from);
1859	  		from = next;
1860		}
1861	return from;
1862}
1863
1864void isdn_ppp_mp_reassembly( isdn_net_dev * net_dev, isdn_net_local * lp,
1865				struct sk_buff * from, struct sk_buff * to )
1866{
1867	ippp_bundle * mp = net_dev->pb;
1868	int proto;
1869	struct sk_buff * skb;
1870	unsigned int tot_len;
1871
1872	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
1873		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1874			__func__, lp->ppp_slot);
1875		return;
1876	}
1877	if( MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG) ) {
1878		if( ippp_table[lp->ppp_slot]->debug & 0x40 )
1879			printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
1880					"len %d\n", MP_SEQ(from), from->len );
1881		skb = from;
1882		skb_pull(skb, MP_HEADER_LEN);
1883		mp->frames--;	
1884	} else {
1885		struct sk_buff * frag;
1886		int n;
1887
1888		for(tot_len=n=0, frag=from; frag != to; frag=frag->next, n++)
1889			tot_len += frag->len - MP_HEADER_LEN;
1890
1891		if( ippp_table[lp->ppp_slot]->debug & 0x40 )
1892			printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
1893				"to %d, len %d\n", MP_SEQ(from), 
1894				(MP_SEQ(from)+n-1) & MP_LONGSEQ_MASK, tot_len );
1895		if( (skb = dev_alloc_skb(tot_len)) == NULL ) {
1896			printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
1897					"of size %d\n", tot_len);
1898			isdn_ppp_mp_discard(mp, from, to);
1899			return;
1900		}
1901
1902		while( from != to ) {
1903			unsigned int len = from->len - MP_HEADER_LEN;
1904
1905			skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
1906							 skb_put(skb,len),
1907							 len);
1908			frag = from->next;
1909			isdn_ppp_mp_free_skb(mp, from);
1910			from = frag; 
1911		}
1912	}
1913   	proto = isdn_ppp_strip_proto(skb);
1914	isdn_ppp_push_higher(net_dev, lp, skb, proto);
1915}
1916
1917static void isdn_ppp_mp_free_skb(ippp_bundle * mp, struct sk_buff * skb)
1918{
1919	dev_kfree_skb(skb);
1920	mp->frames--;
1921}
1922
1923static void isdn_ppp_mp_print_recv_pkt( int slot, struct sk_buff * skb )
1924{
1925	printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n", 
1926		slot, (int) skb->len, 
1927		(int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
1928		(int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
1929}
1930
1931static int
1932isdn_ppp_bundle(struct ippp_struct *is, int unit)
1933{
1934	char ifn[IFNAMSIZ + 1];
1935	isdn_net_dev *p;
1936	isdn_net_local *lp, *nlp;
1937	int rc;
1938	unsigned long flags;
1939
1940	sprintf(ifn, "ippp%d", unit);
1941	p = isdn_net_findif(ifn);
1942	if (!p) {
1943		printk(KERN_ERR "ippp_bundle: cannot find %s\n", ifn);
1944		return -EINVAL;
1945	}
1946
1947    	spin_lock_irqsave(&p->pb->lock, flags);
1948
1949	nlp = is->lp;
1950	lp = p->queue;
1951	if( nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
1952		lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS ) {
1953		printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n",
1954			nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ? 
1955			nlp->ppp_slot : lp->ppp_slot );
1956		rc = -EINVAL;
1957		goto out;
1958 	}
1959
1960	isdn_net_add_to_bundle(p, nlp);
1961
1962	ippp_table[nlp->ppp_slot]->unit = ippp_table[lp->ppp_slot]->unit;
1963
1964	/* maybe also SC_CCP stuff */
1965	ippp_table[nlp->ppp_slot]->pppcfg |= ippp_table[lp->ppp_slot]->pppcfg &
1966		(SC_ENABLE_IP | SC_NO_TCP_CCID | SC_REJ_COMP_TCP);
1967	ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg &
1968		(SC_MP_PROT | SC_REJ_MP_PROT | SC_OUT_SHORT_SEQ | SC_IN_SHORT_SEQ);
1969	rc = isdn_ppp_mp_init(nlp, p->pb);
1970out:
1971	spin_unlock_irqrestore(&p->pb->lock, flags);
1972	return rc;
1973}
1974  
1975#endif /* CONFIG_ISDN_MPP */
1976  
1977/*
1978 * network device ioctl handlers
1979 */
1980
1981static int
1982isdn_ppp_dev_ioctl_stats(int slot, struct ifreq *ifr, struct net_device *dev)
1983{
1984	struct ppp_stats __user *res = ifr->ifr_data;
1985	struct ppp_stats t;
1986	isdn_net_local *lp = netdev_priv(dev);
1987
1988	if (!access_ok(VERIFY_WRITE, res, sizeof(struct ppp_stats)))
1989		return -EFAULT;
1990
1991	/* build a temporary stat struct and copy it to user space */
1992
1993	memset(&t, 0, sizeof(struct ppp_stats));
1994	if (dev->flags & IFF_UP) {
1995		t.p.ppp_ipackets = lp->stats.rx_packets;
1996		t.p.ppp_ibytes = lp->stats.rx_bytes;
1997		t.p.ppp_ierrors = lp->stats.rx_errors;
1998		t.p.ppp_opackets = lp->stats.tx_packets;
1999		t.p.ppp_obytes = lp->stats.tx_bytes;
2000		t.p.ppp_oerrors = lp->stats.tx_errors;
2001#ifdef CONFIG_ISDN_PPP_VJ
2002		if (slot >= 0 && ippp_table[slot]->slcomp) {
2003			struct slcompress *slcomp = ippp_table[slot]->slcomp;
2004			t.vj.vjs_packets = slcomp->sls_o_compressed + slcomp->sls_o_uncompressed;
2005			t.vj.vjs_compressed = slcomp->sls_o_compressed;
2006			t.vj.vjs_searches = slcomp->sls_o_searches;
2007			t.vj.vjs_misses = slcomp->sls_o_misses;
2008			t.vj.vjs_errorin = slcomp->sls_i_error;
2009			t.vj.vjs_tossed = slcomp->sls_i_tossed;
2010			t.vj.vjs_uncompressedin = slcomp->sls_i_uncompressed;
2011			t.vj.vjs_compressedin = slcomp->sls_i_compressed;
2012		}
2013#endif
2014	}
2015	if (copy_to_user(res, &t, sizeof(struct ppp_stats)))
2016		return -EFAULT;
2017	return 0;
2018}
2019
2020int
2021isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2022{
2023	int error=0;
2024	int len;
2025	isdn_net_local *lp = netdev_priv(dev);
2026
2027
2028	if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
2029		return -EINVAL;
2030
2031	switch (cmd) {
2032#define PPP_VERSION "2.3.7"
2033		case SIOCGPPPVER:
2034			len = strlen(PPP_VERSION) + 1;
2035			if (copy_to_user(ifr->ifr_data, PPP_VERSION, len))
2036				error = -EFAULT;
2037			break;
2038
2039		case SIOCGPPPSTATS:
2040			error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
2041			break;
2042		default:
2043			error = -EINVAL;
2044			break;
2045	}
2046	return error;
2047}
2048
2049static int
2050isdn_ppp_if_get_unit(char *name)
2051{
2052	int len,
2053	 i,
2054	 unit = 0,
2055	 deci;
2056
2057	len = strlen(name);
2058
2059	if (strncmp("ippp", name, 4) || len > 8)
2060		return -1;
2061
2062	for (i = 0, deci = 1; i < len; i++, deci *= 10) {
2063		char a = name[len - i - 1];
2064		if (a >= '0' && a <= '9')
2065			unit += (a - '0') * deci;
2066		else
2067			break;
2068	}
2069	if (!i || len - i != 4)
2070		unit = -1;
2071
2072	return unit;
2073}
2074
2075
2076int
2077isdn_ppp_dial_slave(char *name)
2078{
2079#ifdef CONFIG_ISDN_MPP
2080	isdn_net_dev *ndev;
2081	isdn_net_local *lp;
2082	struct net_device *sdev;
2083
2084	if (!(ndev = isdn_net_findif(name)))
2085		return 1;
2086	lp = ndev->local;
2087	if (!(lp->flags & ISDN_NET_CONNECTED))
2088		return 5;
2089
2090	sdev = lp->slave;
2091	while (sdev) {
2092		isdn_net_local *mlp = netdev_priv(sdev);
2093		if (!(mlp->flags & ISDN_NET_CONNECTED))
2094			break;
2095		sdev = mlp->slave;
2096	}
2097	if (!sdev)
2098		return 2;
2099
2100	isdn_net_dial_req(netdev_priv(sdev));
2101	return 0;
2102#else
2103	return -1;
2104#endif
2105}
2106
2107int
2108isdn_ppp_hangup_slave(char *name)
2109{
2110#ifdef CONFIG_ISDN_MPP
2111	isdn_net_dev *ndev;
2112	isdn_net_local *lp;
2113	struct net_device *sdev;
2114
2115	if (!(ndev = isdn_net_findif(name)))
2116		return 1;
2117	lp = ndev->local;
2118	if (!(lp->flags & ISDN_NET_CONNECTED))
2119		return 5;
2120
2121	sdev = lp->slave;
2122	while (sdev) {
2123		isdn_net_local *mlp = netdev_priv(sdev);
2124
2125		if (mlp->slave) { /* find last connected link in chain */
2126			isdn_net_local *nlp = ISDN_SLAVE_PRIV(mlp);
2127
2128			if (!(nlp->flags & ISDN_NET_CONNECTED))
2129				break;
2130		} else if (mlp->flags & ISDN_NET_CONNECTED)
2131			break;
2132		
2133		sdev = mlp->slave;
2134	}
2135	if (!sdev)
2136		return 2;
2137
2138	isdn_net_hangup(sdev);
2139	return 0;
2140#else
2141	return -1;
2142#endif
2143}
2144
2145/*
2146 * PPP compression stuff
2147 */
2148
2149
2150/* Push an empty CCP Data Frame up to the daemon to wake it up and let it
2151   generate a CCP Reset-Request or tear down CCP altogether */
2152
2153static void isdn_ppp_ccp_kickup(struct ippp_struct *is)
2154{
2155	isdn_ppp_fill_rq(NULL, 0, PPP_COMP, is->lp->ppp_slot);
2156}
2157
2158/* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
2159   but absolutely nontrivial. The most abstruse problem we are facing is
2160   that the generation, reception and all the handling of timeouts and
2161   resends including proper request id management should be entirely left
2162   to the (de)compressor, but indeed is not covered by the current API to
2163   the (de)compressor. The API is a prototype version from PPP where only
2164   some (de)compressors have yet been implemented and all of them are
2165   rather simple in their reset handling. Especially, their is only one
2166   outstanding ResetAck at a time with all of them and ResetReq/-Acks do
2167   not have parameters. For this very special case it was sufficient to
2168   just return an error code from the decompressor and have a single
2169   reset() entry to communicate all the necessary information between
2170   the framework and the (de)compressor. Bad enough, LZS is different
2171   (and any other compressor may be different, too). It has multiple
2172   histories (eventually) and needs to Reset each of them independently
2173   and thus uses multiple outstanding Acks and history numbers as an
2174   additional parameter to Reqs/Acks.
2175   All that makes it harder to port the reset state engine into the
2176   kernel because it is not just the same simple one as in (i)pppd but
2177   it must be able to pass additional parameters and have multiple out-
2178   standing Acks. We are trying to achieve the impossible by handling
2179   reset transactions independent by their id. The id MUST change when
2180   the data portion changes, thus any (de)compressor who uses more than
2181   one resettable state must provide and recognize individual ids for
2182   each individual reset transaction. The framework itself does _only_
2183   differentiate them by id, because it has no other semantics like the
2184   (de)compressor might.
2185   This looks like a major redesign of the interface would be nice,
2186   but I don't have an idea how to do it better. */
2187
2188/* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
2189   getting that lengthy because there is no simple "send-this-frame-out"
2190   function above but every wrapper does a bit different. Hope I guess
2191   correct in this hack... */
2192
2193static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
2194				    unsigned char code, unsigned char id,
2195				    unsigned char *data, int len)
2196{
2197	struct sk_buff *skb;
2198	unsigned char *p;
2199	int hl;
2200	int cnt = 0;
2201	isdn_net_local *lp = is->lp;
2202
2203	/* Alloc large enough skb */
2204	hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
2205	skb = alloc_skb(len + hl + 16,GFP_ATOMIC);
2206	if(!skb) {
2207		printk(KERN_WARNING
2208		       "ippp: CCP cannot send reset - out of memory\n");
2209		return;
2210	}
2211	skb_reserve(skb, hl);
2212
2213	/* We may need to stuff an address and control field first */
2214	if(!(is->pppcfg & SC_COMP_AC)) {
2215		p = skb_put(skb, 2);
2216		*p++ = 0xff;
2217		*p++ = 0x03;
2218	}
2219
2220	/* Stuff proto, code, id and length */
2221	p = skb_put(skb, 6);
2222	*p++ = (proto >> 8);
2223	*p++ = (proto & 0xff);
2224	*p++ = code;
2225	*p++ = id;
2226	cnt = 4 + len;
2227	*p++ = (cnt >> 8);
2228	*p++ = (cnt & 0xff);
2229
2230	/* Now stuff remaining bytes */
2231	if(len) {
2232		p = skb_put(skb, len);
2233		memcpy(p, data, len);
2234	}
2235
2236	/* skb is now ready for xmit */
2237	printk(KERN_DEBUG "Sending CCP Frame:\n");
2238	isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2239
2240	isdn_net_write_super(lp, skb);
2241}
2242
2243/* Allocate the reset state vector */
2244static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is)
2245{
2246	struct ippp_ccp_reset *r;
2247	r = kzalloc(sizeof(struct ippp_ccp_reset), GFP_KERNEL);
2248	if(!r) {
2249		printk(KERN_ERR "ippp_ccp: failed to allocate reset data"
2250		       " structure - no mem\n");
2251		return NULL;
2252	}
2253	printk(KERN_DEBUG "ippp_ccp: allocated reset data structure %p\n", r);
2254	is->reset = r;
2255	return r;
2256}
2257
2258/* Destroy the reset state vector. Kill all pending timers first. */
2259static void isdn_ppp_ccp_reset_free(struct ippp_struct *is)
2260{
2261	unsigned int id;
2262
2263	printk(KERN_DEBUG "ippp_ccp: freeing reset data structure %p\n",
2264	       is->reset);
2265	for(id = 0; id < 256; id++) {
2266		if(is->reset->rs[id]) {
2267			isdn_ppp_ccp_reset_free_state(is, (unsigned char)id);
2268		}
2269	}
2270	kfree(is->reset);
2271	is->reset = NULL;
2272}
2273
2274/* Free a given state and clear everything up for later reallocation */
2275static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
2276					  unsigned char id)
2277{
2278	struct ippp_ccp_reset_state *rs;
2279
2280	if(is->reset->rs[id]) {
2281		printk(KERN_DEBUG "ippp_ccp: freeing state for id %d\n", id);
2282		rs = is->reset->rs[id];
2283		/* Make sure the kernel will not call back later */
2284		if(rs->ta)
2285			del_timer(&rs->timer);
2286		is->reset->rs[id] = NULL;
2287		kfree(rs);
2288	} else {
2289		printk(KERN_WARNING "ippp_ccp: id %d is not allocated\n", id);
2290	}
2291}
2292
2293/* The timer callback function which is called when a ResetReq has timed out,
2294   aka has never been answered by a ResetAck */
2295static void isdn_ppp_ccp_timer_callback(unsigned long closure)
2296{
2297	struct ippp_ccp_reset_state *rs =
2298		(struct ippp_ccp_reset_state *)closure;
2299
2300	if(!rs) {
2301		printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
2302		return;
2303	}
2304	if(rs->ta && rs->state == CCPResetSentReq) {
2305		/* We are correct here */
2306		if(!rs->expra) {
2307			/* Hmm, there is no Ack really expected. We can clean
2308			   up the state now, it will be reallocated if the
2309			   decompressor insists on another reset */
2310			rs->ta = 0;
2311			isdn_ppp_ccp_reset_free_state(rs->is, rs->id);
2312			return;
2313		}
2314		printk(KERN_DEBUG "ippp_ccp: CCP Reset timed out for id %d\n",
2315		       rs->id);
2316		/* Push it again */
2317		isdn_ppp_ccp_xmit_reset(rs->is, PPP_CCP, CCP_RESETREQ, rs->id,
2318					rs->data, rs->dlen);
2319		/* Restart timer */
2320		rs->timer.expires = jiffies + HZ*5;
2321		add_timer(&rs->timer);
2322	} else {
2323		printk(KERN_WARNING "ippp_ccp: timer cb in wrong state %d\n",
2324		       rs->state);
2325	}
2326}
2327
2328/* Allocate a new reset transaction state */
2329static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
2330						      unsigned char id)
2331{
2332	struct ippp_ccp_reset_state *rs;
2333	if(is->reset->rs[id]) {
2334		printk(KERN_WARNING "ippp_ccp: old state exists for id %d\n",
2335		       id);
2336		return NULL;
2337	} else {
2338		rs = kzalloc(sizeof(struct ippp_ccp_reset_state), GFP_KERNEL);
2339		if(!rs)
2340			return NULL;
2341		rs->state = CCPResetIdle;
2342		rs->is = is;
2343		rs->id = id;
2344		init_timer(&rs->timer);
2345		rs->timer.data = (unsigned long)rs;
2346		rs->timer.function = isdn_ppp_ccp_timer_callback;
2347		is->reset->rs[id] = rs;
2348	}
2349	return rs;
2350}
2351
2352
2353/* A decompressor wants a reset with a set of parameters - do what is
2354   necessary to fulfill it */
2355static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
2356				     struct isdn_ppp_resetparams *rp)
2357{
2358	struct ippp_ccp_reset_state *rs;
2359
2360	if(rp->valid) {
2361		/* The decompressor defines parameters by itself */
2362		if(rp->rsend) {
2363			/* And he wants us to send a request */
2364			if(!(rp->idval)) {
2365				printk(KERN_ERR "ippp_ccp: decompressor must"
2366				       " specify reset id\n");
2367				return;
2368			}
2369			if(is->reset->rs[rp->id]) {
2370				/* There is already a transaction in existence
2371				   for this id. May be still waiting for a
2372				   Ack or may be wrong. */
2373				rs = is->reset->rs[rp->id];
2374				if(rs->state == CCPResetSentReq && rs->ta) {
2375					printk(KERN_DEBUG "ippp_ccp: reset"
2376					       " trans still in progress"
2377					       " for id %d\n", rp->id);
2378				} else {
2379					printk(KERN_WARNING "ippp_ccp: reset"
2380					       " trans in wrong state %d for"
2381					       " id %d\n", rs->state, rp->id);
2382				}
2383			} else {
2384				/* Ok, this is a new transaction */
2385				printk(KERN_DEBUG "ippp_ccp: new trans for id"
2386				       " %d to be started\n", rp->id);
2387				rs = isdn_ppp_ccp_reset_alloc_state(is, rp->id);
2388				if(!rs) {
2389					printk(KERN_ERR "ippp_ccp: out of mem"
2390					       " allocing ccp trans\n");
2391					return;
2392				}
2393				rs->state = CCPResetSentReq;
2394				rs->expra = rp->expra;
2395				if(rp->dtval) {
2396					rs->dlen = rp->dlen;
2397					memcpy(rs->data, rp->data, rp->dlen);
2398				}
2399				/* HACK TODO - add link comp here */
2400				isdn_ppp_ccp_xmit_reset(is, PPP_CCP,
2401							CCP_RESETREQ, rs->id,
2402							rs->data, rs->dlen);
2403				/* Start the timer */
2404				rs->timer.expires = jiffies + 5*HZ;
2405				add_timer(&rs->timer);
2406				rs->ta = 1;
2407			}
2408		} else {
2409			printk(KERN_DEBUG "ippp_ccp: no reset sent\n");
2410		}
2411	} else {
2412		/* The reset params are invalid. The decompressor does not
2413		   care about them, so we just send the minimal requests
2414		   and increase ids only when an Ack is received for a
2415		   given id */
2416		if(is->reset->rs[is->reset->lastid]) {
2417			/* There is already a transaction in existence
2418			   for this id. May be still waiting for a
2419			   Ack or may be wrong. */
2420			rs = is->reset->rs[is->reset->lastid];
2421			if(rs->state == CCPResetSentReq && rs->ta) {
2422				printk(KERN_DEBUG "ippp_ccp: reset"
2423				       " trans still in progress"
2424				       " for id %d\n", rp->id);
2425			} else {
2426				printk(KERN_WARNING "ippp_ccp: reset"
2427				       " trans in wrong state %d for"
2428				       " id %d\n", rs->state, rp->id);
2429			}
2430		} else {
2431			printk(KERN_DEBUG "ippp_ccp: new trans for id"
2432			       " %d to be started\n", is->reset->lastid);
2433			rs = isdn_ppp_ccp_reset_alloc_state(is,
2434							    is->reset->lastid);
2435			if(!rs) {
2436				printk(KERN_ERR "ippp_ccp: out of mem"
2437				       " allocing ccp trans\n");
2438				return;
2439			}
2440			rs->state = CCPResetSentReq;
2441			/* We always expect an Ack if the decompressor doesn't
2442			   know	better */
2443			rs->expra = 1;
2444			rs->dlen = 0;
2445			/* HACK TODO - add link comp here */
2446			isdn_ppp_ccp_xmit_reset(is, PPP_CCP, CCP_RESETREQ,
2447						rs->id, NULL, 0);
2448			/* Start the timer */
2449			rs->timer.expires = jiffies + 5*HZ;
2450			add_timer(&rs->timer);
2451			rs->ta = 1;
2452		}
2453	}
2454}
2455
2456/* An Ack was received for this id. This means we stop the timer and clean
2457   up the state prior to calling the decompressors reset routine. */
2458static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
2459					unsigned char id)
2460{
2461	struct ippp_ccp_reset_state *rs = is->reset->rs[id];
2462
2463	if(rs) {
2464		if(rs->ta && rs->state == CCPResetSentReq) {
2465			/* Great, we are correct */
2466			if(!rs->expra)
2467				printk(KERN_DEBUG "ippp_ccp: ResetAck received"
2468				       " for id %d but not expected\n", id);
2469		} else {
2470			printk(KERN_INFO "ippp_ccp: ResetAck received out of"
2471			       "sync for id %d\n", id);
2472		}
2473		if(rs->ta) {
2474			rs->ta = 0;
2475			del_timer(&rs->timer);
2476		}
2477		isdn_ppp_ccp_reset_free_state(is, id);
2478	} else {
2479		printk(KERN_INFO "ippp_ccp: ResetAck received for unknown id"
2480		       " %d\n", id);
2481	}
2482	/* Make sure the simple reset stuff uses a new id next time */
2483	is->reset->lastid++;
2484}
2485
2486/* 
2487 * decompress packet
2488 *
2489 * if master = 0, we're trying to uncompress an per-link compressed packet,
2490 * as opposed to an compressed reconstructed-from-MPPP packet.
2491 * proto is updated to protocol field of uncompressed packet.
2492 *
2493 * retval: decompressed packet,
2494 *         same packet if uncompressed,
2495 *	   NULL if decompression error
2496 */
2497
2498static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb,struct ippp_struct *is,struct ippp_struct *master,
2499	int *proto)
2500{
2501	void *stat = NULL;
2502	struct isdn_ppp_compressor *ipc = NULL;
2503	struct sk_buff *skb_out;
2504	int len;
2505	struct ippp_struct *ri;
2506	struct isdn_ppp_resetparams rsparm;
2507	unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2508
2509	if(!master) {
2510		// per-link decompression 
2511		stat = is->link_decomp_stat;
2512		ipc = is->link_decompressor;
2513		ri = is;
2514	} else {
2515		stat = master->decomp_stat;
2516		ipc = master->decompressor;
2517		ri = master;
2518	}
2519
2520	if (!ipc) {
2521		// no decompressor -> we can't decompress.
2522		printk(KERN_DEBUG "ippp: no decompressor defined!\n");
2523		return skb;
2524	}
2525	BUG_ON(!stat); // if we have a compressor, stat has been set as well
2526
2527	if((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG) ) {
2528		// compressed packets are compressed by their protocol type
2529
2530		// Set up reset params for the decompressor
2531  		memset(&rsparm, 0, sizeof(rsparm));
2532  		rsparm.data = rsdata;
2533  		rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2534  
2535  		skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
2536  		if (!skb_out) {
2537  			kfree_skb(skb);
2538  			printk(KERN_ERR "ippp: decomp memory allocation failure\n");
2539			return NULL;
2540  		}
2541		len = ipc->decompress(stat, skb, skb_out, &rsparm);
2542		kfree_skb(skb);
2543		if (len <= 0) {
2544			switch(len) {
2545			case DECOMP_ERROR:
2546				printk(KERN_INFO "ippp: decomp wants reset %s params\n",
2547				       rsparm.valid ? "with" : "without");
2548				
2549				isdn_ppp_ccp_reset_trans(ri, &rsparm);
2550				break;
2551			case DECOMP_FATALERROR:
2552				ri->pppcfg |= SC_DC_FERROR;
2553				/* Kick ipppd to recognize the error */
2554				isdn_ppp_ccp_kickup(ri);
2555				break;
2556			}
2557			kfree_skb(skb_out);
2558			return NULL;
2559		}
2560		*proto = isdn_ppp_strip_proto(skb_out);
2561		if (*proto < 0) {
2562			kfree_skb(skb_out);
2563			return NULL;
2564		}
2565		return skb_out;
2566	} else { 
2567		// uncompressed packets are fed through the decompressor to
2568		// update the decompressor state
2569		ipc->incomp(stat, skb, *proto);
2570		return skb;
2571	}
2572}
2573
2574/*
2575 * compress a frame 
2576 *   type=0: normal/bundle compression
2577 *       =1: link compression
2578 * returns original skb if we haven't compressed the frame
2579 * and a new skb pointer if we've done it
2580 */
2581static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in,int *proto,
2582	struct ippp_struct *is,struct ippp_struct *master,int type)
2583{
2584    int ret;
2585    int new_proto;
2586    struct isdn_ppp_compressor *compressor;
2587    void *stat;
2588    struct sk_buff *skb_out;
2589
2590	/* we do not compress control protocols */
2591    if(*proto < 0 || *proto > 0x3fff) {
2592	    return skb_in;
2593    }
2594
2595	if(type) { /* type=1 => Link compression */
2596		return skb_in;
2597	}
2598	else {
2599		if(!master) {
2600			compressor = is->compressor;
2601			stat = is->comp_stat;
2602		}
2603		else {
2604			compressor = master->compressor;
2605			stat = master->comp_stat;
2606		}
2607		new_proto = PPP_COMP;
2608	}
2609
2610	if(!compressor) {
2611		printk(KERN_ERR "isdn_ppp: No compressor set!\n");
2612		return skb_in;
2613	}
2614	if(!stat) {
2615		printk(KERN_ERR "isdn_ppp: Compressor not initialized?\n");
2616		return skb_in;
2617	}
2618
2619	/* Allow for at least 150 % expansion (for now) */
2620	skb_out = alloc_skb(skb_in->len + skb_in->len/2 + 32 +
2621		skb_headroom(skb_in), GFP_ATOMIC);
2622	if(!skb_out)
2623		return skb_in;
2624	skb_reserve(skb_out, skb_headroom(skb_in));
2625
2626	ret = (compressor->compress)(stat,skb_in,skb_out,*proto);
2627	if(!ret) {
2628		dev_kfree_skb(skb_out);
2629		return skb_in;
2630	}
2631	
2632	dev_kfree_skb(skb_in);
2633	*proto = new_proto;
2634	return skb_out;
2635}
2636
2637/*
2638 * we received a CCP frame .. 
2639 * not a clean solution, but we MUST handle a few cases in the kernel
2640 */
2641static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
2642	 struct sk_buff *skb,int proto)
2643{
2644	struct ippp_struct *is;
2645	struct ippp_struct *mis;
2646	int len;
2647	struct isdn_ppp_resetparams rsparm;
2648	unsigned char rsdata[IPPP_RESET_MAXDATABYTES];	
2649
2650	printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
2651		lp->ppp_slot);
2652	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
2653		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2654			__func__, lp->ppp_slot);
2655		return;
2656	}
2657	is = ippp_table[lp->ppp_slot];
2658	isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2659
2660	if(lp->master) {
2661		int slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2662		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2663			printk(KERN_ERR "%s: slot(%d) out of range\n",
2664				__func__, slot);
2665			return;
2666		}	
2667		mis = ippp_table[slot];
2668	} else
2669		mis = is;
2670
2671	switch(skb->data[0]) {
2672	case CCP_CONFREQ:
2673		if(is->debug & 0x10)
2674			printk(KERN_DEBUG "Disable compression here!\n");
2675		if(proto == PPP_CCP)
2676			mis->compflags &= ~SC_COMP_ON;		
2677		else
2678			is->compflags &= ~SC_LINK_COMP_ON;		
2679		break;
2680	case CCP_TERMREQ:
2681	case CCP_TERMACK:
2682		if(is->debug & 0x10)
2683			printk(KERN_DEBUG "Disable (de)compression here!\n");
2684		if(proto == PPP_CCP)
2685			mis->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);		
2686		else
2687			is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);		
2688		break;
2689	case CCP_CONFACK:
2690		/* if we RECEIVE an ackowledge we enable the decompressor */
2691		if(is->debug & 0x10)
2692			printk(KERN_DEBUG "Enable decompression here!\n");
2693		if(proto == PPP_CCP) {
2694			if (!mis->decompressor)
2695				break;
2696			mis->compflags |= SC_DECOMP_ON;
2697		} else {
2698			if (!is->decompressor)
2699				break;
2700			is->compflags |= SC_LINK_DECOMP_ON;
2701		}
2702		break;
2703
2704	case CCP_RESETACK:
2705		printk(KERN_DEBUG "Received ResetAck from peer\n");
2706		len = (skb->data[2] << 8) | skb->data[3];
2707		len -= 4;
2708
2709		if(proto == PPP_CCP) {
2710			/* If a reset Ack was outstanding for this id, then
2711			   clean up the state engine */
2712			isdn_ppp_ccp_reset_ack_rcvd(mis, skb->data[1]);
2713			if(mis->decompressor && mis->decomp_stat)
2714				mis->decompressor->
2715					reset(mis->decomp_stat,
2716					      skb->data[0],
2717					      skb->data[1],
2718					      len ? &skb->data[4] : NULL,
2719					      len, NULL);
2720			/* TODO: This is not easy to decide here */
2721			mis->compflags &= ~SC_DECOMP_DISCARD;
2722		}
2723		else {
2724			isdn_ppp_ccp_reset_ack_rcvd(is, skb->data[1]);
2725			if(is->link_decompressor && is->link_decomp_stat)
2726				is->link_decompressor->
2727					reset(is->link_decomp_stat,
2728					      skb->data[0],
2729					      skb->data[1],
2730					      len ? &skb->data[4] : NULL,
2731					      len, NULL);
2732			/* TODO: neither here */
2733			is->compflags &= ~SC_LINK_DECOMP_DISCARD;
2734		}
2735		break;
2736
2737	case CCP_RESETREQ:
2738		printk(KERN_DEBUG "Received ResetReq from peer\n");
2739		/* Receiving a ResetReq means we must reset our compressor */
2740		/* Set up reset params for the reset entry */
2741		memset(&rsparm, 0, sizeof(rsparm));
2742		rsparm.data = rsdata;
2743		rsparm.maxdlen = IPPP_RESET_MAXDATABYTES; 
2744		/* Isolate data length */
2745		len = (skb->data[2] << 8) | skb->data[3];
2746		len -= 4;
2747		if(proto == PPP_CCP) {
2748			if(mis->compressor && mis->comp_stat)
2749				mis->compressor->
2750					reset(mis->comp_stat,
2751					      skb->data[0],
2752					      skb->data[1],
2753					      len ? &skb->data[4] : NULL,
2754					      len, &rsparm);
2755		}
2756		else {
2757			if(is->link_compressor && is->link_comp_stat)
2758				is->link_compressor->
2759					reset(is->link_comp_stat,
2760					      skb->data[0],
2761					      skb->data[1],
2762					      len ? &skb->data[4] : NULL,
2763					      len, &rsparm);
2764		}
2765		/* Ack the Req as specified by rsparm */
2766		if(rsparm.valid) {
2767			/* Compressor reset handler decided how to answer */
2768			if(rsparm.rsend) {
2769				/* We should send a Frame */
2770				isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2771							rsparm.idval ? rsparm.id
2772							: skb->data[1],
2773							rsparm.dtval ?
2774							rsparm.data : NULL,
2775							rsparm.dtval ?
2776							rsparm.dlen : 0);
2777			} else {
2778				printk(KERN_DEBUG "ResetAck suppressed\n");
2779			}
2780		} else {
2781			/* We answer with a straight reflected Ack */
2782			isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2783						skb->data[1],
2784						len ? &skb->data[4] : NULL,
2785						len);
2786		}
2787		break;
2788	}
2789}
2790
2791
2792/*
2793 * Daemon sends a CCP frame ...
2794 */
2795
2796/* TODO: Clean this up with new Reset semantics */
2797
2798/* I believe the CCP handling as-is is done wrong. Compressed frames
2799 * should only be sent/received after CCP reaches UP state, which means
2800 * both sides have sent CONF_ACK. Currently, we handle both directions
2801 * independently, which means we may accept compressed frames too early
2802 * (supposedly not a problem), but may also mean we send compressed frames
2803 * too early, which may turn out to be a problem.
2804 * This part of state machine should actually be handled by (i)pppd, but
2805 * that's too big of a change now. --kai
2806 */
2807
2808/* Actually, we might turn this into an advantage: deal with the RFC in
2809 * the old tradition of beeing generous on what we accept, but beeing
2810 * strict on what we send. Thus we should just
2811 * - accept compressed frames as soon as decompression is negotiated
2812 * - send compressed frames only when decomp *and* comp are negotiated
2813 * - drop rx compressed frames if we cannot decomp (instead of pushing them
2814 *   up to ipppd)
2815 * and I tried to modify this file according to that. --abp
2816 */
2817
2818static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
2819{
2820	struct ippp_struct *mis,*is;
2821	int proto, slot = lp->ppp_slot;
2822	unsigned char *data;
2823
2824	if(!skb || skb->len < 3)
2825		return;
2826	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2827		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2828			__func__, slot);
2829		return;
2830	}	
2831	is = ippp_table[slot];
2832	/* Daemon may send with or without address and control field comp */
2833	data = skb->data;
2834	if(!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
2835		data += 2;
2836		if(skb->len < 5)
2837			return;
2838	}
2839
2840	proto = ((int)data[0]<<8)+data[1];
2841	if(proto != PPP_CCP && proto != PPP_CCPFRAG)
2842		return;
2843
2844	printk(KERN_DEBUG "Received CCP frame from daemon:\n");
2845	isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit,lp->ppp_slot);
2846
2847	if (lp->master) {
2848		slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2849		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2850			printk(KERN_ERR "%s: slot(%d) out of range\n",
2851				__func__, slot);
2852			return;
2853		}	
2854		mis = ippp_table[slot];
2855	} else
2856		mis = is;
2857	if (mis != is)
2858		printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2859	
2860        switch(data[2]) {
2861	case CCP_CONFREQ:
2862		if(is->debug & 0x10)
2863			printk(KERN_DEBUG "Disable decompression here!\n");
2864		if(proto == PPP_CCP)
2865			is->compflags &= ~SC_DECOMP_ON;
2866		else
2867			is->compflags &= ~SC_LINK_DECOMP_ON;
2868		break;
2869	case CCP_TERMREQ:
2870	case CCP_TERMACK:
2871		if(is->debug & 0x10)
2872			printk(KERN_DEBUG "Disable (de)compression here!\n");
2873		if(proto == PPP_CCP)
2874			is->compflags &= ~(SC_DECOMP_ON|SC_COMP_ON);
2875		else
2876			is->compflags &= ~(SC_LINK_DECOMP_ON|SC_LINK_COMP_ON);
2877		break;
2878	case CCP_CONFACK:
2879		/* if we SEND an ackowledge we can/must enable the compressor */
2880		if(is->debug & 0x10)
2881			printk(KERN_DEBUG "Enable compression here!\n");
2882		if(proto == PPP_CCP) {
2883			if (!is->compressor)
2884				break;
2885			is->compflags |= SC_COMP_ON;
2886		} else {
2887			if (!is->compressor)
2888				break;
2889			is->compflags |= SC_LINK_COMP_ON;
2890		}
2891		break;
2892	case CCP_RESETACK:
2893		/* If we send a ACK we should reset our compressor */
2894		if(is->debug & 0x10)
2895			printk(KERN_DEBUG "Reset decompression state here!\n");
2896		printk(KERN_DEBUG "ResetAck from daemon passed by\n");
2897		if(proto == PPP_CCP) {
2898			/* link to master? */
2899			if(is->compressor && is->comp_stat)
2900				is->compressor->reset(is->comp_stat, 0, 0,
2901						      NULL, 0, NULL);
2902			is->compflags &= ~SC_COMP_DISCARD;	
2903		}
2904		else {
2905			if(is->link_compressor && is->link_comp_stat)
2906				is->link_compressor->reset(is->link_comp_stat,
2907							   0, 0, NULL, 0, NULL);
2908			is->compflags &= ~SC_LINK_COMP_DISCARD;	
2909		}
2910		break;
2911	case CCP_RESETREQ:
2912		/* Just let it pass by */
2913		printk(KERN_DEBUG "ResetReq from daemon passed by\n");
2914		break;
2915	}
2916}
2917
2918int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
2919{
2920	ipc->next = ipc_head;
2921	ipc->prev = NULL;
2922	if(ipc_head) {
2923		ipc_head->prev = ipc;
2924	}
2925	ipc_head = ipc;
2926	return 0;
2927}
2928
2929int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc)
2930{
2931	if(ipc->prev)
2932		ipc->prev->next = ipc->next;
2933	else
2934		ipc_head = ipc->next;
2935	if(ipc->next)
2936		ipc->next->prev = ipc->prev;
2937	ipc->prev = ipc->next = NULL;
2938	return 0;
2939}
2940
2941static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *data)
2942{
2943	struct isdn_ppp_compressor *ipc = ipc_head;
2944	int ret;
2945	void *stat;
2946	int num = data->num;
2947
2948	if(is->debug & 0x10)
2949		printk(KERN_DEBUG "[%d] Set %s type %d\n",is->unit,
2950			(data->flags&IPPP_COMP_FLAG_XMIT)?"compressor":"decompressor",num);
2951
2952	/* If is has no valid reset state vector, we cannot allocate a
2953	   decompressor. The decompressor would cause reset transactions
2954	   sooner or later, and they need that vector. */
2955
2956	if(!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
2957		printk(KERN_ERR "ippp_ccp: no reset data structure - can't"
2958		       " allow decompression.\n");
2959		return -ENOMEM;
2960	}
2961
2962	while(ipc) {
2963		if(ipc->num == num) {
2964			stat = ipc->alloc(data);
2965			if(stat) {
2966				ret = ipc->init(stat,data,is->unit,0);
2967				if(!ret) {
2968					printk(KERN_ERR "Can't init (de)compression!\n");
2969					ipc->free(stat);
2970					stat = NULL;
2971					break;
2972				}
2973			}
2974			else {
2975				printk(KERN_ERR "Can't alloc (de)compression!\n");
2976				break;
2977			}
2978
2979                        if(data->flags & IPPP_COMP_FLAG_XMIT) {
2980				if(data->flags & IPPP_COMP_FLAG_LINK) {
2981					if(is->link_comp_stat)
2982						is->link_compressor->free(is->link_comp_stat);
2983					is->link_comp_stat = stat;
2984                                	is->link_compressor = ipc;
2985				}
2986				else {
2987					if(is->comp_stat)
2988						is->compressor->free(is->comp_stat);
2989					is->comp_stat = stat;
2990                                	is->compressor = ipc;
2991				}
2992			}
2993                        else {
2994				if(data->flags & IPPP_COMP_FLAG_LINK) {
2995					if(is->link_decomp_stat)
2996						is->link_decompressor->free(is->link_decomp_stat);
2997					is->link_decomp_stat = stat;
2998        	                        is->link_decompressor = ipc;
2999				}
3000				else {
3001					if(is->decomp_stat)
3002						is->decompressor->free(is->decomp_stat);
3003					is->decomp_stat = stat;
3004        	                        is->decompressor = ipc;
3005				}
3006			}
3007			return 0;
3008		}
3009		ipc = ipc->next;
3010	}
3011	return -EINVAL;
3012}
v3.5.6
   1/* $Id: isdn_ppp.c,v 1.1.2.3 2004/02/10 01:07:13 keil Exp $
   2 *
   3 * Linux ISDN subsystem, functions for synchronous PPP (linklevel).
   4 *
   5 * Copyright 1995,96 by Michael Hipp (Michael.Hipp@student.uni-tuebingen.de)
   6 *
   7 * This software may be used and distributed according to the terms
   8 * of the GNU General Public License, incorporated herein by reference.
   9 *
  10 */
  11
  12#include <linux/isdn.h>
  13#include <linux/poll.h>
  14#include <linux/ppp-comp.h>
  15#include <linux/slab.h>
  16#ifdef CONFIG_IPPP_FILTER
  17#include <linux/filter.h>
  18#endif
  19
  20#include "isdn_common.h"
  21#include "isdn_ppp.h"
  22#include "isdn_net.h"
  23
  24#ifndef PPP_IPX
  25#define PPP_IPX 0x002b
  26#endif
  27
  28/* Prototypes */
  29static int isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot);
  30static int isdn_ppp_closewait(int slot);
  31static void isdn_ppp_push_higher(isdn_net_dev *net_dev, isdn_net_local *lp,
  32				 struct sk_buff *skb, int proto);
  33static int isdn_ppp_if_get_unit(char *namebuf);
  34static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *);
  35static struct sk_buff *isdn_ppp_decompress(struct sk_buff *,
  36					   struct ippp_struct *, struct ippp_struct *, int *proto);
  37static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
  38				 struct sk_buff *skb, int proto);
  39static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in, int *proto,
  40					 struct ippp_struct *is, struct ippp_struct *master, int type);
  41static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
  42			      struct sk_buff *skb);
  43
  44/* New CCP stuff */
  45static void isdn_ppp_ccp_kickup(struct ippp_struct *is);
  46static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
  47				    unsigned char code, unsigned char id,
  48				    unsigned char *data, int len);
  49static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is);
  50static void isdn_ppp_ccp_reset_free(struct ippp_struct *is);
  51static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
  52					  unsigned char id);
  53static void isdn_ppp_ccp_timer_callback(unsigned long closure);
  54static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
  55								   unsigned char id);
  56static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
  57				     struct isdn_ppp_resetparams *rp);
  58static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
  59					unsigned char id);
  60
  61
  62
  63#ifdef CONFIG_ISDN_MPP
  64static ippp_bundle *isdn_ppp_bundle_arr = NULL;
  65
  66static int isdn_ppp_mp_bundle_array_init(void);
  67static int isdn_ppp_mp_init(isdn_net_local *lp, ippp_bundle *add_to);
  68static void isdn_ppp_mp_receive(isdn_net_dev *net_dev, isdn_net_local *lp,
  69				struct sk_buff *skb);
  70static void isdn_ppp_mp_cleanup(isdn_net_local *lp);
  71
  72static int isdn_ppp_bundle(struct ippp_struct *, int unit);
  73#endif	/* CONFIG_ISDN_MPP */
  74
  75char *isdn_ppp_revision = "$Revision: 1.1.2.3 $";
  76
  77static struct ippp_struct *ippp_table[ISDN_MAX_CHANNELS];
  78
  79static struct isdn_ppp_compressor *ipc_head = NULL;
  80
  81/*
  82 * frame log (debug)
  83 */
  84static void
  85isdn_ppp_frame_log(char *info, char *data, int len, int maxlen, int unit, int slot)
  86{
  87	int cnt,
  88		j,
  89		i;
  90	char buf[80];
  91
  92	if (len < maxlen)
  93		maxlen = len;
  94
  95	for (i = 0, cnt = 0; cnt < maxlen; i++) {
  96		for (j = 0; j < 16 && cnt < maxlen; j++, cnt++)
  97			sprintf(buf + j * 3, "%02x ", (unsigned char)data[cnt]);
  98		printk(KERN_DEBUG "[%d/%d].%s[%d]: %s\n", unit, slot, info, i, buf);
  99	}
 100}
 101
 102/*
 103 * unbind isdn_net_local <=> ippp-device
 104 * note: it can happen, that we hangup/free the master before the slaves
 105 *       in this case we bind another lp to the master device
 106 */
 107int
 108isdn_ppp_free(isdn_net_local *lp)
 109{
 110	struct ippp_struct *is;
 111
 112	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
 113		printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
 114		       __func__, lp->ppp_slot);
 115		return 0;
 116	}
 117
 118#ifdef CONFIG_ISDN_MPP
 119	spin_lock(&lp->netdev->pb->lock);
 120#endif
 121	isdn_net_rm_from_bundle(lp);
 122#ifdef CONFIG_ISDN_MPP
 123	if (lp->netdev->pb->ref_ct == 1)	/* last link in queue? */
 124		isdn_ppp_mp_cleanup(lp);
 125
 126	lp->netdev->pb->ref_ct--;
 127	spin_unlock(&lp->netdev->pb->lock);
 128#endif /* CONFIG_ISDN_MPP */
 129	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
 130		printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n",
 131		       __func__, lp->ppp_slot);
 132		return 0;
 133	}
 134	is = ippp_table[lp->ppp_slot];
 135	if ((is->state & IPPP_CONNECT))
 136		isdn_ppp_closewait(lp->ppp_slot);	/* force wakeup on ippp device */
 137	else if (is->state & IPPP_ASSIGNED)
 138		is->state = IPPP_OPEN;	/* fallback to 'OPEN but not ASSIGNED' state */
 139
 140	if (is->debug & 0x1)
 141		printk(KERN_DEBUG "isdn_ppp_free %d %lx %lx\n", lp->ppp_slot, (long) lp, (long) is->lp);
 142
 143	is->lp = NULL;          /* link is down .. set lp to NULL */
 144	lp->ppp_slot = -1;      /* is this OK ?? */
 145
 146	return 0;
 147}
 148
 149/*
 150 * bind isdn_net_local <=> ippp-device
 151 *
 152 * This function is allways called with holding dev->lock so
 153 * no additional lock is needed
 154 */
 155int
 156isdn_ppp_bind(isdn_net_local *lp)
 157{
 158	int i;
 159	int unit = 0;
 160	struct ippp_struct *is;
 161	int retval;
 162
 163	if (lp->pppbind < 0) {  /* device bounded to ippp device ? */
 164		isdn_net_dev *net_dev = dev->netdev;
 165		char exclusive[ISDN_MAX_CHANNELS];	/* exclusive flags */
 166		memset(exclusive, 0, ISDN_MAX_CHANNELS);
 167		while (net_dev) {	/* step through net devices to find exclusive minors */
 168			isdn_net_local *lp = net_dev->local;
 169			if (lp->pppbind >= 0)
 170				exclusive[lp->pppbind] = 1;
 171			net_dev = net_dev->next;
 172		}
 173		/*
 174		 * search a free device / slot
 175		 */
 176		for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 177			if (ippp_table[i]->state == IPPP_OPEN && !exclusive[ippp_table[i]->minor]) {	/* OPEN, but not connected! */
 178				break;
 179			}
 180		}
 181	} else {
 182		for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 183			if (ippp_table[i]->minor == lp->pppbind &&
 184			    (ippp_table[i]->state & IPPP_OPEN) == IPPP_OPEN)
 185				break;
 186		}
 187	}
 188
 189	if (i >= ISDN_MAX_CHANNELS) {
 190		printk(KERN_WARNING "isdn_ppp_bind: Can't find a (free) connection to the ipppd daemon.\n");
 191		retval = -1;
 192		goto out;
 193	}
 194	/* get unit number from interface name .. ugly! */
 195	unit = isdn_ppp_if_get_unit(lp->netdev->dev->name);
 196	if (unit < 0) {
 197		printk(KERN_ERR "isdn_ppp_bind: illegal interface name %s.\n",
 198		       lp->netdev->dev->name);
 199		retval = -1;
 200		goto out;
 201	}
 202
 203	lp->ppp_slot = i;
 204	is = ippp_table[i];
 205	is->lp = lp;
 206	is->unit = unit;
 207	is->state = IPPP_OPEN | IPPP_ASSIGNED;	/* assigned to a netdevice but not connected */
 208#ifdef CONFIG_ISDN_MPP
 209	retval = isdn_ppp_mp_init(lp, NULL);
 210	if (retval < 0)
 211		goto out;
 212#endif /* CONFIG_ISDN_MPP */
 213
 214	retval = lp->ppp_slot;
 215
 216out:
 217	return retval;
 218}
 219
 220/*
 221 * kick the ipppd on the device
 222 * (wakes up daemon after B-channel connect)
 223 */
 224
 225void
 226isdn_ppp_wakeup_daemon(isdn_net_local *lp)
 227{
 228	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
 229		printk(KERN_ERR "%s: ppp_slot(%d) out of range\n",
 230		       __func__, lp->ppp_slot);
 231		return;
 232	}
 233	ippp_table[lp->ppp_slot]->state = IPPP_OPEN | IPPP_CONNECT | IPPP_NOBLOCK;
 234	wake_up_interruptible(&ippp_table[lp->ppp_slot]->wq);
 235}
 236
 237/*
 238 * there was a hangup on the netdevice
 239 * force wakeup of the ippp device
 240 * go into 'device waits for release' state
 241 */
 242static int
 243isdn_ppp_closewait(int slot)
 244{
 245	struct ippp_struct *is;
 246
 247	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
 248		printk(KERN_ERR "%s: slot(%d) out of range\n",
 249		       __func__, slot);
 250		return 0;
 251	}
 252	is = ippp_table[slot];
 253	if (is->state)
 254		wake_up_interruptible(&is->wq);
 255	is->state = IPPP_CLOSEWAIT;
 256	return 1;
 257}
 258
 259/*
 260 * isdn_ppp_find_slot / isdn_ppp_free_slot
 261 */
 262
 263static int
 264isdn_ppp_get_slot(void)
 265{
 266	int i;
 267	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 268		if (!ippp_table[i]->state)
 269			return i;
 270	}
 271	return -1;
 272}
 273
 274/*
 275 * isdn_ppp_open
 276 */
 277
 278int
 279isdn_ppp_open(int min, struct file *file)
 280{
 281	int slot;
 282	struct ippp_struct *is;
 283
 284	if (min < 0 || min >= ISDN_MAX_CHANNELS)
 285		return -ENODEV;
 286
 287	slot = isdn_ppp_get_slot();
 288	if (slot < 0) {
 289		return -EBUSY;
 290	}
 291	is = file->private_data = ippp_table[slot];
 292
 293	printk(KERN_DEBUG "ippp, open, slot: %d, minor: %d, state: %04x\n",
 294	       slot, min, is->state);
 295
 296	/* compression stuff */
 297	is->link_compressor   = is->compressor = NULL;
 298	is->link_decompressor = is->decompressor = NULL;
 299	is->link_comp_stat    = is->comp_stat = NULL;
 300	is->link_decomp_stat  = is->decomp_stat = NULL;
 301	is->compflags = 0;
 302
 303	is->reset = isdn_ppp_ccp_reset_alloc(is);
 304
 305	is->lp = NULL;
 306	is->mp_seqno = 0;       /* MP sequence number */
 307	is->pppcfg = 0;         /* ppp configuration */
 308	is->mpppcfg = 0;        /* mppp configuration */
 309	is->last_link_seqno = -1;	/* MP: maybe set to Bundle-MIN, when joining a bundle ?? */
 310	is->unit = -1;          /* set, when we have our interface */
 311	is->mru = 1524;         /* MRU, default 1524 */
 312	is->maxcid = 16;        /* VJ: maxcid */
 313	is->tk = current;
 314	init_waitqueue_head(&is->wq);
 315	is->first = is->rq + NUM_RCV_BUFFS - 1;	/* receive queue */
 316	is->last = is->rq;
 317	is->minor = min;
 318#ifdef CONFIG_ISDN_PPP_VJ
 319	/*
 320	 * VJ header compression init
 321	 */
 322	is->slcomp = slhc_init(16, 16);	/* not necessary for 2. link in bundle */
 323#endif
 324#ifdef CONFIG_IPPP_FILTER
 325	is->pass_filter = NULL;
 326	is->active_filter = NULL;
 327#endif
 328	is->state = IPPP_OPEN;
 329
 330	return 0;
 331}
 332
 333/*
 334 * release ippp device
 335 */
 336void
 337isdn_ppp_release(int min, struct file *file)
 338{
 339	int i;
 340	struct ippp_struct *is;
 341
 342	if (min < 0 || min >= ISDN_MAX_CHANNELS)
 343		return;
 344	is = file->private_data;
 345
 346	if (!is) {
 347		printk(KERN_ERR "%s: no file->private_data\n", __func__);
 348		return;
 349	}
 350	if (is->debug & 0x1)
 351		printk(KERN_DEBUG "ippp: release, minor: %d %lx\n", min, (long) is->lp);
 352
 353	if (is->lp) {           /* a lp address says: this link is still up */
 354		isdn_net_dev *p = is->lp->netdev;
 355
 356		if (!p) {
 357			printk(KERN_ERR "%s: no lp->netdev\n", __func__);
 358			return;
 359		}
 360		is->state &= ~IPPP_CONNECT;	/* -> effect: no call of wakeup */
 361		/*
 362		 * isdn_net_hangup() calls isdn_ppp_free()
 363		 * isdn_ppp_free() sets is->lp to NULL and lp->ppp_slot to -1
 364		 * removing the IPPP_CONNECT flag omits calling of isdn_ppp_wakeup_daemon()
 365		 */
 366		isdn_net_hangup(p->dev);
 367	}
 368	for (i = 0; i < NUM_RCV_BUFFS; i++) {
 369		kfree(is->rq[i].buf);
 370		is->rq[i].buf = NULL;
 371	}
 372	is->first = is->rq + NUM_RCV_BUFFS - 1;	/* receive queue */
 373	is->last = is->rq;
 374
 375#ifdef CONFIG_ISDN_PPP_VJ
 376/* TODO: if this was the previous master: link the slcomp to the new master */
 377	slhc_free(is->slcomp);
 378	is->slcomp = NULL;
 379#endif
 380#ifdef CONFIG_IPPP_FILTER
 381	kfree(is->pass_filter);
 382	is->pass_filter = NULL;
 383	kfree(is->active_filter);
 384	is->active_filter = NULL;
 385#endif
 386
 387/* TODO: if this was the previous master: link the stuff to the new master */
 388	if (is->comp_stat)
 389		is->compressor->free(is->comp_stat);
 390	if (is->link_comp_stat)
 391		is->link_compressor->free(is->link_comp_stat);
 392	if (is->link_decomp_stat)
 393		is->link_decompressor->free(is->link_decomp_stat);
 394	if (is->decomp_stat)
 395		is->decompressor->free(is->decomp_stat);
 396	is->compressor   = is->link_compressor   = NULL;
 397	is->decompressor = is->link_decompressor = NULL;
 398	is->comp_stat    = is->link_comp_stat    = NULL;
 399	is->decomp_stat  = is->link_decomp_stat  = NULL;
 400
 401	/* Clean up if necessary */
 402	if (is->reset)
 403		isdn_ppp_ccp_reset_free(is);
 404
 405	/* this slot is ready for new connections */
 406	is->state = 0;
 407}
 408
 409/*
 410 * get_arg .. ioctl helper
 411 */
 412static int
 413get_arg(void __user *b, void *val, int len)
 414{
 415	if (len <= 0)
 416		len = sizeof(void *);
 417	if (copy_from_user(val, b, len))
 418		return -EFAULT;
 419	return 0;
 420}
 421
 422/*
 423 * set arg .. ioctl helper
 424 */
 425static int
 426set_arg(void __user *b, void *val, int len)
 427{
 428	if (len <= 0)
 429		len = sizeof(void *);
 430	if (copy_to_user(b, val, len))
 431		return -EFAULT;
 432	return 0;
 433}
 434
 435#ifdef CONFIG_IPPP_FILTER
 436static int get_filter(void __user *arg, struct sock_filter **p)
 437{
 438	struct sock_fprog uprog;
 439	struct sock_filter *code = NULL;
 440	int len, err;
 441
 442	if (copy_from_user(&uprog, arg, sizeof(uprog)))
 443		return -EFAULT;
 444
 445	if (!uprog.len) {
 446		*p = NULL;
 447		return 0;
 448	}
 449
 450	/* uprog.len is unsigned short, so no overflow here */
 451	len = uprog.len * sizeof(struct sock_filter);
 452	code = memdup_user(uprog.filter, len);
 453	if (IS_ERR(code))
 454		return PTR_ERR(code);
 455
 456	err = sk_chk_filter(code, uprog.len);
 457	if (err) {
 458		kfree(code);
 459		return err;
 460	}
 461
 462	*p = code;
 463	return uprog.len;
 464}
 465#endif /* CONFIG_IPPP_FILTER */
 466
 467/*
 468 * ippp device ioctl
 469 */
 470int
 471isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg)
 472{
 473	unsigned long val;
 474	int r, i, j;
 475	struct ippp_struct *is;
 476	isdn_net_local *lp;
 477	struct isdn_ppp_comp_data data;
 478	void __user *argp = (void __user *)arg;
 479
 480	is = file->private_data;
 481	lp = is->lp;
 482
 483	if (is->debug & 0x1)
 484		printk(KERN_DEBUG "isdn_ppp_ioctl: minor: %d cmd: %x state: %x\n", min, cmd, is->state);
 485
 486	if (!(is->state & IPPP_OPEN))
 487		return -EINVAL;
 488
 489	switch (cmd) {
 490	case PPPIOCBUNDLE:
 491#ifdef CONFIG_ISDN_MPP
 492		if (!(is->state & IPPP_CONNECT))
 493			return -EINVAL;
 494		if ((r = get_arg(argp, &val, sizeof(val))))
 495			return r;
 496		printk(KERN_DEBUG "iPPP-bundle: minor: %d, slave unit: %d, master unit: %d\n",
 497		       (int) min, (int) is->unit, (int) val);
 498		return isdn_ppp_bundle(is, val);
 499#else
 500		return -1;
 501#endif
 502		break;
 503	case PPPIOCGUNIT:	/* get ppp/isdn unit number */
 504		if ((r = set_arg(argp, &is->unit, sizeof(is->unit))))
 505			return r;
 506		break;
 507	case PPPIOCGIFNAME:
 508		if (!lp)
 509			return -EINVAL;
 510		if ((r = set_arg(argp, lp->netdev->dev->name,
 511				 strlen(lp->netdev->dev->name))))
 512			return r;
 513		break;
 514	case PPPIOCGMPFLAGS:	/* get configuration flags */
 515		if ((r = set_arg(argp, &is->mpppcfg, sizeof(is->mpppcfg))))
 516			return r;
 517		break;
 518	case PPPIOCSMPFLAGS:	/* set configuration flags */
 519		if ((r = get_arg(argp, &val, sizeof(val))))
 520			return r;
 521		is->mpppcfg = val;
 522		break;
 523	case PPPIOCGFLAGS:	/* get configuration flags */
 524		if ((r = set_arg(argp, &is->pppcfg, sizeof(is->pppcfg))))
 525			return r;
 526		break;
 527	case PPPIOCSFLAGS:	/* set configuration flags */
 528		if ((r = get_arg(argp, &val, sizeof(val)))) {
 529			return r;
 530		}
 531		if (val & SC_ENABLE_IP && !(is->pppcfg & SC_ENABLE_IP) && (is->state & IPPP_CONNECT)) {
 
 
 
 
 
 
 
 
 
 
 532			if (lp) {
 533				/* OK .. we are ready to send buffers */
 534				is->pppcfg = val; /* isdn_ppp_xmit test for SC_ENABLE_IP !!! */
 535				netif_wake_queue(lp->netdev->dev);
 536				break;
 537			}
 538		}
 539		is->pppcfg = val;
 540		break;
 541	case PPPIOCGIDLE:	/* get idle time information */
 542		if (lp) {
 543			struct ppp_idle pidle;
 544			pidle.xmit_idle = pidle.recv_idle = lp->huptimer;
 545			if ((r = set_arg(argp, &pidle, sizeof(struct ppp_idle))))
 
 
 
 
 546				return r;
 547		}
 548		break;
 549	case PPPIOCSMRU:	/* set receive unit size for PPP */
 550		if ((r = get_arg(argp, &val, sizeof(val))))
 551			return r;
 552		is->mru = val;
 553		break;
 554	case PPPIOCSMPMRU:
 555		break;
 556	case PPPIOCSMPMTU:
 557		break;
 558	case PPPIOCSMAXCID:	/* set the maximum compression slot id */
 559		if ((r = get_arg(argp, &val, sizeof(val))))
 560			return r;
 561		val++;
 562		if (is->maxcid != val) {
 563#ifdef CONFIG_ISDN_PPP_VJ
 564			struct slcompress *sltmp;
 565#endif
 566			if (is->debug & 0x1)
 567				printk(KERN_DEBUG "ippp, ioctl: changed MAXCID to %ld\n", val);
 568			is->maxcid = val;
 569#ifdef CONFIG_ISDN_PPP_VJ
 570			sltmp = slhc_init(16, val);
 571			if (!sltmp) {
 572				printk(KERN_ERR "ippp, can't realloc slhc struct\n");
 573				return -ENOMEM;
 574			}
 575			if (is->slcomp)
 576				slhc_free(is->slcomp);
 577			is->slcomp = sltmp;
 578#endif
 579		}
 580		break;
 581	case PPPIOCGDEBUG:
 582		if ((r = set_arg(argp, &is->debug, sizeof(is->debug))))
 583			return r;
 584		break;
 585	case PPPIOCSDEBUG:
 586		if ((r = get_arg(argp, &val, sizeof(val))))
 587			return r;
 588		is->debug = val;
 589		break;
 590	case PPPIOCGCOMPRESSORS:
 591	{
 592		unsigned long protos[8] = {0,};
 593		struct isdn_ppp_compressor *ipc = ipc_head;
 594		while (ipc) {
 595			j = ipc->num / (sizeof(long) * 8);
 596			i = ipc->num % (sizeof(long) * 8);
 597			if (j < 8)
 598				protos[j] |= (0x1 << i);
 599			ipc = ipc->next;
 600		}
 601		if ((r = set_arg(argp, protos, 8 * sizeof(long))))
 602			return r;
 603	}
 604	break;
 605	case PPPIOCSCOMPRESSOR:
 606		if ((r = get_arg(argp, &data, sizeof(struct isdn_ppp_comp_data))))
 607			return r;
 608		return isdn_ppp_set_compressor(is, &data);
 609	case PPPIOCGCALLINFO:
 610	{
 611		struct pppcallinfo pci;
 612		memset((char *)&pci, 0, sizeof(struct pppcallinfo));
 613		if (lp)
 614		{
 615			strncpy(pci.local_num, lp->msn, 63);
 616			if (lp->dial) {
 617				strncpy(pci.remote_num, lp->dial->num, 63);
 618			}
 619			pci.charge_units = lp->charge;
 620			if (lp->outgoing)
 621				pci.calltype = CALLTYPE_OUTGOING;
 622			else
 623				pci.calltype = CALLTYPE_INCOMING;
 624			if (lp->flags & ISDN_NET_CALLBACK)
 625				pci.calltype |= CALLTYPE_CALLBACK;
 626		}
 627		return set_arg(argp, &pci, sizeof(struct pppcallinfo));
 628	}
 629#ifdef CONFIG_IPPP_FILTER
 630	case PPPIOCSPASS:
 631	{
 632		struct sock_filter *code;
 633		int len = get_filter(argp, &code);
 634		if (len < 0)
 635			return len;
 636		kfree(is->pass_filter);
 637		is->pass_filter = code;
 638		is->pass_len = len;
 639		break;
 640	}
 641	case PPPIOCSACTIVE:
 642	{
 643		struct sock_filter *code;
 644		int len = get_filter(argp, &code);
 645		if (len < 0)
 646			return len;
 647		kfree(is->active_filter);
 648		is->active_filter = code;
 649		is->active_len = len;
 650		break;
 651	}
 652#endif /* CONFIG_IPPP_FILTER */
 653	default:
 654		break;
 655	}
 656	return 0;
 657}
 658
 659unsigned int
 660isdn_ppp_poll(struct file *file, poll_table *wait)
 661{
 662	u_int mask;
 663	struct ippp_buf_queue *bf, *bl;
 664	u_long flags;
 665	struct ippp_struct *is;
 666
 667	is = file->private_data;
 668
 669	if (is->debug & 0x2)
 670		printk(KERN_DEBUG "isdn_ppp_poll: minor: %d\n",
 671		       iminor(file->f_path.dentry->d_inode));
 672
 673	/* just registers wait_queue hook. This doesn't really wait. */
 674	poll_wait(file, &is->wq, wait);
 675
 676	if (!(is->state & IPPP_OPEN)) {
 677		if (is->state == IPPP_CLOSEWAIT)
 678			return POLLHUP;
 679		printk(KERN_DEBUG "isdn_ppp: device not open\n");
 680		return POLLERR;
 681	}
 682	/* we're always ready to send .. */
 683	mask = POLLOUT | POLLWRNORM;
 684
 685	spin_lock_irqsave(&is->buflock, flags);
 686	bl = is->last;
 687	bf = is->first;
 688	/*
 689	 * if IPPP_NOBLOCK is set we return even if we have nothing to read
 690	 */
 691	if (bf->next != bl || (is->state & IPPP_NOBLOCK)) {
 692		is->state &= ~IPPP_NOBLOCK;
 693		mask |= POLLIN | POLLRDNORM;
 694	}
 695	spin_unlock_irqrestore(&is->buflock, flags);
 696	return mask;
 697}
 698
 699/*
 700 *  fill up isdn_ppp_read() queue ..
 701 */
 702
 703static int
 704isdn_ppp_fill_rq(unsigned char *buf, int len, int proto, int slot)
 705{
 706	struct ippp_buf_queue *bf, *bl;
 707	u_long flags;
 708	u_char *nbuf;
 709	struct ippp_struct *is;
 710
 711	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
 712		printk(KERN_WARNING "ippp: illegal slot(%d).\n", slot);
 713		return 0;
 714	}
 715	is = ippp_table[slot];
 716
 717	if (!(is->state & IPPP_CONNECT)) {
 718		printk(KERN_DEBUG "ippp: device not activated.\n");
 719		return 0;
 720	}
 721	nbuf = kmalloc(len + 4, GFP_ATOMIC);
 722	if (!nbuf) {
 723		printk(KERN_WARNING "ippp: Can't alloc buf\n");
 724		return 0;
 725	}
 726	nbuf[0] = PPP_ALLSTATIONS;
 727	nbuf[1] = PPP_UI;
 728	nbuf[2] = proto >> 8;
 729	nbuf[3] = proto & 0xff;
 730	memcpy(nbuf + 4, buf, len);
 731
 732	spin_lock_irqsave(&is->buflock, flags);
 733	bf = is->first;
 734	bl = is->last;
 735
 736	if (bf == bl) {
 737		printk(KERN_WARNING "ippp: Queue is full; discarding first buffer\n");
 738		bf = bf->next;
 739		kfree(bf->buf);
 740		is->first = bf;
 741	}
 742	bl->buf = (char *) nbuf;
 743	bl->len = len + 4;
 744
 745	is->last = bl->next;
 746	spin_unlock_irqrestore(&is->buflock, flags);
 747	wake_up_interruptible(&is->wq);
 748	return len;
 749}
 750
 751/*
 752 * read() .. non-blocking: ipppd calls it only after select()
 753 *           reports, that there is data
 754 */
 755
 756int
 757isdn_ppp_read(int min, struct file *file, char __user *buf, int count)
 758{
 759	struct ippp_struct *is;
 760	struct ippp_buf_queue *b;
 761	u_long flags;
 762	u_char *save_buf;
 763
 764	is = file->private_data;
 765
 766	if (!(is->state & IPPP_OPEN))
 767		return 0;
 768
 769	if (!access_ok(VERIFY_WRITE, buf, count))
 770		return -EFAULT;
 771
 772	spin_lock_irqsave(&is->buflock, flags);
 773	b = is->first->next;
 774	save_buf = b->buf;
 775	if (!save_buf) {
 776		spin_unlock_irqrestore(&is->buflock, flags);
 777		return -EAGAIN;
 778	}
 779	if (b->len < count)
 780		count = b->len;
 781	b->buf = NULL;
 782	is->first = b;
 783
 784	spin_unlock_irqrestore(&is->buflock, flags);
 785	if (copy_to_user(buf, save_buf, count))
 786		count = -EFAULT;
 787	kfree(save_buf);
 788
 789	return count;
 790}
 791
 792/*
 793 * ipppd wanna write a packet to the card .. non-blocking
 794 */
 795
 796int
 797isdn_ppp_write(int min, struct file *file, const char __user *buf, int count)
 798{
 799	isdn_net_local *lp;
 800	struct ippp_struct *is;
 801	int proto;
 802	unsigned char protobuf[4];
 803
 804	is = file->private_data;
 805
 806	if (!(is->state & IPPP_CONNECT))
 807		return 0;
 808
 809	lp = is->lp;
 810
 811	/* -> push it directly to the lowlevel interface */
 812
 813	if (!lp)
 814		printk(KERN_DEBUG "isdn_ppp_write: lp == NULL\n");
 815	else {
 816		/*
 817		 * Don't reset huptimer for
 818		 * LCP packets. (Echo requests).
 819		 */
 820		if (copy_from_user(protobuf, buf, 4))
 821			return -EFAULT;
 822		proto = PPP_PROTOCOL(protobuf);
 823		if (proto != PPP_LCP)
 824			lp->huptimer = 0;
 825
 826		if (lp->isdn_device < 0 || lp->isdn_channel < 0)
 827			return 0;
 828
 829		if ((dev->drv[lp->isdn_device]->flags & DRV_FLAG_RUNNING) &&
 830		    lp->dialstate == 0 &&
 831		    (lp->flags & ISDN_NET_CONNECTED)) {
 832			unsigned short hl;
 833			struct sk_buff *skb;
 834			/*
 835			 * we need to reserve enough space in front of
 836			 * sk_buff. old call to dev_alloc_skb only reserved
 837			 * 16 bytes, now we are looking what the driver want
 838			 */
 839			hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
 840			skb = alloc_skb(hl + count, GFP_ATOMIC);
 841			if (!skb) {
 842				printk(KERN_WARNING "isdn_ppp_write: out of memory!\n");
 843				return count;
 844			}
 845			skb_reserve(skb, hl);
 846			if (copy_from_user(skb_put(skb, count), buf, count))
 847			{
 848				kfree_skb(skb);
 849				return -EFAULT;
 850			}
 851			if (is->debug & 0x40) {
 852				printk(KERN_DEBUG "ppp xmit: len %d\n", (int) skb->len);
 853				isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
 854			}
 855
 856			isdn_ppp_send_ccp(lp->netdev, lp, skb); /* keeps CCP/compression states in sync */
 857
 858			isdn_net_write_super(lp, skb);
 859		}
 860	}
 861	return count;
 862}
 863
 864/*
 865 * init memory, structures etc.
 866 */
 867
 868int
 869isdn_ppp_init(void)
 870{
 871	int i,
 872		j;
 873
 874#ifdef CONFIG_ISDN_MPP
 875	if (isdn_ppp_mp_bundle_array_init() < 0)
 876		return -ENOMEM;
 877#endif /* CONFIG_ISDN_MPP */
 878
 879	for (i = 0; i < ISDN_MAX_CHANNELS; i++) {
 880		if (!(ippp_table[i] = kzalloc(sizeof(struct ippp_struct), GFP_KERNEL))) {
 881			printk(KERN_WARNING "isdn_ppp_init: Could not alloc ippp_table\n");
 882			for (j = 0; j < i; j++)
 883				kfree(ippp_table[j]);
 884			return -1;
 885		}
 886		spin_lock_init(&ippp_table[i]->buflock);
 887		ippp_table[i]->state = 0;
 888		ippp_table[i]->first = ippp_table[i]->rq + NUM_RCV_BUFFS - 1;
 889		ippp_table[i]->last = ippp_table[i]->rq;
 890
 891		for (j = 0; j < NUM_RCV_BUFFS; j++) {
 892			ippp_table[i]->rq[j].buf = NULL;
 893			ippp_table[i]->rq[j].last = ippp_table[i]->rq +
 894				(NUM_RCV_BUFFS + j - 1) % NUM_RCV_BUFFS;
 895			ippp_table[i]->rq[j].next = ippp_table[i]->rq + (j + 1) % NUM_RCV_BUFFS;
 896		}
 897	}
 898	return 0;
 899}
 900
 901void
 902isdn_ppp_cleanup(void)
 903{
 904	int i;
 905
 906	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
 907		kfree(ippp_table[i]);
 908
 909#ifdef CONFIG_ISDN_MPP
 910	kfree(isdn_ppp_bundle_arr);
 911#endif /* CONFIG_ISDN_MPP */
 912
 913}
 914
 915/*
 916 * check for address/control field and skip if allowed
 917 * retval != 0 -> discard packet silently
 918 */
 919static int isdn_ppp_skip_ac(struct ippp_struct *is, struct sk_buff *skb)
 920{
 921	if (skb->len < 1)
 922		return -1;
 923
 924	if (skb->data[0] == 0xff) {
 925		if (skb->len < 2)
 926			return -1;
 927
 928		if (skb->data[1] != 0x03)
 929			return -1;
 930
 931		// skip address/control (AC) field
 932		skb_pull(skb, 2);
 933	} else {
 934		if (is->pppcfg & SC_REJ_COMP_AC)
 935			// if AC compression was not negotiated, but used, discard packet
 936			return -1;
 937	}
 938	return 0;
 939}
 940
 941/*
 942 * get the PPP protocol header and pull skb
 943 * retval < 0 -> discard packet silently
 944 */
 945static int isdn_ppp_strip_proto(struct sk_buff *skb)
 946{
 947	int proto;
 948
 949	if (skb->len < 1)
 950		return -1;
 951
 952	if (skb->data[0] & 0x1) {
 953		// protocol field is compressed
 954		proto = skb->data[0];
 955		skb_pull(skb, 1);
 956	} else {
 957		if (skb->len < 2)
 958			return -1;
 959		proto = ((int) skb->data[0] << 8) + skb->data[1];
 960		skb_pull(skb, 2);
 961	}
 962	return proto;
 963}
 964
 965
 966/*
 967 * handler for incoming packets on a syncPPP interface
 968 */
 969void isdn_ppp_receive(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
 970{
 971	struct ippp_struct *is;
 972	int slot;
 973	int proto;
 974
 975	BUG_ON(net_dev->local->master); // we're called with the master device always
 976
 977	slot = lp->ppp_slot;
 978	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
 979		printk(KERN_ERR "isdn_ppp_receive: lp->ppp_slot(%d)\n",
 980		       lp->ppp_slot);
 981		kfree_skb(skb);
 982		return;
 983	}
 984	is = ippp_table[slot];
 985
 986	if (is->debug & 0x4) {
 987		printk(KERN_DEBUG "ippp_receive: is:%08lx lp:%08lx slot:%d unit:%d len:%d\n",
 988		       (long)is, (long)lp, lp->ppp_slot, is->unit, (int)skb->len);
 989		isdn_ppp_frame_log("receive", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
 990	}
 991
 992	if (isdn_ppp_skip_ac(is, skb) < 0) {
 993		kfree_skb(skb);
 994		return;
 995	}
 996	proto = isdn_ppp_strip_proto(skb);
 997	if (proto < 0) {
 998		kfree_skb(skb);
 999		return;
1000	}
1001
 
 
 
 
 
 
 
 
 
 
1002#ifdef CONFIG_ISDN_MPP
1003	if (is->compflags & SC_LINK_DECOMP_ON) {
1004		skb = isdn_ppp_decompress(skb, is, NULL, &proto);
1005		if (!skb) // decompression error
1006			return;
1007	}
1008
1009	if (!(is->mpppcfg & SC_REJ_MP_PROT)) { // we agreed to receive MPPP
1010		if (proto == PPP_MP) {
1011			isdn_ppp_mp_receive(net_dev, lp, skb);
1012			return;
1013		}
1014	}
1015#endif
1016	isdn_ppp_push_higher(net_dev, lp, skb, proto);
1017}
1018
1019/*
1020 * we receive a reassembled frame, MPPP has been taken care of before.
1021 * address/control and protocol have been stripped from the skb
1022 * note: net_dev has to be master net_dev
1023 */
1024static void
1025isdn_ppp_push_higher(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb, int proto)
1026{
1027	struct net_device *dev = net_dev->dev;
1028	struct ippp_struct *is, *mis;
1029	isdn_net_local *mlp = NULL;
1030	int slot;
1031
1032	slot = lp->ppp_slot;
1033	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1034		printk(KERN_ERR "isdn_ppp_push_higher: lp->ppp_slot(%d)\n",
1035		       lp->ppp_slot);
1036		goto drop_packet;
1037	}
1038	is = ippp_table[slot];
1039
1040	if (lp->master) { // FIXME?
1041		mlp = ISDN_MASTER_PRIV(lp);
1042		slot = mlp->ppp_slot;
1043		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1044			printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n",
1045			       lp->ppp_slot);
1046			goto drop_packet;
1047		}
1048	}
1049	mis = ippp_table[slot];
1050
1051	if (is->debug & 0x10) {
1052		printk(KERN_DEBUG "push, skb %d %04x\n", (int) skb->len, proto);
1053		isdn_ppp_frame_log("rpush", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
1054	}
1055	if (mis->compflags & SC_DECOMP_ON) {
1056		skb = isdn_ppp_decompress(skb, is, mis, &proto);
1057		if (!skb) // decompression error
1058			return;
1059	}
1060	switch (proto) {
1061	case PPP_IPX:  /* untested */
1062		if (is->debug & 0x20)
1063			printk(KERN_DEBUG "isdn_ppp: IPX\n");
1064		skb->protocol = htons(ETH_P_IPX);
1065		break;
1066	case PPP_IP:
1067		if (is->debug & 0x20)
1068			printk(KERN_DEBUG "isdn_ppp: IP\n");
1069		skb->protocol = htons(ETH_P_IP);
1070		break;
1071	case PPP_COMP:
1072	case PPP_COMPFRAG:
1073		printk(KERN_INFO "isdn_ppp: unexpected compressed frame dropped\n");
1074		goto drop_packet;
1075#ifdef CONFIG_ISDN_PPP_VJ
1076	case PPP_VJC_UNCOMP:
1077		if (is->debug & 0x20)
1078			printk(KERN_DEBUG "isdn_ppp: VJC_UNCOMP\n");
1079		if (net_dev->local->ppp_slot < 0) {
1080			printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1081			       __func__, net_dev->local->ppp_slot);
1082			goto drop_packet;
1083		}
1084		if (slhc_remember(ippp_table[net_dev->local->ppp_slot]->slcomp, skb->data, skb->len) <= 0) {
1085			printk(KERN_WARNING "isdn_ppp: received illegal VJC_UNCOMP frame!\n");
1086			goto drop_packet;
1087		}
1088		skb->protocol = htons(ETH_P_IP);
1089		break;
1090	case PPP_VJC_COMP:
1091		if (is->debug & 0x20)
1092			printk(KERN_DEBUG "isdn_ppp: VJC_COMP\n");
1093		{
1094			struct sk_buff *skb_old = skb;
1095			int pkt_len;
1096			skb = dev_alloc_skb(skb_old->len + 128);
1097
1098			if (!skb) {
1099				printk(KERN_WARNING "%s: Memory squeeze, dropping packet.\n", dev->name);
1100				skb = skb_old;
1101				goto drop_packet;
1102			}
1103			skb_put(skb, skb_old->len + 128);
1104			skb_copy_from_linear_data(skb_old, skb->data,
1105						  skb_old->len);
1106			if (net_dev->local->ppp_slot < 0) {
1107				printk(KERN_ERR "%s: net_dev->local->ppp_slot(%d) out of range\n",
1108				       __func__, net_dev->local->ppp_slot);
1109				goto drop_packet;
1110			}
1111			pkt_len = slhc_uncompress(ippp_table[net_dev->local->ppp_slot]->slcomp,
1112						  skb->data, skb_old->len);
1113			kfree_skb(skb_old);
1114			if (pkt_len < 0)
1115				goto drop_packet;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1116
1117			skb_trim(skb, pkt_len);
1118			skb->protocol = htons(ETH_P_IP);
1119		}
1120		break;
1121#endif
1122	case PPP_CCP:
1123	case PPP_CCPFRAG:
1124		isdn_ppp_receive_ccp(net_dev, lp, skb, proto);
1125		/* Dont pop up ResetReq/Ack stuff to the daemon any
1126		   longer - the job is done already */
1127		if (skb->data[0] == CCP_RESETREQ ||
1128		    skb->data[0] == CCP_RESETACK)
1129			break;
1130		/* fall through */
1131	default:
1132		isdn_ppp_fill_rq(skb->data, skb->len, proto, lp->ppp_slot);	/* push data to pppd device */
1133		kfree_skb(skb);
1134		return;
1135	}
1136
1137#ifdef CONFIG_IPPP_FILTER
1138	/* check if the packet passes the pass and active filters
1139	 * the filter instructions are constructed assuming
1140	 * a four-byte PPP header on each packet (which is still present) */
1141	skb_push(skb, 4);
1142
1143	{
1144		u_int16_t *p = (u_int16_t *) skb->data;
1145
1146		*p = 0;	/* indicate inbound */
1147	}
1148
1149	if (is->pass_filter
1150	    && sk_run_filter(skb, is->pass_filter) == 0) {
1151		if (is->debug & 0x2)
1152			printk(KERN_DEBUG "IPPP: inbound frame filtered.\n");
1153		kfree_skb(skb);
1154		return;
1155	}
1156	if (!(is->active_filter
1157	      && sk_run_filter(skb, is->active_filter) == 0)) {
1158		if (is->debug & 0x2)
1159			printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");
1160		lp->huptimer = 0;
1161		if (mlp)
1162			mlp->huptimer = 0;
1163	}
1164	skb_pull(skb, 4);
1165#else /* CONFIG_IPPP_FILTER */
1166	lp->huptimer = 0;
1167	if (mlp)
1168		mlp->huptimer = 0;
1169#endif /* CONFIG_IPPP_FILTER */
1170	skb->dev = dev;
1171	skb_reset_mac_header(skb);
1172	netif_rx(skb);
1173	/* net_dev->local->stats.rx_packets++; done in isdn_net.c */
1174	return;
1175
1176drop_packet:
1177	net_dev->local->stats.rx_dropped++;
1178	kfree_skb(skb);
1179}
1180
1181/*
1182 * isdn_ppp_skb_push ..
1183 * checks whether we have enough space at the beginning of the skb
1184 * and allocs a new SKB if necessary
1185 */
1186static unsigned char *isdn_ppp_skb_push(struct sk_buff **skb_p, int len)
1187{
1188	struct sk_buff *skb = *skb_p;
1189
1190	if (skb_headroom(skb) < len) {
1191		struct sk_buff *nskb = skb_realloc_headroom(skb, len);
1192
1193		if (!nskb) {
1194			printk(KERN_ERR "isdn_ppp_skb_push: can't realloc headroom!\n");
1195			dev_kfree_skb(skb);
1196			return NULL;
1197		}
1198		printk(KERN_DEBUG "isdn_ppp_skb_push:under %d %d\n", skb_headroom(skb), len);
1199		dev_kfree_skb(skb);
1200		*skb_p = nskb;
1201		return skb_push(nskb, len);
1202	}
1203	return skb_push(skb, len);
1204}
1205
1206/*
1207 * send ppp frame .. we expect a PIDCOMPressable proto --
1208 *  (here: currently always PPP_IP,PPP_VJC_COMP,PPP_VJC_UNCOMP)
1209 *
1210 * VJ compression may change skb pointer!!! .. requeue with old
1211 * skb isn't allowed!!
1212 */
1213
1214int
1215isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev)
1216{
1217	isdn_net_local *lp, *mlp;
1218	isdn_net_dev *nd;
1219	unsigned int proto = PPP_IP;     /* 0x21 */
1220	struct ippp_struct *ipt, *ipts;
1221	int slot, retval = NETDEV_TX_OK;
1222
1223	mlp = netdev_priv(netdev);
1224	nd = mlp->netdev;       /* get master lp */
1225
1226	slot = mlp->ppp_slot;
1227	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1228		printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1229		       mlp->ppp_slot);
1230		kfree_skb(skb);
1231		goto out;
1232	}
1233	ipts = ippp_table[slot];
1234
1235	if (!(ipts->pppcfg & SC_ENABLE_IP)) {	/* PPP connected ? */
1236		if (ipts->debug & 0x1)
1237			printk(KERN_INFO "%s: IP frame delayed.\n", netdev->name);
1238		retval = NETDEV_TX_BUSY;
1239		goto out;
1240	}
1241
1242	switch (ntohs(skb->protocol)) {
1243	case ETH_P_IP:
1244		proto = PPP_IP;
1245		break;
1246	case ETH_P_IPX:
1247		proto = PPP_IPX;	/* untested */
1248		break;
1249	default:
1250		printk(KERN_ERR "isdn_ppp: skipped unsupported protocol: %#x.\n",
1251		       skb->protocol);
1252		dev_kfree_skb(skb);
1253		goto out;
1254	}
1255
1256	lp = isdn_net_get_locked_lp(nd);
1257	if (!lp) {
1258		printk(KERN_WARNING "%s: all channels busy - requeuing!\n", netdev->name);
1259		retval = NETDEV_TX_BUSY;
1260		goto out;
1261	}
1262	/* we have our lp locked from now on */
1263
1264	slot = lp->ppp_slot;
1265	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1266		printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n",
1267		       lp->ppp_slot);
1268		kfree_skb(skb);
1269		goto unlock;
1270	}
1271	ipt = ippp_table[slot];
1272
1273	/*
1274	 * after this line .. requeueing in the device queue is no longer allowed!!!
1275	 */
1276
1277	/* Pull off the fake header we stuck on earlier to keep
1278	 * the fragmentation code happy.
1279	 */
1280	skb_pull(skb, IPPP_MAX_HEADER);
1281
1282#ifdef CONFIG_IPPP_FILTER
1283	/* check if we should pass this packet
1284	 * the filter instructions are constructed assuming
1285	 * a four-byte PPP header on each packet */
1286	*skb_push(skb, 4) = 1; /* indicate outbound */
1287
1288	{
1289		__be16 *p = (__be16 *)skb->data;
1290
1291		p++;
1292		*p = htons(proto);
1293	}
1294
1295	if (ipt->pass_filter
1296	    && sk_run_filter(skb, ipt->pass_filter) == 0) {
1297		if (ipt->debug & 0x4)
1298			printk(KERN_DEBUG "IPPP: outbound frame filtered.\n");
1299		kfree_skb(skb);
1300		goto unlock;
1301	}
1302	if (!(ipt->active_filter
1303	      && sk_run_filter(skb, ipt->active_filter) == 0)) {
1304		if (ipt->debug & 0x4)
1305			printk(KERN_DEBUG "IPPP: link-active filter: resetting huptimer.\n");
1306		lp->huptimer = 0;
1307	}
1308	skb_pull(skb, 4);
1309#else /* CONFIG_IPPP_FILTER */
1310	lp->huptimer = 0;
1311#endif /* CONFIG_IPPP_FILTER */
1312
1313	if (ipt->debug & 0x4)
1314		printk(KERN_DEBUG "xmit skb, len %d\n", (int) skb->len);
1315	if (ipts->debug & 0x40)
1316		isdn_ppp_frame_log("xmit0", skb->data, skb->len, 32, ipts->unit, lp->ppp_slot);
1317
1318#ifdef CONFIG_ISDN_PPP_VJ
1319	if (proto == PPP_IP && ipts->pppcfg & SC_COMP_TCP) {	/* ipts here? probably yes, but check this again */
1320		struct sk_buff *new_skb;
1321		unsigned short hl;
1322		/*
1323		 * we need to reserve enough space in front of
1324		 * sk_buff. old call to dev_alloc_skb only reserved
1325		 * 16 bytes, now we are looking what the driver want.
1326		 */
1327		hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen + IPPP_MAX_HEADER;
1328		/*
1329		 * Note: hl might still be insufficient because the method
1330		 * above does not account for a possibible MPPP slave channel
1331		 * which had larger HL header space requirements than the
1332		 * master.
1333		 */
1334		new_skb = alloc_skb(hl + skb->len, GFP_ATOMIC);
1335		if (new_skb) {
1336			u_char *buf;
1337			int pktlen;
1338
1339			skb_reserve(new_skb, hl);
1340			new_skb->dev = skb->dev;
1341			skb_put(new_skb, skb->len);
1342			buf = skb->data;
1343
1344			pktlen = slhc_compress(ipts->slcomp, skb->data, skb->len, new_skb->data,
1345					       &buf, !(ipts->pppcfg & SC_NO_TCP_CCID));
1346
1347			if (buf != skb->data) {
1348				if (new_skb->data != buf)
1349					printk(KERN_ERR "isdn_ppp: FATAL error after slhc_compress!!\n");
1350				dev_kfree_skb(skb);
1351				skb = new_skb;
1352			} else {
1353				dev_kfree_skb(new_skb);
1354			}
1355
1356			skb_trim(skb, pktlen);
1357			if (skb->data[0] & SL_TYPE_COMPRESSED_TCP) {	/* cslip? style -> PPP */
1358				proto = PPP_VJC_COMP;
1359				skb->data[0] ^= SL_TYPE_COMPRESSED_TCP;
1360			} else {
1361				if (skb->data[0] >= SL_TYPE_UNCOMPRESSED_TCP)
1362					proto = PPP_VJC_UNCOMP;
1363				skb->data[0] = (skb->data[0] & 0x0f) | 0x40;
1364			}
1365		}
1366	}
1367#endif
1368
1369	/*
1370	 * normal (single link) or bundle compression
1371	 */
1372	if (ipts->compflags & SC_COMP_ON) {
1373		/* We send compressed only if both down- und upstream
1374		   compression is negotiated, that means, CCP is up */
1375		if (ipts->compflags & SC_DECOMP_ON) {
1376			skb = isdn_ppp_compress(skb, &proto, ipt, ipts, 0);
1377		} else {
1378			printk(KERN_DEBUG "isdn_ppp: CCP not yet up - sending as-is\n");
1379		}
1380	}
1381
1382	if (ipt->debug & 0x24)
1383		printk(KERN_DEBUG "xmit2 skb, len %d, proto %04x\n", (int) skb->len, proto);
1384
1385#ifdef CONFIG_ISDN_MPP
1386	if (ipt->mpppcfg & SC_MP_PROT) {
1387		/* we get mp_seqno from static isdn_net_local */
1388		long mp_seqno = ipts->mp_seqno;
1389		ipts->mp_seqno++;
1390		if (ipt->mpppcfg & SC_OUT_SHORT_SEQ) {
1391			unsigned char *data = isdn_ppp_skb_push(&skb, 3);
1392			if (!data)
1393				goto unlock;
1394			mp_seqno &= 0xfff;
1395			data[0] = MP_BEGIN_FRAG | MP_END_FRAG | ((mp_seqno >> 8) & 0xf);	/* (B)egin & (E)ndbit .. */
1396			data[1] = mp_seqno & 0xff;
1397			data[2] = proto;	/* PID compression */
1398		} else {
1399			unsigned char *data = isdn_ppp_skb_push(&skb, 5);
1400			if (!data)
1401				goto unlock;
1402			data[0] = MP_BEGIN_FRAG | MP_END_FRAG;	/* (B)egin & (E)ndbit .. */
1403			data[1] = (mp_seqno >> 16) & 0xff;	/* sequence number: 24bit */
1404			data[2] = (mp_seqno >> 8) & 0xff;
1405			data[3] = (mp_seqno >> 0) & 0xff;
1406			data[4] = proto;	/* PID compression */
1407		}
1408		proto = PPP_MP; /* MP Protocol, 0x003d */
1409	}
1410#endif
1411
1412	/*
1413	 * 'link in bundle' compression  ...
1414	 */
1415	if (ipt->compflags & SC_LINK_COMP_ON)
1416		skb = isdn_ppp_compress(skb, &proto, ipt, ipts, 1);
1417
1418	if ((ipt->pppcfg & SC_COMP_PROT) && (proto <= 0xff)) {
1419		unsigned char *data = isdn_ppp_skb_push(&skb, 1);
1420		if (!data)
1421			goto unlock;
1422		data[0] = proto & 0xff;
1423	}
1424	else {
1425		unsigned char *data = isdn_ppp_skb_push(&skb, 2);
1426		if (!data)
1427			goto unlock;
1428		data[0] = (proto >> 8) & 0xff;
1429		data[1] = proto & 0xff;
1430	}
1431	if (!(ipt->pppcfg & SC_COMP_AC)) {
1432		unsigned char *data = isdn_ppp_skb_push(&skb, 2);
1433		if (!data)
1434			goto unlock;
1435		data[0] = 0xff;    /* All Stations */
1436		data[1] = 0x03;    /* Unnumbered information */
1437	}
1438
1439	/* tx-stats are now updated via BSENT-callback */
1440
1441	if (ipts->debug & 0x40) {
1442		printk(KERN_DEBUG "skb xmit: len: %d\n", (int) skb->len);
1443		isdn_ppp_frame_log("xmit", skb->data, skb->len, 32, ipt->unit, lp->ppp_slot);
1444	}
1445
1446	isdn_net_writebuf_skb(lp, skb);
1447
1448unlock:
1449	spin_unlock_bh(&lp->xmit_lock);
1450out:
1451	return retval;
1452}
1453
1454#ifdef CONFIG_IPPP_FILTER
1455/*
1456 * check if this packet may trigger auto-dial.
1457 */
1458
1459int isdn_ppp_autodial_filter(struct sk_buff *skb, isdn_net_local *lp)
1460{
1461	struct ippp_struct *is = ippp_table[lp->ppp_slot];
1462	u_int16_t proto;
1463	int drop = 0;
1464
1465	switch (ntohs(skb->protocol)) {
1466	case ETH_P_IP:
1467		proto = PPP_IP;
1468		break;
1469	case ETH_P_IPX:
1470		proto = PPP_IPX;
1471		break;
1472	default:
1473		printk(KERN_ERR "isdn_ppp_autodial_filter: unsupported protocol 0x%x.\n",
1474		       skb->protocol);
1475		return 1;
1476	}
1477
1478	/* the filter instructions are constructed assuming
1479	 * a four-byte PPP header on each packet. we have to
1480	 * temporarily remove part of the fake header stuck on
1481	 * earlier.
1482	 */
1483	*skb_pull(skb, IPPP_MAX_HEADER - 4) = 1; /* indicate outbound */
1484
1485	{
1486		__be16 *p = (__be16 *)skb->data;
1487
1488		p++;
1489		*p = htons(proto);
1490	}
1491
1492	drop |= is->pass_filter
1493		&& sk_run_filter(skb, is->pass_filter) == 0;
1494	drop |= is->active_filter
1495		&& sk_run_filter(skb, is->active_filter) == 0;
1496
1497	skb_push(skb, IPPP_MAX_HEADER - 4);
1498	return drop;
1499}
1500#endif
1501#ifdef CONFIG_ISDN_MPP
1502
1503/* this is _not_ rfc1990 header, but something we convert both short and long
1504 * headers to for convinience's sake:
1505 *	byte 0 is flags as in rfc1990
1506 *	bytes 1...4 is 24-bit seqence number converted to host byte order
1507 */
1508#define MP_HEADER_LEN	5
1509
1510#define MP_LONGSEQ_MASK		0x00ffffff
1511#define MP_SHORTSEQ_MASK	0x00000fff
1512#define MP_LONGSEQ_MAX		MP_LONGSEQ_MASK
1513#define MP_SHORTSEQ_MAX		MP_SHORTSEQ_MASK
1514#define MP_LONGSEQ_MAXBIT	((MP_LONGSEQ_MASK + 1) >> 1)
1515#define MP_SHORTSEQ_MAXBIT	((MP_SHORTSEQ_MASK + 1) >> 1)
1516
1517/* sequence-wrap safe comparisons (for long sequence)*/
1518#define MP_LT(a, b)	((a - b) & MP_LONGSEQ_MAXBIT)
1519#define MP_LE(a, b)	!((b - a) & MP_LONGSEQ_MAXBIT)
1520#define MP_GT(a, b)	((b - a) & MP_LONGSEQ_MAXBIT)
1521#define MP_GE(a, b)	!((a - b) & MP_LONGSEQ_MAXBIT)
1522
1523#define MP_SEQ(f)	((*(u32 *)(f->data + 1)))
1524#define MP_FLAGS(f)	(f->data[0])
1525
1526static int isdn_ppp_mp_bundle_array_init(void)
1527{
1528	int i;
1529	int sz = ISDN_MAX_CHANNELS * sizeof(ippp_bundle);
1530	if ((isdn_ppp_bundle_arr = kzalloc(sz, GFP_KERNEL)) == NULL)
1531		return -ENOMEM;
1532	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
1533		spin_lock_init(&isdn_ppp_bundle_arr[i].lock);
1534	return 0;
1535}
1536
1537static ippp_bundle *isdn_ppp_mp_bundle_alloc(void)
1538{
1539	int i;
1540	for (i = 0; i < ISDN_MAX_CHANNELS; i++)
1541		if (isdn_ppp_bundle_arr[i].ref_ct <= 0)
1542			return (isdn_ppp_bundle_arr + i);
1543	return NULL;
1544}
1545
1546static int isdn_ppp_mp_init(isdn_net_local *lp, ippp_bundle *add_to)
1547{
1548	struct ippp_struct *is;
1549
1550	if (lp->ppp_slot < 0) {
1551		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1552		       __func__, lp->ppp_slot);
1553		return (-EINVAL);
1554	}
1555
1556	is = ippp_table[lp->ppp_slot];
1557	if (add_to) {
1558		if (lp->netdev->pb)
1559			lp->netdev->pb->ref_ct--;
1560		lp->netdev->pb = add_to;
1561	} else {		/* first link in a bundle */
1562		is->mp_seqno = 0;
1563		if ((lp->netdev->pb = isdn_ppp_mp_bundle_alloc()) == NULL)
1564			return -ENOMEM;
1565		lp->next = lp->last = lp;	/* nobody else in a queue */
1566		lp->netdev->pb->frags = NULL;
1567		lp->netdev->pb->frames = 0;
1568		lp->netdev->pb->seq = UINT_MAX;
1569	}
1570	lp->netdev->pb->ref_ct++;
1571
1572	is->last_link_seqno = 0;
1573	return 0;
1574}
1575
1576static u32 isdn_ppp_mp_get_seq(int short_seq,
1577			       struct sk_buff *skb, u32 last_seq);
1578static struct sk_buff *isdn_ppp_mp_discard(ippp_bundle *mp,
1579					   struct sk_buff *from, struct sk_buff *to);
1580static void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
1581				   struct sk_buff *from, struct sk_buff *to);
1582static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb);
1583static void isdn_ppp_mp_print_recv_pkt(int slot, struct sk_buff *skb);
1584
1585static void isdn_ppp_mp_receive(isdn_net_dev *net_dev, isdn_net_local *lp,
1586				struct sk_buff *skb)
1587{
1588	struct ippp_struct *is;
1589	isdn_net_local *lpq;
1590	ippp_bundle *mp;
1591	isdn_mppp_stats *stats;
1592	struct sk_buff *newfrag, *frag, *start, *nextf;
1593	u32 newseq, minseq, thisseq;
1594	unsigned long flags;
1595	int slot;
1596
1597	spin_lock_irqsave(&net_dev->pb->lock, flags);
1598	mp = net_dev->pb;
1599	stats = &mp->stats;
1600	slot = lp->ppp_slot;
1601	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1602		printk(KERN_ERR "%s: lp->ppp_slot(%d)\n",
1603		       __func__, lp->ppp_slot);
1604		stats->frame_drops++;
1605		dev_kfree_skb(skb);
1606		spin_unlock_irqrestore(&mp->lock, flags);
1607		return;
1608	}
1609	is = ippp_table[slot];
1610	if (++mp->frames > stats->max_queue_len)
1611		stats->max_queue_len = mp->frames;
1612
1613	if (is->debug & 0x8)
1614		isdn_ppp_mp_print_recv_pkt(lp->ppp_slot, skb);
1615
1616	newseq = isdn_ppp_mp_get_seq(is->mpppcfg & SC_IN_SHORT_SEQ,
1617				     skb, is->last_link_seqno);
1618
1619
1620	/* if this packet seq # is less than last already processed one,
1621	 * toss it right away, but check for sequence start case first
1622	 */
1623	if (mp->seq > MP_LONGSEQ_MAX && (newseq & MP_LONGSEQ_MAXBIT)) {
1624		mp->seq = newseq;	/* the first packet: required for
1625					 * rfc1990 non-compliant clients --
1626					 * prevents constant packet toss */
1627	} else if (MP_LT(newseq, mp->seq)) {
1628		stats->frame_drops++;
1629		isdn_ppp_mp_free_skb(mp, skb);
1630		spin_unlock_irqrestore(&mp->lock, flags);
1631		return;
1632	}
1633
1634	/* find the minimum received sequence number over all links */
1635	is->last_link_seqno = minseq = newseq;
1636	for (lpq = net_dev->queue;;) {
1637		slot = lpq->ppp_slot;
1638		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
1639			printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n",
1640			       __func__, lpq->ppp_slot);
1641		} else {
1642			u32 lls = ippp_table[slot]->last_link_seqno;
1643			if (MP_LT(lls, minseq))
1644				minseq = lls;
1645		}
1646		if ((lpq = lpq->next) == net_dev->queue)
1647			break;
1648	}
1649	if (MP_LT(minseq, mp->seq))
1650		minseq = mp->seq;	/* can't go beyond already processed
1651					 * packets */
1652	newfrag = skb;
1653
1654	/* if this new fragment is before the first one, then enqueue it now. */
1655	if ((frag = mp->frags) == NULL || MP_LT(newseq, MP_SEQ(frag))) {
1656		newfrag->next = frag;
1657		mp->frags = frag = newfrag;
1658		newfrag = NULL;
1659	}
1660
1661	start = MP_FLAGS(frag) & MP_BEGIN_FRAG &&
1662		MP_SEQ(frag) == mp->seq ? frag : NULL;
1663
1664	/*
1665	 * main fragment traversing loop
1666	 *
1667	 * try to accomplish several tasks:
1668	 * - insert new fragment into the proper sequence slot (once that's done
1669	 *   newfrag will be set to NULL)
1670	 * - reassemble any complete fragment sequence (non-null 'start'
1671	 *   indicates there is a contiguous sequence present)
1672	 * - discard any incomplete sequences that are below minseq -- due
1673	 *   to the fact that sender always increment sequence number, if there
1674	 *   is an incomplete sequence below minseq, no new fragments would
1675	 *   come to complete such sequence and it should be discarded
1676	 *
1677	 * loop completes when we accomplished the following tasks:
1678	 * - new fragment is inserted in the proper sequence ('newfrag' is
1679	 *   set to NULL)
1680	 * - we hit a gap in the sequence, so no reassembly/processing is
1681	 *   possible ('start' would be set to NULL)
1682	 *
1683	 * algorithm for this code is derived from code in the book
1684	 * 'PPP Design And Debugging' by James Carlson (Addison-Wesley)
1685	 */
1686	while (start != NULL || newfrag != NULL) {
1687
1688		thisseq = MP_SEQ(frag);
1689		nextf = frag->next;
1690
1691		/* drop any duplicate fragments */
1692		if (newfrag != NULL && thisseq == newseq) {
1693			isdn_ppp_mp_free_skb(mp, newfrag);
1694			newfrag = NULL;
1695		}
1696
1697		/* insert new fragment before next element if possible. */
1698		if (newfrag != NULL && (nextf == NULL ||
1699					MP_LT(newseq, MP_SEQ(nextf)))) {
1700			newfrag->next = nextf;
1701			frag->next = nextf = newfrag;
1702			newfrag = NULL;
1703		}
1704
1705		if (start != NULL) {
1706			/* check for misplaced start */
1707			if (start != frag && (MP_FLAGS(frag) & MP_BEGIN_FRAG)) {
 
 
 
 
 
 
1708				printk(KERN_WARNING"isdn_mppp(seq %d): new "
1709				       "BEGIN flag with no prior END", thisseq);
1710				stats->seqerrs++;
1711				stats->frame_drops++;
1712				start = isdn_ppp_mp_discard(mp, start, frag);
1713				nextf = frag->next;
1714			}
1715		} else if (MP_LE(thisseq, minseq)) {
1716			if (MP_FLAGS(frag) & MP_BEGIN_FRAG)
1717				start = frag;
1718			else {
1719				if (MP_FLAGS(frag) & MP_END_FRAG)
1720					stats->frame_drops++;
1721				if (mp->frags == frag)
1722					mp->frags = nextf;
1723				isdn_ppp_mp_free_skb(mp, frag);
1724				frag = nextf;
1725				continue;
1726			}
1727		}
1728
1729		/* if start is non-null and we have end fragment, then
1730		 * we have full reassembly sequence -- reassemble
1731		 * and process packet now
1732		 */
1733		if (start != NULL && (MP_FLAGS(frag) & MP_END_FRAG)) {
1734			minseq = mp->seq = (thisseq + 1) & MP_LONGSEQ_MASK;
1735			/* Reassemble the packet then dispatch it */
1736			isdn_ppp_mp_reassembly(net_dev, lp, start, nextf);
 
 
 
1737
1738			start = NULL;
1739			frag = NULL;
1740
1741			mp->frags = nextf;
1742		}
1743
1744		/* check if need to update start pointer: if we just
1745		 * reassembled the packet and sequence is contiguous
1746		 * then next fragment should be the start of new reassembly
1747		 * if sequence is contiguous, but we haven't reassembled yet,
1748		 * keep going.
1749		 * if sequence is not contiguous, either clear everything
1750		 * below low watermark and set start to the next frag or
1751		 * clear start ptr.
1752		 */
1753		if (nextf != NULL &&
1754		    ((thisseq + 1) & MP_LONGSEQ_MASK) == MP_SEQ(nextf)) {
1755			/* if we just reassembled and the next one is here,
1756			 * then start another reassembly. */
1757
1758			if (frag == NULL) {
1759				if (MP_FLAGS(nextf) & MP_BEGIN_FRAG)
1760					start = nextf;
1761				else
1762				{
1763					printk(KERN_WARNING"isdn_mppp(seq %d):"
1764					       " END flag with no following "
1765					       "BEGIN", thisseq);
1766					stats->seqerrs++;
1767				}
1768			}
1769
1770		} else {
1771			if (nextf != NULL && frag != NULL &&
1772			    MP_LT(thisseq, minseq)) {
1773				/* we've got a break in the sequence
1774				 * and we not at the end yet
1775				 * and we did not just reassembled
1776				 *(if we did, there wouldn't be anything before)
1777				 * and we below the low watermark
1778				 * discard all the frames below low watermark
1779				 * and start over */
1780				stats->frame_drops++;
1781				mp->frags = isdn_ppp_mp_discard(mp, start, nextf);
1782			}
1783			/* break in the sequence, no reassembly */
1784			start = NULL;
1785		}
1786
1787		frag = nextf;
1788	}	/* while -- main loop */
1789
1790	if (mp->frags == NULL)
1791		mp->frags = frag;
1792
1793	/* rather straighforward way to deal with (not very) possible
1794	 * queue overflow */
1795	if (mp->frames > MP_MAX_QUEUE_LEN) {
1796		stats->overflows++;
1797		while (mp->frames > MP_MAX_QUEUE_LEN) {
1798			frag = mp->frags->next;
1799			isdn_ppp_mp_free_skb(mp, mp->frags);
1800			mp->frags = frag;
1801		}
1802	}
1803	spin_unlock_irqrestore(&mp->lock, flags);
1804}
1805
1806static void isdn_ppp_mp_cleanup(isdn_net_local *lp)
1807{
1808	struct sk_buff *frag = lp->netdev->pb->frags;
1809	struct sk_buff *nextfrag;
1810	while (frag) {
1811		nextfrag = frag->next;
1812		isdn_ppp_mp_free_skb(lp->netdev->pb, frag);
1813		frag = nextfrag;
1814	}
1815	lp->netdev->pb->frags = NULL;
1816}
1817
1818static u32 isdn_ppp_mp_get_seq(int short_seq,
1819			       struct sk_buff *skb, u32 last_seq)
1820{
1821	u32 seq;
1822	int flags = skb->data[0] & (MP_BEGIN_FRAG | MP_END_FRAG);
1823
1824	if (!short_seq)
1825	{
1826		seq = ntohl(*(__be32 *)skb->data) & MP_LONGSEQ_MASK;
1827		skb_push(skb, 1);
1828	}
1829	else
1830	{
1831		/* convert 12-bit short seq number to 24-bit long one
1832		 */
1833		seq = ntohs(*(__be16 *)skb->data) & MP_SHORTSEQ_MASK;
1834
1835		/* check for seqence wrap */
1836		if (!(seq &  MP_SHORTSEQ_MAXBIT) &&
1837		    (last_seq &  MP_SHORTSEQ_MAXBIT) &&
1838		    (unsigned long)last_seq <= MP_LONGSEQ_MAX)
1839			seq |= (last_seq + MP_SHORTSEQ_MAX + 1) &
1840				(~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1841		else
1842			seq |= last_seq & (~MP_SHORTSEQ_MASK & MP_LONGSEQ_MASK);
1843
1844		skb_push(skb, 3);	/* put converted seqence back in skb */
1845	}
1846	*(u32 *)(skb->data + 1) = seq;	/* put seqence back in _host_ byte
1847					 * order */
1848	skb->data[0] = flags;	        /* restore flags */
1849	return seq;
1850}
1851
1852struct sk_buff *isdn_ppp_mp_discard(ippp_bundle *mp,
1853				    struct sk_buff *from, struct sk_buff *to)
1854{
1855	if (from)
1856		while (from != to) {
1857			struct sk_buff *next = from->next;
1858			isdn_ppp_mp_free_skb(mp, from);
1859			from = next;
1860		}
1861	return from;
1862}
1863
1864void isdn_ppp_mp_reassembly(isdn_net_dev *net_dev, isdn_net_local *lp,
1865			    struct sk_buff *from, struct sk_buff *to)
1866{
1867	ippp_bundle *mp = net_dev->pb;
1868	int proto;
1869	struct sk_buff *skb;
1870	unsigned int tot_len;
1871
1872	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
1873		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
1874		       __func__, lp->ppp_slot);
1875		return;
1876	}
1877	if (MP_FLAGS(from) == (MP_BEGIN_FRAG | MP_END_FRAG)) {
1878		if (ippp_table[lp->ppp_slot]->debug & 0x40)
1879			printk(KERN_DEBUG "isdn_mppp: reassembly: frame %d, "
1880			       "len %d\n", MP_SEQ(from), from->len);
1881		skb = from;
1882		skb_pull(skb, MP_HEADER_LEN);
1883		mp->frames--;
1884	} else {
1885		struct sk_buff *frag;
1886		int n;
1887
1888		for (tot_len = n = 0, frag = from; frag != to; frag = frag->next, n++)
1889			tot_len += frag->len - MP_HEADER_LEN;
1890
1891		if (ippp_table[lp->ppp_slot]->debug & 0x40)
1892			printk(KERN_DEBUG"isdn_mppp: reassembling frames %d "
1893			       "to %d, len %d\n", MP_SEQ(from),
1894			       (MP_SEQ(from) + n - 1) & MP_LONGSEQ_MASK, tot_len);
1895		if ((skb = dev_alloc_skb(tot_len)) == NULL) {
1896			printk(KERN_ERR "isdn_mppp: cannot allocate sk buff "
1897			       "of size %d\n", tot_len);
1898			isdn_ppp_mp_discard(mp, from, to);
1899			return;
1900		}
1901
1902		while (from != to) {
1903			unsigned int len = from->len - MP_HEADER_LEN;
1904
1905			skb_copy_from_linear_data_offset(from, MP_HEADER_LEN,
1906							 skb_put(skb, len),
1907							 len);
1908			frag = from->next;
1909			isdn_ppp_mp_free_skb(mp, from);
1910			from = frag;
1911		}
1912	}
1913	proto = isdn_ppp_strip_proto(skb);
1914	isdn_ppp_push_higher(net_dev, lp, skb, proto);
1915}
1916
1917static void isdn_ppp_mp_free_skb(ippp_bundle *mp, struct sk_buff *skb)
1918{
1919	dev_kfree_skb(skb);
1920	mp->frames--;
1921}
1922
1923static void isdn_ppp_mp_print_recv_pkt(int slot, struct sk_buff *skb)
1924{
1925	printk(KERN_DEBUG "mp_recv: %d/%d -> %02x %02x %02x %02x %02x %02x\n",
1926	       slot, (int) skb->len,
1927	       (int) skb->data[0], (int) skb->data[1], (int) skb->data[2],
1928	       (int) skb->data[3], (int) skb->data[4], (int) skb->data[5]);
1929}
1930
1931static int
1932isdn_ppp_bundle(struct ippp_struct *is, int unit)
1933{
1934	char ifn[IFNAMSIZ + 1];
1935	isdn_net_dev *p;
1936	isdn_net_local *lp, *nlp;
1937	int rc;
1938	unsigned long flags;
1939
1940	sprintf(ifn, "ippp%d", unit);
1941	p = isdn_net_findif(ifn);
1942	if (!p) {
1943		printk(KERN_ERR "ippp_bundle: cannot find %s\n", ifn);
1944		return -EINVAL;
1945	}
1946
1947	spin_lock_irqsave(&p->pb->lock, flags);
1948
1949	nlp = is->lp;
1950	lp = p->queue;
1951	if (nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ||
1952	    lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
1953		printk(KERN_ERR "ippp_bundle: binding to invalid slot %d\n",
1954		       nlp->ppp_slot < 0 || nlp->ppp_slot >= ISDN_MAX_CHANNELS ?
1955		       nlp->ppp_slot : lp->ppp_slot);
1956		rc = -EINVAL;
1957		goto out;
1958	}
1959
1960	isdn_net_add_to_bundle(p, nlp);
1961
1962	ippp_table[nlp->ppp_slot]->unit = ippp_table[lp->ppp_slot]->unit;
1963
1964	/* maybe also SC_CCP stuff */
1965	ippp_table[nlp->ppp_slot]->pppcfg |= ippp_table[lp->ppp_slot]->pppcfg &
1966		(SC_ENABLE_IP | SC_NO_TCP_CCID | SC_REJ_COMP_TCP);
1967	ippp_table[nlp->ppp_slot]->mpppcfg |= ippp_table[lp->ppp_slot]->mpppcfg &
1968		(SC_MP_PROT | SC_REJ_MP_PROT | SC_OUT_SHORT_SEQ | SC_IN_SHORT_SEQ);
1969	rc = isdn_ppp_mp_init(nlp, p->pb);
1970out:
1971	spin_unlock_irqrestore(&p->pb->lock, flags);
1972	return rc;
1973}
1974
1975#endif /* CONFIG_ISDN_MPP */
1976
1977/*
1978 * network device ioctl handlers
1979 */
1980
1981static int
1982isdn_ppp_dev_ioctl_stats(int slot, struct ifreq *ifr, struct net_device *dev)
1983{
1984	struct ppp_stats __user *res = ifr->ifr_data;
1985	struct ppp_stats t;
1986	isdn_net_local *lp = netdev_priv(dev);
1987
1988	if (!access_ok(VERIFY_WRITE, res, sizeof(struct ppp_stats)))
1989		return -EFAULT;
1990
1991	/* build a temporary stat struct and copy it to user space */
1992
1993	memset(&t, 0, sizeof(struct ppp_stats));
1994	if (dev->flags & IFF_UP) {
1995		t.p.ppp_ipackets = lp->stats.rx_packets;
1996		t.p.ppp_ibytes = lp->stats.rx_bytes;
1997		t.p.ppp_ierrors = lp->stats.rx_errors;
1998		t.p.ppp_opackets = lp->stats.tx_packets;
1999		t.p.ppp_obytes = lp->stats.tx_bytes;
2000		t.p.ppp_oerrors = lp->stats.tx_errors;
2001#ifdef CONFIG_ISDN_PPP_VJ
2002		if (slot >= 0 && ippp_table[slot]->slcomp) {
2003			struct slcompress *slcomp = ippp_table[slot]->slcomp;
2004			t.vj.vjs_packets = slcomp->sls_o_compressed + slcomp->sls_o_uncompressed;
2005			t.vj.vjs_compressed = slcomp->sls_o_compressed;
2006			t.vj.vjs_searches = slcomp->sls_o_searches;
2007			t.vj.vjs_misses = slcomp->sls_o_misses;
2008			t.vj.vjs_errorin = slcomp->sls_i_error;
2009			t.vj.vjs_tossed = slcomp->sls_i_tossed;
2010			t.vj.vjs_uncompressedin = slcomp->sls_i_uncompressed;
2011			t.vj.vjs_compressedin = slcomp->sls_i_compressed;
2012		}
2013#endif
2014	}
2015	if (copy_to_user(res, &t, sizeof(struct ppp_stats)))
2016		return -EFAULT;
2017	return 0;
2018}
2019
2020int
2021isdn_ppp_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
2022{
2023	int error = 0;
2024	int len;
2025	isdn_net_local *lp = netdev_priv(dev);
2026
2027
2028	if (lp->p_encap != ISDN_NET_ENCAP_SYNCPPP)
2029		return -EINVAL;
2030
2031	switch (cmd) {
2032#define PPP_VERSION "2.3.7"
2033	case SIOCGPPPVER:
2034		len = strlen(PPP_VERSION) + 1;
2035		if (copy_to_user(ifr->ifr_data, PPP_VERSION, len))
2036			error = -EFAULT;
2037		break;
2038
2039	case SIOCGPPPSTATS:
2040		error = isdn_ppp_dev_ioctl_stats(lp->ppp_slot, ifr, dev);
2041		break;
2042	default:
2043		error = -EINVAL;
2044		break;
2045	}
2046	return error;
2047}
2048
2049static int
2050isdn_ppp_if_get_unit(char *name)
2051{
2052	int len,
2053		i,
2054		unit = 0,
2055		deci;
2056
2057	len = strlen(name);
2058
2059	if (strncmp("ippp", name, 4) || len > 8)
2060		return -1;
2061
2062	for (i = 0, deci = 1; i < len; i++, deci *= 10) {
2063		char a = name[len - i - 1];
2064		if (a >= '0' && a <= '9')
2065			unit += (a - '0') * deci;
2066		else
2067			break;
2068	}
2069	if (!i || len - i != 4)
2070		unit = -1;
2071
2072	return unit;
2073}
2074
2075
2076int
2077isdn_ppp_dial_slave(char *name)
2078{
2079#ifdef CONFIG_ISDN_MPP
2080	isdn_net_dev *ndev;
2081	isdn_net_local *lp;
2082	struct net_device *sdev;
2083
2084	if (!(ndev = isdn_net_findif(name)))
2085		return 1;
2086	lp = ndev->local;
2087	if (!(lp->flags & ISDN_NET_CONNECTED))
2088		return 5;
2089
2090	sdev = lp->slave;
2091	while (sdev) {
2092		isdn_net_local *mlp = netdev_priv(sdev);
2093		if (!(mlp->flags & ISDN_NET_CONNECTED))
2094			break;
2095		sdev = mlp->slave;
2096	}
2097	if (!sdev)
2098		return 2;
2099
2100	isdn_net_dial_req(netdev_priv(sdev));
2101	return 0;
2102#else
2103	return -1;
2104#endif
2105}
2106
2107int
2108isdn_ppp_hangup_slave(char *name)
2109{
2110#ifdef CONFIG_ISDN_MPP
2111	isdn_net_dev *ndev;
2112	isdn_net_local *lp;
2113	struct net_device *sdev;
2114
2115	if (!(ndev = isdn_net_findif(name)))
2116		return 1;
2117	lp = ndev->local;
2118	if (!(lp->flags & ISDN_NET_CONNECTED))
2119		return 5;
2120
2121	sdev = lp->slave;
2122	while (sdev) {
2123		isdn_net_local *mlp = netdev_priv(sdev);
2124
2125		if (mlp->slave) { /* find last connected link in chain */
2126			isdn_net_local *nlp = ISDN_SLAVE_PRIV(mlp);
2127
2128			if (!(nlp->flags & ISDN_NET_CONNECTED))
2129				break;
2130		} else if (mlp->flags & ISDN_NET_CONNECTED)
2131			break;
2132
2133		sdev = mlp->slave;
2134	}
2135	if (!sdev)
2136		return 2;
2137
2138	isdn_net_hangup(sdev);
2139	return 0;
2140#else
2141	return -1;
2142#endif
2143}
2144
2145/*
2146 * PPP compression stuff
2147 */
2148
2149
2150/* Push an empty CCP Data Frame up to the daemon to wake it up and let it
2151   generate a CCP Reset-Request or tear down CCP altogether */
2152
2153static void isdn_ppp_ccp_kickup(struct ippp_struct *is)
2154{
2155	isdn_ppp_fill_rq(NULL, 0, PPP_COMP, is->lp->ppp_slot);
2156}
2157
2158/* In-kernel handling of CCP Reset-Request and Reset-Ack is necessary,
2159   but absolutely nontrivial. The most abstruse problem we are facing is
2160   that the generation, reception and all the handling of timeouts and
2161   resends including proper request id management should be entirely left
2162   to the (de)compressor, but indeed is not covered by the current API to
2163   the (de)compressor. The API is a prototype version from PPP where only
2164   some (de)compressors have yet been implemented and all of them are
2165   rather simple in their reset handling. Especially, their is only one
2166   outstanding ResetAck at a time with all of them and ResetReq/-Acks do
2167   not have parameters. For this very special case it was sufficient to
2168   just return an error code from the decompressor and have a single
2169   reset() entry to communicate all the necessary information between
2170   the framework and the (de)compressor. Bad enough, LZS is different
2171   (and any other compressor may be different, too). It has multiple
2172   histories (eventually) and needs to Reset each of them independently
2173   and thus uses multiple outstanding Acks and history numbers as an
2174   additional parameter to Reqs/Acks.
2175   All that makes it harder to port the reset state engine into the
2176   kernel because it is not just the same simple one as in (i)pppd but
2177   it must be able to pass additional parameters and have multiple out-
2178   standing Acks. We are trying to achieve the impossible by handling
2179   reset transactions independent by their id. The id MUST change when
2180   the data portion changes, thus any (de)compressor who uses more than
2181   one resettable state must provide and recognize individual ids for
2182   each individual reset transaction. The framework itself does _only_
2183   differentiate them by id, because it has no other semantics like the
2184   (de)compressor might.
2185   This looks like a major redesign of the interface would be nice,
2186   but I don't have an idea how to do it better. */
2187
2188/* Send a CCP Reset-Request or Reset-Ack directly from the kernel. This is
2189   getting that lengthy because there is no simple "send-this-frame-out"
2190   function above but every wrapper does a bit different. Hope I guess
2191   correct in this hack... */
2192
2193static void isdn_ppp_ccp_xmit_reset(struct ippp_struct *is, int proto,
2194				    unsigned char code, unsigned char id,
2195				    unsigned char *data, int len)
2196{
2197	struct sk_buff *skb;
2198	unsigned char *p;
2199	int hl;
2200	int cnt = 0;
2201	isdn_net_local *lp = is->lp;
2202
2203	/* Alloc large enough skb */
2204	hl = dev->drv[lp->isdn_device]->interface->hl_hdrlen;
2205	skb = alloc_skb(len + hl + 16, GFP_ATOMIC);
2206	if (!skb) {
2207		printk(KERN_WARNING
2208		       "ippp: CCP cannot send reset - out of memory\n");
2209		return;
2210	}
2211	skb_reserve(skb, hl);
2212
2213	/* We may need to stuff an address and control field first */
2214	if (!(is->pppcfg & SC_COMP_AC)) {
2215		p = skb_put(skb, 2);
2216		*p++ = 0xff;
2217		*p++ = 0x03;
2218	}
2219
2220	/* Stuff proto, code, id and length */
2221	p = skb_put(skb, 6);
2222	*p++ = (proto >> 8);
2223	*p++ = (proto & 0xff);
2224	*p++ = code;
2225	*p++ = id;
2226	cnt = 4 + len;
2227	*p++ = (cnt >> 8);
2228	*p++ = (cnt & 0xff);
2229
2230	/* Now stuff remaining bytes */
2231	if (len) {
2232		p = skb_put(skb, len);
2233		memcpy(p, data, len);
2234	}
2235
2236	/* skb is now ready for xmit */
2237	printk(KERN_DEBUG "Sending CCP Frame:\n");
2238	isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
2239
2240	isdn_net_write_super(lp, skb);
2241}
2242
2243/* Allocate the reset state vector */
2244static struct ippp_ccp_reset *isdn_ppp_ccp_reset_alloc(struct ippp_struct *is)
2245{
2246	struct ippp_ccp_reset *r;
2247	r = kzalloc(sizeof(struct ippp_ccp_reset), GFP_KERNEL);
2248	if (!r) {
2249		printk(KERN_ERR "ippp_ccp: failed to allocate reset data"
2250		       " structure - no mem\n");
2251		return NULL;
2252	}
2253	printk(KERN_DEBUG "ippp_ccp: allocated reset data structure %p\n", r);
2254	is->reset = r;
2255	return r;
2256}
2257
2258/* Destroy the reset state vector. Kill all pending timers first. */
2259static void isdn_ppp_ccp_reset_free(struct ippp_struct *is)
2260{
2261	unsigned int id;
2262
2263	printk(KERN_DEBUG "ippp_ccp: freeing reset data structure %p\n",
2264	       is->reset);
2265	for (id = 0; id < 256; id++) {
2266		if (is->reset->rs[id]) {
2267			isdn_ppp_ccp_reset_free_state(is, (unsigned char)id);
2268		}
2269	}
2270	kfree(is->reset);
2271	is->reset = NULL;
2272}
2273
2274/* Free a given state and clear everything up for later reallocation */
2275static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
2276					  unsigned char id)
2277{
2278	struct ippp_ccp_reset_state *rs;
2279
2280	if (is->reset->rs[id]) {
2281		printk(KERN_DEBUG "ippp_ccp: freeing state for id %d\n", id);
2282		rs = is->reset->rs[id];
2283		/* Make sure the kernel will not call back later */
2284		if (rs->ta)
2285			del_timer(&rs->timer);
2286		is->reset->rs[id] = NULL;
2287		kfree(rs);
2288	} else {
2289		printk(KERN_WARNING "ippp_ccp: id %d is not allocated\n", id);
2290	}
2291}
2292
2293/* The timer callback function which is called when a ResetReq has timed out,
2294   aka has never been answered by a ResetAck */
2295static void isdn_ppp_ccp_timer_callback(unsigned long closure)
2296{
2297	struct ippp_ccp_reset_state *rs =
2298		(struct ippp_ccp_reset_state *)closure;
2299
2300	if (!rs) {
2301		printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
2302		return;
2303	}
2304	if (rs->ta && rs->state == CCPResetSentReq) {
2305		/* We are correct here */
2306		if (!rs->expra) {
2307			/* Hmm, there is no Ack really expected. We can clean
2308			   up the state now, it will be reallocated if the
2309			   decompressor insists on another reset */
2310			rs->ta = 0;
2311			isdn_ppp_ccp_reset_free_state(rs->is, rs->id);
2312			return;
2313		}
2314		printk(KERN_DEBUG "ippp_ccp: CCP Reset timed out for id %d\n",
2315		       rs->id);
2316		/* Push it again */
2317		isdn_ppp_ccp_xmit_reset(rs->is, PPP_CCP, CCP_RESETREQ, rs->id,
2318					rs->data, rs->dlen);
2319		/* Restart timer */
2320		rs->timer.expires = jiffies + HZ * 5;
2321		add_timer(&rs->timer);
2322	} else {
2323		printk(KERN_WARNING "ippp_ccp: timer cb in wrong state %d\n",
2324		       rs->state);
2325	}
2326}
2327
2328/* Allocate a new reset transaction state */
2329static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
2330								   unsigned char id)
2331{
2332	struct ippp_ccp_reset_state *rs;
2333	if (is->reset->rs[id]) {
2334		printk(KERN_WARNING "ippp_ccp: old state exists for id %d\n",
2335		       id);
2336		return NULL;
2337	} else {
2338		rs = kzalloc(sizeof(struct ippp_ccp_reset_state), GFP_KERNEL);
2339		if (!rs)
2340			return NULL;
2341		rs->state = CCPResetIdle;
2342		rs->is = is;
2343		rs->id = id;
2344		init_timer(&rs->timer);
2345		rs->timer.data = (unsigned long)rs;
2346		rs->timer.function = isdn_ppp_ccp_timer_callback;
2347		is->reset->rs[id] = rs;
2348	}
2349	return rs;
2350}
2351
2352
2353/* A decompressor wants a reset with a set of parameters - do what is
2354   necessary to fulfill it */
2355static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
2356				     struct isdn_ppp_resetparams *rp)
2357{
2358	struct ippp_ccp_reset_state *rs;
2359
2360	if (rp->valid) {
2361		/* The decompressor defines parameters by itself */
2362		if (rp->rsend) {
2363			/* And he wants us to send a request */
2364			if (!(rp->idval)) {
2365				printk(KERN_ERR "ippp_ccp: decompressor must"
2366				       " specify reset id\n");
2367				return;
2368			}
2369			if (is->reset->rs[rp->id]) {
2370				/* There is already a transaction in existence
2371				   for this id. May be still waiting for a
2372				   Ack or may be wrong. */
2373				rs = is->reset->rs[rp->id];
2374				if (rs->state == CCPResetSentReq && rs->ta) {
2375					printk(KERN_DEBUG "ippp_ccp: reset"
2376					       " trans still in progress"
2377					       " for id %d\n", rp->id);
2378				} else {
2379					printk(KERN_WARNING "ippp_ccp: reset"
2380					       " trans in wrong state %d for"
2381					       " id %d\n", rs->state, rp->id);
2382				}
2383			} else {
2384				/* Ok, this is a new transaction */
2385				printk(KERN_DEBUG "ippp_ccp: new trans for id"
2386				       " %d to be started\n", rp->id);
2387				rs = isdn_ppp_ccp_reset_alloc_state(is, rp->id);
2388				if (!rs) {
2389					printk(KERN_ERR "ippp_ccp: out of mem"
2390					       " allocing ccp trans\n");
2391					return;
2392				}
2393				rs->state = CCPResetSentReq;
2394				rs->expra = rp->expra;
2395				if (rp->dtval) {
2396					rs->dlen = rp->dlen;
2397					memcpy(rs->data, rp->data, rp->dlen);
2398				}
2399				/* HACK TODO - add link comp here */
2400				isdn_ppp_ccp_xmit_reset(is, PPP_CCP,
2401							CCP_RESETREQ, rs->id,
2402							rs->data, rs->dlen);
2403				/* Start the timer */
2404				rs->timer.expires = jiffies + 5 * HZ;
2405				add_timer(&rs->timer);
2406				rs->ta = 1;
2407			}
2408		} else {
2409			printk(KERN_DEBUG "ippp_ccp: no reset sent\n");
2410		}
2411	} else {
2412		/* The reset params are invalid. The decompressor does not
2413		   care about them, so we just send the minimal requests
2414		   and increase ids only when an Ack is received for a
2415		   given id */
2416		if (is->reset->rs[is->reset->lastid]) {
2417			/* There is already a transaction in existence
2418			   for this id. May be still waiting for a
2419			   Ack or may be wrong. */
2420			rs = is->reset->rs[is->reset->lastid];
2421			if (rs->state == CCPResetSentReq && rs->ta) {
2422				printk(KERN_DEBUG "ippp_ccp: reset"
2423				       " trans still in progress"
2424				       " for id %d\n", rp->id);
2425			} else {
2426				printk(KERN_WARNING "ippp_ccp: reset"
2427				       " trans in wrong state %d for"
2428				       " id %d\n", rs->state, rp->id);
2429			}
2430		} else {
2431			printk(KERN_DEBUG "ippp_ccp: new trans for id"
2432			       " %d to be started\n", is->reset->lastid);
2433			rs = isdn_ppp_ccp_reset_alloc_state(is,
2434							    is->reset->lastid);
2435			if (!rs) {
2436				printk(KERN_ERR "ippp_ccp: out of mem"
2437				       " allocing ccp trans\n");
2438				return;
2439			}
2440			rs->state = CCPResetSentReq;
2441			/* We always expect an Ack if the decompressor doesn't
2442			   know	better */
2443			rs->expra = 1;
2444			rs->dlen = 0;
2445			/* HACK TODO - add link comp here */
2446			isdn_ppp_ccp_xmit_reset(is, PPP_CCP, CCP_RESETREQ,
2447						rs->id, NULL, 0);
2448			/* Start the timer */
2449			rs->timer.expires = jiffies + 5 * HZ;
2450			add_timer(&rs->timer);
2451			rs->ta = 1;
2452		}
2453	}
2454}
2455
2456/* An Ack was received for this id. This means we stop the timer and clean
2457   up the state prior to calling the decompressors reset routine. */
2458static void isdn_ppp_ccp_reset_ack_rcvd(struct ippp_struct *is,
2459					unsigned char id)
2460{
2461	struct ippp_ccp_reset_state *rs = is->reset->rs[id];
2462
2463	if (rs) {
2464		if (rs->ta && rs->state == CCPResetSentReq) {
2465			/* Great, we are correct */
2466			if (!rs->expra)
2467				printk(KERN_DEBUG "ippp_ccp: ResetAck received"
2468				       " for id %d but not expected\n", id);
2469		} else {
2470			printk(KERN_INFO "ippp_ccp: ResetAck received out of"
2471			       "sync for id %d\n", id);
2472		}
2473		if (rs->ta) {
2474			rs->ta = 0;
2475			del_timer(&rs->timer);
2476		}
2477		isdn_ppp_ccp_reset_free_state(is, id);
2478	} else {
2479		printk(KERN_INFO "ippp_ccp: ResetAck received for unknown id"
2480		       " %d\n", id);
2481	}
2482	/* Make sure the simple reset stuff uses a new id next time */
2483	is->reset->lastid++;
2484}
2485
2486/*
2487 * decompress packet
2488 *
2489 * if master = 0, we're trying to uncompress an per-link compressed packet,
2490 * as opposed to an compressed reconstructed-from-MPPP packet.
2491 * proto is updated to protocol field of uncompressed packet.
2492 *
2493 * retval: decompressed packet,
2494 *         same packet if uncompressed,
2495 *	   NULL if decompression error
2496 */
2497
2498static struct sk_buff *isdn_ppp_decompress(struct sk_buff *skb, struct ippp_struct *is, struct ippp_struct *master,
2499					   int *proto)
2500{
2501	void *stat = NULL;
2502	struct isdn_ppp_compressor *ipc = NULL;
2503	struct sk_buff *skb_out;
2504	int len;
2505	struct ippp_struct *ri;
2506	struct isdn_ppp_resetparams rsparm;
2507	unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2508
2509	if (!master) {
2510		// per-link decompression
2511		stat = is->link_decomp_stat;
2512		ipc = is->link_decompressor;
2513		ri = is;
2514	} else {
2515		stat = master->decomp_stat;
2516		ipc = master->decompressor;
2517		ri = master;
2518	}
2519
2520	if (!ipc) {
2521		// no decompressor -> we can't decompress.
2522		printk(KERN_DEBUG "ippp: no decompressor defined!\n");
2523		return skb;
2524	}
2525	BUG_ON(!stat); // if we have a compressor, stat has been set as well
2526
2527	if ((master && *proto == PPP_COMP) || (!master && *proto == PPP_COMPFRAG)) {
2528		// compressed packets are compressed by their protocol type
2529
2530		// Set up reset params for the decompressor
2531		memset(&rsparm, 0, sizeof(rsparm));
2532		rsparm.data = rsdata;
2533		rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2534
2535		skb_out = dev_alloc_skb(is->mru + PPP_HDRLEN);
2536		if (!skb_out) {
2537			kfree_skb(skb);
2538			printk(KERN_ERR "ippp: decomp memory allocation failure\n");
2539			return NULL;
2540		}
2541		len = ipc->decompress(stat, skb, skb_out, &rsparm);
2542		kfree_skb(skb);
2543		if (len <= 0) {
2544			switch (len) {
2545			case DECOMP_ERROR:
2546				printk(KERN_INFO "ippp: decomp wants reset %s params\n",
2547				       rsparm.valid ? "with" : "without");
2548
2549				isdn_ppp_ccp_reset_trans(ri, &rsparm);
2550				break;
2551			case DECOMP_FATALERROR:
2552				ri->pppcfg |= SC_DC_FERROR;
2553				/* Kick ipppd to recognize the error */
2554				isdn_ppp_ccp_kickup(ri);
2555				break;
2556			}
2557			kfree_skb(skb_out);
2558			return NULL;
2559		}
2560		*proto = isdn_ppp_strip_proto(skb_out);
2561		if (*proto < 0) {
2562			kfree_skb(skb_out);
2563			return NULL;
2564		}
2565		return skb_out;
2566	} else {
2567		// uncompressed packets are fed through the decompressor to
2568		// update the decompressor state
2569		ipc->incomp(stat, skb, *proto);
2570		return skb;
2571	}
2572}
2573
2574/*
2575 * compress a frame
2576 *   type=0: normal/bundle compression
2577 *       =1: link compression
2578 * returns original skb if we haven't compressed the frame
2579 * and a new skb pointer if we've done it
2580 */
2581static struct sk_buff *isdn_ppp_compress(struct sk_buff *skb_in, int *proto,
2582					 struct ippp_struct *is, struct ippp_struct *master, int type)
2583{
2584	int ret;
2585	int new_proto;
2586	struct isdn_ppp_compressor *compressor;
2587	void *stat;
2588	struct sk_buff *skb_out;
2589
2590	/* we do not compress control protocols */
2591	if (*proto < 0 || *proto > 0x3fff) {
2592		return skb_in;
2593	}
2594
2595	if (type) { /* type=1 => Link compression */
2596		return skb_in;
2597	}
2598	else {
2599		if (!master) {
2600			compressor = is->compressor;
2601			stat = is->comp_stat;
2602		}
2603		else {
2604			compressor = master->compressor;
2605			stat = master->comp_stat;
2606		}
2607		new_proto = PPP_COMP;
2608	}
2609
2610	if (!compressor) {
2611		printk(KERN_ERR "isdn_ppp: No compressor set!\n");
2612		return skb_in;
2613	}
2614	if (!stat) {
2615		printk(KERN_ERR "isdn_ppp: Compressor not initialized?\n");
2616		return skb_in;
2617	}
2618
2619	/* Allow for at least 150 % expansion (for now) */
2620	skb_out = alloc_skb(skb_in->len + skb_in->len / 2 + 32 +
2621			    skb_headroom(skb_in), GFP_ATOMIC);
2622	if (!skb_out)
2623		return skb_in;
2624	skb_reserve(skb_out, skb_headroom(skb_in));
2625
2626	ret = (compressor->compress)(stat, skb_in, skb_out, *proto);
2627	if (!ret) {
2628		dev_kfree_skb(skb_out);
2629		return skb_in;
2630	}
2631
2632	dev_kfree_skb(skb_in);
2633	*proto = new_proto;
2634	return skb_out;
2635}
2636
2637/*
2638 * we received a CCP frame ..
2639 * not a clean solution, but we MUST handle a few cases in the kernel
2640 */
2641static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp,
2642				 struct sk_buff *skb, int proto)
2643{
2644	struct ippp_struct *is;
2645	struct ippp_struct *mis;
2646	int len;
2647	struct isdn_ppp_resetparams rsparm;
2648	unsigned char rsdata[IPPP_RESET_MAXDATABYTES];
2649
2650	printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n",
2651	       lp->ppp_slot);
2652	if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) {
2653		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2654		       __func__, lp->ppp_slot);
2655		return;
2656	}
2657	is = ippp_table[lp->ppp_slot];
2658	isdn_ppp_frame_log("ccp-rcv", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
2659
2660	if (lp->master) {
2661		int slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2662		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2663			printk(KERN_ERR "%s: slot(%d) out of range\n",
2664			       __func__, slot);
2665			return;
2666		}
2667		mis = ippp_table[slot];
2668	} else
2669		mis = is;
2670
2671	switch (skb->data[0]) {
2672	case CCP_CONFREQ:
2673		if (is->debug & 0x10)
2674			printk(KERN_DEBUG "Disable compression here!\n");
2675		if (proto == PPP_CCP)
2676			mis->compflags &= ~SC_COMP_ON;
2677		else
2678			is->compflags &= ~SC_LINK_COMP_ON;
2679		break;
2680	case CCP_TERMREQ:
2681	case CCP_TERMACK:
2682		if (is->debug & 0x10)
2683			printk(KERN_DEBUG "Disable (de)compression here!\n");
2684		if (proto == PPP_CCP)
2685			mis->compflags &= ~(SC_DECOMP_ON | SC_COMP_ON);
2686		else
2687			is->compflags &= ~(SC_LINK_DECOMP_ON | SC_LINK_COMP_ON);
2688		break;
2689	case CCP_CONFACK:
2690		/* if we RECEIVE an ackowledge we enable the decompressor */
2691		if (is->debug & 0x10)
2692			printk(KERN_DEBUG "Enable decompression here!\n");
2693		if (proto == PPP_CCP) {
2694			if (!mis->decompressor)
2695				break;
2696			mis->compflags |= SC_DECOMP_ON;
2697		} else {
2698			if (!is->decompressor)
2699				break;
2700			is->compflags |= SC_LINK_DECOMP_ON;
2701		}
2702		break;
2703
2704	case CCP_RESETACK:
2705		printk(KERN_DEBUG "Received ResetAck from peer\n");
2706		len = (skb->data[2] << 8) | skb->data[3];
2707		len -= 4;
2708
2709		if (proto == PPP_CCP) {
2710			/* If a reset Ack was outstanding for this id, then
2711			   clean up the state engine */
2712			isdn_ppp_ccp_reset_ack_rcvd(mis, skb->data[1]);
2713			if (mis->decompressor && mis->decomp_stat)
2714				mis->decompressor->
2715					reset(mis->decomp_stat,
2716					      skb->data[0],
2717					      skb->data[1],
2718					      len ? &skb->data[4] : NULL,
2719					      len, NULL);
2720			/* TODO: This is not easy to decide here */
2721			mis->compflags &= ~SC_DECOMP_DISCARD;
2722		}
2723		else {
2724			isdn_ppp_ccp_reset_ack_rcvd(is, skb->data[1]);
2725			if (is->link_decompressor && is->link_decomp_stat)
2726				is->link_decompressor->
2727					reset(is->link_decomp_stat,
2728					      skb->data[0],
2729					      skb->data[1],
2730					      len ? &skb->data[4] : NULL,
2731					      len, NULL);
2732			/* TODO: neither here */
2733			is->compflags &= ~SC_LINK_DECOMP_DISCARD;
2734		}
2735		break;
2736
2737	case CCP_RESETREQ:
2738		printk(KERN_DEBUG "Received ResetReq from peer\n");
2739		/* Receiving a ResetReq means we must reset our compressor */
2740		/* Set up reset params for the reset entry */
2741		memset(&rsparm, 0, sizeof(rsparm));
2742		rsparm.data = rsdata;
2743		rsparm.maxdlen = IPPP_RESET_MAXDATABYTES;
2744		/* Isolate data length */
2745		len = (skb->data[2] << 8) | skb->data[3];
2746		len -= 4;
2747		if (proto == PPP_CCP) {
2748			if (mis->compressor && mis->comp_stat)
2749				mis->compressor->
2750					reset(mis->comp_stat,
2751					      skb->data[0],
2752					      skb->data[1],
2753					      len ? &skb->data[4] : NULL,
2754					      len, &rsparm);
2755		}
2756		else {
2757			if (is->link_compressor && is->link_comp_stat)
2758				is->link_compressor->
2759					reset(is->link_comp_stat,
2760					      skb->data[0],
2761					      skb->data[1],
2762					      len ? &skb->data[4] : NULL,
2763					      len, &rsparm);
2764		}
2765		/* Ack the Req as specified by rsparm */
2766		if (rsparm.valid) {
2767			/* Compressor reset handler decided how to answer */
2768			if (rsparm.rsend) {
2769				/* We should send a Frame */
2770				isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2771							rsparm.idval ? rsparm.id
2772							: skb->data[1],
2773							rsparm.dtval ?
2774							rsparm.data : NULL,
2775							rsparm.dtval ?
2776							rsparm.dlen : 0);
2777			} else {
2778				printk(KERN_DEBUG "ResetAck suppressed\n");
2779			}
2780		} else {
2781			/* We answer with a straight reflected Ack */
2782			isdn_ppp_ccp_xmit_reset(is, proto, CCP_RESETACK,
2783						skb->data[1],
2784						len ? &skb->data[4] : NULL,
2785						len);
2786		}
2787		break;
2788	}
2789}
2790
2791
2792/*
2793 * Daemon sends a CCP frame ...
2794 */
2795
2796/* TODO: Clean this up with new Reset semantics */
2797
2798/* I believe the CCP handling as-is is done wrong. Compressed frames
2799 * should only be sent/received after CCP reaches UP state, which means
2800 * both sides have sent CONF_ACK. Currently, we handle both directions
2801 * independently, which means we may accept compressed frames too early
2802 * (supposedly not a problem), but may also mean we send compressed frames
2803 * too early, which may turn out to be a problem.
2804 * This part of state machine should actually be handled by (i)pppd, but
2805 * that's too big of a change now. --kai
2806 */
2807
2808/* Actually, we might turn this into an advantage: deal with the RFC in
2809 * the old tradition of beeing generous on what we accept, but beeing
2810 * strict on what we send. Thus we should just
2811 * - accept compressed frames as soon as decompression is negotiated
2812 * - send compressed frames only when decomp *and* comp are negotiated
2813 * - drop rx compressed frames if we cannot decomp (instead of pushing them
2814 *   up to ipppd)
2815 * and I tried to modify this file according to that. --abp
2816 */
2817
2818static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct sk_buff *skb)
2819{
2820	struct ippp_struct *mis, *is;
2821	int proto, slot = lp->ppp_slot;
2822	unsigned char *data;
2823
2824	if (!skb || skb->len < 3)
2825		return;
2826	if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2827		printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n",
2828		       __func__, slot);
2829		return;
2830	}
2831	is = ippp_table[slot];
2832	/* Daemon may send with or without address and control field comp */
2833	data = skb->data;
2834	if (!(is->pppcfg & SC_COMP_AC) && data[0] == 0xff && data[1] == 0x03) {
2835		data += 2;
2836		if (skb->len < 5)
2837			return;
2838	}
2839
2840	proto = ((int)data[0]<<8) + data[1];
2841	if (proto != PPP_CCP && proto != PPP_CCPFRAG)
2842		return;
2843
2844	printk(KERN_DEBUG "Received CCP frame from daemon:\n");
2845	isdn_ppp_frame_log("ccp-xmit", skb->data, skb->len, 32, is->unit, lp->ppp_slot);
2846
2847	if (lp->master) {
2848		slot = ISDN_MASTER_PRIV(lp)->ppp_slot;
2849		if (slot < 0 || slot >= ISDN_MAX_CHANNELS) {
2850			printk(KERN_ERR "%s: slot(%d) out of range\n",
2851			       __func__, slot);
2852			return;
2853		}
2854		mis = ippp_table[slot];
2855	} else
2856		mis = is;
2857	if (mis != is)
2858		printk(KERN_DEBUG "isdn_ppp: Ouch! Master CCP sends on slave slot!\n");
2859
2860	switch (data[2]) {
2861	case CCP_CONFREQ:
2862		if (is->debug & 0x10)
2863			printk(KERN_DEBUG "Disable decompression here!\n");
2864		if (proto == PPP_CCP)
2865			is->compflags &= ~SC_DECOMP_ON;
2866		else
2867			is->compflags &= ~SC_LINK_DECOMP_ON;
2868		break;
2869	case CCP_TERMREQ:
2870	case CCP_TERMACK:
2871		if (is->debug & 0x10)
2872			printk(KERN_DEBUG "Disable (de)compression here!\n");
2873		if (proto == PPP_CCP)
2874			is->compflags &= ~(SC_DECOMP_ON | SC_COMP_ON);
2875		else
2876			is->compflags &= ~(SC_LINK_DECOMP_ON | SC_LINK_COMP_ON);
2877		break;
2878	case CCP_CONFACK:
2879		/* if we SEND an ackowledge we can/must enable the compressor */
2880		if (is->debug & 0x10)
2881			printk(KERN_DEBUG "Enable compression here!\n");
2882		if (proto == PPP_CCP) {
2883			if (!is->compressor)
2884				break;
2885			is->compflags |= SC_COMP_ON;
2886		} else {
2887			if (!is->compressor)
2888				break;
2889			is->compflags |= SC_LINK_COMP_ON;
2890		}
2891		break;
2892	case CCP_RESETACK:
2893		/* If we send a ACK we should reset our compressor */
2894		if (is->debug & 0x10)
2895			printk(KERN_DEBUG "Reset decompression state here!\n");
2896		printk(KERN_DEBUG "ResetAck from daemon passed by\n");
2897		if (proto == PPP_CCP) {
2898			/* link to master? */
2899			if (is->compressor && is->comp_stat)
2900				is->compressor->reset(is->comp_stat, 0, 0,
2901						      NULL, 0, NULL);
2902			is->compflags &= ~SC_COMP_DISCARD;
2903		}
2904		else {
2905			if (is->link_compressor && is->link_comp_stat)
2906				is->link_compressor->reset(is->link_comp_stat,
2907							   0, 0, NULL, 0, NULL);
2908			is->compflags &= ~SC_LINK_COMP_DISCARD;
2909		}
2910		break;
2911	case CCP_RESETREQ:
2912		/* Just let it pass by */
2913		printk(KERN_DEBUG "ResetReq from daemon passed by\n");
2914		break;
2915	}
2916}
2917
2918int isdn_ppp_register_compressor(struct isdn_ppp_compressor *ipc)
2919{
2920	ipc->next = ipc_head;
2921	ipc->prev = NULL;
2922	if (ipc_head) {
2923		ipc_head->prev = ipc;
2924	}
2925	ipc_head = ipc;
2926	return 0;
2927}
2928
2929int isdn_ppp_unregister_compressor(struct isdn_ppp_compressor *ipc)
2930{
2931	if (ipc->prev)
2932		ipc->prev->next = ipc->next;
2933	else
2934		ipc_head = ipc->next;
2935	if (ipc->next)
2936		ipc->next->prev = ipc->prev;
2937	ipc->prev = ipc->next = NULL;
2938	return 0;
2939}
2940
2941static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_data *data)
2942{
2943	struct isdn_ppp_compressor *ipc = ipc_head;
2944	int ret;
2945	void *stat;
2946	int num = data->num;
2947
2948	if (is->debug & 0x10)
2949		printk(KERN_DEBUG "[%d] Set %s type %d\n", is->unit,
2950		       (data->flags & IPPP_COMP_FLAG_XMIT) ? "compressor" : "decompressor", num);
2951
2952	/* If is has no valid reset state vector, we cannot allocate a
2953	   decompressor. The decompressor would cause reset transactions
2954	   sooner or later, and they need that vector. */
2955
2956	if (!(data->flags & IPPP_COMP_FLAG_XMIT) && !is->reset) {
2957		printk(KERN_ERR "ippp_ccp: no reset data structure - can't"
2958		       " allow decompression.\n");
2959		return -ENOMEM;
2960	}
2961
2962	while (ipc) {
2963		if (ipc->num == num) {
2964			stat = ipc->alloc(data);
2965			if (stat) {
2966				ret = ipc->init(stat, data, is->unit, 0);
2967				if (!ret) {
2968					printk(KERN_ERR "Can't init (de)compression!\n");
2969					ipc->free(stat);
2970					stat = NULL;
2971					break;
2972				}
2973			}
2974			else {
2975				printk(KERN_ERR "Can't alloc (de)compression!\n");
2976				break;
2977			}
2978
2979			if (data->flags & IPPP_COMP_FLAG_XMIT) {
2980				if (data->flags & IPPP_COMP_FLAG_LINK) {
2981					if (is->link_comp_stat)
2982						is->link_compressor->free(is->link_comp_stat);
2983					is->link_comp_stat = stat;
2984					is->link_compressor = ipc;
2985				}
2986				else {
2987					if (is->comp_stat)
2988						is->compressor->free(is->comp_stat);
2989					is->comp_stat = stat;
2990					is->compressor = ipc;
2991				}
2992			}
2993			else {
2994				if (data->flags & IPPP_COMP_FLAG_LINK) {
2995					if (is->link_decomp_stat)
2996						is->link_decompressor->free(is->link_decomp_stat);
2997					is->link_decomp_stat = stat;
2998					is->link_decompressor = ipc;
2999				}
3000				else {
3001					if (is->decomp_stat)
3002						is->decompressor->free(is->decomp_stat);
3003					is->decomp_stat = stat;
3004					is->decompressor = ipc;
3005				}
3006			}
3007			return 0;
3008		}
3009		ipc = ipc->next;
3010	}
3011	return -EINVAL;
3012}