linux/drivers/isdn/mISDN/layer2.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *
   4 * Author       Karsten Keil <kkeil@novell.com>
   5 *
   6 * Copyright 2008  by Karsten Keil <kkeil@novell.com>
   7 */
   8
   9#include <linux/mISDNif.h>
  10#include <linux/slab.h>
  11#include "core.h"
  12#include "fsm.h"
  13#include "layer2.h"
  14
  15static u_int *debug;
  16
  17static
  18struct Fsm l2fsm = {NULL, 0, 0, NULL, NULL};
  19
  20static char *strL2State[] =
  21{
  22        "ST_L2_1",
  23        "ST_L2_2",
  24        "ST_L2_3",
  25        "ST_L2_4",
  26        "ST_L2_5",
  27        "ST_L2_6",
  28        "ST_L2_7",
  29        "ST_L2_8",
  30};
  31
  32enum {
  33        EV_L2_UI,
  34        EV_L2_SABME,
  35        EV_L2_DISC,
  36        EV_L2_DM,
  37        EV_L2_UA,
  38        EV_L2_FRMR,
  39        EV_L2_SUPER,
  40        EV_L2_I,
  41        EV_L2_DL_DATA,
  42        EV_L2_ACK_PULL,
  43        EV_L2_DL_UNITDATA,
  44        EV_L2_DL_ESTABLISH_REQ,
  45        EV_L2_DL_RELEASE_REQ,
  46        EV_L2_MDL_ASSIGN,
  47        EV_L2_MDL_REMOVE,
  48        EV_L2_MDL_ERROR,
  49        EV_L1_DEACTIVATE,
  50        EV_L2_T200,
  51        EV_L2_T203,
  52        EV_L2_T200I,
  53        EV_L2_T203I,
  54        EV_L2_SET_OWN_BUSY,
  55        EV_L2_CLEAR_OWN_BUSY,
  56        EV_L2_FRAME_ERROR,
  57};
  58
  59#define L2_EVENT_COUNT (EV_L2_FRAME_ERROR + 1)
  60
  61static char *strL2Event[] =
  62{
  63        "EV_L2_UI",
  64        "EV_L2_SABME",
  65        "EV_L2_DISC",
  66        "EV_L2_DM",
  67        "EV_L2_UA",
  68        "EV_L2_FRMR",
  69        "EV_L2_SUPER",
  70        "EV_L2_I",
  71        "EV_L2_DL_DATA",
  72        "EV_L2_ACK_PULL",
  73        "EV_L2_DL_UNITDATA",
  74        "EV_L2_DL_ESTABLISH_REQ",
  75        "EV_L2_DL_RELEASE_REQ",
  76        "EV_L2_MDL_ASSIGN",
  77        "EV_L2_MDL_REMOVE",
  78        "EV_L2_MDL_ERROR",
  79        "EV_L1_DEACTIVATE",
  80        "EV_L2_T200",
  81        "EV_L2_T203",
  82        "EV_L2_T200I",
  83        "EV_L2_T203I",
  84        "EV_L2_SET_OWN_BUSY",
  85        "EV_L2_CLEAR_OWN_BUSY",
  86        "EV_L2_FRAME_ERROR",
  87};
  88
  89static void
  90l2m_debug(struct FsmInst *fi, char *fmt, ...)
  91{
  92        struct layer2 *l2 = fi->userdata;
  93        struct va_format vaf;
  94        va_list va;
  95
  96        if (!(*debug & DEBUG_L2_FSM))
  97                return;
  98
  99        va_start(va, fmt);
 100
 101        vaf.fmt = fmt;
 102        vaf.va = &va;
 103
 104        printk(KERN_DEBUG "%s l2 (sapi %d tei %d): %pV\n",
 105               mISDNDevName4ch(&l2->ch), l2->sapi, l2->tei, &vaf);
 106
 107        va_end(va);
 108}
 109
 110inline u_int
 111l2headersize(struct layer2 *l2, int ui)
 112{
 113        return ((test_bit(FLG_MOD128, &l2->flag) && (!ui)) ? 2 : 1) +
 114                (test_bit(FLG_LAPD, &l2->flag) ? 2 : 1);
 115}
 116
 117inline u_int
 118l2addrsize(struct layer2 *l2)
 119{
 120        return test_bit(FLG_LAPD, &l2->flag) ? 2 : 1;
 121}
 122
 123static u_int
 124l2_newid(struct layer2 *l2)
 125{
 126        u_int   id;
 127
 128        id = l2->next_id++;
 129        if (id == 0x7fff)
 130                l2->next_id = 1;
 131        id <<= 16;
 132        id |= l2->tei << 8;
 133        id |= l2->sapi;
 134        return id;
 135}
 136
 137static void
 138l2up(struct layer2 *l2, u_int prim, struct sk_buff *skb)
 139{
 140        int     err;
 141
 142        if (!l2->up)
 143                return;
 144        mISDN_HEAD_PRIM(skb) = prim;
 145        mISDN_HEAD_ID(skb) = (l2->ch.nr << 16) | l2->ch.addr;
 146        err = l2->up->send(l2->up, skb);
 147        if (err) {
 148                printk(KERN_WARNING "%s: dev %s err=%d\n", __func__,
 149                       mISDNDevName4ch(&l2->ch), err);
 150                dev_kfree_skb(skb);
 151        }
 152}
 153
 154static void
 155l2up_create(struct layer2 *l2, u_int prim, int len, void *arg)
 156{
 157        struct sk_buff  *skb;
 158        struct mISDNhead *hh;
 159        int             err;
 160
 161        if (!l2->up)
 162                return;
 163        skb = mI_alloc_skb(len, GFP_ATOMIC);
 164        if (!skb)
 165                return;
 166        hh = mISDN_HEAD_P(skb);
 167        hh->prim = prim;
 168        hh->id = (l2->ch.nr << 16) | l2->ch.addr;
 169        if (len)
 170                skb_put_data(skb, arg, len);
 171        err = l2->up->send(l2->up, skb);
 172        if (err) {
 173                printk(KERN_WARNING "%s: dev %s err=%d\n", __func__,
 174                       mISDNDevName4ch(&l2->ch), err);
 175                dev_kfree_skb(skb);
 176        }
 177}
 178
 179static int
 180l2down_skb(struct layer2 *l2, struct sk_buff *skb) {
 181        int ret;
 182
 183        ret = l2->ch.recv(l2->ch.peer, skb);
 184        if (ret && (*debug & DEBUG_L2_RECV))
 185                printk(KERN_DEBUG "l2down_skb: dev %s ret(%d)\n",
 186                       mISDNDevName4ch(&l2->ch), ret);
 187        return ret;
 188}
 189
 190static int
 191l2down_raw(struct layer2 *l2, struct sk_buff *skb)
 192{
 193        struct mISDNhead *hh = mISDN_HEAD_P(skb);
 194
 195        if (hh->prim == PH_DATA_REQ) {
 196                if (test_and_set_bit(FLG_L1_NOTREADY, &l2->flag)) {
 197                        skb_queue_tail(&l2->down_queue, skb);
 198                        return 0;
 199                }
 200                l2->down_id = mISDN_HEAD_ID(skb);
 201        }
 202        return l2down_skb(l2, skb);
 203}
 204
 205static int
 206l2down(struct layer2 *l2, u_int prim, u_int id, struct sk_buff *skb)
 207{
 208        struct mISDNhead *hh = mISDN_HEAD_P(skb);
 209
 210        hh->prim = prim;
 211        hh->id = id;
 212        return l2down_raw(l2, skb);
 213}
 214
 215static int
 216l2down_create(struct layer2 *l2, u_int prim, u_int id, int len, void *arg)
 217{
 218        struct sk_buff  *skb;
 219        int             err;
 220        struct mISDNhead *hh;
 221
 222        skb = mI_alloc_skb(len, GFP_ATOMIC);
 223        if (!skb)
 224                return -ENOMEM;
 225        hh = mISDN_HEAD_P(skb);
 226        hh->prim = prim;
 227        hh->id = id;
 228        if (len)
 229                skb_put_data(skb, arg, len);
 230        err = l2down_raw(l2, skb);
 231        if (err)
 232                dev_kfree_skb(skb);
 233        return err;
 234}
 235
 236static int
 237ph_data_confirm(struct layer2 *l2, struct mISDNhead *hh, struct sk_buff *skb) {
 238        struct sk_buff *nskb = skb;
 239        int ret = -EAGAIN;
 240
 241        if (test_bit(FLG_L1_NOTREADY, &l2->flag)) {
 242                if (hh->id == l2->down_id) {
 243                        nskb = skb_dequeue(&l2->down_queue);
 244                        if (nskb) {
 245                                l2->down_id = mISDN_HEAD_ID(nskb);
 246                                if (l2down_skb(l2, nskb)) {
 247                                        dev_kfree_skb(nskb);
 248                                        l2->down_id = MISDN_ID_NONE;
 249                                }
 250                        } else
 251                                l2->down_id = MISDN_ID_NONE;
 252                        if (ret) {
 253                                dev_kfree_skb(skb);
 254                                ret = 0;
 255                        }
 256                        if (l2->down_id == MISDN_ID_NONE) {
 257                                test_and_clear_bit(FLG_L1_NOTREADY, &l2->flag);
 258                                mISDN_FsmEvent(&l2->l2m, EV_L2_ACK_PULL, NULL);
 259                        }
 260                }
 261        }
 262        if (!test_and_set_bit(FLG_L1_NOTREADY, &l2->flag)) {
 263                nskb = skb_dequeue(&l2->down_queue);
 264                if (nskb) {
 265                        l2->down_id = mISDN_HEAD_ID(nskb);
 266                        if (l2down_skb(l2, nskb)) {
 267                                dev_kfree_skb(nskb);
 268                                l2->down_id = MISDN_ID_NONE;
 269                                test_and_clear_bit(FLG_L1_NOTREADY, &l2->flag);
 270                        }
 271                } else
 272                        test_and_clear_bit(FLG_L1_NOTREADY, &l2->flag);
 273        }
 274        return ret;
 275}
 276
 277static void
 278l2_timeout(struct FsmInst *fi, int event, void *arg)
 279{
 280        struct layer2 *l2 = fi->userdata;
 281        struct sk_buff *skb;
 282        struct mISDNhead *hh;
 283
 284        skb = mI_alloc_skb(0, GFP_ATOMIC);
 285        if (!skb) {
 286                printk(KERN_WARNING "%s: L2(%d,%d) nr:%x timer %s no skb\n",
 287                       mISDNDevName4ch(&l2->ch), l2->sapi, l2->tei,
 288                       l2->ch.nr, event == EV_L2_T200 ? "T200" : "T203");
 289                return;
 290        }
 291        hh = mISDN_HEAD_P(skb);
 292        hh->prim = event == EV_L2_T200 ? DL_TIMER200_IND : DL_TIMER203_IND;
 293        hh->id = l2->ch.nr;
 294        if (*debug & DEBUG_TIMER)
 295                printk(KERN_DEBUG "%s: L2(%d,%d) nr:%x timer %s expired\n",
 296                       mISDNDevName4ch(&l2->ch), l2->sapi, l2->tei,
 297                       l2->ch.nr, event == EV_L2_T200 ? "T200" : "T203");
 298        if (l2->ch.st)
 299                l2->ch.st->own.recv(&l2->ch.st->own, skb);
 300}
 301
 302static int
 303l2mgr(struct layer2 *l2, u_int prim, void *arg) {
 304        long c = (long)arg;
 305
 306        printk(KERN_WARNING "l2mgr: dev %s addr:%x prim %x %c\n",
 307               mISDNDevName4ch(&l2->ch), l2->id, prim, (char)c);
 308        if (test_bit(FLG_LAPD, &l2->flag) &&
 309            !test_bit(FLG_FIXED_TEI, &l2->flag)) {
 310                switch (c) {
 311                case 'C':
 312                case 'D':
 313                case 'G':
 314                case 'H':
 315                        l2_tei(l2, prim, (u_long)arg);
 316                        break;
 317                }
 318        }
 319        return 0;
 320}
 321
 322static void
 323set_peer_busy(struct layer2 *l2) {
 324        test_and_set_bit(FLG_PEER_BUSY, &l2->flag);
 325        if (skb_queue_len(&l2->i_queue) || skb_queue_len(&l2->ui_queue))
 326                test_and_set_bit(FLG_L2BLOCK, &l2->flag);
 327}
 328
 329static void
 330clear_peer_busy(struct layer2 *l2) {
 331        if (test_and_clear_bit(FLG_PEER_BUSY, &l2->flag))
 332                test_and_clear_bit(FLG_L2BLOCK, &l2->flag);
 333}
 334
 335static void
 336InitWin(struct layer2 *l2)
 337{
 338        int i;
 339
 340        for (i = 0; i < MAX_WINDOW; i++)
 341                l2->windowar[i] = NULL;
 342}
 343
 344static int
 345freewin(struct layer2 *l2)
 346{
 347        int i, cnt = 0;
 348
 349        for (i = 0; i < MAX_WINDOW; i++) {
 350                if (l2->windowar[i]) {
 351                        cnt++;
 352                        dev_kfree_skb(l2->windowar[i]);
 353                        l2->windowar[i] = NULL;
 354                }
 355        }
 356        return cnt;
 357}
 358
 359static void
 360ReleaseWin(struct layer2 *l2)
 361{
 362        int cnt = freewin(l2);
 363
 364        if (cnt)
 365                printk(KERN_WARNING
 366                       "isdnl2 freed %d skbuffs in release\n", cnt);
 367}
 368
 369inline unsigned int
 370cansend(struct layer2 *l2)
 371{
 372        unsigned int p1;
 373
 374        if (test_bit(FLG_MOD128, &l2->flag))
 375                p1 = (l2->vs - l2->va) % 128;
 376        else
 377                p1 = (l2->vs - l2->va) % 8;
 378        return (p1 < l2->window) && !test_bit(FLG_PEER_BUSY, &l2->flag);
 379}
 380
 381inline void
 382clear_exception(struct layer2 *l2)
 383{
 384        test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
 385        test_and_clear_bit(FLG_REJEXC, &l2->flag);
 386        test_and_clear_bit(FLG_OWN_BUSY, &l2->flag);
 387        clear_peer_busy(l2);
 388}
 389
 390static int
 391sethdraddr(struct layer2 *l2, u_char *header, int rsp)
 392{
 393        u_char *ptr = header;
 394        int crbit = rsp;
 395
 396        if (test_bit(FLG_LAPD, &l2->flag)) {
 397                if (test_bit(FLG_LAPD_NET, &l2->flag))
 398                        crbit = !crbit;
 399                *ptr++ = (l2->sapi << 2) | (crbit ? 2 : 0);
 400                *ptr++ = (l2->tei << 1) | 1;
 401                return 2;
 402        } else {
 403                if (test_bit(FLG_ORIG, &l2->flag))
 404                        crbit = !crbit;
 405                if (crbit)
 406                        *ptr++ = l2->addr.B;
 407                else
 408                        *ptr++ = l2->addr.A;
 409                return 1;
 410        }
 411}
 412
 413static inline void
 414enqueue_super(struct layer2 *l2, struct sk_buff *skb)
 415{
 416        if (l2down(l2, PH_DATA_REQ, l2_newid(l2), skb))
 417                dev_kfree_skb(skb);
 418}
 419
 420static inline void
 421enqueue_ui(struct layer2 *l2, struct sk_buff *skb)
 422{
 423        if (l2->tm)
 424                l2_tei(l2, MDL_STATUS_UI_IND, 0);
 425        if (l2down(l2, PH_DATA_REQ, l2_newid(l2), skb))
 426                dev_kfree_skb(skb);
 427}
 428
 429inline int
 430IsUI(u_char *data)
 431{
 432        return (data[0] & 0xef) == UI;
 433}
 434
 435inline int
 436IsUA(u_char *data)
 437{
 438        return (data[0] & 0xef) == UA;
 439}
 440
 441inline int
 442IsDM(u_char *data)
 443{
 444        return (data[0] & 0xef) == DM;
 445}
 446
 447inline int
 448IsDISC(u_char *data)
 449{
 450        return (data[0] & 0xef) == DISC;
 451}
 452
 453inline int
 454IsRR(u_char *data, struct layer2 *l2)
 455{
 456        if (test_bit(FLG_MOD128, &l2->flag))
 457                return data[0] == RR;
 458        else
 459                return (data[0] & 0xf) == 1;
 460}
 461
 462inline int
 463IsSFrame(u_char *data, struct layer2 *l2)
 464{
 465        register u_char d = *data;
 466
 467        if (!test_bit(FLG_MOD128, &l2->flag))
 468                d &= 0xf;
 469        return ((d & 0xf3) == 1) && ((d & 0x0c) != 0x0c);
 470}
 471
 472inline int
 473IsSABME(u_char *data, struct layer2 *l2)
 474{
 475        u_char d = data[0] & ~0x10;
 476
 477        return test_bit(FLG_MOD128, &l2->flag) ? d == SABME : d == SABM;
 478}
 479
 480inline int
 481IsREJ(u_char *data, struct layer2 *l2)
 482{
 483        return test_bit(FLG_MOD128, &l2->flag) ?
 484                data[0] == REJ : (data[0] & 0xf) == REJ;
 485}
 486
 487inline int
 488IsFRMR(u_char *data)
 489{
 490        return (data[0] & 0xef) == FRMR;
 491}
 492
 493inline int
 494IsRNR(u_char *data, struct layer2 *l2)
 495{
 496        return test_bit(FLG_MOD128, &l2->flag) ?
 497                data[0] == RNR : (data[0] & 0xf) == RNR;
 498}
 499
 500static int
 501iframe_error(struct layer2 *l2, struct sk_buff *skb)
 502{
 503        u_int   i;
 504        int     rsp = *skb->data & 0x2;
 505
 506        i = l2addrsize(l2) + (test_bit(FLG_MOD128, &l2->flag) ? 2 : 1);
 507        if (test_bit(FLG_ORIG, &l2->flag))
 508                rsp = !rsp;
 509        if (rsp)
 510                return 'L';
 511        if (skb->len < i)
 512                return 'N';
 513        if ((skb->len - i) > l2->maxlen)
 514                return 'O';
 515        return 0;
 516}
 517
 518static int
 519super_error(struct layer2 *l2, struct sk_buff *skb)
 520{
 521        if (skb->len != l2addrsize(l2) +
 522            (test_bit(FLG_MOD128, &l2->flag) ? 2 : 1))
 523                return 'N';
 524        return 0;
 525}
 526
 527static int
 528unnum_error(struct layer2 *l2, struct sk_buff *skb, int wantrsp)
 529{
 530        int rsp = (*skb->data & 0x2) >> 1;
 531        if (test_bit(FLG_ORIG, &l2->flag))
 532                rsp = !rsp;
 533        if (rsp != wantrsp)
 534                return 'L';
 535        if (skb->len != l2addrsize(l2) + 1)
 536                return 'N';
 537        return 0;
 538}
 539
 540static int
 541UI_error(struct layer2 *l2, struct sk_buff *skb)
 542{
 543        int rsp = *skb->data & 0x2;
 544        if (test_bit(FLG_ORIG, &l2->flag))
 545                rsp = !rsp;
 546        if (rsp)
 547                return 'L';
 548        if (skb->len > l2->maxlen + l2addrsize(l2) + 1)
 549                return 'O';
 550        return 0;
 551}
 552
 553static int
 554FRMR_error(struct layer2 *l2, struct sk_buff *skb)
 555{
 556        u_int   headers = l2addrsize(l2) + 1;
 557        u_char  *datap = skb->data + headers;
 558        int     rsp = *skb->data & 0x2;
 559
 560        if (test_bit(FLG_ORIG, &l2->flag))
 561                rsp = !rsp;
 562        if (!rsp)
 563                return 'L';
 564        if (test_bit(FLG_MOD128, &l2->flag)) {
 565                if (skb->len < headers + 5)
 566                        return 'N';
 567                else if (*debug & DEBUG_L2)
 568                        l2m_debug(&l2->l2m,
 569                                  "FRMR information %2x %2x %2x %2x %2x",
 570                                  datap[0], datap[1], datap[2], datap[3], datap[4]);
 571        } else {
 572                if (skb->len < headers + 3)
 573                        return 'N';
 574                else if (*debug & DEBUG_L2)
 575                        l2m_debug(&l2->l2m,
 576                                  "FRMR information %2x %2x %2x",
 577                                  datap[0], datap[1], datap[2]);
 578        }
 579        return 0;
 580}
 581
 582static unsigned int
 583legalnr(struct layer2 *l2, unsigned int nr)
 584{
 585        if (test_bit(FLG_MOD128, &l2->flag))
 586                return ((nr - l2->va) % 128) <= ((l2->vs - l2->va) % 128);
 587        else
 588                return ((nr - l2->va) % 8) <= ((l2->vs - l2->va) % 8);
 589}
 590
 591static void
 592setva(struct layer2 *l2, unsigned int nr)
 593{
 594        struct sk_buff  *skb;
 595
 596        while (l2->va != nr) {
 597                l2->va++;
 598                if (test_bit(FLG_MOD128, &l2->flag))
 599                        l2->va %= 128;
 600                else
 601                        l2->va %= 8;
 602                if (l2->windowar[l2->sow]) {
 603                        skb_trim(l2->windowar[l2->sow], 0);
 604                        skb_queue_tail(&l2->tmp_queue, l2->windowar[l2->sow]);
 605                        l2->windowar[l2->sow] = NULL;
 606                }
 607                l2->sow = (l2->sow + 1) % l2->window;
 608        }
 609        skb = skb_dequeue(&l2->tmp_queue);
 610        while (skb) {
 611                dev_kfree_skb(skb);
 612                skb = skb_dequeue(&l2->tmp_queue);
 613        }
 614}
 615
 616static void
 617send_uframe(struct layer2 *l2, struct sk_buff *skb, u_char cmd, u_char cr)
 618{
 619        u_char tmp[MAX_L2HEADER_LEN];
 620        int i;
 621
 622        i = sethdraddr(l2, tmp, cr);
 623        tmp[i++] = cmd;
 624        if (skb)
 625                skb_trim(skb, 0);
 626        else {
 627                skb = mI_alloc_skb(i, GFP_ATOMIC);
 628                if (!skb) {
 629                        printk(KERN_WARNING "%s: can't alloc skbuff in %s\n",
 630                               mISDNDevName4ch(&l2->ch), __func__);
 631                        return;
 632                }
 633        }
 634        skb_put_data(skb, tmp, i);
 635        enqueue_super(l2, skb);
 636}
 637
 638
 639inline u_char
 640get_PollFlag(struct layer2 *l2, struct sk_buff *skb)
 641{
 642        return skb->data[l2addrsize(l2)] & 0x10;
 643}
 644
 645inline u_char
 646get_PollFlagFree(struct layer2 *l2, struct sk_buff *skb)
 647{
 648        u_char PF;
 649
 650        PF = get_PollFlag(l2, skb);
 651        dev_kfree_skb(skb);
 652        return PF;
 653}
 654
 655inline void
 656start_t200(struct layer2 *l2, int i)
 657{
 658        mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, i);
 659        test_and_set_bit(FLG_T200_RUN, &l2->flag);
 660}
 661
 662inline void
 663restart_t200(struct layer2 *l2, int i)
 664{
 665        mISDN_FsmRestartTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, i);
 666        test_and_set_bit(FLG_T200_RUN, &l2->flag);
 667}
 668
 669inline void
 670stop_t200(struct layer2 *l2, int i)
 671{
 672        if (test_and_clear_bit(FLG_T200_RUN, &l2->flag))
 673                mISDN_FsmDelTimer(&l2->t200, i);
 674}
 675
 676inline void
 677st5_dl_release_l2l3(struct layer2 *l2)
 678{
 679        int pr;
 680
 681        if (test_and_clear_bit(FLG_PEND_REL, &l2->flag))
 682                pr = DL_RELEASE_CNF;
 683        else
 684                pr = DL_RELEASE_IND;
 685        l2up_create(l2, pr, 0, NULL);
 686}
 687
 688inline void
 689lapb_dl_release_l2l3(struct layer2 *l2, int f)
 690{
 691        if (test_bit(FLG_LAPB, &l2->flag))
 692                l2down_create(l2, PH_DEACTIVATE_REQ, l2_newid(l2), 0, NULL);
 693        l2up_create(l2, f, 0, NULL);
 694}
 695
 696static void
 697establishlink(struct FsmInst *fi)
 698{
 699        struct layer2 *l2 = fi->userdata;
 700        u_char cmd;
 701
 702        clear_exception(l2);
 703        l2->rc = 0;
 704        cmd = (test_bit(FLG_MOD128, &l2->flag) ? SABME : SABM) | 0x10;
 705        send_uframe(l2, NULL, cmd, CMD);
 706        mISDN_FsmDelTimer(&l2->t203, 1);
 707        restart_t200(l2, 1);
 708        test_and_clear_bit(FLG_PEND_REL, &l2->flag);
 709        freewin(l2);
 710        mISDN_FsmChangeState(fi, ST_L2_5);
 711}
 712
 713static void
 714l2_mdl_error_ua(struct FsmInst *fi, int event, void *arg)
 715{
 716        struct sk_buff *skb = arg;
 717        struct layer2 *l2 = fi->userdata;
 718
 719        if (get_PollFlagFree(l2, skb))
 720                l2mgr(l2, MDL_ERROR_IND, (void *) 'C');
 721        else
 722                l2mgr(l2, MDL_ERROR_IND, (void *) 'D');
 723
 724}
 725
 726static void
 727l2_mdl_error_dm(struct FsmInst *fi, int event, void *arg)
 728{
 729        struct sk_buff *skb = arg;
 730        struct layer2 *l2 = fi->userdata;
 731
 732        if (get_PollFlagFree(l2, skb))
 733                l2mgr(l2, MDL_ERROR_IND, (void *) 'B');
 734        else {
 735                l2mgr(l2, MDL_ERROR_IND, (void *) 'E');
 736                establishlink(fi);
 737                test_and_clear_bit(FLG_L3_INIT, &l2->flag);
 738        }
 739}
 740
 741static void
 742l2_st8_mdl_error_dm(struct FsmInst *fi, int event, void *arg)
 743{
 744        struct sk_buff *skb = arg;
 745        struct layer2 *l2 = fi->userdata;
 746
 747        if (get_PollFlagFree(l2, skb))
 748                l2mgr(l2, MDL_ERROR_IND, (void *) 'B');
 749        else
 750                l2mgr(l2, MDL_ERROR_IND, (void *) 'E');
 751        establishlink(fi);
 752        test_and_clear_bit(FLG_L3_INIT, &l2->flag);
 753}
 754
 755static void
 756l2_go_st3(struct FsmInst *fi, int event, void *arg)
 757{
 758        dev_kfree_skb((struct sk_buff *)arg);
 759        mISDN_FsmChangeState(fi, ST_L2_3);
 760}
 761
 762static void
 763l2_mdl_assign(struct FsmInst *fi, int event, void *arg)
 764{
 765        struct layer2   *l2 = fi->userdata;
 766
 767        mISDN_FsmChangeState(fi, ST_L2_3);
 768        dev_kfree_skb((struct sk_buff *)arg);
 769        l2_tei(l2, MDL_ASSIGN_IND, 0);
 770}
 771
 772static void
 773l2_queue_ui_assign(struct FsmInst *fi, int event, void *arg)
 774{
 775        struct layer2 *l2 = fi->userdata;
 776        struct sk_buff *skb = arg;
 777
 778        skb_queue_tail(&l2->ui_queue, skb);
 779        mISDN_FsmChangeState(fi, ST_L2_2);
 780        l2_tei(l2, MDL_ASSIGN_IND, 0);
 781}
 782
 783static void
 784l2_queue_ui(struct FsmInst *fi, int event, void *arg)
 785{
 786        struct layer2 *l2 = fi->userdata;
 787        struct sk_buff *skb = arg;
 788
 789        skb_queue_tail(&l2->ui_queue, skb);
 790}
 791
 792static void
 793tx_ui(struct layer2 *l2)
 794{
 795        struct sk_buff *skb;
 796        u_char header[MAX_L2HEADER_LEN];
 797        int i;
 798
 799        i = sethdraddr(l2, header, CMD);
 800        if (test_bit(FLG_LAPD_NET, &l2->flag))
 801                header[1] = 0xff; /* tei 127 */
 802        header[i++] = UI;
 803        while ((skb = skb_dequeue(&l2->ui_queue))) {
 804                memcpy(skb_push(skb, i), header, i);
 805                enqueue_ui(l2, skb);
 806        }
 807}
 808
 809static void
 810l2_send_ui(struct FsmInst *fi, int event, void *arg)
 811{
 812        struct layer2 *l2 = fi->userdata;
 813        struct sk_buff *skb = arg;
 814
 815        skb_queue_tail(&l2->ui_queue, skb);
 816        tx_ui(l2);
 817}
 818
 819static void
 820l2_got_ui(struct FsmInst *fi, int event, void *arg)
 821{
 822        struct layer2 *l2 = fi->userdata;
 823        struct sk_buff *skb = arg;
 824
 825        skb_pull(skb, l2headersize(l2, 1));
 826/*
 827 *              in states 1-3 for broadcast
 828 */
 829
 830        if (l2->tm)
 831                l2_tei(l2, MDL_STATUS_UI_IND, 0);
 832        l2up(l2, DL_UNITDATA_IND, skb);
 833}
 834
 835static void
 836l2_establish(struct FsmInst *fi, int event, void *arg)
 837{
 838        struct sk_buff *skb = arg;
 839        struct layer2 *l2 = fi->userdata;
 840
 841        establishlink(fi);
 842        test_and_set_bit(FLG_L3_INIT, &l2->flag);
 843        dev_kfree_skb(skb);
 844}
 845
 846static void
 847l2_discard_i_setl3(struct FsmInst *fi, int event, void *arg)
 848{
 849        struct sk_buff *skb = arg;
 850        struct layer2 *l2 = fi->userdata;
 851
 852        skb_queue_purge(&l2->i_queue);
 853        test_and_set_bit(FLG_L3_INIT, &l2->flag);
 854        test_and_clear_bit(FLG_PEND_REL, &l2->flag);
 855        dev_kfree_skb(skb);
 856}
 857
 858static void
 859l2_l3_reestablish(struct FsmInst *fi, int event, void *arg)
 860{
 861        struct sk_buff *skb = arg;
 862        struct layer2 *l2 = fi->userdata;
 863
 864        skb_queue_purge(&l2->i_queue);
 865        establishlink(fi);
 866        test_and_set_bit(FLG_L3_INIT, &l2->flag);
 867        dev_kfree_skb(skb);
 868}
 869
 870static void
 871l2_release(struct FsmInst *fi, int event, void *arg)
 872{
 873        struct layer2 *l2 = fi->userdata;
 874        struct sk_buff *skb = arg;
 875
 876        skb_trim(skb, 0);
 877        l2up(l2, DL_RELEASE_CNF, skb);
 878}
 879
 880static void
 881l2_pend_rel(struct FsmInst *fi, int event, void *arg)
 882{
 883        struct sk_buff *skb = arg;
 884        struct layer2 *l2 = fi->userdata;
 885
 886        test_and_set_bit(FLG_PEND_REL, &l2->flag);
 887        dev_kfree_skb(skb);
 888}
 889
 890static void
 891l2_disconnect(struct FsmInst *fi, int event, void *arg)
 892{
 893        struct layer2 *l2 = fi->userdata;
 894        struct sk_buff *skb = arg;
 895
 896        skb_queue_purge(&l2->i_queue);
 897        freewin(l2);
 898        mISDN_FsmChangeState(fi, ST_L2_6);
 899        l2->rc = 0;
 900        send_uframe(l2, NULL, DISC | 0x10, CMD);
 901        mISDN_FsmDelTimer(&l2->t203, 1);
 902        restart_t200(l2, 2);
 903        dev_kfree_skb(skb);
 904}
 905
 906static void
 907l2_start_multi(struct FsmInst *fi, int event, void *arg)
 908{
 909        struct layer2   *l2 = fi->userdata;
 910        struct sk_buff  *skb = arg;
 911
 912        l2->vs = 0;
 913        l2->va = 0;
 914        l2->vr = 0;
 915        l2->sow = 0;
 916        clear_exception(l2);
 917        send_uframe(l2, NULL, UA | get_PollFlag(l2, skb), RSP);
 918        mISDN_FsmChangeState(fi, ST_L2_7);
 919        mISDN_FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 3);
 920        skb_trim(skb, 0);
 921        l2up(l2, DL_ESTABLISH_IND, skb);
 922        if (l2->tm)
 923                l2_tei(l2, MDL_STATUS_UP_IND, 0);
 924}
 925
 926static void
 927l2_send_UA(struct FsmInst *fi, int event, void *arg)
 928{
 929        struct layer2 *l2 = fi->userdata;
 930        struct sk_buff *skb = arg;
 931
 932        send_uframe(l2, skb, UA | get_PollFlag(l2, skb), RSP);
 933}
 934
 935static void
 936l2_send_DM(struct FsmInst *fi, int event, void *arg)
 937{
 938        struct layer2 *l2 = fi->userdata;
 939        struct sk_buff *skb = arg;
 940
 941        send_uframe(l2, skb, DM | get_PollFlag(l2, skb), RSP);
 942}
 943
 944static void
 945l2_restart_multi(struct FsmInst *fi, int event, void *arg)
 946{
 947        struct layer2   *l2 = fi->userdata;
 948        struct sk_buff  *skb = arg;
 949        int             est = 0;
 950
 951        send_uframe(l2, skb, UA | get_PollFlag(l2, skb), RSP);
 952
 953        l2mgr(l2, MDL_ERROR_IND, (void *) 'F');
 954
 955        if (l2->vs != l2->va) {
 956                skb_queue_purge(&l2->i_queue);
 957                est = 1;
 958        }
 959
 960        clear_exception(l2);
 961        l2->vs = 0;
 962        l2->va = 0;
 963        l2->vr = 0;
 964        l2->sow = 0;
 965        mISDN_FsmChangeState(fi, ST_L2_7);
 966        stop_t200(l2, 3);
 967        mISDN_FsmRestartTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 3);
 968
 969        if (est)
 970                l2up_create(l2, DL_ESTABLISH_IND, 0, NULL);
 971/*              mISDN_queue_data(&l2->inst, l2->inst.id | MSG_BROADCAST,
 972 *                  MGR_SHORTSTATUS | INDICATION, SSTATUS_L2_ESTABLISHED,
 973 *                  0, NULL, 0);
 974 */
 975        if (skb_queue_len(&l2->i_queue) && cansend(l2))
 976                mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL);
 977}
 978
 979static void
 980l2_stop_multi(struct FsmInst *fi, int event, void *arg)
 981{
 982        struct layer2   *l2 = fi->userdata;
 983        struct sk_buff  *skb = arg;
 984
 985        mISDN_FsmChangeState(fi, ST_L2_4);
 986        mISDN_FsmDelTimer(&l2->t203, 3);
 987        stop_t200(l2, 4);
 988
 989        send_uframe(l2, skb, UA | get_PollFlag(l2, skb), RSP);
 990        skb_queue_purge(&l2->i_queue);
 991        freewin(l2);
 992        lapb_dl_release_l2l3(l2, DL_RELEASE_IND);
 993        if (l2->tm)
 994                l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
 995}
 996
 997static void
 998l2_connected(struct FsmInst *fi, int event, void *arg)
 999{
1000        struct layer2   *l2 = fi->userdata;
1001        struct sk_buff  *skb = arg;
1002        int pr = -1;
1003
1004        if (!get_PollFlag(l2, skb)) {
1005                l2_mdl_error_ua(fi, event, arg);
1006                return;
1007        }
1008        dev_kfree_skb(skb);
1009        if (test_and_clear_bit(FLG_PEND_REL, &l2->flag))
1010                l2_disconnect(fi, event, NULL);
1011        if (test_and_clear_bit(FLG_L3_INIT, &l2->flag)) {
1012                pr = DL_ESTABLISH_CNF;
1013        } else if (l2->vs != l2->va) {
1014                skb_queue_purge(&l2->i_queue);
1015                pr = DL_ESTABLISH_IND;
1016        }
1017        stop_t200(l2, 5);
1018        l2->vr = 0;
1019        l2->vs = 0;
1020        l2->va = 0;
1021        l2->sow = 0;
1022        mISDN_FsmChangeState(fi, ST_L2_7);
1023        mISDN_FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 4);
1024        if (pr != -1)
1025                l2up_create(l2, pr, 0, NULL);
1026
1027        if (skb_queue_len(&l2->i_queue) && cansend(l2))
1028                mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL);
1029
1030        if (l2->tm)
1031                l2_tei(l2, MDL_STATUS_UP_IND, 0);
1032}
1033
1034static void
1035l2_released(struct FsmInst *fi, int event, void *arg)
1036{
1037        struct layer2 *l2 = fi->userdata;
1038        struct sk_buff *skb = arg;
1039
1040        if (!get_PollFlag(l2, skb)) {
1041                l2_mdl_error_ua(fi, event, arg);
1042                return;
1043        }
1044        dev_kfree_skb(skb);
1045        stop_t200(l2, 6);
1046        lapb_dl_release_l2l3(l2, DL_RELEASE_CNF);
1047        mISDN_FsmChangeState(fi, ST_L2_4);
1048        if (l2->tm)
1049                l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1050}
1051
1052static void
1053l2_reestablish(struct FsmInst *fi, int event, void *arg)
1054{
1055        struct layer2 *l2 = fi->userdata;
1056        struct sk_buff *skb = arg;
1057
1058        if (!get_PollFlagFree(l2, skb)) {
1059                establishlink(fi);
1060                test_and_set_bit(FLG_L3_INIT, &l2->flag);
1061        }
1062}
1063
1064static void
1065l2_st5_dm_release(struct FsmInst *fi, int event, void *arg)
1066{
1067        struct layer2 *l2 = fi->userdata;
1068        struct sk_buff *skb = arg;
1069
1070        if (get_PollFlagFree(l2, skb)) {
1071                stop_t200(l2, 7);
1072                if (!test_bit(FLG_L3_INIT, &l2->flag))
1073                        skb_queue_purge(&l2->i_queue);
1074                if (test_bit(FLG_LAPB, &l2->flag))
1075                        l2down_create(l2, PH_DEACTIVATE_REQ,
1076                                      l2_newid(l2), 0, NULL);
1077                st5_dl_release_l2l3(l2);
1078                mISDN_FsmChangeState(fi, ST_L2_4);
1079                if (l2->tm)
1080                        l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1081        }
1082}
1083
1084static void
1085l2_st6_dm_release(struct FsmInst *fi, int event, void *arg)
1086{
1087        struct layer2 *l2 = fi->userdata;
1088        struct sk_buff *skb = arg;
1089
1090        if (get_PollFlagFree(l2, skb)) {
1091                stop_t200(l2, 8);
1092                lapb_dl_release_l2l3(l2, DL_RELEASE_CNF);
1093                mISDN_FsmChangeState(fi, ST_L2_4);
1094                if (l2->tm)
1095                        l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1096        }
1097}
1098
1099static void
1100enquiry_cr(struct layer2 *l2, u_char typ, u_char cr, u_char pf)
1101{
1102        struct sk_buff *skb;
1103        u_char tmp[MAX_L2HEADER_LEN];
1104        int i;
1105
1106        i = sethdraddr(l2, tmp, cr);
1107        if (test_bit(FLG_MOD128, &l2->flag)) {
1108                tmp[i++] = typ;
1109                tmp[i++] = (l2->vr << 1) | (pf ? 1 : 0);
1110        } else
1111                tmp[i++] = (l2->vr << 5) | typ | (pf ? 0x10 : 0);
1112        skb = mI_alloc_skb(i, GFP_ATOMIC);
1113        if (!skb) {
1114                printk(KERN_WARNING "%s: isdnl2 can't alloc sbbuff in %s\n",
1115                       mISDNDevName4ch(&l2->ch), __func__);
1116                return;
1117        }
1118        skb_put_data(skb, tmp, i);
1119        enqueue_super(l2, skb);
1120}
1121
1122inline void
1123enquiry_response(struct layer2 *l2)
1124{
1125        if (test_bit(FLG_OWN_BUSY, &l2->flag))
1126                enquiry_cr(l2, RNR, RSP, 1);
1127        else
1128                enquiry_cr(l2, RR, RSP, 1);
1129        test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
1130}
1131
1132inline void
1133transmit_enquiry(struct layer2 *l2)
1134{
1135        if (test_bit(FLG_OWN_BUSY, &l2->flag))
1136                enquiry_cr(l2, RNR, CMD, 1);
1137        else
1138                enquiry_cr(l2, RR, CMD, 1);
1139        test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
1140        start_t200(l2, 9);
1141}
1142
1143
1144static void
1145nrerrorrecovery(struct FsmInst *fi)
1146{
1147        struct layer2 *l2 = fi->userdata;
1148
1149        l2mgr(l2, MDL_ERROR_IND, (void *) 'J');
1150        establishlink(fi);
1151        test_and_clear_bit(FLG_L3_INIT, &l2->flag);
1152}
1153
1154static void
1155invoke_retransmission(struct layer2 *l2, unsigned int nr)
1156{
1157        u_int   p1;
1158
1159        if (l2->vs != nr) {
1160                while (l2->vs != nr) {
1161                        (l2->vs)--;
1162                        if (test_bit(FLG_MOD128, &l2->flag)) {
1163                                l2->vs %= 128;
1164                                p1 = (l2->vs - l2->va) % 128;
1165                        } else {
1166                                l2->vs %= 8;
1167                                p1 = (l2->vs - l2->va) % 8;
1168                        }
1169                        p1 = (p1 + l2->sow) % l2->window;
1170                        if (l2->windowar[p1])
1171                                skb_queue_head(&l2->i_queue, l2->windowar[p1]);
1172                        else
1173                                printk(KERN_WARNING
1174                                       "%s: windowar[%d] is NULL\n",
1175                                       mISDNDevName4ch(&l2->ch), p1);
1176                        l2->windowar[p1] = NULL;
1177                }
1178                mISDN_FsmEvent(&l2->l2m, EV_L2_ACK_PULL, NULL);
1179        }
1180}
1181
1182static void
1183l2_st7_got_super(struct FsmInst *fi, int event, void *arg)
1184{
1185        struct layer2 *l2 = fi->userdata;
1186        struct sk_buff *skb = arg;
1187        int PollFlag, rsp, typ = RR;
1188        unsigned int nr;
1189
1190        rsp = *skb->data & 0x2;
1191        if (test_bit(FLG_ORIG, &l2->flag))
1192                rsp = !rsp;
1193
1194        skb_pull(skb, l2addrsize(l2));
1195        if (IsRNR(skb->data, l2)) {
1196                set_peer_busy(l2);
1197                typ = RNR;
1198        } else
1199                clear_peer_busy(l2);
1200        if (IsREJ(skb->data, l2))
1201                typ = REJ;
1202
1203        if (test_bit(FLG_MOD128, &l2->flag)) {
1204                PollFlag = (skb->data[1] & 0x1) == 0x1;
1205                nr = skb->data[1] >> 1;
1206        } else {
1207                PollFlag = (skb->data[0] & 0x10);
1208                nr = (skb->data[0] >> 5) & 0x7;
1209        }
1210        dev_kfree_skb(skb);
1211
1212        if (PollFlag) {
1213                if (rsp)
1214                        l2mgr(l2, MDL_ERROR_IND, (void *) 'A');
1215                else
1216                        enquiry_response(l2);
1217        }
1218        if (legalnr(l2, nr)) {
1219                if (typ == REJ) {
1220                        setva(l2, nr);
1221                        invoke_retransmission(l2, nr);
1222                        stop_t200(l2, 10);
1223                        if (mISDN_FsmAddTimer(&l2->t203, l2->T203,
1224                                              EV_L2_T203, NULL, 6))
1225                                l2m_debug(&l2->l2m, "Restart T203 ST7 REJ");
1226                } else if ((nr == l2->vs) && (typ == RR)) {
1227                        setva(l2, nr);
1228                        stop_t200(l2, 11);
1229                        mISDN_FsmRestartTimer(&l2->t203, l2->T203,
1230                                              EV_L2_T203, NULL, 7);
1231                } else if ((l2->va != nr) || (typ == RNR)) {
1232                        setva(l2, nr);
1233                        if (typ != RR)
1234                                mISDN_FsmDelTimer(&l2->t203, 9);
1235                        restart_t200(l2, 12);
1236                }
1237                if (skb_queue_len(&l2->i_queue) && (typ == RR))
1238                        mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL);
1239        } else
1240                nrerrorrecovery(fi);
1241}
1242
1243static void
1244l2_feed_i_if_reest(struct FsmInst *fi, int event, void *arg)
1245{
1246        struct layer2 *l2 = fi->userdata;
1247        struct sk_buff *skb = arg;
1248
1249        if (!test_bit(FLG_L3_INIT, &l2->flag))
1250                skb_queue_tail(&l2->i_queue, skb);
1251        else
1252                dev_kfree_skb(skb);
1253}
1254
1255static void
1256l2_feed_i_pull(struct FsmInst *fi, int event, void *arg)
1257{
1258        struct layer2 *l2 = fi->userdata;
1259        struct sk_buff *skb = arg;
1260
1261        skb_queue_tail(&l2->i_queue, skb);
1262        mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL);
1263}
1264
1265static void
1266l2_feed_iqueue(struct FsmInst *fi, int event, void *arg)
1267{
1268        struct layer2 *l2 = fi->userdata;
1269        struct sk_buff *skb = arg;
1270
1271        skb_queue_tail(&l2->i_queue, skb);
1272}
1273
1274static void
1275l2_got_iframe(struct FsmInst *fi, int event, void *arg)
1276{
1277        struct layer2   *l2 = fi->userdata;
1278        struct sk_buff  *skb = arg;
1279        int             PollFlag, i;
1280        u_int           ns, nr;
1281
1282        i = l2addrsize(l2);
1283        if (test_bit(FLG_MOD128, &l2->flag)) {
1284                PollFlag = ((skb->data[i + 1] & 0x1) == 0x1);
1285                ns = skb->data[i] >> 1;
1286                nr = (skb->data[i + 1] >> 1) & 0x7f;
1287        } else {
1288                PollFlag = (skb->data[i] & 0x10);
1289                ns = (skb->data[i] >> 1) & 0x7;
1290                nr = (skb->data[i] >> 5) & 0x7;
1291        }
1292        if (test_bit(FLG_OWN_BUSY, &l2->flag)) {
1293                dev_kfree_skb(skb);
1294                if (PollFlag)
1295                        enquiry_response(l2);
1296        } else {
1297                if (l2->vr == ns) {
1298                        l2->vr++;
1299                        if (test_bit(FLG_MOD128, &l2->flag))
1300                                l2->vr %= 128;
1301                        else
1302                                l2->vr %= 8;
1303                        test_and_clear_bit(FLG_REJEXC, &l2->flag);
1304                        if (PollFlag)
1305                                enquiry_response(l2);
1306                        else
1307                                test_and_set_bit(FLG_ACK_PEND, &l2->flag);
1308                        skb_pull(skb, l2headersize(l2, 0));
1309                        l2up(l2, DL_DATA_IND, skb);
1310                } else {
1311                        /* n(s)!=v(r) */
1312                        dev_kfree_skb(skb);
1313                        if (test_and_set_bit(FLG_REJEXC, &l2->flag)) {
1314                                if (PollFlag)
1315                                        enquiry_response(l2);
1316                        } else {
1317                                enquiry_cr(l2, REJ, RSP, PollFlag);
1318                                test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
1319                        }
1320                }
1321        }
1322        if (legalnr(l2, nr)) {
1323                if (!test_bit(FLG_PEER_BUSY, &l2->flag) &&
1324                    (fi->state == ST_L2_7)) {
1325                        if (nr == l2->vs) {
1326                                stop_t200(l2, 13);
1327                                mISDN_FsmRestartTimer(&l2->t203, l2->T203,
1328                                                      EV_L2_T203, NULL, 7);
1329                        } else if (nr != l2->va)
1330                                restart_t200(l2, 14);
1331                }
1332                setva(l2, nr);
1333        } else {
1334                nrerrorrecovery(fi);
1335                return;
1336        }
1337        if (skb_queue_len(&l2->i_queue) && (fi->state == ST_L2_7))
1338                mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL);
1339        if (test_and_clear_bit(FLG_ACK_PEND, &l2->flag))
1340                enquiry_cr(l2, RR, RSP, 0);
1341}
1342
1343static void
1344l2_got_tei(struct FsmInst *fi, int event, void *arg)
1345{
1346        struct layer2   *l2 = fi->userdata;
1347        u_int           info;
1348
1349        l2->tei = (signed char)(long)arg;
1350        set_channel_address(&l2->ch, l2->sapi, l2->tei);
1351        info = DL_INFO_L2_CONNECT;
1352        l2up_create(l2, DL_INFORMATION_IND, sizeof(info), &info);
1353        if (fi->state == ST_L2_3) {
1354                establishlink(fi);
1355                test_and_set_bit(FLG_L3_INIT, &l2->flag);
1356        } else
1357                mISDN_FsmChangeState(fi, ST_L2_4);
1358        if (skb_queue_len(&l2->ui_queue))
1359                tx_ui(l2);
1360}
1361
1362static void
1363l2_st5_tout_200(struct FsmInst *fi, int event, void *arg)
1364{
1365        struct layer2 *l2 = fi->userdata;
1366
1367        if (test_bit(FLG_LAPD, &l2->flag) &&
1368            test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
1369                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
1370        } else if (l2->rc == l2->N200) {
1371                mISDN_FsmChangeState(fi, ST_L2_4);
1372                test_and_clear_bit(FLG_T200_RUN, &l2->flag);
1373                skb_queue_purge(&l2->i_queue);
1374                l2mgr(l2, MDL_ERROR_IND, (void *) 'G');
1375                if (test_bit(FLG_LAPB, &l2->flag))
1376                        l2down_create(l2, PH_DEACTIVATE_REQ,
1377                                      l2_newid(l2), 0, NULL);
1378                st5_dl_release_l2l3(l2);
1379                if (l2->tm)
1380                        l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1381        } else {
1382                l2->rc++;
1383                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
1384                send_uframe(l2, NULL, (test_bit(FLG_MOD128, &l2->flag) ?
1385                                       SABME : SABM) | 0x10, CMD);
1386        }
1387}
1388
1389static void
1390l2_st6_tout_200(struct FsmInst *fi, int event, void *arg)
1391{
1392        struct layer2 *l2 = fi->userdata;
1393
1394        if (test_bit(FLG_LAPD, &l2->flag) &&
1395            test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
1396                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
1397        } else if (l2->rc == l2->N200) {
1398                mISDN_FsmChangeState(fi, ST_L2_4);
1399                test_and_clear_bit(FLG_T200_RUN, &l2->flag);
1400                l2mgr(l2, MDL_ERROR_IND, (void *) 'H');
1401                lapb_dl_release_l2l3(l2, DL_RELEASE_CNF);
1402                if (l2->tm)
1403                        l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1404        } else {
1405                l2->rc++;
1406                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200,
1407                                  NULL, 9);
1408                send_uframe(l2, NULL, DISC | 0x10, CMD);
1409        }
1410}
1411
1412static void
1413l2_st7_tout_200(struct FsmInst *fi, int event, void *arg)
1414{
1415        struct layer2 *l2 = fi->userdata;
1416
1417        if (test_bit(FLG_LAPD, &l2->flag) &&
1418            test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
1419                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
1420                return;
1421        }
1422        test_and_clear_bit(FLG_T200_RUN, &l2->flag);
1423        l2->rc = 0;
1424        mISDN_FsmChangeState(fi, ST_L2_8);
1425        transmit_enquiry(l2);
1426        l2->rc++;
1427}
1428
1429static void
1430l2_st8_tout_200(struct FsmInst *fi, int event, void *arg)
1431{
1432        struct layer2 *l2 = fi->userdata;
1433
1434        if (test_bit(FLG_LAPD, &l2->flag) &&
1435            test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
1436                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 9);
1437                return;
1438        }
1439        test_and_clear_bit(FLG_T200_RUN, &l2->flag);
1440        if (l2->rc == l2->N200) {
1441                l2mgr(l2, MDL_ERROR_IND, (void *) 'I');
1442                establishlink(fi);
1443                test_and_clear_bit(FLG_L3_INIT, &l2->flag);
1444        } else {
1445                transmit_enquiry(l2);
1446                l2->rc++;
1447        }
1448}
1449
1450static void
1451l2_st7_tout_203(struct FsmInst *fi, int event, void *arg)
1452{
1453        struct layer2 *l2 = fi->userdata;
1454
1455        if (test_bit(FLG_LAPD, &l2->flag) &&
1456            test_bit(FLG_DCHAN_BUSY, &l2->flag)) {
1457                mISDN_FsmAddTimer(&l2->t203, l2->T203, EV_L2_T203, NULL, 9);
1458                return;
1459        }
1460        mISDN_FsmChangeState(fi, ST_L2_8);
1461        transmit_enquiry(l2);
1462        l2->rc = 0;
1463}
1464
1465static void
1466l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
1467{
1468        struct layer2   *l2 = fi->userdata;
1469        struct sk_buff  *skb, *nskb;
1470        u_char          header[MAX_L2HEADER_LEN];
1471        u_int           i, p1;
1472
1473        if (!cansend(l2))
1474                return;
1475
1476        skb = skb_dequeue(&l2->i_queue);
1477        if (!skb)
1478                return;
1479        i = sethdraddr(l2, header, CMD);
1480        if (test_bit(FLG_MOD128, &l2->flag)) {
1481                header[i++] = l2->vs << 1;
1482                header[i++] = l2->vr << 1;
1483        } else
1484                header[i++] = (l2->vr << 5) | (l2->vs << 1);
1485        nskb = skb_realloc_headroom(skb, i);
1486        if (!nskb) {
1487                printk(KERN_WARNING "%s: no headroom(%d) copy for IFrame\n",
1488                       mISDNDevName4ch(&l2->ch), i);
1489                skb_queue_head(&l2->i_queue, skb);
1490                return;
1491        }
1492        if (test_bit(FLG_MOD128, &l2->flag)) {
1493                p1 = (l2->vs - l2->va) % 128;
1494                l2->vs = (l2->vs + 1) % 128;
1495        } else {
1496                p1 = (l2->vs - l2->va) % 8;
1497                l2->vs = (l2->vs + 1) % 8;
1498        }
1499        p1 = (p1 + l2->sow) % l2->window;
1500        if (l2->windowar[p1]) {
1501                printk(KERN_WARNING "%s: l2 try overwrite ack queue entry %d\n",
1502                       mISDNDevName4ch(&l2->ch), p1);
1503                dev_kfree_skb(l2->windowar[p1]);
1504        }
1505        l2->windowar[p1] = skb;
1506        memcpy(skb_push(nskb, i), header, i);
1507        l2down(l2, PH_DATA_REQ, l2_newid(l2), nskb);
1508        test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
1509        if (!test_and_set_bit(FLG_T200_RUN, &l2->flag)) {
1510                mISDN_FsmDelTimer(&l2->t203, 13);
1511                mISDN_FsmAddTimer(&l2->t200, l2->T200, EV_L2_T200, NULL, 11);
1512        }
1513}
1514
1515static void
1516l2_st8_got_super(struct FsmInst *fi, int event, void *arg)
1517{
1518        struct layer2 *l2 = fi->userdata;
1519        struct sk_buff *skb = arg;
1520        int PollFlag, rsp, rnr = 0;
1521        unsigned int nr;
1522
1523        rsp = *skb->data & 0x2;
1524        if (test_bit(FLG_ORIG, &l2->flag))
1525                rsp = !rsp;
1526
1527        skb_pull(skb, l2addrsize(l2));
1528
1529        if (IsRNR(skb->data, l2)) {
1530                set_peer_busy(l2);
1531                rnr = 1;
1532        } else
1533                clear_peer_busy(l2);
1534
1535        if (test_bit(FLG_MOD128, &l2->flag)) {
1536                PollFlag = (skb->data[1] & 0x1) == 0x1;
1537                nr = skb->data[1] >> 1;
1538        } else {
1539                PollFlag = (skb->data[0] & 0x10);
1540                nr = (skb->data[0] >> 5) & 0x7;
1541        }
1542        dev_kfree_skb(skb);
1543        if (rsp && PollFlag) {
1544                if (legalnr(l2, nr)) {
1545                        if (rnr) {
1546                                restart_t200(l2, 15);
1547                        } else {
1548                                stop_t200(l2, 16);
1549                                mISDN_FsmAddTimer(&l2->t203, l2->T203,
1550                                                  EV_L2_T203, NULL, 5);
1551                                setva(l2, nr);
1552                        }
1553                        invoke_retransmission(l2, nr);
1554                        mISDN_FsmChangeState(fi, ST_L2_7);
1555                        if (skb_queue_len(&l2->i_queue) && cansend(l2))
1556                                mISDN_FsmEvent(fi, EV_L2_ACK_PULL, NULL);
1557                } else
1558                        nrerrorrecovery(fi);
1559        } else {
1560                if (!rsp && PollFlag)
1561                        enquiry_response(l2);
1562                if (legalnr(l2, nr))
1563                        setva(l2, nr);
1564                else
1565                        nrerrorrecovery(fi);
1566        }
1567}
1568
1569static void
1570l2_got_FRMR(struct FsmInst *fi, int event, void *arg)
1571{
1572        struct layer2 *l2 = fi->userdata;
1573        struct sk_buff *skb = arg;
1574
1575        skb_pull(skb, l2addrsize(l2) + 1);
1576
1577        if (!(skb->data[0] & 1) || ((skb->data[0] & 3) == 1) || /* I or S */
1578            (IsUA(skb->data) && (fi->state == ST_L2_7))) {
1579                l2mgr(l2, MDL_ERROR_IND, (void *) 'K');
1580                establishlink(fi);
1581                test_and_clear_bit(FLG_L3_INIT, &l2->flag);
1582        }
1583        dev_kfree_skb(skb);
1584}
1585
1586static void
1587l2_st24_tei_remove(struct FsmInst *fi, int event, void *arg)
1588{
1589        struct layer2 *l2 = fi->userdata;
1590
1591        skb_queue_purge(&l2->ui_queue);
1592        l2->tei = GROUP_TEI;
1593        mISDN_FsmChangeState(fi, ST_L2_1);
1594}
1595
1596static void
1597l2_st3_tei_remove(struct FsmInst *fi, int event, void *arg)
1598{
1599        struct layer2 *l2 = fi->userdata;
1600
1601        skb_queue_purge(&l2->ui_queue);
1602        l2->tei = GROUP_TEI;
1603        l2up_create(l2, DL_RELEASE_IND, 0, NULL);
1604        mISDN_FsmChangeState(fi, ST_L2_1);
1605}
1606
1607static void
1608l2_st5_tei_remove(struct FsmInst *fi, int event, void *arg)
1609{
1610        struct layer2 *l2 = fi->userdata;
1611
1612        skb_queue_purge(&l2->i_queue);
1613        skb_queue_purge(&l2->ui_queue);
1614        freewin(l2);
1615        l2->tei = GROUP_TEI;
1616        stop_t200(l2, 17);
1617        st5_dl_release_l2l3(l2);
1618        mISDN_FsmChangeState(fi, ST_L2_1);
1619}
1620
1621static void
1622l2_st6_tei_remove(struct FsmInst *fi, int event, void *arg)
1623{
1624        struct layer2 *l2 = fi->userdata;
1625
1626        skb_queue_purge(&l2->ui_queue);
1627        l2->tei = GROUP_TEI;
1628        stop_t200(l2, 18);
1629        l2up_create(l2, DL_RELEASE_IND, 0, NULL);
1630        mISDN_FsmChangeState(fi, ST_L2_1);
1631}
1632
1633static void
1634l2_tei_remove(struct FsmInst *fi, int event, void *arg)
1635{
1636        struct layer2 *l2 = fi->userdata;
1637
1638        skb_queue_purge(&l2->i_queue);
1639        skb_queue_purge(&l2->ui_queue);
1640        freewin(l2);
1641        l2->tei = GROUP_TEI;
1642        stop_t200(l2, 17);
1643        mISDN_FsmDelTimer(&l2->t203, 19);
1644        l2up_create(l2, DL_RELEASE_IND, 0, NULL);
1645/*      mISDN_queue_data(&l2->inst, l2->inst.id | MSG_BROADCAST,
1646 *              MGR_SHORTSTATUS_IND, SSTATUS_L2_RELEASED,
1647 *              0, NULL, 0);
1648 */
1649        mISDN_FsmChangeState(fi, ST_L2_1);
1650}
1651
1652static void
1653l2_st14_persistent_da(struct FsmInst *fi, int event, void *arg)
1654{
1655        struct layer2 *l2 = fi->userdata;
1656        struct sk_buff *skb = arg;
1657
1658        skb_queue_purge(&l2->i_queue);
1659        skb_queue_purge(&l2->ui_queue);
1660        if (test_and_clear_bit(FLG_ESTAB_PEND, &l2->flag))
1661                l2up(l2, DL_RELEASE_IND, skb);
1662        else
1663                dev_kfree_skb(skb);
1664}
1665
1666static void
1667l2_st5_persistent_da(struct FsmInst *fi, int event, void *arg)
1668{
1669        struct layer2 *l2 = fi->userdata;
1670        struct sk_buff *skb = arg;
1671
1672        skb_queue_purge(&l2->i_queue);
1673        skb_queue_purge(&l2->ui_queue);
1674        freewin(l2);
1675        stop_t200(l2, 19);
1676        st5_dl_release_l2l3(l2);
1677        mISDN_FsmChangeState(fi, ST_L2_4);
1678        if (l2->tm)
1679                l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1680        dev_kfree_skb(skb);
1681}
1682
1683static void
1684l2_st6_persistent_da(struct FsmInst *fi, int event, void *arg)
1685{
1686        struct layer2 *l2 = fi->userdata;
1687        struct sk_buff *skb = arg;
1688
1689        skb_queue_purge(&l2->ui_queue);
1690        stop_t200(l2, 20);
1691        l2up(l2, DL_RELEASE_CNF, skb);
1692        mISDN_FsmChangeState(fi, ST_L2_4);
1693        if (l2->tm)
1694                l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1695}
1696
1697static void
1698l2_persistent_da(struct FsmInst *fi, int event, void *arg)
1699{
1700        struct layer2 *l2 = fi->userdata;
1701        struct sk_buff *skb = arg;
1702
1703        skb_queue_purge(&l2->i_queue);
1704        skb_queue_purge(&l2->ui_queue);
1705        freewin(l2);
1706        stop_t200(l2, 19);
1707        mISDN_FsmDelTimer(&l2->t203, 19);
1708        l2up(l2, DL_RELEASE_IND, skb);
1709        mISDN_FsmChangeState(fi, ST_L2_4);
1710        if (l2->tm)
1711                l2_tei(l2, MDL_STATUS_DOWN_IND, 0);
1712}
1713
1714static void
1715l2_set_own_busy(struct FsmInst *fi, int event, void *arg)
1716{
1717        struct layer2 *l2 = fi->userdata;
1718        struct sk_buff *skb = arg;
1719
1720        if (!test_and_set_bit(FLG_OWN_BUSY, &l2->flag)) {
1721                enquiry_cr(l2, RNR, RSP, 0);
1722                test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
1723        }
1724        dev_kfree_skb(skb);
1725}
1726
1727static void
1728l2_clear_own_busy(struct FsmInst *fi, int event, void *arg)
1729{
1730        struct layer2 *l2 = fi->userdata;
1731        struct sk_buff *skb = arg;
1732
1733        if (!test_and_clear_bit(FLG_OWN_BUSY, &l2->flag)) {
1734                enquiry_cr(l2, RR, RSP, 0);
1735                test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
1736        }
1737        dev_kfree_skb(skb);
1738}
1739
1740static void
1741l2_frame_error(struct FsmInst *fi, int event, void *arg)
1742{
1743        struct layer2 *l2 = fi->userdata;
1744
1745        l2mgr(l2, MDL_ERROR_IND, arg);
1746}
1747
1748static void
1749l2_frame_error_reest(struct FsmInst *fi, int event, void *arg)
1750{
1751        struct layer2 *l2 = fi->userdata;
1752
1753        l2mgr(l2, MDL_ERROR_IND, arg);
1754        establishlink(fi);
1755        test_and_clear_bit(FLG_L3_INIT, &l2->flag);
1756}
1757
1758static struct FsmNode L2FnList[] =
1759{
1760        {ST_L2_1, EV_L2_DL_ESTABLISH_REQ, l2_mdl_assign},
1761        {ST_L2_2, EV_L2_DL_ESTABLISH_REQ, l2_go_st3},
1762        {ST_L2_4, EV_L2_DL_ESTABLISH_REQ, l2_establish},
1763        {ST_L2_5, EV_L2_DL_ESTABLISH_REQ, l2_discard_i_setl3},
1764        {ST_L2_7, EV_L2_DL_ESTABLISH_REQ, l2_l3_reestablish},
1765        {ST_L2_8, EV_L2_DL_ESTABLISH_REQ, l2_l3_reestablish},
1766        {ST_L2_4, EV_L2_DL_RELEASE_REQ, l2_release},
1767        {ST_L2_5, EV_L2_DL_RELEASE_REQ, l2_pend_rel},
1768        {ST_L2_7, EV_L2_DL_RELEASE_REQ, l2_disconnect},
1769        {ST_L2_8, EV_L2_DL_RELEASE_REQ, l2_disconnect},
1770        {ST_L2_5, EV_L2_DL_DATA, l2_feed_i_if_reest},
1771        {ST_L2_7, EV_L2_DL_DATA, l2_feed_i_pull},
1772        {ST_L2_8, EV_L2_DL_DATA, l2_feed_iqueue},
1773        {ST_L2_1, EV_L2_DL_UNITDATA, l2_queue_ui_assign},
1774        {ST_L2_2, EV_L2_DL_UNITDATA, l2_queue_ui},
1775        {ST_L2_3, EV_L2_DL_UNITDATA, l2_queue_ui},
1776        {ST_L2_4, EV_L2_DL_UNITDATA, l2_send_ui},
1777        {ST_L2_5, EV_L2_DL_UNITDATA, l2_send_ui},
1778        {ST_L2_6, EV_L2_DL_UNITDATA, l2_send_ui},
1779        {ST_L2_7, EV_L2_DL_UNITDATA, l2_send_ui},
1780        {ST_L2_8, EV_L2_DL_UNITDATA, l2_send_ui},
1781        {ST_L2_1, EV_L2_MDL_ASSIGN, l2_got_tei},
1782        {ST_L2_2, EV_L2_MDL_ASSIGN, l2_got_tei},
1783        {ST_L2_3, EV_L2_MDL_ASSIGN, l2_got_tei},
1784        {ST_L2_2, EV_L2_MDL_ERROR, l2_st24_tei_remove},
1785        {ST_L2_3, EV_L2_MDL_ERROR, l2_st3_tei_remove},
1786        {ST_L2_4, EV_L2_MDL_REMOVE, l2_st24_tei_remove},
1787        {ST_L2_5, EV_L2_MDL_REMOVE, l2_st5_tei_remove},
1788        {ST_L2_6, EV_L2_MDL_REMOVE, l2_st6_tei_remove},
1789        {ST_L2_7, EV_L2_MDL_REMOVE, l2_tei_remove},
1790        {ST_L2_8, EV_L2_MDL_REMOVE, l2_tei_remove},
1791        {ST_L2_4, EV_L2_SABME, l2_start_multi},
1792        {ST_L2_5, EV_L2_SABME, l2_send_UA},
1793        {ST_L2_6, EV_L2_SABME, l2_send_DM},
1794        {ST_L2_7, EV_L2_SABME, l2_restart_multi},
1795        {ST_L2_8, EV_L2_SABME, l2_restart_multi},
1796        {ST_L2_4, EV_L2_DISC, l2_send_DM},
1797        {ST_L2_5, EV_L2_DISC, l2_send_DM},
1798        {ST_L2_6, EV_L2_DISC, l2_send_UA},
1799        {ST_L2_7, EV_L2_DISC, l2_stop_multi},
1800        {ST_L2_8, EV_L2_DISC, l2_stop_multi},
1801        {ST_L2_4, EV_L2_UA, l2_mdl_error_ua},
1802        {ST_L2_5, EV_L2_UA, l2_connected},
1803        {ST_L2_6, EV_L2_UA, l2_released},
1804        {ST_L2_7, EV_L2_UA, l2_mdl_error_ua},
1805        {ST_L2_8, EV_L2_UA, l2_mdl_error_ua},
1806        {ST_L2_4, EV_L2_DM, l2_reestablish},
1807        {ST_L2_5, EV_L2_DM, l2_st5_dm_release},
1808        {ST_L2_6, EV_L2_DM, l2_st6_dm_release},
1809        {ST_L2_7, EV_L2_DM, l2_mdl_error_dm},
1810        {ST_L2_8, EV_L2_DM, l2_st8_mdl_error_dm},
1811        {ST_L2_1, EV_L2_UI, l2_got_ui},
1812        {ST_L2_2, EV_L2_UI, l2_got_ui},
1813        {ST_L2_3, EV_L2_UI, l2_got_ui},
1814        {ST_L2_4, EV_L2_UI, l2_got_ui},
1815        {ST_L2_5, EV_L2_UI, l2_got_ui},
1816        {ST_L2_6, EV_L2_UI, l2_got_ui},
1817        {ST_L2_7, EV_L2_UI, l2_got_ui},
1818        {ST_L2_8, EV_L2_UI, l2_got_ui},
1819        {ST_L2_7, EV_L2_FRMR, l2_got_FRMR},
1820        {ST_L2_8, EV_L2_FRMR, l2_got_FRMR},
1821        {ST_L2_7, EV_L2_SUPER, l2_st7_got_super},
1822        {ST_L2_8, EV_L2_SUPER, l2_st8_got_super},
1823        {ST_L2_7, EV_L2_I, l2_got_iframe},
1824        {ST_L2_8, EV_L2_I, l2_got_iframe},
1825        {ST_L2_5, EV_L2_T200, l2_timeout},
1826        {ST_L2_6, EV_L2_T200, l2_timeout},
1827        {ST_L2_7, EV_L2_T200, l2_timeout},
1828        {ST_L2_8, EV_L2_T200, l2_timeout},
1829        {ST_L2_7, EV_L2_T203, l2_timeout},
1830        {ST_L2_5, EV_L2_T200I, l2_st5_tout_200},
1831        {ST_L2_6, EV_L2_T200I, l2_st6_tout_200},
1832        {ST_L2_7, EV_L2_T200I, l2_st7_tout_200},
1833        {ST_L2_8, EV_L2_T200I, l2_st8_tout_200},
1834        {ST_L2_7, EV_L2_T203I, l2_st7_tout_203},
1835        {ST_L2_7, EV_L2_ACK_PULL, l2_pull_iqueue},
1836        {ST_L2_7, EV_L2_SET_OWN_BUSY, l2_set_own_busy},
1837        {ST_L2_8, EV_L2_SET_OWN_BUSY, l2_set_own_busy},
1838        {ST_L2_7, EV_L2_CLEAR_OWN_BUSY, l2_clear_own_busy},
1839        {ST_L2_8, EV_L2_CLEAR_OWN_BUSY, l2_clear_own_busy},
1840        {ST_L2_4, EV_L2_FRAME_ERROR, l2_frame_error},
1841        {ST_L2_5, EV_L2_FRAME_ERROR, l2_frame_error},
1842        {ST_L2_6, EV_L2_FRAME_ERROR, l2_frame_error},
1843        {ST_L2_7, EV_L2_FRAME_ERROR, l2_frame_error_reest},
1844        {ST_L2_8, EV_L2_FRAME_ERROR, l2_frame_error_reest},
1845        {ST_L2_1, EV_L1_DEACTIVATE, l2_st14_persistent_da},
1846        {ST_L2_2, EV_L1_DEACTIVATE, l2_st24_tei_remove},
1847        {ST_L2_3, EV_L1_DEACTIVATE, l2_st3_tei_remove},
1848        {ST_L2_4, EV_L1_DEACTIVATE, l2_st14_persistent_da},
1849        {ST_L2_5, EV_L1_DEACTIVATE, l2_st5_persistent_da},
1850        {ST_L2_6, EV_L1_DEACTIVATE, l2_st6_persistent_da},
1851        {ST_L2_7, EV_L1_DEACTIVATE, l2_persistent_da},
1852        {ST_L2_8, EV_L1_DEACTIVATE, l2_persistent_da},
1853};
1854
1855static int
1856ph_data_indication(struct layer2 *l2, struct mISDNhead *hh, struct sk_buff *skb)
1857{
1858        u_char  *datap = skb->data;
1859        int     ret = -EINVAL;
1860        int     psapi, ptei;
1861        u_int   l;
1862        int     c = 0;
1863
1864        l = l2addrsize(l2);
1865        if (skb->len <= l) {
1866                mISDN_FsmEvent(&l2->l2m, EV_L2_FRAME_ERROR, (void *) 'N');
1867                return ret;
1868        }
1869        if (test_bit(FLG_LAPD, &l2->flag)) { /* Maybe not needed */
1870                psapi = *datap++;
1871                ptei = *datap++;
1872                if ((psapi & 1) || !(ptei & 1)) {
1873                        printk(KERN_WARNING
1874                               "%s l2 D-channel frame wrong EA0/EA1\n",
1875                               mISDNDevName4ch(&l2->ch));
1876                        return ret;
1877                }
1878                psapi >>= 2;
1879                ptei >>= 1;
1880                if (psapi != l2->sapi) {
1881                        /* not our business */
1882                        if (*debug & DEBUG_L2)
1883                                printk(KERN_DEBUG "%s: sapi %d/%d mismatch\n",
1884                                       mISDNDevName4ch(&l2->ch), psapi,
1885                                       l2->sapi);
1886                        dev_kfree_skb(skb);
1887                        return 0;
1888                }
1889                if ((ptei != l2->tei) && (ptei != GROUP_TEI)) {
1890                        /* not our business */
1891                        if (*debug & DEBUG_L2)
1892                                printk(KERN_DEBUG "%s: tei %d/%d mismatch\n",
1893                                       mISDNDevName4ch(&l2->ch), ptei, l2->tei);
1894                        dev_kfree_skb(skb);
1895                        return 0;
1896                }
1897        } else
1898                datap += l;
1899        if (!(*datap & 1)) {    /* I-Frame */
1900                c = iframe_error(l2, skb);
1901                if (!c)
1902                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_I, skb);
1903        } else if (IsSFrame(datap, l2)) {       /* S-Frame */
1904                c = super_error(l2, skb);
1905                if (!c)
1906                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_SUPER, skb);
1907        } else if (IsUI(datap)) {
1908                c = UI_error(l2, skb);
1909                if (!c)
1910                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_UI, skb);
1911        } else if (IsSABME(datap, l2)) {
1912                c = unnum_error(l2, skb, CMD);
1913                if (!c)
1914                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_SABME, skb);
1915        } else if (IsUA(datap)) {
1916                c = unnum_error(l2, skb, RSP);
1917                if (!c)
1918                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_UA, skb);
1919        } else if (IsDISC(datap)) {
1920                c = unnum_error(l2, skb, CMD);
1921                if (!c)
1922                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_DISC, skb);
1923        } else if (IsDM(datap)) {
1924                c = unnum_error(l2, skb, RSP);
1925                if (!c)
1926                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_DM, skb);
1927        } else if (IsFRMR(datap)) {
1928                c = FRMR_error(l2, skb);
1929                if (!c)
1930                        ret = mISDN_FsmEvent(&l2->l2m, EV_L2_FRMR, skb);
1931        } else
1932                c = 'L';
1933        if (c) {
1934                printk(KERN_WARNING "%s:l2 D-channel frame error %c\n",
1935                       mISDNDevName4ch(&l2->ch), c);
1936                mISDN_FsmEvent(&l2->l2m, EV_L2_FRAME_ERROR, (void *)(long)c);
1937        }
1938        return ret;
1939}
1940
1941static int
1942l2_send(struct mISDNchannel *ch, struct sk_buff *skb)
1943{
1944        struct layer2           *l2 = container_of(ch, struct layer2, ch);
1945        struct mISDNhead        *hh =  mISDN_HEAD_P(skb);
1946        int                     ret = -EINVAL;
1947
1948        if (*debug & DEBUG_L2_RECV)
1949                printk(KERN_DEBUG "%s: %s prim(%x) id(%x) sapi(%d) tei(%d)\n",
1950                       __func__, mISDNDevName4ch(&l2->ch), hh->prim, hh->id,
1951                       l2->sapi, l2->tei);
1952        if (hh->prim == DL_INTERN_MSG) {
1953                struct mISDNhead *chh = hh + 1; /* saved copy */
1954
1955                *hh = *chh;
1956                if (*debug & DEBUG_L2_RECV)
1957                        printk(KERN_DEBUG "%s: prim(%x) id(%x) internal msg\n",
1958                                mISDNDevName4ch(&l2->ch), hh->prim, hh->id);
1959        }
1960        switch (hh->prim) {
1961        case PH_DATA_IND:
1962                ret = ph_data_indication(l2, hh, skb);
1963                break;
1964        case PH_DATA_CNF:
1965                ret = ph_data_confirm(l2, hh, skb);
1966                break;
1967        case PH_ACTIVATE_IND:
1968                test_and_set_bit(FLG_L1_ACTIV, &l2->flag);
1969                l2up_create(l2, MPH_ACTIVATE_IND, 0, NULL);
1970                if (test_and_clear_bit(FLG_ESTAB_PEND, &l2->flag))
1971                        ret = mISDN_FsmEvent(&l2->l2m,
1972                                             EV_L2_DL_ESTABLISH_REQ, skb);
1973                break;
1974        case PH_DEACTIVATE_IND:
1975                test_and_clear_bit(FLG_L1_ACTIV, &l2->flag);
1976                l2up_create(l2, MPH_DEACTIVATE_IND, 0, NULL);
1977                ret = mISDN_FsmEvent(&l2->l2m, EV_L1_DEACTIVATE, skb);
1978                break;
1979        case MPH_INFORMATION_IND:
1980                if (!l2->up)
1981                        break;
1982                ret = l2->up->send(l2->up, skb);
1983                break;
1984        case DL_DATA_REQ:
1985                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_DL_DATA, skb);
1986                break;
1987        case DL_UNITDATA_REQ:
1988                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_DL_UNITDATA, skb);
1989                break;
1990        case DL_ESTABLISH_REQ:
1991                if (test_bit(FLG_LAPB, &l2->flag))
1992                        test_and_set_bit(FLG_ORIG, &l2->flag);
1993                if (test_bit(FLG_L1_ACTIV, &l2->flag)) {
1994                        if (test_bit(FLG_LAPD, &l2->flag) ||
1995                            test_bit(FLG_ORIG, &l2->flag))
1996                                ret = mISDN_FsmEvent(&l2->l2m,
1997                                                     EV_L2_DL_ESTABLISH_REQ, skb);
1998                } else {
1999                        if (test_bit(FLG_LAPD, &l2->flag) ||
2000                            test_bit(FLG_ORIG, &l2->flag)) {
2001                                test_and_set_bit(FLG_ESTAB_PEND,
2002                                                 &l2->flag);
2003                        }
2004                        ret = l2down(l2, PH_ACTIVATE_REQ, l2_newid(l2),
2005                                     skb);
2006                }
2007                break;
2008        case DL_RELEASE_REQ:
2009                if (test_bit(FLG_LAPB, &l2->flag))
2010                        l2down_create(l2, PH_DEACTIVATE_REQ,
2011                                      l2_newid(l2), 0, NULL);
2012                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_DL_RELEASE_REQ,
2013                                     skb);
2014                break;
2015        case DL_TIMER200_IND:
2016                mISDN_FsmEvent(&l2->l2m, EV_L2_T200I, NULL);
2017                break;
2018        case DL_TIMER203_IND:
2019                mISDN_FsmEvent(&l2->l2m, EV_L2_T203I, NULL);
2020                break;
2021        default:
2022                if (*debug & DEBUG_L2)
2023                        l2m_debug(&l2->l2m, "l2 unknown pr %04x",
2024                                  hh->prim);
2025        }
2026        if (ret) {
2027                dev_kfree_skb(skb);
2028                ret = 0;
2029        }
2030        return ret;
2031}
2032
2033int
2034tei_l2(struct layer2 *l2, u_int cmd, u_long arg)
2035{
2036        int             ret = -EINVAL;
2037
2038        if (*debug & DEBUG_L2_TEI)
2039                printk(KERN_DEBUG "%s: cmd(%x) in %s\n",
2040                       mISDNDevName4ch(&l2->ch), cmd, __func__);
2041        switch (cmd) {
2042        case (MDL_ASSIGN_REQ):
2043                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_MDL_ASSIGN, (void *)arg);
2044                break;
2045        case (MDL_REMOVE_REQ):
2046                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_MDL_REMOVE, NULL);
2047                break;
2048        case (MDL_ERROR_IND):
2049                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_MDL_ERROR, NULL);
2050                break;
2051        case (MDL_ERROR_RSP):
2052                /* ETS 300-125 5.3.2.1 Test: TC13010 */
2053                printk(KERN_NOTICE "%s: MDL_ERROR|REQ (tei_l2)\n",
2054                       mISDNDevName4ch(&l2->ch));
2055                ret = mISDN_FsmEvent(&l2->l2m, EV_L2_MDL_ERROR, NULL);
2056                break;
2057        }
2058        return ret;
2059}
2060
2061static void
2062release_l2(struct layer2 *l2)
2063{
2064        mISDN_FsmDelTimer(&l2->t200, 21);
2065        mISDN_FsmDelTimer(&l2->t203, 16);
2066        skb_queue_purge(&l2->i_queue);
2067        skb_queue_purge(&l2->ui_queue);
2068        skb_queue_purge(&l2->down_queue);
2069        ReleaseWin(l2);
2070        if (test_bit(FLG_LAPD, &l2->flag)) {
2071                TEIrelease(l2);
2072                if (l2->ch.st)
2073                        l2->ch.st->dev->D.ctrl(&l2->ch.st->dev->D,
2074                                               CLOSE_CHANNEL, NULL);
2075        }
2076        kfree(l2);
2077}
2078
2079static int
2080l2_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
2081{
2082        struct layer2           *l2 = container_of(ch, struct layer2, ch);
2083        u_int                   info;
2084
2085        if (*debug & DEBUG_L2_CTRL)
2086                printk(KERN_DEBUG "%s: %s cmd(%x)\n",
2087                       mISDNDevName4ch(ch), __func__, cmd);
2088
2089        switch (cmd) {
2090        case OPEN_CHANNEL:
2091                if (test_bit(FLG_LAPD, &l2->flag)) {
2092                        set_channel_address(&l2->ch, l2->sapi, l2->tei);
2093                        info = DL_INFO_L2_CONNECT;
2094                        l2up_create(l2, DL_INFORMATION_IND,
2095                                    sizeof(info), &info);
2096                }
2097                break;
2098        case CLOSE_CHANNEL:
2099                if (l2->ch.peer)
2100                        l2->ch.peer->ctrl(l2->ch.peer, CLOSE_CHANNEL, NULL);
2101                release_l2(l2);
2102                break;
2103        }
2104        return 0;
2105}
2106
2107struct layer2 *
2108create_l2(struct mISDNchannel *ch, u_int protocol, u_long options, int tei,
2109          int sapi)
2110{
2111        struct layer2           *l2;
2112        struct channel_req      rq;
2113
2114        l2 = kzalloc(sizeof(struct layer2), GFP_KERNEL);
2115        if (!l2) {
2116                printk(KERN_ERR "kzalloc layer2 failed\n");
2117                return NULL;
2118        }
2119        l2->next_id = 1;
2120        l2->down_id = MISDN_ID_NONE;
2121        l2->up = ch;
2122        l2->ch.st = ch->st;
2123        l2->ch.send = l2_send;
2124        l2->ch.ctrl = l2_ctrl;
2125        switch (protocol) {
2126        case ISDN_P_LAPD_NT:
2127                test_and_set_bit(FLG_LAPD, &l2->flag);
2128                test_and_set_bit(FLG_LAPD_NET, &l2->flag);
2129                test_and_set_bit(FLG_MOD128, &l2->flag);
2130                l2->sapi = sapi;
2131                l2->maxlen = MAX_DFRAME_LEN;
2132                if (test_bit(OPTION_L2_PMX, &options))
2133                        l2->window = 7;
2134                else
2135                        l2->window = 1;
2136                if (test_bit(OPTION_L2_PTP, &options))
2137                        test_and_set_bit(FLG_PTP, &l2->flag);
2138                if (test_bit(OPTION_L2_FIXEDTEI, &options))
2139                        test_and_set_bit(FLG_FIXED_TEI, &l2->flag);
2140                l2->tei = tei;
2141                l2->T200 = 1000;
2142                l2->N200 = 3;
2143                l2->T203 = 10000;
2144                if (test_bit(OPTION_L2_PMX, &options))
2145                        rq.protocol = ISDN_P_NT_E1;
2146                else
2147                        rq.protocol = ISDN_P_NT_S0;
2148                rq.adr.channel = 0;
2149                l2->ch.st->dev->D.ctrl(&l2->ch.st->dev->D, OPEN_CHANNEL, &rq);
2150                break;
2151        case ISDN_P_LAPD_TE:
2152                test_and_set_bit(FLG_LAPD, &l2->flag);
2153                test_and_set_bit(FLG_MOD128, &l2->flag);
2154                test_and_set_bit(FLG_ORIG, &l2->flag);
2155                l2->sapi = sapi;
2156                l2->maxlen = MAX_DFRAME_LEN;
2157                if (test_bit(OPTION_L2_PMX, &options))
2158                        l2->window = 7;
2159                else
2160                        l2->window = 1;
2161                if (test_bit(OPTION_L2_PTP, &options))
2162                        test_and_set_bit(FLG_PTP, &l2->flag);
2163                if (test_bit(OPTION_L2_FIXEDTEI, &options))
2164                        test_and_set_bit(FLG_FIXED_TEI, &l2->flag);
2165                l2->tei = tei;
2166                l2->T200 = 1000;
2167                l2->N200 = 3;
2168                l2->T203 = 10000;
2169                if (test_bit(OPTION_L2_PMX, &options))
2170                        rq.protocol = ISDN_P_TE_E1;
2171                else
2172                        rq.protocol = ISDN_P_TE_S0;
2173                rq.adr.channel = 0;
2174                l2->ch.st->dev->D.ctrl(&l2->ch.st->dev->D, OPEN_CHANNEL, &rq);
2175                break;
2176        case ISDN_P_B_X75SLP:
2177                test_and_set_bit(FLG_LAPB, &l2->flag);
2178                l2->window = 7;
2179                l2->maxlen = MAX_DATA_SIZE;
2180                l2->T200 = 1000;
2181                l2->N200 = 4;
2182                l2->T203 = 5000;
2183                l2->addr.A = 3;
2184                l2->addr.B = 1;
2185                break;
2186        default:
2187                printk(KERN_ERR "layer2 create failed prt %x\n",
2188                       protocol);
2189                kfree(l2);
2190                return NULL;
2191        }
2192        skb_queue_head_init(&l2->i_queue);
2193        skb_queue_head_init(&l2->ui_queue);
2194        skb_queue_head_init(&l2->down_queue);
2195        skb_queue_head_init(&l2->tmp_queue);
2196        InitWin(l2);
2197        l2->l2m.fsm = &l2fsm;
2198        if (test_bit(FLG_LAPB, &l2->flag) ||
2199            test_bit(FLG_FIXED_TEI, &l2->flag) ||
2200            test_bit(FLG_LAPD_NET, &l2->flag))
2201                l2->l2m.state = ST_L2_4;
2202        else
2203                l2->l2m.state = ST_L2_1;
2204        l2->l2m.debug = *debug;
2205        l2->l2m.userdata = l2;
2206        l2->l2m.userint = 0;
2207        l2->l2m.printdebug = l2m_debug;
2208
2209        mISDN_FsmInitTimer(&l2->l2m, &l2->t200);
2210        mISDN_FsmInitTimer(&l2->l2m, &l2->t203);
2211        return l2;
2212}
2213
2214static int
2215x75create(struct channel_req *crq)
2216{
2217        struct layer2   *l2;
2218
2219        if (crq->protocol != ISDN_P_B_X75SLP)
2220                return -EPROTONOSUPPORT;
2221        l2 = create_l2(crq->ch, crq->protocol, 0, 0, 0);
2222        if (!l2)
2223                return -ENOMEM;
2224        crq->ch = &l2->ch;
2225        crq->protocol = ISDN_P_B_HDLC;
2226        return 0;
2227}
2228
2229static struct Bprotocol X75SLP = {
2230        .Bprotocols = (1 << (ISDN_P_B_X75SLP & ISDN_P_B_MASK)),
2231        .name = "X75SLP",
2232        .create = x75create
2233};
2234
2235int
2236Isdnl2_Init(u_int *deb)
2237{
2238        int res;
2239        debug = deb;
2240        mISDN_register_Bprotocol(&X75SLP);
2241        l2fsm.state_count = L2_STATE_COUNT;
2242        l2fsm.event_count = L2_EVENT_COUNT;
2243        l2fsm.strEvent = strL2Event;
2244        l2fsm.strState = strL2State;
2245        res = mISDN_FsmNew(&l2fsm, L2FnList, ARRAY_SIZE(L2FnList));
2246        if (res)
2247                goto error;
2248        res = TEIInit(deb);
2249        if (res)
2250                goto error_fsm;
2251        return 0;
2252
2253error_fsm:
2254        mISDN_FsmFree(&l2fsm);
2255error:
2256        mISDN_unregister_Bprotocol(&X75SLP);
2257        return res;
2258}
2259
2260void
2261Isdnl2_cleanup(void)
2262{
2263        mISDN_unregister_Bprotocol(&X75SLP);
2264        TEIFree();
2265        mISDN_FsmFree(&l2fsm);
2266}
2267