root/drivers/isdn/mISDN/layer2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. l2m_debug
  2. l2headersize
  3. l2addrsize
  4. l2_newid
  5. l2up
  6. l2up_create
  7. l2down_skb
  8. l2down_raw
  9. l2down
  10. l2down_create
  11. ph_data_confirm
  12. l2_timeout
  13. l2mgr
  14. set_peer_busy
  15. clear_peer_busy
  16. InitWin
  17. freewin
  18. ReleaseWin
  19. cansend
  20. clear_exception
  21. sethdraddr
  22. enqueue_super
  23. enqueue_ui
  24. IsUI
  25. IsUA
  26. IsDM
  27. IsDISC
  28. IsRR
  29. IsSFrame
  30. IsSABME
  31. IsREJ
  32. IsFRMR
  33. IsRNR
  34. iframe_error
  35. super_error
  36. unnum_error
  37. UI_error
  38. FRMR_error
  39. legalnr
  40. setva
  41. send_uframe
  42. get_PollFlag
  43. get_PollFlagFree
  44. start_t200
  45. restart_t200
  46. stop_t200
  47. st5_dl_release_l2l3
  48. lapb_dl_release_l2l3
  49. establishlink
  50. l2_mdl_error_ua
  51. l2_mdl_error_dm
  52. l2_st8_mdl_error_dm
  53. l2_go_st3
  54. l2_mdl_assign
  55. l2_queue_ui_assign
  56. l2_queue_ui
  57. tx_ui
  58. l2_send_ui
  59. l2_got_ui
  60. l2_establish
  61. l2_discard_i_setl3
  62. l2_l3_reestablish
  63. l2_release
  64. l2_pend_rel
  65. l2_disconnect
  66. l2_start_multi
  67. l2_send_UA
  68. l2_send_DM
  69. l2_restart_multi
  70. l2_stop_multi
  71. l2_connected
  72. l2_released
  73. l2_reestablish
  74. l2_st5_dm_release
  75. l2_st6_dm_release
  76. enquiry_cr
  77. enquiry_response
  78. transmit_enquiry
  79. nrerrorrecovery
  80. invoke_retransmission
  81. l2_st7_got_super
  82. l2_feed_i_if_reest
  83. l2_feed_i_pull
  84. l2_feed_iqueue
  85. l2_got_iframe
  86. l2_got_tei
  87. l2_st5_tout_200
  88. l2_st6_tout_200
  89. l2_st7_tout_200
  90. l2_st8_tout_200
  91. l2_st7_tout_203
  92. l2_pull_iqueue
  93. l2_st8_got_super
  94. l2_got_FRMR
  95. l2_st24_tei_remove
  96. l2_st3_tei_remove
  97. l2_st5_tei_remove
  98. l2_st6_tei_remove
  99. l2_tei_remove
  100. l2_st14_persistent_da
  101. l2_st5_persistent_da
  102. l2_st6_persistent_da
  103. l2_persistent_da
  104. l2_set_own_busy
  105. l2_clear_own_busy
  106. l2_frame_error
  107. l2_frame_error_reest
  108. ph_data_indication
  109. l2_send
  110. tei_l2
  111. release_l2
  112. l2_ctrl
  113. create_l2
  114. x75create
  115. Isdnl2_Init
  116. Isdnl2_cleanup

   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 
  15 static u_int *debug;
  16 
  17 static
  18 struct Fsm l2fsm = {NULL, 0, 0, NULL, NULL};
  19 
  20 static 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 
  32 enum {
  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 
  61 static 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 
  89 static void
  90 l2m_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 
 110 inline u_int
 111 l2headersize(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 
 117 inline u_int
 118 l2addrsize(struct layer2 *l2)
 119 {
 120         return test_bit(FLG_LAPD, &l2->flag) ? 2 : 1;
 121 }
 122 
 123 static u_int
 124 l2_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 
 137 static void
 138 l2up(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 
 154 static void
 155 l2up_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 
 179 static int
 180 l2down_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 
 190 static int
 191 l2down_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 
 205 static int
 206 l2down(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 
 215 static int
 216 l2down_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 
 236 static int
 237 ph_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 
 277 static void
 278 l2_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 
 302 static int
 303 l2mgr(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 
 322 static void
 323 set_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 
 329 static void
 330 clear_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 
 335 static void
 336 InitWin(struct layer2 *l2)
 337 {
 338         int i;
 339 
 340         for (i = 0; i < MAX_WINDOW; i++)
 341                 l2->windowar[i] = NULL;
 342 }
 343 
 344 static int
 345 freewin(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 
 359 static void
 360 ReleaseWin(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 
 369 inline unsigned int
 370 cansend(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 
 381 inline void
 382 clear_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 
 390 static int
 391 sethdraddr(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 
 413 static inline void
 414 enqueue_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 
 420 static inline void
 421 enqueue_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 
 429 inline int
 430 IsUI(u_char *data)
 431 {
 432         return (data[0] & 0xef) == UI;
 433 }
 434 
 435 inline int
 436 IsUA(u_char *data)
 437 {
 438         return (data[0] & 0xef) == UA;
 439 }
 440 
 441 inline int
 442 IsDM(u_char *data)
 443 {
 444         return (data[0] & 0xef) == DM;
 445 }
 446 
 447 inline int
 448 IsDISC(u_char *data)
 449 {
 450         return (data[0] & 0xef) == DISC;
 451 }
 452 
 453 inline int
 454 IsRR(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 
 462 inline int
 463 IsSFrame(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 
 472 inline int
 473 IsSABME(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 
 480 inline int
 481 IsREJ(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 
 487 inline int
 488 IsFRMR(u_char *data)
 489 {
 490         return (data[0] & 0xef) == FRMR;
 491 }
 492 
 493 inline int
 494 IsRNR(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 
 500 static int
 501 iframe_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 
 518 static int
 519 super_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 
 527 static int
 528 unnum_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 
 540 static int
 541 UI_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 
 553 static int
 554 FRMR_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 
 582 static unsigned int
 583 legalnr(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 
 591 static void
 592 setva(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 
 616 static void
 617 send_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 
 639 inline u_char
 640 get_PollFlag(struct layer2 *l2, struct sk_buff *skb)
 641 {
 642         return skb->data[l2addrsize(l2)] & 0x10;
 643 }
 644 
 645 inline u_char
 646 get_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 
 655 inline void
 656 start_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 
 662 inline void
 663 restart_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 
 669 inline void
 670 stop_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 
 676 inline void
 677 st5_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 
 688 inline void
 689 lapb_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 
 696 static void
 697 establishlink(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 
 713 static void
 714 l2_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 
 726 static void
 727 l2_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 
 741 static void
 742 l2_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 
 755 static void
 756 l2_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 
 762 static void
 763 l2_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 
 772 static void
 773 l2_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 
 783 static void
 784 l2_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 
 792 static void
 793 tx_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 
 809 static void
 810 l2_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 
 819 static void
 820 l2_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 
 835 static void
 836 l2_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 
 846 static void
 847 l2_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 
 858 static void
 859 l2_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 
 870 static void
 871 l2_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 
 880 static void
 881 l2_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 
 890 static void
 891 l2_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 
 906 static void
 907 l2_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 
 926 static void
 927 l2_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 
 935 static void
 936 l2_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 
 944 static void
 945 l2_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 
 979 static void
 980 l2_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 
 997 static void
 998 l2_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 
1034 static void
1035 l2_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 
1052 static void
1053 l2_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 
1064 static void
1065 l2_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 
1084 static void
1085 l2_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 
1099 static void
1100 enquiry_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 
1122 inline void
1123 enquiry_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 
1132 inline void
1133 transmit_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 
1144 static void
1145 nrerrorrecovery(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 
1154 static void
1155 invoke_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 
1182 static void
1183 l2_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 
1243 static void
1244 l2_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 
1255 static void
1256 l2_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 
1265 static void
1266 l2_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 
1274 static void
1275 l2_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 
1343 static void
1344 l2_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 
1362 static void
1363 l2_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 
1389 static void
1390 l2_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 
1412 static void
1413 l2_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 
1429 static void
1430 l2_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 
1450 static void
1451 l2_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 
1465 static void
1466 l2_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 
1515 static void
1516 l2_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 
1569 static void
1570 l2_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 
1586 static void
1587 l2_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 
1596 static void
1597 l2_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 
1607 static void
1608 l2_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 
1621 static void
1622 l2_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 
1633 static void
1634 l2_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 
1652 static void
1653 l2_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 
1666 static void
1667 l2_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 
1683 static void
1684 l2_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 
1697 static void
1698 l2_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 
1714 static void
1715 l2_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 
1727 static void
1728 l2_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 
1740 static void
1741 l2_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 
1748 static void
1749 l2_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 
1758 static 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 
1855 static int
1856 ph_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 
1941 static int
1942 l2_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 
2033 int
2034 tei_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 
2061 static void
2062 release_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 
2079 static int
2080 l2_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 
2107 struct layer2 *
2108 create_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 
2214 static int
2215 x75create(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 
2229 static struct Bprotocol X75SLP = {
2230         .Bprotocols = (1 << (ISDN_P_B_X75SLP & ISDN_P_B_MASK)),
2231         .name = "X75SLP",
2232         .create = x75create
2233 };
2234 
2235 int
2236 Isdnl2_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 
2253 error_fsm:
2254         mISDN_FsmFree(&l2fsm);
2255 error:
2256         mISDN_unregister_Bprotocol(&X75SLP);
2257         return res;
2258 }
2259 
2260 void
2261 Isdnl2_cleanup(void)
2262 {
2263         mISDN_unregister_Bprotocol(&X75SLP);
2264         TEIFree();
2265         mISDN_FsmFree(&l2fsm);
2266 }

/* [<][>][^][v][top][bottom][index][help] */