linux/drivers/isdn/mISDN/tei.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#include "layer2.h"
   9#include <linux/random.h>
  10#include <linux/slab.h>
  11#include "core.h"
  12
  13#define ID_REQUEST      1
  14#define ID_ASSIGNED     2
  15#define ID_DENIED       3
  16#define ID_CHK_REQ      4
  17#define ID_CHK_RES      5
  18#define ID_REMOVE       6
  19#define ID_VERIFY       7
  20
  21#define TEI_ENTITY_ID   0xf
  22
  23#define MGR_PH_ACTIVE   16
  24#define MGR_PH_NOTREADY 17
  25
  26#define DATIMER_VAL     10000
  27
  28static  u_int   *debug;
  29
  30static struct Fsm deactfsm = {NULL, 0, 0, NULL, NULL};
  31static struct Fsm teifsmu = {NULL, 0, 0, NULL, NULL};
  32static struct Fsm teifsmn = {NULL, 0, 0, NULL, NULL};
  33
  34enum {
  35        ST_L1_DEACT,
  36        ST_L1_DEACT_PENDING,
  37        ST_L1_ACTIV,
  38};
  39#define DEACT_STATE_COUNT (ST_L1_ACTIV + 1)
  40
  41static char *strDeactState[] =
  42{
  43        "ST_L1_DEACT",
  44        "ST_L1_DEACT_PENDING",
  45        "ST_L1_ACTIV",
  46};
  47
  48enum {
  49        EV_ACTIVATE,
  50        EV_ACTIVATE_IND,
  51        EV_DEACTIVATE,
  52        EV_DEACTIVATE_IND,
  53        EV_UI,
  54        EV_DATIMER,
  55};
  56
  57#define DEACT_EVENT_COUNT (EV_DATIMER + 1)
  58
  59static char *strDeactEvent[] =
  60{
  61        "EV_ACTIVATE",
  62        "EV_ACTIVATE_IND",
  63        "EV_DEACTIVATE",
  64        "EV_DEACTIVATE_IND",
  65        "EV_UI",
  66        "EV_DATIMER",
  67};
  68
  69static void
  70da_debug(struct FsmInst *fi, char *fmt, ...)
  71{
  72        struct manager  *mgr = fi->userdata;
  73        struct va_format vaf;
  74        va_list va;
  75
  76        if (!(*debug & DEBUG_L2_TEIFSM))
  77                return;
  78
  79        va_start(va, fmt);
  80
  81        vaf.fmt = fmt;
  82        vaf.va = &va;
  83
  84        printk(KERN_DEBUG "mgr(%d): %pV\n", mgr->ch.st->dev->id, &vaf);
  85
  86        va_end(va);
  87}
  88
  89static void
  90da_activate(struct FsmInst *fi, int event, void *arg)
  91{
  92        struct manager  *mgr = fi->userdata;
  93
  94        if (fi->state == ST_L1_DEACT_PENDING)
  95                mISDN_FsmDelTimer(&mgr->datimer, 1);
  96        mISDN_FsmChangeState(fi, ST_L1_ACTIV);
  97}
  98
  99static void
 100da_deactivate_ind(struct FsmInst *fi, int event, void *arg)
 101{
 102        mISDN_FsmChangeState(fi, ST_L1_DEACT);
 103}
 104
 105static void
 106da_deactivate(struct FsmInst *fi, int event, void *arg)
 107{
 108        struct manager  *mgr = fi->userdata;
 109        struct layer2   *l2;
 110        u_long          flags;
 111
 112        read_lock_irqsave(&mgr->lock, flags);
 113        list_for_each_entry(l2, &mgr->layer2, list) {
 114                if (l2->l2m.state > ST_L2_4) {
 115                        /* have still activ TEI */
 116                        read_unlock_irqrestore(&mgr->lock, flags);
 117                        return;
 118                }
 119        }
 120        read_unlock_irqrestore(&mgr->lock, flags);
 121        /* All TEI are inactiv */
 122        if (!test_bit(OPTION_L1_HOLD, &mgr->options)) {
 123                mISDN_FsmAddTimer(&mgr->datimer, DATIMER_VAL, EV_DATIMER,
 124                                  NULL, 1);
 125                mISDN_FsmChangeState(fi, ST_L1_DEACT_PENDING);
 126        }
 127}
 128
 129static void
 130da_ui(struct FsmInst *fi, int event, void *arg)
 131{
 132        struct manager  *mgr = fi->userdata;
 133
 134        /* restart da timer */
 135        if (!test_bit(OPTION_L1_HOLD, &mgr->options)) {
 136                mISDN_FsmDelTimer(&mgr->datimer, 2);
 137                mISDN_FsmAddTimer(&mgr->datimer, DATIMER_VAL, EV_DATIMER,
 138                                  NULL, 2);
 139        }
 140}
 141
 142static void
 143da_timer(struct FsmInst *fi, int event, void *arg)
 144{
 145        struct manager  *mgr = fi->userdata;
 146        struct layer2   *l2;
 147        u_long          flags;
 148
 149        /* check again */
 150        read_lock_irqsave(&mgr->lock, flags);
 151        list_for_each_entry(l2, &mgr->layer2, list) {
 152                if (l2->l2m.state > ST_L2_4) {
 153                        /* have still activ TEI */
 154                        read_unlock_irqrestore(&mgr->lock, flags);
 155                        mISDN_FsmChangeState(fi, ST_L1_ACTIV);
 156                        return;
 157                }
 158        }
 159        read_unlock_irqrestore(&mgr->lock, flags);
 160        /* All TEI are inactiv */
 161        mISDN_FsmChangeState(fi, ST_L1_DEACT);
 162        _queue_data(&mgr->ch, PH_DEACTIVATE_REQ, MISDN_ID_ANY, 0, NULL,
 163                    GFP_ATOMIC);
 164}
 165
 166static struct FsmNode DeactFnList[] =
 167{
 168        {ST_L1_DEACT, EV_ACTIVATE_IND, da_activate},
 169        {ST_L1_ACTIV, EV_DEACTIVATE_IND, da_deactivate_ind},
 170        {ST_L1_ACTIV, EV_DEACTIVATE, da_deactivate},
 171        {ST_L1_DEACT_PENDING, EV_ACTIVATE, da_activate},
 172        {ST_L1_DEACT_PENDING, EV_UI, da_ui},
 173        {ST_L1_DEACT_PENDING, EV_DATIMER, da_timer},
 174};
 175
 176enum {
 177        ST_TEI_NOP,
 178        ST_TEI_IDREQ,
 179        ST_TEI_IDVERIFY,
 180};
 181
 182#define TEI_STATE_COUNT (ST_TEI_IDVERIFY + 1)
 183
 184static char *strTeiState[] =
 185{
 186        "ST_TEI_NOP",
 187        "ST_TEI_IDREQ",
 188        "ST_TEI_IDVERIFY",
 189};
 190
 191enum {
 192        EV_IDREQ,
 193        EV_ASSIGN,
 194        EV_ASSIGN_REQ,
 195        EV_DENIED,
 196        EV_CHKREQ,
 197        EV_CHKRESP,
 198        EV_REMOVE,
 199        EV_VERIFY,
 200        EV_TIMER,
 201};
 202
 203#define TEI_EVENT_COUNT (EV_TIMER + 1)
 204
 205static char *strTeiEvent[] =
 206{
 207        "EV_IDREQ",
 208        "EV_ASSIGN",
 209        "EV_ASSIGN_REQ",
 210        "EV_DENIED",
 211        "EV_CHKREQ",
 212        "EV_CHKRESP",
 213        "EV_REMOVE",
 214        "EV_VERIFY",
 215        "EV_TIMER",
 216};
 217
 218static void
 219tei_debug(struct FsmInst *fi, char *fmt, ...)
 220{
 221        struct teimgr   *tm = fi->userdata;
 222        struct va_format vaf;
 223        va_list va;
 224
 225        if (!(*debug & DEBUG_L2_TEIFSM))
 226                return;
 227
 228        va_start(va, fmt);
 229
 230        vaf.fmt = fmt;
 231        vaf.va = &va;
 232
 233        printk(KERN_DEBUG "sapi(%d) tei(%d): %pV\n",
 234               tm->l2->sapi, tm->l2->tei, &vaf);
 235
 236        va_end(va);
 237}
 238
 239
 240
 241static int
 242get_free_id(struct manager *mgr)
 243{
 244        DECLARE_BITMAP(ids, 64) = { [0 ... BITS_TO_LONGS(64) - 1] = 0 };
 245        int             i;
 246        struct layer2   *l2;
 247
 248        list_for_each_entry(l2, &mgr->layer2, list) {
 249                if (l2->ch.nr > 63) {
 250                        printk(KERN_WARNING
 251                               "%s: more as 63 layer2 for one device\n",
 252                               __func__);
 253                        return -EBUSY;
 254                }
 255                __set_bit(l2->ch.nr, ids);
 256        }
 257        i = find_next_zero_bit(ids, 64, 1);
 258        if (i < 64)
 259                return i;
 260        printk(KERN_WARNING "%s: more as 63 layer2 for one device\n",
 261               __func__);
 262        return -EBUSY;
 263}
 264
 265static int
 266get_free_tei(struct manager *mgr)
 267{
 268        DECLARE_BITMAP(ids, 64) = { [0 ... BITS_TO_LONGS(64) - 1] = 0 };
 269        int             i;
 270        struct layer2   *l2;
 271
 272        list_for_each_entry(l2, &mgr->layer2, list) {
 273                if (l2->ch.nr == 0)
 274                        continue;
 275                if ((l2->ch.addr & 0xff) != 0)
 276                        continue;
 277                i = l2->ch.addr >> 8;
 278                if (i < 64)
 279                        continue;
 280                i -= 64;
 281
 282                __set_bit(i, ids);
 283        }
 284        i = find_first_zero_bit(ids, 64);
 285        if (i < 64)
 286                return i + 64;
 287        printk(KERN_WARNING "%s: more as 63 dynamic tei for one device\n",
 288               __func__);
 289        return -1;
 290}
 291
 292static void
 293teiup_create(struct manager *mgr, u_int prim, int len, void *arg)
 294{
 295        struct sk_buff  *skb;
 296        struct mISDNhead *hh;
 297        int             err;
 298
 299        skb = mI_alloc_skb(len, GFP_ATOMIC);
 300        if (!skb)
 301                return;
 302        hh = mISDN_HEAD_P(skb);
 303        hh->prim = prim;
 304        hh->id = (mgr->ch.nr << 16) | mgr->ch.addr;
 305        if (len)
 306                skb_put_data(skb, arg, len);
 307        err = mgr->up->send(mgr->up, skb);
 308        if (err) {
 309                printk(KERN_WARNING "%s: err=%d\n", __func__, err);
 310                dev_kfree_skb(skb);
 311        }
 312}
 313
 314static u_int
 315new_id(struct manager *mgr)
 316{
 317        u_int   id;
 318
 319        id = mgr->nextid++;
 320        if (id == 0x7fff)
 321                mgr->nextid = 1;
 322        id <<= 16;
 323        id |= GROUP_TEI << 8;
 324        id |= TEI_SAPI;
 325        return id;
 326}
 327
 328static void
 329do_send(struct manager *mgr)
 330{
 331        if (!test_bit(MGR_PH_ACTIVE, &mgr->options))
 332                return;
 333
 334        if (!test_and_set_bit(MGR_PH_NOTREADY, &mgr->options)) {
 335                struct sk_buff  *skb = skb_dequeue(&mgr->sendq);
 336
 337                if (!skb) {
 338                        test_and_clear_bit(MGR_PH_NOTREADY, &mgr->options);
 339                        return;
 340                }
 341                mgr->lastid = mISDN_HEAD_ID(skb);
 342                mISDN_FsmEvent(&mgr->deact, EV_UI, NULL);
 343                if (mgr->ch.recv(mgr->ch.peer, skb)) {
 344                        dev_kfree_skb(skb);
 345                        test_and_clear_bit(MGR_PH_NOTREADY, &mgr->options);
 346                        mgr->lastid = MISDN_ID_NONE;
 347                }
 348        }
 349}
 350
 351static void
 352do_ack(struct manager *mgr, u_int id)
 353{
 354        if (test_bit(MGR_PH_NOTREADY, &mgr->options)) {
 355                if (id == mgr->lastid) {
 356                        if (test_bit(MGR_PH_ACTIVE, &mgr->options)) {
 357                                struct sk_buff  *skb;
 358
 359                                skb = skb_dequeue(&mgr->sendq);
 360                                if (skb) {
 361                                        mgr->lastid = mISDN_HEAD_ID(skb);
 362                                        if (!mgr->ch.recv(mgr->ch.peer, skb))
 363                                                return;
 364                                        dev_kfree_skb(skb);
 365                                }
 366                        }
 367                        mgr->lastid = MISDN_ID_NONE;
 368                        test_and_clear_bit(MGR_PH_NOTREADY, &mgr->options);
 369                }
 370        }
 371}
 372
 373static void
 374mgr_send_down(struct manager *mgr, struct sk_buff *skb)
 375{
 376        skb_queue_tail(&mgr->sendq, skb);
 377        if (!test_bit(MGR_PH_ACTIVE, &mgr->options)) {
 378                _queue_data(&mgr->ch, PH_ACTIVATE_REQ, MISDN_ID_ANY, 0,
 379                            NULL, GFP_KERNEL);
 380        } else {
 381                do_send(mgr);
 382        }
 383}
 384
 385static int
 386dl_unit_data(struct manager *mgr, struct sk_buff *skb)
 387{
 388        if (!test_bit(MGR_OPT_NETWORK, &mgr->options)) /* only net send UI */
 389                return -EINVAL;
 390        if (!test_bit(MGR_PH_ACTIVE, &mgr->options))
 391                _queue_data(&mgr->ch, PH_ACTIVATE_REQ, MISDN_ID_ANY, 0,
 392                            NULL, GFP_KERNEL);
 393        skb_push(skb, 3);
 394        skb->data[0] = 0x02; /* SAPI 0 C/R = 1 */
 395        skb->data[1] = 0xff; /* TEI 127 */
 396        skb->data[2] = UI;   /* UI frame */
 397        mISDN_HEAD_PRIM(skb) = PH_DATA_REQ;
 398        mISDN_HEAD_ID(skb) = new_id(mgr);
 399        skb_queue_tail(&mgr->sendq, skb);
 400        do_send(mgr);
 401        return 0;
 402}
 403
 404static unsigned int
 405random_ri(void)
 406{
 407        u16 x;
 408
 409        get_random_bytes(&x, sizeof(x));
 410        return x;
 411}
 412
 413static struct layer2 *
 414findtei(struct manager *mgr, int tei)
 415{
 416        struct layer2   *l2;
 417        u_long          flags;
 418
 419        read_lock_irqsave(&mgr->lock, flags);
 420        list_for_each_entry(l2, &mgr->layer2, list) {
 421                if ((l2->sapi == 0) && (l2->tei > 0) &&
 422                    (l2->tei != GROUP_TEI) && (l2->tei == tei))
 423                        goto done;
 424        }
 425        l2 = NULL;
 426done:
 427        read_unlock_irqrestore(&mgr->lock, flags);
 428        return l2;
 429}
 430
 431static void
 432put_tei_msg(struct manager *mgr, u_char m_id, unsigned int ri, int tei)
 433{
 434        struct sk_buff *skb;
 435        u_char bp[8];
 436
 437        bp[0] = (TEI_SAPI << 2);
 438        if (test_bit(MGR_OPT_NETWORK, &mgr->options))
 439                bp[0] |= 2; /* CR:=1 for net command */
 440        bp[1] = (GROUP_TEI << 1) | 0x1;
 441        bp[2] = UI;
 442        bp[3] = TEI_ENTITY_ID;
 443        bp[4] = ri >> 8;
 444        bp[5] = ri & 0xff;
 445        bp[6] = m_id;
 446        bp[7] = ((tei << 1) & 0xff) | 1;
 447        skb = _alloc_mISDN_skb(PH_DATA_REQ, new_id(mgr), 8, bp, GFP_ATOMIC);
 448        if (!skb) {
 449                printk(KERN_WARNING "%s: no skb for tei msg\n", __func__);
 450                return;
 451        }
 452        mgr_send_down(mgr, skb);
 453}
 454
 455static void
 456tei_id_request(struct FsmInst *fi, int event, void *arg)
 457{
 458        struct teimgr *tm = fi->userdata;
 459
 460        if (tm->l2->tei != GROUP_TEI) {
 461                tm->tei_m.printdebug(&tm->tei_m,
 462                                     "assign request for already assigned tei %d",
 463                                     tm->l2->tei);
 464                return;
 465        }
 466        tm->ri = random_ri();
 467        if (*debug & DEBUG_L2_TEI)
 468                tm->tei_m.printdebug(&tm->tei_m,
 469                                     "assign request ri %d", tm->ri);
 470        put_tei_msg(tm->mgr, ID_REQUEST, tm->ri, GROUP_TEI);
 471        mISDN_FsmChangeState(fi, ST_TEI_IDREQ);
 472        mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 1);
 473        tm->nval = 3;
 474}
 475
 476static void
 477tei_id_assign(struct FsmInst *fi, int event, void *arg)
 478{
 479        struct teimgr   *tm = fi->userdata;
 480        struct layer2   *l2;
 481        u_char *dp = arg;
 482        int ri, tei;
 483
 484        ri = ((unsigned int) *dp++ << 8);
 485        ri += *dp++;
 486        dp++;
 487        tei = *dp >> 1;
 488        if (*debug & DEBUG_L2_TEI)
 489                tm->tei_m.printdebug(fi, "identity assign ri %d tei %d",
 490                                     ri, tei);
 491        l2 = findtei(tm->mgr, tei);
 492        if (l2) {       /* same tei is in use */
 493                if (ri != l2->tm->ri) {
 494                        tm->tei_m.printdebug(fi,
 495                                             "possible duplicate assignment tei %d", tei);
 496                        tei_l2(l2, MDL_ERROR_RSP, 0);
 497                }
 498        } else if (ri == tm->ri) {
 499                mISDN_FsmDelTimer(&tm->timer, 1);
 500                mISDN_FsmChangeState(fi, ST_TEI_NOP);
 501                tei_l2(tm->l2, MDL_ASSIGN_REQ, tei);
 502        }
 503}
 504
 505static void
 506tei_id_test_dup(struct FsmInst *fi, int event, void *arg)
 507{
 508        struct teimgr   *tm = fi->userdata;
 509        struct layer2   *l2;
 510        u_char *dp = arg;
 511        int tei, ri;
 512
 513        ri = ((unsigned int) *dp++ << 8);
 514        ri += *dp++;
 515        dp++;
 516        tei = *dp >> 1;
 517        if (*debug & DEBUG_L2_TEI)
 518                tm->tei_m.printdebug(fi, "foreign identity assign ri %d tei %d",
 519                                     ri, tei);
 520        l2 = findtei(tm->mgr, tei);
 521        if (l2) {       /* same tei is in use */
 522                if (ri != l2->tm->ri) { /* and it wasn't our request */
 523                        tm->tei_m.printdebug(fi,
 524                                             "possible duplicate assignment tei %d", tei);
 525                        mISDN_FsmEvent(&l2->tm->tei_m, EV_VERIFY, NULL);
 526                }
 527        }
 528}
 529
 530static void
 531tei_id_denied(struct FsmInst *fi, int event, void *arg)
 532{
 533        struct teimgr *tm = fi->userdata;
 534        u_char *dp = arg;
 535        int ri, tei;
 536
 537        ri = ((unsigned int) *dp++ << 8);
 538        ri += *dp++;
 539        dp++;
 540        tei = *dp >> 1;
 541        if (*debug & DEBUG_L2_TEI)
 542                tm->tei_m.printdebug(fi, "identity denied ri %d tei %d",
 543                                     ri, tei);
 544}
 545
 546static void
 547tei_id_chk_req(struct FsmInst *fi, int event, void *arg)
 548{
 549        struct teimgr *tm = fi->userdata;
 550        u_char *dp = arg;
 551        int tei;
 552
 553        tei = *(dp + 3) >> 1;
 554        if (*debug & DEBUG_L2_TEI)
 555                tm->tei_m.printdebug(fi, "identity check req tei %d", tei);
 556        if ((tm->l2->tei != GROUP_TEI) && ((tei == GROUP_TEI) ||
 557                                           (tei == tm->l2->tei))) {
 558                mISDN_FsmDelTimer(&tm->timer, 4);
 559                mISDN_FsmChangeState(&tm->tei_m, ST_TEI_NOP);
 560                put_tei_msg(tm->mgr, ID_CHK_RES, random_ri(), tm->l2->tei);
 561        }
 562}
 563
 564static void
 565tei_id_remove(struct FsmInst *fi, int event, void *arg)
 566{
 567        struct teimgr *tm = fi->userdata;
 568        u_char *dp = arg;
 569        int tei;
 570
 571        tei = *(dp + 3) >> 1;
 572        if (*debug & DEBUG_L2_TEI)
 573                tm->tei_m.printdebug(fi, "identity remove tei %d", tei);
 574        if ((tm->l2->tei != GROUP_TEI) &&
 575            ((tei == GROUP_TEI) || (tei == tm->l2->tei))) {
 576                mISDN_FsmDelTimer(&tm->timer, 5);
 577                mISDN_FsmChangeState(&tm->tei_m, ST_TEI_NOP);
 578                tei_l2(tm->l2, MDL_REMOVE_REQ, 0);
 579        }
 580}
 581
 582static void
 583tei_id_verify(struct FsmInst *fi, int event, void *arg)
 584{
 585        struct teimgr *tm = fi->userdata;
 586
 587        if (*debug & DEBUG_L2_TEI)
 588                tm->tei_m.printdebug(fi, "id verify request for tei %d",
 589                                     tm->l2->tei);
 590        put_tei_msg(tm->mgr, ID_VERIFY, 0, tm->l2->tei);
 591        mISDN_FsmChangeState(&tm->tei_m, ST_TEI_IDVERIFY);
 592        mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 2);
 593        tm->nval = 2;
 594}
 595
 596static void
 597tei_id_req_tout(struct FsmInst *fi, int event, void *arg)
 598{
 599        struct teimgr *tm = fi->userdata;
 600
 601        if (--tm->nval) {
 602                tm->ri = random_ri();
 603                if (*debug & DEBUG_L2_TEI)
 604                        tm->tei_m.printdebug(fi, "assign req(%d) ri %d",
 605                                             4 - tm->nval, tm->ri);
 606                put_tei_msg(tm->mgr, ID_REQUEST, tm->ri, GROUP_TEI);
 607                mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 3);
 608        } else {
 609                tm->tei_m.printdebug(fi, "assign req failed");
 610                tei_l2(tm->l2, MDL_ERROR_RSP, 0);
 611                mISDN_FsmChangeState(fi, ST_TEI_NOP);
 612        }
 613}
 614
 615static void
 616tei_id_ver_tout(struct FsmInst *fi, int event, void *arg)
 617{
 618        struct teimgr *tm = fi->userdata;
 619
 620        if (--tm->nval) {
 621                if (*debug & DEBUG_L2_TEI)
 622                        tm->tei_m.printdebug(fi,
 623                                             "id verify req(%d) for tei %d",
 624                                             3 - tm->nval, tm->l2->tei);
 625                put_tei_msg(tm->mgr, ID_VERIFY, 0, tm->l2->tei);
 626                mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 4);
 627        } else {
 628                tm->tei_m.printdebug(fi, "verify req for tei %d failed",
 629                                     tm->l2->tei);
 630                tei_l2(tm->l2, MDL_REMOVE_REQ, 0);
 631                mISDN_FsmChangeState(fi, ST_TEI_NOP);
 632        }
 633}
 634
 635static struct FsmNode TeiFnListUser[] =
 636{
 637        {ST_TEI_NOP, EV_IDREQ, tei_id_request},
 638        {ST_TEI_NOP, EV_ASSIGN, tei_id_test_dup},
 639        {ST_TEI_NOP, EV_VERIFY, tei_id_verify},
 640        {ST_TEI_NOP, EV_REMOVE, tei_id_remove},
 641        {ST_TEI_NOP, EV_CHKREQ, tei_id_chk_req},
 642        {ST_TEI_IDREQ, EV_TIMER, tei_id_req_tout},
 643        {ST_TEI_IDREQ, EV_ASSIGN, tei_id_assign},
 644        {ST_TEI_IDREQ, EV_DENIED, tei_id_denied},
 645        {ST_TEI_IDVERIFY, EV_TIMER, tei_id_ver_tout},
 646        {ST_TEI_IDVERIFY, EV_REMOVE, tei_id_remove},
 647        {ST_TEI_IDVERIFY, EV_CHKREQ, tei_id_chk_req},
 648};
 649
 650static void
 651tei_l2remove(struct layer2 *l2)
 652{
 653        put_tei_msg(l2->tm->mgr, ID_REMOVE, 0, l2->tei);
 654        tei_l2(l2, MDL_REMOVE_REQ, 0);
 655        list_del(&l2->ch.list);
 656        l2->ch.ctrl(&l2->ch, CLOSE_CHANNEL, NULL);
 657}
 658
 659static void
 660tei_assign_req(struct FsmInst *fi, int event, void *arg)
 661{
 662        struct teimgr *tm = fi->userdata;
 663        u_char *dp = arg;
 664
 665        if (tm->l2->tei == GROUP_TEI) {
 666                tm->tei_m.printdebug(&tm->tei_m,
 667                                     "net tei assign request without tei");
 668                return;
 669        }
 670        tm->ri = ((unsigned int) *dp++ << 8);
 671        tm->ri += *dp++;
 672        if (*debug & DEBUG_L2_TEI)
 673                tm->tei_m.printdebug(&tm->tei_m,
 674                                     "net assign request ri %d teim %d", tm->ri, *dp);
 675        put_tei_msg(tm->mgr, ID_ASSIGNED, tm->ri, tm->l2->tei);
 676        mISDN_FsmChangeState(fi, ST_TEI_NOP);
 677}
 678
 679static void
 680tei_id_chk_req_net(struct FsmInst *fi, int event, void *arg)
 681{
 682        struct teimgr   *tm = fi->userdata;
 683
 684        if (*debug & DEBUG_L2_TEI)
 685                tm->tei_m.printdebug(fi, "id check request for tei %d",
 686                                     tm->l2->tei);
 687        tm->rcnt = 0;
 688        put_tei_msg(tm->mgr, ID_CHK_REQ, 0, tm->l2->tei);
 689        mISDN_FsmChangeState(&tm->tei_m, ST_TEI_IDVERIFY);
 690        mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 2);
 691        tm->nval = 2;
 692}
 693
 694static void
 695tei_id_chk_resp(struct FsmInst *fi, int event, void *arg)
 696{
 697        struct teimgr *tm = fi->userdata;
 698        u_char *dp = arg;
 699        int tei;
 700
 701        tei = dp[3] >> 1;
 702        if (*debug & DEBUG_L2_TEI)
 703                tm->tei_m.printdebug(fi, "identity check resp tei %d", tei);
 704        if (tei == tm->l2->tei)
 705                tm->rcnt++;
 706}
 707
 708static void
 709tei_id_verify_net(struct FsmInst *fi, int event, void *arg)
 710{
 711        struct teimgr *tm = fi->userdata;
 712        u_char *dp = arg;
 713        int tei;
 714
 715        tei = dp[3] >> 1;
 716        if (*debug & DEBUG_L2_TEI)
 717                tm->tei_m.printdebug(fi, "identity verify req tei %d/%d",
 718                                     tei, tm->l2->tei);
 719        if (tei == tm->l2->tei)
 720                tei_id_chk_req_net(fi, event, arg);
 721}
 722
 723static void
 724tei_id_ver_tout_net(struct FsmInst *fi, int event, void *arg)
 725{
 726        struct teimgr *tm = fi->userdata;
 727
 728        if (tm->rcnt == 1) {
 729                if (*debug & DEBUG_L2_TEI)
 730                        tm->tei_m.printdebug(fi,
 731                                             "check req for tei %d successful\n", tm->l2->tei);
 732                mISDN_FsmChangeState(fi, ST_TEI_NOP);
 733        } else if (tm->rcnt > 1) {
 734                /* duplicate assignment; remove */
 735                tei_l2remove(tm->l2);
 736        } else if (--tm->nval) {
 737                if (*debug & DEBUG_L2_TEI)
 738                        tm->tei_m.printdebug(fi,
 739                                             "id check req(%d) for tei %d",
 740                                             3 - tm->nval, tm->l2->tei);
 741                put_tei_msg(tm->mgr, ID_CHK_REQ, 0, tm->l2->tei);
 742                mISDN_FsmAddTimer(&tm->timer, tm->tval, EV_TIMER, NULL, 4);
 743        } else {
 744                tm->tei_m.printdebug(fi, "check req for tei %d failed",
 745                                     tm->l2->tei);
 746                mISDN_FsmChangeState(fi, ST_TEI_NOP);
 747                tei_l2remove(tm->l2);
 748        }
 749}
 750
 751static struct FsmNode TeiFnListNet[] =
 752{
 753        {ST_TEI_NOP, EV_ASSIGN_REQ, tei_assign_req},
 754        {ST_TEI_NOP, EV_VERIFY, tei_id_verify_net},
 755        {ST_TEI_NOP, EV_CHKREQ, tei_id_chk_req_net},
 756        {ST_TEI_IDVERIFY, EV_TIMER, tei_id_ver_tout_net},
 757        {ST_TEI_IDVERIFY, EV_CHKRESP, tei_id_chk_resp},
 758};
 759
 760static void
 761tei_ph_data_ind(struct teimgr *tm, u_int mt, u_char *dp, int len)
 762{
 763        if (test_bit(FLG_FIXED_TEI, &tm->l2->flag))
 764                return;
 765        if (*debug & DEBUG_L2_TEI)
 766                tm->tei_m.printdebug(&tm->tei_m, "tei handler mt %x", mt);
 767        if (mt == ID_ASSIGNED)
 768                mISDN_FsmEvent(&tm->tei_m, EV_ASSIGN, dp);
 769        else if (mt == ID_DENIED)
 770                mISDN_FsmEvent(&tm->tei_m, EV_DENIED, dp);
 771        else if (mt == ID_CHK_REQ)
 772                mISDN_FsmEvent(&tm->tei_m, EV_CHKREQ, dp);
 773        else if (mt == ID_REMOVE)
 774                mISDN_FsmEvent(&tm->tei_m, EV_REMOVE, dp);
 775        else if (mt == ID_VERIFY)
 776                mISDN_FsmEvent(&tm->tei_m, EV_VERIFY, dp);
 777        else if (mt == ID_CHK_RES)
 778                mISDN_FsmEvent(&tm->tei_m, EV_CHKRESP, dp);
 779}
 780
 781static struct layer2 *
 782create_new_tei(struct manager *mgr, int tei, int sapi)
 783{
 784        unsigned long           opt = 0;
 785        unsigned long           flags;
 786        int                     id;
 787        struct layer2           *l2;
 788        struct channel_req      rq;
 789
 790        if (!mgr->up)
 791                return NULL;
 792        if ((tei >= 0) && (tei < 64))
 793                test_and_set_bit(OPTION_L2_FIXEDTEI, &opt);
 794        if (mgr->ch.st->dev->Dprotocols & ((1 << ISDN_P_TE_E1) |
 795            (1 << ISDN_P_NT_E1))) {
 796                test_and_set_bit(OPTION_L2_PMX, &opt);
 797                rq.protocol = ISDN_P_NT_E1;
 798        } else {
 799                rq.protocol = ISDN_P_NT_S0;
 800        }
 801        l2 = create_l2(mgr->up, ISDN_P_LAPD_NT, opt, tei, sapi);
 802        if (!l2) {
 803                printk(KERN_WARNING "%s:no memory for layer2\n", __func__);
 804                return NULL;
 805        }
 806        l2->tm = kzalloc(sizeof(struct teimgr), GFP_KERNEL);
 807        if (!l2->tm) {
 808                kfree(l2);
 809                printk(KERN_WARNING "%s:no memory for teimgr\n", __func__);
 810                return NULL;
 811        }
 812        l2->tm->mgr = mgr;
 813        l2->tm->l2 = l2;
 814        l2->tm->tei_m.debug = *debug & DEBUG_L2_TEIFSM;
 815        l2->tm->tei_m.userdata = l2->tm;
 816        l2->tm->tei_m.printdebug = tei_debug;
 817        l2->tm->tei_m.fsm = &teifsmn;
 818        l2->tm->tei_m.state = ST_TEI_NOP;
 819        l2->tm->tval = 2000; /* T202  2 sec */
 820        mISDN_FsmInitTimer(&l2->tm->tei_m, &l2->tm->timer);
 821        write_lock_irqsave(&mgr->lock, flags);
 822        id = get_free_id(mgr);
 823        list_add_tail(&l2->list, &mgr->layer2);
 824        write_unlock_irqrestore(&mgr->lock, flags);
 825        if (id < 0) {
 826                l2->ch.ctrl(&l2->ch, CLOSE_CHANNEL, NULL);
 827                printk(KERN_WARNING "%s:no free id\n", __func__);
 828                return NULL;
 829        } else {
 830                l2->ch.nr = id;
 831                __add_layer2(&l2->ch, mgr->ch.st);
 832                l2->ch.recv = mgr->ch.recv;
 833                l2->ch.peer = mgr->ch.peer;
 834                l2->ch.ctrl(&l2->ch, OPEN_CHANNEL, NULL);
 835                /* We need open here L1 for the manager as well (refcounting) */
 836                rq.adr.dev = mgr->ch.st->dev->id;
 837                id = mgr->ch.st->own.ctrl(&mgr->ch.st->own, OPEN_CHANNEL, &rq);
 838                if (id < 0) {
 839                        printk(KERN_WARNING "%s: cannot open L1\n", __func__);
 840                        l2->ch.ctrl(&l2->ch, CLOSE_CHANNEL, NULL);
 841                        l2 = NULL;
 842                }
 843        }
 844        return l2;
 845}
 846
 847static void
 848new_tei_req(struct manager *mgr, u_char *dp)
 849{
 850        int             tei, ri;
 851        struct layer2   *l2;
 852
 853        ri = dp[0] << 8;
 854        ri += dp[1];
 855        if (!mgr->up)
 856                goto denied;
 857        if (!(dp[3] & 1)) /* Extension bit != 1 */
 858                goto denied;
 859        if (dp[3] != 0xff)
 860                tei = dp[3] >> 1; /* 3GPP TS 08.56 6.1.11.2 */
 861        else
 862                tei = get_free_tei(mgr);
 863        if (tei < 0) {
 864                printk(KERN_WARNING "%s:No free tei\n", __func__);
 865                goto denied;
 866        }
 867        l2 = create_new_tei(mgr, tei, CTRL_SAPI);
 868        if (!l2)
 869                goto denied;
 870        else
 871                mISDN_FsmEvent(&l2->tm->tei_m, EV_ASSIGN_REQ, dp);
 872        return;
 873denied:
 874        put_tei_msg(mgr, ID_DENIED, ri, GROUP_TEI);
 875}
 876
 877static int
 878ph_data_ind(struct manager *mgr, struct sk_buff *skb)
 879{
 880        int             ret = -EINVAL;
 881        struct layer2   *l2, *nl2;
 882        u_char          mt;
 883
 884        if (skb->len < 8) {
 885                if (*debug  & DEBUG_L2_TEI)
 886                        printk(KERN_DEBUG "%s: short mgr frame %d/8\n",
 887                               __func__, skb->len);
 888                goto done;
 889        }
 890
 891        if ((skb->data[0] >> 2) != TEI_SAPI) /* not for us */
 892                goto done;
 893        if (skb->data[0] & 1) /* EA0 formal error */
 894                goto done;
 895        if (!(skb->data[1] & 1)) /* EA1 formal error */
 896                goto done;
 897        if ((skb->data[1] >> 1) != GROUP_TEI) /* not for us */
 898                goto done;
 899        if ((skb->data[2] & 0xef) != UI) /* not UI */
 900                goto done;
 901        if (skb->data[3] != TEI_ENTITY_ID) /* not tei entity */
 902                goto done;
 903        mt = skb->data[6];
 904        switch (mt) {
 905        case ID_REQUEST:
 906        case ID_CHK_RES:
 907        case ID_VERIFY:
 908                if (!test_bit(MGR_OPT_NETWORK, &mgr->options))
 909                        goto done;
 910                break;
 911        case ID_ASSIGNED:
 912        case ID_DENIED:
 913        case ID_CHK_REQ:
 914        case ID_REMOVE:
 915                if (test_bit(MGR_OPT_NETWORK, &mgr->options))
 916                        goto done;
 917                break;
 918        default:
 919                goto done;
 920        }
 921        ret = 0;
 922        if (mt == ID_REQUEST) {
 923                new_tei_req(mgr, &skb->data[4]);
 924                goto done;
 925        }
 926        list_for_each_entry_safe(l2, nl2, &mgr->layer2, list) {
 927                tei_ph_data_ind(l2->tm, mt, &skb->data[4], skb->len - 4);
 928        }
 929done:
 930        return ret;
 931}
 932
 933int
 934l2_tei(struct layer2 *l2, u_int cmd, u_long arg)
 935{
 936        struct teimgr   *tm = l2->tm;
 937
 938        if (test_bit(FLG_FIXED_TEI, &l2->flag))
 939                return 0;
 940        if (*debug & DEBUG_L2_TEI)
 941                printk(KERN_DEBUG "%s: cmd(%x)\n", __func__, cmd);
 942        switch (cmd) {
 943        case MDL_ASSIGN_IND:
 944                mISDN_FsmEvent(&tm->tei_m, EV_IDREQ, NULL);
 945                break;
 946        case MDL_ERROR_IND:
 947                if (test_bit(MGR_OPT_NETWORK, &tm->mgr->options))
 948                        mISDN_FsmEvent(&tm->tei_m, EV_CHKREQ, &l2->tei);
 949                if (test_bit(MGR_OPT_USER, &tm->mgr->options))
 950                        mISDN_FsmEvent(&tm->tei_m, EV_VERIFY, NULL);
 951                break;
 952        case MDL_STATUS_UP_IND:
 953                if (test_bit(MGR_OPT_NETWORK, &tm->mgr->options))
 954                        mISDN_FsmEvent(&tm->mgr->deact, EV_ACTIVATE, NULL);
 955                break;
 956        case MDL_STATUS_DOWN_IND:
 957                if (test_bit(MGR_OPT_NETWORK, &tm->mgr->options))
 958                        mISDN_FsmEvent(&tm->mgr->deact, EV_DEACTIVATE, NULL);
 959                break;
 960        case MDL_STATUS_UI_IND:
 961                if (test_bit(MGR_OPT_NETWORK, &tm->mgr->options))
 962                        mISDN_FsmEvent(&tm->mgr->deact, EV_UI, NULL);
 963                break;
 964        }
 965        return 0;
 966}
 967
 968void
 969TEIrelease(struct layer2 *l2)
 970{
 971        struct teimgr   *tm = l2->tm;
 972        u_long          flags;
 973
 974        mISDN_FsmDelTimer(&tm->timer, 1);
 975        write_lock_irqsave(&tm->mgr->lock, flags);
 976        list_del(&l2->list);
 977        write_unlock_irqrestore(&tm->mgr->lock, flags);
 978        l2->tm = NULL;
 979        kfree(tm);
 980}
 981
 982static int
 983create_teimgr(struct manager *mgr, struct channel_req *crq)
 984{
 985        struct layer2           *l2;
 986        unsigned long           opt = 0;
 987        unsigned long           flags;
 988        int                     id;
 989        struct channel_req      l1rq;
 990
 991        if (*debug & DEBUG_L2_TEI)
 992                printk(KERN_DEBUG "%s: %s proto(%x) adr(%d %d %d %d)\n",
 993                       __func__, dev_name(&mgr->ch.st->dev->dev),
 994                       crq->protocol, crq->adr.dev, crq->adr.channel,
 995                       crq->adr.sapi, crq->adr.tei);
 996        if (crq->adr.tei > GROUP_TEI)
 997                return -EINVAL;
 998        if (crq->adr.tei < 64)
 999                test_and_set_bit(OPTION_L2_FIXEDTEI, &opt);
1000        if (crq->adr.tei == 0)
1001                test_and_set_bit(OPTION_L2_PTP, &opt);
1002        if (test_bit(MGR_OPT_NETWORK, &mgr->options)) {
1003                if (crq->protocol == ISDN_P_LAPD_TE)
1004                        return -EPROTONOSUPPORT;
1005                if ((crq->adr.tei != 0) && (crq->adr.tei != 127))
1006                        return -EINVAL;
1007                if (mgr->up) {
1008                        printk(KERN_WARNING
1009                               "%s: only one network manager is allowed\n",
1010                               __func__);
1011                        return -EBUSY;
1012                }
1013        } else if (test_bit(MGR_OPT_USER, &mgr->options)) {
1014                if (crq->protocol == ISDN_P_LAPD_NT)
1015                        return -EPROTONOSUPPORT;
1016                if ((crq->adr.tei >= 64) && (crq->adr.tei < GROUP_TEI))
1017                        return -EINVAL; /* dyn tei */
1018        } else {
1019                if (crq->protocol == ISDN_P_LAPD_NT)
1020                        test_and_set_bit(MGR_OPT_NETWORK, &mgr->options);
1021                if (crq->protocol == ISDN_P_LAPD_TE)
1022                        test_and_set_bit(MGR_OPT_USER, &mgr->options);
1023        }
1024        l1rq.adr = crq->adr;
1025        if (mgr->ch.st->dev->Dprotocols
1026            & ((1 << ISDN_P_TE_E1) | (1 << ISDN_P_NT_E1)))
1027                test_and_set_bit(OPTION_L2_PMX, &opt);
1028        if ((crq->protocol == ISDN_P_LAPD_NT) && (crq->adr.tei == 127)) {
1029                mgr->up = crq->ch;
1030                id = DL_INFO_L2_CONNECT;
1031                teiup_create(mgr, DL_INFORMATION_IND, sizeof(id), &id);
1032                if (test_bit(MGR_PH_ACTIVE, &mgr->options))
1033                        teiup_create(mgr, PH_ACTIVATE_IND, 0, NULL);
1034                crq->ch = NULL;
1035                if (!list_empty(&mgr->layer2)) {
1036                        read_lock_irqsave(&mgr->lock, flags);
1037                        list_for_each_entry(l2, &mgr->layer2, list) {
1038                                l2->up = mgr->up;
1039                                l2->ch.ctrl(&l2->ch, OPEN_CHANNEL, NULL);
1040                        }
1041                        read_unlock_irqrestore(&mgr->lock, flags);
1042                }
1043                return 0;
1044        }
1045        l2 = create_l2(crq->ch, crq->protocol, opt,
1046                       crq->adr.tei, crq->adr.sapi);
1047        if (!l2)
1048                return -ENOMEM;
1049        l2->tm = kzalloc(sizeof(struct teimgr), GFP_KERNEL);
1050        if (!l2->tm) {
1051                kfree(l2);
1052                printk(KERN_ERR "kmalloc teimgr failed\n");
1053                return -ENOMEM;
1054        }
1055        l2->tm->mgr = mgr;
1056        l2->tm->l2 = l2;
1057        l2->tm->tei_m.debug = *debug & DEBUG_L2_TEIFSM;
1058        l2->tm->tei_m.userdata = l2->tm;
1059        l2->tm->tei_m.printdebug = tei_debug;
1060        if (crq->protocol == ISDN_P_LAPD_TE) {
1061                l2->tm->tei_m.fsm = &teifsmu;
1062                l2->tm->tei_m.state = ST_TEI_NOP;
1063                l2->tm->tval = 1000; /* T201  1 sec */
1064                if (test_bit(OPTION_L2_PMX, &opt))
1065                        l1rq.protocol = ISDN_P_TE_E1;
1066                else
1067                        l1rq.protocol = ISDN_P_TE_S0;
1068        } else {
1069                l2->tm->tei_m.fsm = &teifsmn;
1070                l2->tm->tei_m.state = ST_TEI_NOP;
1071                l2->tm->tval = 2000; /* T202  2 sec */
1072                if (test_bit(OPTION_L2_PMX, &opt))
1073                        l1rq.protocol = ISDN_P_NT_E1;
1074                else
1075                        l1rq.protocol = ISDN_P_NT_S0;
1076        }
1077        mISDN_FsmInitTimer(&l2->tm->tei_m, &l2->tm->timer);
1078        write_lock_irqsave(&mgr->lock, flags);
1079        id = get_free_id(mgr);
1080        list_add_tail(&l2->list, &mgr->layer2);
1081        write_unlock_irqrestore(&mgr->lock, flags);
1082        if (id >= 0) {
1083                l2->ch.nr = id;
1084                l2->up->nr = id;
1085                crq->ch = &l2->ch;
1086                /* We need open here L1 for the manager as well (refcounting) */
1087                id = mgr->ch.st->own.ctrl(&mgr->ch.st->own, OPEN_CHANNEL,
1088                                          &l1rq);
1089        }
1090        if (id < 0)
1091                l2->ch.ctrl(&l2->ch, CLOSE_CHANNEL, NULL);
1092        return id;
1093}
1094
1095static int
1096mgr_send(struct mISDNchannel *ch, struct sk_buff *skb)
1097{
1098        struct manager  *mgr;
1099        struct mISDNhead        *hh =  mISDN_HEAD_P(skb);
1100        int                     ret = -EINVAL;
1101
1102        mgr = container_of(ch, struct manager, ch);
1103        if (*debug & DEBUG_L2_RECV)
1104                printk(KERN_DEBUG "%s: prim(%x) id(%x)\n",
1105                       __func__, hh->prim, hh->id);
1106        switch (hh->prim) {
1107        case PH_DATA_IND:
1108                mISDN_FsmEvent(&mgr->deact, EV_UI, NULL);
1109                ret = ph_data_ind(mgr, skb);
1110                break;
1111        case PH_DATA_CNF:
1112                do_ack(mgr, hh->id);
1113                ret = 0;
1114                break;
1115        case PH_ACTIVATE_IND:
1116                test_and_set_bit(MGR_PH_ACTIVE, &mgr->options);
1117                if (mgr->up)
1118                        teiup_create(mgr, PH_ACTIVATE_IND, 0, NULL);
1119                mISDN_FsmEvent(&mgr->deact, EV_ACTIVATE_IND, NULL);
1120                do_send(mgr);
1121                ret = 0;
1122                break;
1123        case PH_DEACTIVATE_IND:
1124                test_and_clear_bit(MGR_PH_ACTIVE, &mgr->options);
1125                if (mgr->up)
1126                        teiup_create(mgr, PH_DEACTIVATE_IND, 0, NULL);
1127                mISDN_FsmEvent(&mgr->deact, EV_DEACTIVATE_IND, NULL);
1128                ret = 0;
1129                break;
1130        case DL_UNITDATA_REQ:
1131                return dl_unit_data(mgr, skb);
1132        }
1133        if (!ret)
1134                dev_kfree_skb(skb);
1135        return ret;
1136}
1137
1138static int
1139free_teimanager(struct manager *mgr)
1140{
1141        struct layer2   *l2, *nl2;
1142
1143        test_and_clear_bit(OPTION_L1_HOLD, &mgr->options);
1144        if (test_bit(MGR_OPT_NETWORK, &mgr->options)) {
1145                /* not locked lock is taken in release tei */
1146                mgr->up = NULL;
1147                if (test_bit(OPTION_L2_CLEANUP, &mgr->options)) {
1148                        list_for_each_entry_safe(l2, nl2, &mgr->layer2, list) {
1149                                put_tei_msg(mgr, ID_REMOVE, 0, l2->tei);
1150                                mutex_lock(&mgr->ch.st->lmutex);
1151                                list_del(&l2->ch.list);
1152                                mutex_unlock(&mgr->ch.st->lmutex);
1153                                l2->ch.ctrl(&l2->ch, CLOSE_CHANNEL, NULL);
1154                        }
1155                        test_and_clear_bit(MGR_OPT_NETWORK, &mgr->options);
1156                } else {
1157                        list_for_each_entry_safe(l2, nl2, &mgr->layer2, list) {
1158                                l2->up = NULL;
1159                        }
1160                }
1161        }
1162        if (test_bit(MGR_OPT_USER, &mgr->options)) {
1163                if (list_empty(&mgr->layer2))
1164                        test_and_clear_bit(MGR_OPT_USER, &mgr->options);
1165        }
1166        mgr->ch.st->dev->D.ctrl(&mgr->ch.st->dev->D, CLOSE_CHANNEL, NULL);
1167        return 0;
1168}
1169
1170static int
1171ctrl_teimanager(struct manager *mgr, void *arg)
1172{
1173        /* currently we only have one option */
1174        unsigned int *val = (unsigned int *)arg;
1175
1176        switch (val[0]) {
1177        case IMCLEAR_L2:
1178                if (val[1])
1179                        test_and_set_bit(OPTION_L2_CLEANUP, &mgr->options);
1180                else
1181                        test_and_clear_bit(OPTION_L2_CLEANUP, &mgr->options);
1182                break;
1183        case IMHOLD_L1:
1184                if (val[1])
1185                        test_and_set_bit(OPTION_L1_HOLD, &mgr->options);
1186                else
1187                        test_and_clear_bit(OPTION_L1_HOLD, &mgr->options);
1188                break;
1189        default:
1190                return -EINVAL;
1191        }
1192        return 0;
1193}
1194
1195/* This function does create a L2 for fixed TEI in NT Mode */
1196static int
1197check_data(struct manager *mgr, struct sk_buff *skb)
1198{
1199        struct mISDNhead        *hh =  mISDN_HEAD_P(skb);
1200        int                     ret, tei, sapi;
1201        struct layer2           *l2;
1202
1203        if (*debug & DEBUG_L2_CTRL)
1204                printk(KERN_DEBUG "%s: prim(%x) id(%x)\n",
1205                       __func__, hh->prim, hh->id);
1206        if (test_bit(MGR_OPT_USER, &mgr->options))
1207                return -ENOTCONN;
1208        if (hh->prim != PH_DATA_IND)
1209                return -ENOTCONN;
1210        if (skb->len != 3)
1211                return -ENOTCONN;
1212        if (skb->data[0] & 3) /* EA0 and CR must be  0 */
1213                return -EINVAL;
1214        sapi = skb->data[0] >> 2;
1215        if (!(skb->data[1] & 1)) /* invalid EA1 */
1216                return -EINVAL;
1217        tei = skb->data[1] >> 1;
1218        if (tei > 63) /* not a fixed tei */
1219                return -ENOTCONN;
1220        if ((skb->data[2] & ~0x10) != SABME)
1221                return -ENOTCONN;
1222        /* We got a SABME for a fixed TEI */
1223        if (*debug & DEBUG_L2_CTRL)
1224                printk(KERN_DEBUG "%s: SABME sapi(%d) tei(%d)\n",
1225                       __func__, sapi, tei);
1226        l2 = create_new_tei(mgr, tei, sapi);
1227        if (!l2) {
1228                if (*debug & DEBUG_L2_CTRL)
1229                        printk(KERN_DEBUG "%s: failed to create new tei\n",
1230                               __func__);
1231                return -ENOMEM;
1232        }
1233        ret = l2->ch.send(&l2->ch, skb);
1234        return ret;
1235}
1236
1237void
1238delete_teimanager(struct mISDNchannel *ch)
1239{
1240        struct manager  *mgr;
1241        struct layer2   *l2, *nl2;
1242
1243        mgr = container_of(ch, struct manager, ch);
1244        /* not locked lock is taken in release tei */
1245        list_for_each_entry_safe(l2, nl2, &mgr->layer2, list) {
1246                mutex_lock(&mgr->ch.st->lmutex);
1247                list_del(&l2->ch.list);
1248                mutex_unlock(&mgr->ch.st->lmutex);
1249                l2->ch.ctrl(&l2->ch, CLOSE_CHANNEL, NULL);
1250        }
1251        list_del(&mgr->ch.list);
1252        list_del(&mgr->bcast.list);
1253        skb_queue_purge(&mgr->sendq);
1254        kfree(mgr);
1255}
1256
1257static int
1258mgr_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
1259{
1260        struct manager  *mgr;
1261        int             ret = -EINVAL;
1262
1263        mgr = container_of(ch, struct manager, ch);
1264        if (*debug & DEBUG_L2_CTRL)
1265                printk(KERN_DEBUG "%s(%x, %p)\n", __func__, cmd, arg);
1266        switch (cmd) {
1267        case OPEN_CHANNEL:
1268                ret = create_teimgr(mgr, arg);
1269                break;
1270        case CLOSE_CHANNEL:
1271                ret = free_teimanager(mgr);
1272                break;
1273        case CONTROL_CHANNEL:
1274                ret = ctrl_teimanager(mgr, arg);
1275                break;
1276        case CHECK_DATA:
1277                ret = check_data(mgr, arg);
1278                break;
1279        }
1280        return ret;
1281}
1282
1283static int
1284mgr_bcast(struct mISDNchannel *ch, struct sk_buff *skb)
1285{
1286        struct manager          *mgr = container_of(ch, struct manager, bcast);
1287        struct mISDNhead        *hhc, *hh = mISDN_HEAD_P(skb);
1288        struct sk_buff          *cskb = NULL;
1289        struct layer2           *l2;
1290        u_long                  flags;
1291        int                     ret;
1292
1293        read_lock_irqsave(&mgr->lock, flags);
1294        list_for_each_entry(l2, &mgr->layer2, list) {
1295                if ((hh->id & MISDN_ID_SAPI_MASK) ==
1296                    (l2->ch.addr & MISDN_ID_SAPI_MASK)) {
1297                        if (list_is_last(&l2->list, &mgr->layer2)) {
1298                                cskb = skb;
1299                                skb = NULL;
1300                        } else {
1301                                if (!cskb)
1302                                        cskb = skb_copy(skb, GFP_ATOMIC);
1303                        }
1304                        if (cskb) {
1305                                hhc = mISDN_HEAD_P(cskb);
1306                                /* save original header behind normal header */
1307                                hhc++;
1308                                *hhc = *hh;
1309                                hhc--;
1310                                hhc->prim = DL_INTERN_MSG;
1311                                hhc->id = l2->ch.nr;
1312                                ret = ch->st->own.recv(&ch->st->own, cskb);
1313                                if (ret) {
1314                                        if (*debug & DEBUG_SEND_ERR)
1315                                                printk(KERN_DEBUG
1316                                                       "%s ch%d prim(%x) addr(%x)"
1317                                                       " err %d\n",
1318                                                       __func__, l2->ch.nr,
1319                                                       hh->prim, l2->ch.addr, ret);
1320                                } else
1321                                        cskb = NULL;
1322                        } else {
1323                                printk(KERN_WARNING "%s ch%d addr %x no mem\n",
1324                                       __func__, ch->nr, ch->addr);
1325                                goto out;
1326                        }
1327                }
1328        }
1329out:
1330        read_unlock_irqrestore(&mgr->lock, flags);
1331        dev_kfree_skb(cskb);
1332        dev_kfree_skb(skb);
1333        return 0;
1334}
1335
1336static int
1337mgr_bcast_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)
1338{
1339
1340        return -EINVAL;
1341}
1342
1343int
1344create_teimanager(struct mISDNdevice *dev)
1345{
1346        struct manager *mgr;
1347
1348        mgr = kzalloc(sizeof(struct manager), GFP_KERNEL);
1349        if (!mgr)
1350                return -ENOMEM;
1351        INIT_LIST_HEAD(&mgr->layer2);
1352        rwlock_init(&mgr->lock);
1353        skb_queue_head_init(&mgr->sendq);
1354        mgr->nextid = 1;
1355        mgr->lastid = MISDN_ID_NONE;
1356        mgr->ch.send = mgr_send;
1357        mgr->ch.ctrl = mgr_ctrl;
1358        mgr->ch.st = dev->D.st;
1359        set_channel_address(&mgr->ch, TEI_SAPI, GROUP_TEI);
1360        add_layer2(&mgr->ch, dev->D.st);
1361        mgr->bcast.send = mgr_bcast;
1362        mgr->bcast.ctrl = mgr_bcast_ctrl;
1363        mgr->bcast.st = dev->D.st;
1364        set_channel_address(&mgr->bcast, 0, GROUP_TEI);
1365        add_layer2(&mgr->bcast, dev->D.st);
1366        mgr->deact.debug = *debug & DEBUG_MANAGER;
1367        mgr->deact.userdata = mgr;
1368        mgr->deact.printdebug = da_debug;
1369        mgr->deact.fsm = &deactfsm;
1370        mgr->deact.state = ST_L1_DEACT;
1371        mISDN_FsmInitTimer(&mgr->deact, &mgr->datimer);
1372        dev->teimgr = &mgr->ch;
1373        return 0;
1374}
1375
1376int TEIInit(u_int *deb)
1377{
1378        int res;
1379        debug = deb;
1380        teifsmu.state_count = TEI_STATE_COUNT;
1381        teifsmu.event_count = TEI_EVENT_COUNT;
1382        teifsmu.strEvent = strTeiEvent;
1383        teifsmu.strState = strTeiState;
1384        res = mISDN_FsmNew(&teifsmu, TeiFnListUser, ARRAY_SIZE(TeiFnListUser));
1385        if (res)
1386                goto error;
1387        teifsmn.state_count = TEI_STATE_COUNT;
1388        teifsmn.event_count = TEI_EVENT_COUNT;
1389        teifsmn.strEvent = strTeiEvent;
1390        teifsmn.strState = strTeiState;
1391        res = mISDN_FsmNew(&teifsmn, TeiFnListNet, ARRAY_SIZE(TeiFnListNet));
1392        if (res)
1393                goto error_smn;
1394        deactfsm.state_count =  DEACT_STATE_COUNT;
1395        deactfsm.event_count = DEACT_EVENT_COUNT;
1396        deactfsm.strEvent = strDeactEvent;
1397        deactfsm.strState = strDeactState;
1398        res = mISDN_FsmNew(&deactfsm, DeactFnList, ARRAY_SIZE(DeactFnList));
1399        if (res)
1400                goto error_deact;
1401        return 0;
1402
1403error_deact:
1404        mISDN_FsmFree(&teifsmn);
1405error_smn:
1406        mISDN_FsmFree(&teifsmu);
1407error:
1408        return res;
1409}
1410
1411void TEIFree(void)
1412{
1413        mISDN_FsmFree(&teifsmu);
1414        mISDN_FsmFree(&teifsmn);
1415        mISDN_FsmFree(&deactfsm);
1416}
1417