linux/drivers/isdn/i4l/isdn_ppp.c
<<
>>
Prefs
   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}
3013