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