isdnl2.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:42k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: isdnl2.c,v 1.1.4.1 2001/11/20 14:19:36 kai Exp $
  2.  *
  3.  * Author       Karsten Keil
  4.  *              based on the teles driver from Jan den Ouden
  5.  * Copyright    by Karsten Keil      <keil@isdn4linux.de>
  6.  * 
  7.  * This software may be used and distributed according to the terms
  8.  * of the GNU General Public License, incorporated herein by reference.
  9.  *
  10.  * For changes and modifications please read
  11.  * ../../../Documentation/isdn/HiSax.cert
  12.  *
  13.  * Thanks to    Jan den Ouden
  14.  *              Fritz Elfert
  15.  *
  16.  */
  17. #define __NO_VERSION__
  18. #include <linux/init.h>
  19. #include "hisax.h"
  20. #include "isdnl2.h"
  21. const char *l2_revision = "$Revision: 1.1.4.1 $";
  22. static void l2m_debug(struct FsmInst *fi, char *fmt, ...);
  23. static struct Fsm l2fsm;
  24. enum {
  25. ST_L2_1,
  26. ST_L2_2,
  27. ST_L2_3,
  28. ST_L2_4,
  29. ST_L2_5,
  30. ST_L2_6,
  31. ST_L2_7,
  32. ST_L2_8,
  33. };
  34. #define L2_STATE_COUNT (ST_L2_8+1)
  35. static char *strL2State[] =
  36. {
  37. "ST_L2_1",
  38. "ST_L2_2",
  39. "ST_L2_3",
  40. "ST_L2_4",
  41. "ST_L2_5",
  42. "ST_L2_6",
  43. "ST_L2_7",
  44. "ST_L2_8",
  45. };
  46. enum {
  47. EV_L2_UI,
  48. EV_L2_SABME,
  49. EV_L2_DISC,
  50. EV_L2_DM,
  51. EV_L2_UA,
  52. EV_L2_FRMR,
  53. EV_L2_SUPER,
  54. EV_L2_I,
  55. EV_L2_DL_DATA,
  56. EV_L2_ACK_PULL,
  57. EV_L2_DL_UNIT_DATA,
  58. EV_L2_DL_ESTABLISH_REQ,
  59. EV_L2_DL_RELEASE_REQ,
  60. EV_L2_MDL_ASSIGN,
  61. EV_L2_MDL_REMOVE,
  62. EV_L2_MDL_ERROR,
  63. EV_L1_DEACTIVATE,
  64. EV_L2_T200,
  65. EV_L2_T203,
  66. EV_L2_SET_OWN_BUSY,
  67. EV_L2_CLEAR_OWN_BUSY,
  68. EV_L2_FRAME_ERROR,
  69. };
  70. #define L2_EVENT_COUNT (EV_L2_FRAME_ERROR+1)
  71. static char *strL2Event[] =
  72. {
  73. "EV_L2_UI",
  74. "EV_L2_SABME",
  75. "EV_L2_DISC",
  76. "EV_L2_DM",
  77. "EV_L2_UA",
  78. "EV_L2_FRMR",
  79. "EV_L2_SUPER",
  80. "EV_L2_I",
  81. "EV_L2_DL_DATA",
  82. "EV_L2_ACK_PULL",
  83. "EV_L2_DL_UNIT_DATA",
  84. "EV_L2_DL_ESTABLISH_REQ",
  85. "EV_L2_DL_RELEASE_REQ",
  86. "EV_L2_MDL_ASSIGN",
  87. "EV_L2_MDL_REMOVE",
  88. "EV_L2_MDL_ERROR",
  89. "EV_L1_DEACTIVATE",
  90. "EV_L2_T200",
  91. "EV_L2_T203",
  92. "EV_L2_SET_OWN_BUSY",
  93. "EV_L2_CLEAR_OWN_BUSY",
  94. "EV_L2_FRAME_ERROR",
  95. };
  96. static int l2addrsize(struct Layer2 *l2);
  97. static void
  98. set_peer_busy(struct Layer2 *l2) {
  99. test_and_set_bit(FLG_PEER_BUSY, &l2->flag);
  100. if (skb_queue_len(&l2->i_queue) || skb_queue_len(&l2->ui_queue))
  101. test_and_set_bit(FLG_L2BLOCK, &l2->flag);
  102. }
  103. static void
  104. clear_peer_busy(struct Layer2 *l2) {
  105. if (test_and_clear_bit(FLG_PEER_BUSY, &l2->flag))
  106. test_and_clear_bit(FLG_L2BLOCK, &l2->flag);
  107. }
  108. static void
  109. InitWin(struct Layer2 *l2)
  110. {
  111. int i;
  112. for (i = 0; i < MAX_WINDOW; i++)
  113. l2->windowar[i] = NULL;
  114. }
  115. static int
  116. freewin1(struct Layer2 *l2)
  117. {
  118. int i, cnt = 0;
  119. for (i = 0; i < MAX_WINDOW; i++) {
  120. if (l2->windowar[i]) {
  121. cnt++;
  122. dev_kfree_skb(l2->windowar[i]);
  123. l2->windowar[i] = NULL;
  124. }
  125. }
  126. return cnt;
  127. }
  128. inline void
  129. freewin(struct PStack *st)
  130. {
  131. freewin1(&st->l2);
  132. }
  133. static void
  134. ReleaseWin(struct Layer2 *l2)
  135. {
  136. int cnt;
  137. if((cnt = freewin1(l2)))
  138. printk(KERN_WARNING "isdl2 freed %d skbuffs in releasen", cnt);
  139. }
  140. inline unsigned int
  141. cansend(struct PStack *st)
  142. {
  143. unsigned int p1;
  144. if(test_bit(FLG_MOD128, &st->l2.flag))
  145. p1 = (st->l2.vs - st->l2.va) % 128;
  146. else
  147. p1 = (st->l2.vs - st->l2.va) % 8;
  148. return ((p1 < st->l2.window) && !test_bit(FLG_PEER_BUSY, &st->l2.flag));
  149. }
  150. inline void
  151. clear_exception(struct Layer2 *l2)
  152. {
  153. test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
  154. test_and_clear_bit(FLG_REJEXC, &l2->flag);
  155. test_and_clear_bit(FLG_OWN_BUSY, &l2->flag);
  156. clear_peer_busy(l2);
  157. }
  158. inline int
  159. l2headersize(struct Layer2 *l2, int ui)
  160. {
  161. return (((test_bit(FLG_MOD128, &l2->flag) && (!ui)) ? 2 : 1) +
  162. (test_bit(FLG_LAPD, &l2->flag) ? 2 : 1));
  163. }
  164. inline int
  165. l2addrsize(struct Layer2 *l2)
  166. {
  167. return (test_bit(FLG_LAPD, &l2->flag) ? 2 : 1);
  168. }
  169. static int
  170. sethdraddr(struct Layer2 *l2, u_char * header, int rsp)
  171. {
  172. u_char *ptr = header;
  173. int crbit = rsp;
  174. if (test_bit(FLG_LAPD, &l2->flag)) {
  175. *ptr++ = (l2->sap << 2) | (rsp ? 2 : 0);
  176. *ptr++ = (l2->tei << 1) | 1;
  177. return (2);
  178. } else {
  179. if (test_bit(FLG_ORIG, &l2->flag))
  180. crbit = !crbit;
  181. if (crbit)
  182. *ptr++ = 1;
  183. else
  184. *ptr++ = 3;
  185. return (1);
  186. }
  187. }
  188. inline static void
  189. enqueue_super(struct PStack *st,
  190.       struct sk_buff *skb)
  191. {
  192. if (test_bit(FLG_LAPB, &st->l2.flag))
  193. st->l1.bcs->tx_cnt += skb->len;
  194. st->l2.l2l1(st, PH_DATA | REQUEST, skb);
  195. }
  196. #define enqueue_ui(a, b) enqueue_super(a, b)
  197. inline int
  198. IsUI(u_char * data)
  199. {
  200. return ((data[0] & 0xef) == UI);
  201. }
  202. inline int
  203. IsUA(u_char * data)
  204. {
  205. return ((data[0] & 0xef) == UA);
  206. }
  207. inline int
  208. IsDM(u_char * data)
  209. {
  210. return ((data[0] & 0xef) == DM);
  211. }
  212. inline int
  213. IsDISC(u_char * data)
  214. {
  215. return ((data[0] & 0xef) == DISC);
  216. }
  217. inline int
  218. IsRR(u_char * data, struct PStack *st)
  219. {
  220. if (test_bit(FLG_MOD128, &st->l2.flag))
  221. return (data[0] == RR);
  222. else
  223. return ((data[0] & 0xf) == 1);
  224. }
  225. inline int
  226. IsSFrame(u_char * data, struct PStack *st)
  227. {
  228. register u_char d = *data;
  229. if (!test_bit(FLG_MOD128, &st->l2.flag))
  230. d &= 0xf;
  231. return(((d & 0xf3) == 1) && ((d & 0x0c) != 0x0c));
  232. }
  233. inline int
  234. IsSABME(u_char * data, struct PStack *st)
  235. {
  236. u_char d = data[0] & ~0x10;
  237. return (test_bit(FLG_MOD128, &st->l2.flag) ? d == SABME : d == SABM);
  238. }
  239. inline int
  240. IsREJ(u_char * data, struct PStack *st)
  241. {
  242. return (test_bit(FLG_MOD128, &st->l2.flag) ? data[0] == REJ : (data[0] & 0xf) == REJ);
  243. }
  244. inline int
  245. IsFRMR(u_char * data)
  246. {
  247. return ((data[0] & 0xef) == FRMR);
  248. }
  249. inline int
  250. IsRNR(u_char * data, struct PStack *st)
  251. {
  252. return (test_bit(FLG_MOD128, &st->l2.flag) ? data[0] == RNR : (data[0] & 0xf) == RNR);
  253. }
  254. int
  255. iframe_error(struct PStack *st, struct sk_buff *skb)
  256. {
  257. int i = l2addrsize(&st->l2) + (test_bit(FLG_MOD128, &st->l2.flag) ? 2 : 1);
  258. int rsp = *skb->data & 0x2;
  259. if (test_bit(FLG_ORIG, &st->l2.flag))
  260. rsp = !rsp;
  261. if (rsp)
  262. return 'L';
  263. if (skb->len < i)
  264. return 'N';
  265. if ((skb->len - i) > st->l2.maxlen)
  266. return 'O';
  267. return 0;
  268. }
  269. int
  270. super_error(struct PStack *st, struct sk_buff *skb)
  271. {
  272. if (skb->len != l2addrsize(&st->l2) +
  273.     (test_bit(FLG_MOD128, &st->l2.flag) ? 2 : 1))
  274. return 'N';
  275. return 0;
  276. }
  277. int
  278. unnum_error(struct PStack *st, struct sk_buff *skb, int wantrsp)
  279. {
  280. int rsp = (*skb->data & 0x2) >> 1;
  281. if (test_bit(FLG_ORIG, &st->l2.flag))
  282. rsp = !rsp;
  283. if (rsp != wantrsp)
  284. return 'L';
  285. if (skb->len != l2addrsize(&st->l2) + 1)
  286. return 'N';
  287. return 0;
  288. }
  289. int
  290. UI_error(struct PStack *st, struct sk_buff *skb)
  291. {
  292. int rsp = *skb->data & 0x2;
  293. if (test_bit(FLG_ORIG, &st->l2.flag))
  294. rsp = !rsp;
  295. if (rsp)
  296. return 'L';
  297. if (skb->len > st->l2.maxlen + l2addrsize(&st->l2) + 1)
  298. return 'O';
  299. return 0;
  300. }
  301. int
  302. FRMR_error(struct PStack *st, struct sk_buff *skb)
  303. {
  304. int headers = l2addrsize(&st->l2) + 1;
  305. u_char *datap = skb->data + headers;
  306. int rsp = *skb->data & 0x2;
  307. if (test_bit(FLG_ORIG, &st->l2.flag))
  308. rsp = !rsp;
  309. if (!rsp)
  310. return 'L';
  311. if (test_bit(FLG_MOD128, &st->l2.flag)) {
  312. if (skb->len < headers + 5)
  313. return 'N';
  314. else
  315. l2m_debug(&st->l2.l2m, "FRMR information %2x %2x %2x %2x %2x",
  316. datap[0], datap[1], datap[2],
  317. datap[3], datap[4]);
  318. } else {
  319. if (skb->len < headers + 3)
  320. return 'N';
  321. else
  322. l2m_debug(&st->l2.l2m, "FRMR information %2x %2x %2x",
  323. datap[0], datap[1], datap[2]);
  324. }
  325. return 0;
  326. }
  327. static unsigned int
  328. legalnr(struct PStack *st, unsigned int nr)
  329. {
  330.         struct Layer2 *l2 = &st->l2;
  331. if(test_bit(FLG_MOD128, &l2->flag))
  332. return ((nr - l2->va) % 128) <= ((l2->vs - l2->va) % 128);
  333. else
  334. return ((nr - l2->va) % 8) <= ((l2->vs - l2->va) % 8);
  335. }
  336. static void
  337. setva(struct PStack *st, unsigned int nr)
  338. {
  339. struct Layer2 *l2 = &st->l2;
  340. int len;
  341. while (l2->va != nr) {
  342. (l2->va)++;
  343. if(test_bit(FLG_MOD128, &l2->flag))
  344. l2->va %= 128;
  345. else
  346. l2->va %= 8;
  347. len = l2->windowar[l2->sow]->len;
  348. if (PACKET_NOACK == l2->windowar[l2->sow]->pkt_type)
  349. len = -1;
  350. dev_kfree_skb(l2->windowar[l2->sow]);
  351. l2->windowar[l2->sow] = NULL;
  352. l2->sow = (l2->sow + 1) % l2->window;
  353. if (st->lli.l2writewakeup && (len >=0))
  354. st->lli.l2writewakeup(st, len);
  355. }
  356. }
  357. static void
  358. send_uframe(struct PStack *st, u_char cmd, u_char cr)
  359. {
  360. struct sk_buff *skb;
  361. u_char tmp[MAX_HEADER_LEN];
  362. int i;
  363. i = sethdraddr(&st->l2, tmp, cr);
  364. tmp[i++] = cmd;
  365. if (!(skb = alloc_skb(i, GFP_ATOMIC))) {
  366. printk(KERN_WARNING "isdl2 can't alloc sbbuff for send_uframen");
  367. return;
  368. }
  369. memcpy(skb_put(skb, i), tmp, i);
  370. enqueue_super(st, skb);
  371. }
  372. inline u_char
  373. get_PollFlag(struct PStack * st, struct sk_buff * skb)
  374. {
  375. return (skb->data[l2addrsize(&(st->l2))] & 0x10);
  376. }
  377. inline void
  378. FreeSkb(struct sk_buff *skb)
  379. {
  380. dev_kfree_skb(skb);
  381. }
  382. inline u_char
  383. get_PollFlagFree(struct PStack *st, struct sk_buff *skb)
  384. {
  385. u_char PF;
  386. PF = get_PollFlag(st, skb);
  387. FreeSkb(skb);
  388. return (PF);
  389. }
  390. inline void
  391. start_t200(struct PStack *st, int i)
  392. {
  393. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, i);
  394. test_and_set_bit(FLG_T200_RUN, &st->l2.flag);
  395. }
  396. inline void
  397. restart_t200(struct PStack *st, int i)
  398. {
  399. FsmRestartTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, i);
  400. test_and_set_bit(FLG_T200_RUN, &st->l2.flag);
  401. }
  402. inline void
  403. stop_t200(struct PStack *st, int i)
  404. {
  405. if(test_and_clear_bit(FLG_T200_RUN, &st->l2.flag))
  406. FsmDelTimer(&st->l2.t200, i);
  407. }
  408. inline void
  409. st5_dl_release_l2l3(struct PStack *st)
  410. {
  411. int pr;
  412. if(test_and_clear_bit(FLG_PEND_REL, &st->l2.flag))
  413. pr = DL_RELEASE | CONFIRM;
  414. else
  415. pr = DL_RELEASE | INDICATION;
  416. st->l2.l2l3(st, pr, NULL);
  417. }
  418. inline void
  419. lapb_dl_release_l2l3(struct PStack *st, int f)
  420. {
  421. if (test_bit(FLG_LAPB, &st->l2.flag))
  422. st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
  423. st->l2.l2l3(st, DL_RELEASE | f, NULL);
  424. }
  425. static void
  426. establishlink(struct FsmInst *fi)
  427. {
  428. struct PStack *st = fi->userdata;
  429. u_char cmd;
  430. clear_exception(&st->l2);
  431. st->l2.rc = 0;
  432. cmd = (test_bit(FLG_MOD128, &st->l2.flag) ? SABME : SABM) | 0x10;
  433. send_uframe(st, cmd, CMD);
  434. FsmDelTimer(&st->l2.t203, 1);
  435. restart_t200(st, 1);
  436. test_and_clear_bit(FLG_PEND_REL, &st->l2.flag);
  437. freewin(st);
  438. FsmChangeState(fi, ST_L2_5);
  439. }
  440. static void
  441. l2_mdl_error_ua(struct FsmInst *fi, int event, void *arg)
  442. {
  443. struct sk_buff *skb = arg;
  444. struct PStack *st = fi->userdata;
  445. if (get_PollFlagFree(st, skb))
  446. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'C');
  447. else
  448. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'D');
  449. }
  450. static void
  451. l2_mdl_error_dm(struct FsmInst *fi, int event, void *arg)
  452. {
  453. struct sk_buff *skb = arg;
  454. struct PStack *st = fi->userdata;
  455. if (get_PollFlagFree(st, skb))
  456. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'B');
  457. else {
  458. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'E');
  459. establishlink(fi);
  460. test_and_clear_bit(FLG_L3_INIT, &st->l2.flag);
  461. }
  462. }
  463. static void
  464. l2_st8_mdl_error_dm(struct FsmInst *fi, int event, void *arg)
  465. {
  466. struct sk_buff *skb = arg;
  467. struct PStack *st = fi->userdata;
  468. if (get_PollFlagFree(st, skb))
  469. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'B');
  470. else {
  471. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'E');
  472. }
  473. establishlink(fi);
  474. test_and_clear_bit(FLG_L3_INIT, &st->l2.flag);
  475. }
  476. static void
  477. l2_go_st3(struct FsmInst *fi, int event, void *arg)
  478. {
  479. FsmChangeState(fi, ST_L2_3); 
  480. }
  481. static void
  482. l2_mdl_assign(struct FsmInst *fi, int event, void *arg)
  483. {
  484. struct PStack *st = fi->userdata;
  485. FsmChangeState(fi, ST_L2_3); 
  486. st->l2.l2tei(st, MDL_ASSIGN | INDICATION, NULL);
  487. }
  488. static void
  489. l2_queue_ui_assign(struct FsmInst *fi, int event, void *arg)
  490. {
  491. struct PStack *st = fi->userdata;
  492. struct sk_buff *skb = arg;
  493. skb_queue_tail(&st->l2.ui_queue, skb);
  494. FsmChangeState(fi, ST_L2_2);
  495. st->l2.l2tei(st, MDL_ASSIGN | INDICATION, NULL);
  496. }
  497. static void
  498. l2_queue_ui(struct FsmInst *fi, int event, void *arg)
  499. {
  500. struct PStack *st = fi->userdata;
  501. struct sk_buff *skb = arg;
  502. skb_queue_tail(&st->l2.ui_queue, skb);
  503. }
  504. static void
  505. tx_ui(struct PStack *st)
  506. {
  507. struct sk_buff *skb;
  508. u_char header[MAX_HEADER_LEN];
  509. int i;
  510. i = sethdraddr(&(st->l2), header, CMD);
  511. header[i++] = UI;
  512. while ((skb = skb_dequeue(&st->l2.ui_queue))) {
  513. memcpy(skb_push(skb, i), header, i);
  514. enqueue_ui(st, skb);
  515. }
  516. }
  517. static void
  518. l2_send_ui(struct FsmInst *fi, int event, void *arg)
  519. {
  520. struct PStack *st = fi->userdata;
  521. struct sk_buff *skb = arg;
  522. skb_queue_tail(&st->l2.ui_queue, skb);
  523. tx_ui(st);
  524. }
  525. static void
  526. l2_got_ui(struct FsmInst *fi, int event, void *arg)
  527. {
  528. struct PStack *st = fi->userdata;
  529. struct sk_buff *skb = arg;
  530. skb_pull(skb, l2headersize(&st->l2, 1));
  531. st->l2.l2l3(st, DL_UNIT_DATA | INDICATION, skb);
  532. /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  533.  * in states 1-3 for broadcast
  534.  */
  535. }
  536. static void
  537. l2_establish(struct FsmInst *fi, int event, void *arg)
  538. {
  539. struct PStack *st = fi->userdata;
  540. establishlink(fi);
  541. test_and_set_bit(FLG_L3_INIT, &st->l2.flag);
  542. }
  543. static void
  544. l2_discard_i_setl3(struct FsmInst *fi, int event, void *arg)
  545. {
  546. struct PStack *st = fi->userdata;
  547. skb_queue_purge(&st->l2.i_queue);
  548. test_and_set_bit(FLG_L3_INIT, &st->l2.flag);
  549. test_and_clear_bit(FLG_PEND_REL, &st->l2.flag);
  550. }
  551. static void
  552. l2_l3_reestablish(struct FsmInst *fi, int event, void *arg)
  553. {
  554. struct PStack *st = fi->userdata;
  555. skb_queue_purge(&st->l2.i_queue);
  556. establishlink(fi);
  557. test_and_set_bit(FLG_L3_INIT, &st->l2.flag);
  558. }
  559. static void
  560. l2_release(struct FsmInst *fi, int event, void *arg)
  561. {
  562. struct PStack *st = fi->userdata;
  563. st->l2.l2l3(st, DL_RELEASE | CONFIRM, NULL);
  564. }
  565. static void
  566. l2_pend_rel(struct FsmInst *fi, int event, void *arg)
  567. {
  568. struct PStack *st = fi->userdata;
  569. test_and_set_bit(FLG_PEND_REL, &st->l2.flag);
  570. }
  571. static void
  572. l2_disconnect(struct FsmInst *fi, int event, void *arg)
  573. {
  574. struct PStack *st = fi->userdata;
  575. skb_queue_purge(&st->l2.i_queue);
  576. freewin(st);
  577. FsmChangeState(fi, ST_L2_6);
  578. st->l2.rc = 0;
  579. send_uframe(st, DISC | 0x10, CMD);
  580. FsmDelTimer(&st->l2.t203, 1);
  581. restart_t200(st, 2);
  582. }
  583. static void
  584. l2_start_multi(struct FsmInst *fi, int event, void *arg)
  585. {
  586. struct PStack *st = fi->userdata;
  587. struct sk_buff *skb = arg;
  588. send_uframe(st, UA | get_PollFlagFree(st, skb), RSP);
  589. clear_exception(&st->l2);
  590. st->l2.vs = 0;
  591. st->l2.va = 0;
  592. st->l2.vr = 0;
  593. st->l2.sow = 0;
  594. FsmChangeState(fi, ST_L2_7);
  595. FsmAddTimer(&st->l2.t203, st->l2.T203, EV_L2_T203, NULL, 3);
  596. st->l2.l2l3(st, DL_ESTABLISH | INDICATION, NULL);
  597. }
  598. static void
  599. l2_send_UA(struct FsmInst *fi, int event, void *arg)
  600. {
  601. struct PStack *st = fi->userdata;
  602. struct sk_buff *skb = arg;
  603. send_uframe(st, UA | get_PollFlagFree(st, skb), RSP);
  604. }
  605. static void
  606. l2_send_DM(struct FsmInst *fi, int event, void *arg)
  607. {
  608. struct PStack *st = fi->userdata;
  609. struct sk_buff *skb = arg;
  610. send_uframe(st, DM | get_PollFlagFree(st, skb), RSP);
  611. }
  612. static void
  613. l2_restart_multi(struct FsmInst *fi, int event, void *arg)
  614. {
  615. struct PStack *st = fi->userdata;
  616. struct sk_buff *skb = arg;
  617. int est = 0, state;
  618. state = fi->state;
  619. send_uframe(st, UA | get_PollFlagFree(st, skb), RSP);
  620. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'F');
  621. if (st->l2.vs != st->l2.va) {
  622. skb_queue_purge(&st->l2.i_queue);
  623. est = 1;
  624. }
  625. clear_exception(&st->l2);
  626. st->l2.vs = 0;
  627. st->l2.va = 0;
  628. st->l2.vr = 0;
  629. st->l2.sow = 0;
  630. FsmChangeState(fi, ST_L2_7);
  631. stop_t200(st, 3);
  632. FsmRestartTimer(&st->l2.t203, st->l2.T203, EV_L2_T203, NULL, 3);
  633. if (est)
  634. st->l2.l2l3(st, DL_ESTABLISH | INDICATION, NULL);
  635. if ((ST_L2_7==state) || (ST_L2_8 == state))
  636. if (skb_queue_len(&st->l2.i_queue) && cansend(st))
  637. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  638. }
  639. static void
  640. l2_stop_multi(struct FsmInst *fi, int event, void *arg)
  641. {
  642. struct PStack *st = fi->userdata;
  643. struct sk_buff *skb = arg;
  644. FsmChangeState(fi, ST_L2_4);
  645. FsmDelTimer(&st->l2.t203, 3);
  646. stop_t200(st, 4);
  647. send_uframe(st, UA | get_PollFlagFree(st, skb), RSP);
  648. skb_queue_purge(&st->l2.i_queue);
  649. freewin(st);
  650. lapb_dl_release_l2l3(st, INDICATION);
  651. }
  652. static void
  653. l2_connected(struct FsmInst *fi, int event, void *arg)
  654. {
  655. struct PStack *st = fi->userdata;
  656. struct sk_buff *skb = arg;
  657. int pr=-1;
  658. if (!get_PollFlag(st, skb)) {
  659. l2_mdl_error_ua(fi, event, arg);
  660. return;
  661. }
  662. FreeSkb(skb);
  663. if (test_and_clear_bit(FLG_PEND_REL, &st->l2.flag))
  664. l2_disconnect(fi, event, arg);
  665. if (test_and_clear_bit(FLG_L3_INIT, &st->l2.flag)) {
  666. pr = DL_ESTABLISH | CONFIRM;
  667. } else if (st->l2.vs != st->l2.va) {
  668. skb_queue_purge(&st->l2.i_queue);
  669. pr = DL_ESTABLISH | INDICATION;
  670. }
  671. stop_t200(st, 5);
  672. st->l2.vr = 0;
  673. st->l2.vs = 0;
  674. st->l2.va = 0;
  675. st->l2.sow = 0;
  676. FsmChangeState(fi, ST_L2_7);
  677. FsmAddTimer(&st->l2.t203, st->l2.T203, EV_L2_T203, NULL, 4);
  678. if (pr != -1)
  679. st->l2.l2l3(st, pr, NULL);
  680. if (skb_queue_len(&st->l2.i_queue) && cansend(st))
  681. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  682. }
  683. static void
  684. l2_released(struct FsmInst *fi, int event, void *arg)
  685. {
  686. struct PStack *st = fi->userdata;
  687. struct sk_buff *skb = arg;
  688. if (!get_PollFlag(st, skb)) {
  689. l2_mdl_error_ua(fi, event, arg);
  690. return;
  691. }
  692. FreeSkb(skb);
  693. stop_t200(st, 6);
  694. lapb_dl_release_l2l3(st, CONFIRM);
  695. FsmChangeState(fi, ST_L2_4);
  696. }
  697. static void
  698. l2_reestablish(struct FsmInst *fi, int event, void *arg)
  699. {
  700. struct PStack *st = fi->userdata;
  701. struct sk_buff *skb = arg;
  702. if (!get_PollFlagFree(st, skb)) {
  703. establishlink(fi);
  704. test_and_set_bit(FLG_L3_INIT, &st->l2.flag);
  705. }
  706. }
  707. static void
  708. l2_st5_dm_release(struct FsmInst *fi, int event, void *arg)
  709. {
  710. struct PStack *st = fi->userdata;
  711. struct sk_buff *skb = arg;
  712. if (get_PollFlagFree(st, skb)) {
  713. stop_t200(st, 7);
  714.   if (!test_bit(FLG_L3_INIT, &st->l2.flag))
  715. skb_queue_purge(&st->l2.i_queue);
  716. if (test_bit(FLG_LAPB, &st->l2.flag))
  717. st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
  718. st5_dl_release_l2l3(st);
  719. FsmChangeState(fi, ST_L2_4);
  720. }
  721. }
  722. static void
  723. l2_st6_dm_release(struct FsmInst *fi, int event, void *arg)
  724. {
  725. struct PStack *st = fi->userdata;
  726. struct sk_buff *skb = arg;
  727. if (get_PollFlagFree(st, skb)) {
  728. stop_t200(st, 8);
  729. lapb_dl_release_l2l3(st, CONFIRM);
  730. FsmChangeState(fi, ST_L2_4);
  731. }
  732. }
  733. inline void
  734. enquiry_cr(struct PStack *st, u_char typ, u_char cr, u_char pf)
  735. {
  736. struct sk_buff *skb;
  737. struct Layer2 *l2;
  738. u_char tmp[MAX_HEADER_LEN];
  739. int i;
  740. l2 = &st->l2;
  741. i = sethdraddr(l2, tmp, cr);
  742. if (test_bit(FLG_MOD128, &l2->flag)) {
  743. tmp[i++] = typ;
  744. tmp[i++] = (l2->vr << 1) | (pf ? 1 : 0);
  745. } else
  746. tmp[i++] = (l2->vr << 5) | typ | (pf ? 0x10 : 0);
  747. if (!(skb = alloc_skb(i, GFP_ATOMIC))) {
  748. printk(KERN_WARNING "isdl2 can't alloc sbbuff for enquiry_crn");
  749. return;
  750. }
  751. memcpy(skb_put(skb, i), tmp, i);
  752. enqueue_super(st, skb);
  753. }
  754. inline void
  755. enquiry_response(struct PStack *st)
  756. {
  757. if (test_bit(FLG_OWN_BUSY, &st->l2.flag))
  758. enquiry_cr(st, RNR, RSP, 1);
  759. else
  760. enquiry_cr(st, RR, RSP, 1);
  761. test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
  762. }
  763. inline void
  764. transmit_enquiry(struct PStack *st)
  765. {
  766. if (test_bit(FLG_OWN_BUSY, &st->l2.flag))
  767. enquiry_cr(st, RNR, CMD, 1);
  768. else
  769. enquiry_cr(st, RR, CMD, 1);
  770. test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
  771. start_t200(st, 9);
  772. }
  773. static void
  774. nrerrorrecovery(struct FsmInst *fi)
  775. {
  776. struct PStack *st = fi->userdata;
  777. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'J');
  778. establishlink(fi);
  779. test_and_clear_bit(FLG_L3_INIT, &st->l2.flag);
  780. }
  781. static void
  782. invoke_retransmission(struct PStack *st, unsigned int nr)
  783. {
  784. struct Layer2 *l2 = &st->l2;
  785. unsigned int p1;
  786. if (l2->vs != nr) {
  787. while (l2->vs != nr) {
  788. (l2->vs)--;
  789. if(test_bit(FLG_MOD128, &l2->flag)) {
  790. l2->vs %= 128;
  791. p1 = (l2->vs - l2->va) % 128;
  792. } else {
  793. l2->vs %= 8;
  794. p1 = (l2->vs - l2->va) % 8;
  795. }
  796. p1 = (p1 + l2->sow) % l2->window;
  797. if (test_bit(FLG_LAPB, &l2->flag))
  798. st->l1.bcs->tx_cnt += l2->windowar[p1]->len + l2headersize(l2, 0);
  799. skb_queue_head(&l2->i_queue, l2->windowar[p1]);
  800. l2->windowar[p1] = NULL;
  801. }
  802. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  803. }
  804. }
  805. static void
  806. l2_st7_got_super(struct FsmInst *fi, int event, void *arg)
  807. {
  808. struct PStack *st = fi->userdata;
  809. struct sk_buff *skb = arg;
  810. int PollFlag, rsp, typ = RR;
  811. unsigned int nr;
  812. struct Layer2 *l2 = &st->l2;
  813. rsp = *skb->data & 0x2;
  814. if (test_bit(FLG_ORIG, &l2->flag))
  815. rsp = !rsp;
  816. skb_pull(skb, l2addrsize(l2));
  817. if (IsRNR(skb->data, st)) {
  818. set_peer_busy(l2);
  819. typ = RNR;
  820. } else
  821. clear_peer_busy(l2);
  822. if (IsREJ(skb->data, st))
  823. typ = REJ;
  824. if (test_bit(FLG_MOD128, &l2->flag)) {
  825. PollFlag = (skb->data[1] & 0x1) == 0x1;
  826. nr = skb->data[1] >> 1;
  827. } else {
  828. PollFlag = (skb->data[0] & 0x10);
  829. nr = (skb->data[0] >> 5) & 0x7;
  830. }
  831. FreeSkb(skb);
  832. if (PollFlag) {
  833. if (rsp)
  834. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'A');
  835. else
  836. enquiry_response(st);
  837. }
  838. if (legalnr(st, nr)) {
  839. if (typ == REJ) {
  840. setva(st, nr);
  841. invoke_retransmission(st, nr);
  842. stop_t200(st, 10);
  843. if (FsmAddTimer(&st->l2.t203, st->l2.T203,
  844. EV_L2_T203, NULL, 6))
  845. l2m_debug(&st->l2.l2m, "Restart T203 ST7 REJ");
  846. } else if ((nr == l2->vs) && (typ == RR)) {
  847. setva(st, nr);
  848. stop_t200(st, 11);
  849. FsmRestartTimer(&st->l2.t203, st->l2.T203,
  850. EV_L2_T203, NULL, 7);
  851. } else if ((l2->va != nr) || (typ == RNR)) {
  852. setva(st, nr);
  853. if(typ != RR) FsmDelTimer(&st->l2.t203, 9);
  854. restart_t200(st, 12);
  855. }
  856. if (skb_queue_len(&st->l2.i_queue) && (typ == RR))
  857. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  858. } else
  859. nrerrorrecovery(fi);
  860. }
  861. static void
  862. l2_feed_i_if_reest(struct FsmInst *fi, int event, void *arg)
  863. {
  864. struct PStack *st = fi->userdata;
  865. struct sk_buff *skb = arg;
  866. if (test_bit(FLG_LAPB, &st->l2.flag))
  867. st->l1.bcs->tx_cnt += skb->len + l2headersize(&st->l2, 0);
  868. if (!test_bit(FLG_L3_INIT, &st->l2.flag))
  869. skb_queue_tail(&st->l2.i_queue, skb);
  870. else
  871. FreeSkb(skb);
  872. }
  873. static void
  874. l2_feed_i_pull(struct FsmInst *fi, int event, void *arg)
  875. {
  876. struct PStack *st = fi->userdata;
  877. struct sk_buff *skb = arg;
  878. if (test_bit(FLG_LAPB, &st->l2.flag))
  879. st->l1.bcs->tx_cnt += skb->len + l2headersize(&st->l2, 0);
  880. skb_queue_tail(&st->l2.i_queue, skb);
  881. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  882. }
  883. static void
  884. l2_feed_iqueue(struct FsmInst *fi, int event, void *arg)
  885. {
  886. struct PStack *st = fi->userdata;
  887. struct sk_buff *skb = arg;
  888. if (test_bit(FLG_LAPB, &st->l2.flag))
  889. st->l1.bcs->tx_cnt += skb->len + l2headersize(&st->l2, 0);
  890. skb_queue_tail(&st->l2.i_queue, skb);
  891. }
  892. static void
  893. l2_got_iframe(struct FsmInst *fi, int event, void *arg)
  894. {
  895. struct PStack *st = fi->userdata;
  896. struct sk_buff *skb = arg;
  897. struct Layer2 *l2 = &(st->l2);
  898. int PollFlag, ns, i;
  899. unsigned int nr;
  900. i = l2addrsize(l2);
  901. if (test_bit(FLG_MOD128, &l2->flag)) {
  902. PollFlag = ((skb->data[i + 1] & 0x1) == 0x1);
  903. ns = skb->data[i] >> 1;
  904. nr = (skb->data[i + 1] >> 1) & 0x7f;
  905. } else {
  906. PollFlag = (skb->data[i] & 0x10);
  907. ns = (skb->data[i] >> 1) & 0x7;
  908. nr = (skb->data[i] >> 5) & 0x7;
  909. }
  910. if (test_bit(FLG_OWN_BUSY, &l2->flag)) {
  911. FreeSkb(skb);
  912. if(PollFlag) enquiry_response(st);
  913. } else if (l2->vr == ns) {
  914. (l2->vr)++;
  915. if(test_bit(FLG_MOD128, &l2->flag))
  916. l2->vr %= 128;
  917. else
  918. l2->vr %= 8;
  919. test_and_clear_bit(FLG_REJEXC, &l2->flag);
  920. if (PollFlag)
  921. enquiry_response(st);
  922. else
  923. test_and_set_bit(FLG_ACK_PEND, &l2->flag);
  924. skb_pull(skb, l2headersize(l2, 0));
  925. st->l2.l2l3(st, DL_DATA | INDICATION, skb);
  926. } else {
  927. /* n(s)!=v(r) */
  928. FreeSkb(skb);
  929. if (test_and_set_bit(FLG_REJEXC, &l2->flag)) {
  930. if (PollFlag)
  931. enquiry_response(st);
  932. } else {
  933. enquiry_cr(st, REJ, RSP, PollFlag);
  934. test_and_clear_bit(FLG_ACK_PEND, &l2->flag);
  935. }
  936. }
  937. if (legalnr(st, nr)) {
  938. if (!test_bit(FLG_PEER_BUSY, &st->l2.flag) && (fi->state == ST_L2_7)) {
  939. if (nr == st->l2.vs) {
  940. stop_t200(st, 13);
  941. FsmRestartTimer(&st->l2.t203, st->l2.T203,
  942. EV_L2_T203, NULL, 7);
  943. } else if (nr != st->l2.va)
  944. restart_t200(st, 14);
  945. }
  946. setva(st, nr);
  947. } else {
  948. nrerrorrecovery(fi);
  949. return;
  950. }
  951. if (skb_queue_len(&st->l2.i_queue) && (fi->state == ST_L2_7))
  952. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  953. if (test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag))
  954. enquiry_cr(st, RR, RSP, 0);
  955. }
  956. static void
  957. l2_got_tei(struct FsmInst *fi, int event, void *arg)
  958. {
  959. struct PStack *st = fi->userdata;
  960. st->l2.tei = (long) arg;
  961. if (fi->state == ST_L2_3) {
  962. establishlink(fi);
  963. test_and_set_bit(FLG_L3_INIT, &st->l2.flag);
  964. } else
  965. FsmChangeState(fi, ST_L2_4);
  966. if (skb_queue_len(&st->l2.ui_queue))
  967. tx_ui(st);
  968. }
  969. static void
  970. l2_st5_tout_200(struct FsmInst *fi, int event, void *arg)
  971. {
  972. struct PStack *st = fi->userdata;
  973. if (test_bit(FLG_LAPD, &st->l2.flag) &&
  974. test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
  975. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
  976. } else if (st->l2.rc == st->l2.N200) {
  977. FsmChangeState(fi, ST_L2_4);
  978. test_and_clear_bit(FLG_T200_RUN, &st->l2.flag);
  979. skb_queue_purge(&st->l2.i_queue);
  980. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'G');
  981. if (test_bit(FLG_LAPB, &st->l2.flag))
  982. st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
  983. st5_dl_release_l2l3(st);
  984. } else {
  985. st->l2.rc++;
  986. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
  987. send_uframe(st, (test_bit(FLG_MOD128, &st->l2.flag) ? SABME : SABM)
  988.     | 0x10, CMD);
  989. }
  990. }
  991. static void
  992. l2_st6_tout_200(struct FsmInst *fi, int event, void *arg)
  993. {
  994. struct PStack *st = fi->userdata;
  995. if (test_bit(FLG_LAPD, &st->l2.flag) &&
  996. test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
  997. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
  998. } else if (st->l2.rc == st->l2.N200) {
  999. FsmChangeState(fi, ST_L2_4);
  1000. test_and_clear_bit(FLG_T200_RUN, &st->l2.flag);
  1001. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'H');
  1002. lapb_dl_release_l2l3(st, CONFIRM);
  1003. } else {
  1004. st->l2.rc++;
  1005. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200,
  1006.     NULL, 9);
  1007. send_uframe(st, DISC | 0x10, CMD);
  1008. }
  1009. }
  1010. static void
  1011. l2_st7_tout_200(struct FsmInst *fi, int event, void *arg)
  1012. {
  1013. struct PStack *st = fi->userdata;
  1014. if (test_bit(FLG_LAPD, &st->l2.flag) &&
  1015. test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
  1016. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
  1017. return;
  1018. }
  1019. test_and_clear_bit(FLG_T200_RUN, &st->l2.flag);
  1020. st->l2.rc = 0;
  1021. FsmChangeState(fi, ST_L2_8);
  1022. transmit_enquiry(st);
  1023. st->l2.rc++;
  1024. }
  1025. static void
  1026. l2_st8_tout_200(struct FsmInst *fi, int event, void *arg)
  1027. {
  1028. struct PStack *st = fi->userdata;
  1029. if (test_bit(FLG_LAPD, &st->l2.flag) &&
  1030. test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
  1031. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 9);
  1032. return;
  1033. }
  1034. test_and_clear_bit(FLG_T200_RUN, &st->l2.flag);
  1035. if (st->l2.rc == st->l2.N200) {
  1036. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'I');
  1037. establishlink(fi);
  1038. test_and_clear_bit(FLG_L3_INIT, &st->l2.flag);
  1039. } else {
  1040. transmit_enquiry(st);
  1041. st->l2.rc++;
  1042. }
  1043. }
  1044. static void
  1045. l2_st7_tout_203(struct FsmInst *fi, int event, void *arg)
  1046. {
  1047. struct PStack *st = fi->userdata;
  1048. if (test_bit(FLG_LAPD, &st->l2.flag) &&
  1049. test_bit(FLG_DCHAN_BUSY, &st->l2.flag)) {
  1050. FsmAddTimer(&st->l2.t203, st->l2.T203, EV_L2_T203, NULL, 9);
  1051. return;
  1052. }
  1053. FsmChangeState(fi, ST_L2_8);
  1054. transmit_enquiry(st);
  1055. st->l2.rc = 0;
  1056. }
  1057. static void
  1058. l2_pull_iqueue(struct FsmInst *fi, int event, void *arg)
  1059. {
  1060. struct PStack *st = fi->userdata;
  1061. struct sk_buff *skb, *oskb;
  1062. struct Layer2 *l2 = &st->l2;
  1063. u_char header[MAX_HEADER_LEN];
  1064. int i;
  1065. int unsigned p1;
  1066. long flags;
  1067. if (!cansend(st))
  1068. return;
  1069. skb = skb_dequeue(&l2->i_queue);
  1070. if (!skb)
  1071. return;
  1072. save_flags(flags);
  1073. cli();
  1074. if(test_bit(FLG_MOD128, &l2->flag))
  1075. p1 = (l2->vs - l2->va) % 128;
  1076. else
  1077. p1 = (l2->vs - l2->va) % 8;
  1078. p1 = (p1 + l2->sow) % l2->window;
  1079. if (l2->windowar[p1]) {
  1080. printk(KERN_WARNING "isdnl2 try overwrite ack queue entry %dn",
  1081.        p1);
  1082. dev_kfree_skb(l2->windowar[p1]);
  1083. }
  1084. l2->windowar[p1] = skb_clone(skb, GFP_ATOMIC);
  1085. i = sethdraddr(&st->l2, header, CMD);
  1086. if (test_bit(FLG_MOD128, &l2->flag)) {
  1087. header[i++] = l2->vs << 1;
  1088. header[i++] = l2->vr << 1;
  1089. l2->vs = (l2->vs + 1) % 128;
  1090. } else {
  1091. header[i++] = (l2->vr << 5) | (l2->vs << 1);
  1092. l2->vs = (l2->vs + 1) % 8;
  1093. }
  1094. restore_flags(flags);
  1095. p1 = skb->data - skb->head;
  1096. if (p1 >= i)
  1097. memcpy(skb_push(skb, i), header, i);
  1098. else {
  1099. printk(KERN_WARNING
  1100. "isdl2 pull_iqueue skb header(%d/%d) too shortn", i, p1);
  1101. oskb = skb;
  1102. skb = alloc_skb(oskb->len + i, GFP_ATOMIC);
  1103. memcpy(skb_put(skb, i), header, i);
  1104. memcpy(skb_put(skb, oskb->len), oskb->data, oskb->len);
  1105. FreeSkb(oskb);
  1106. }
  1107. st->l2.l2l1(st, PH_PULL | INDICATION, skb);
  1108. test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
  1109. if (!test_and_set_bit(FLG_T200_RUN, &st->l2.flag)) {
  1110. FsmDelTimer(&st->l2.t203, 13);
  1111. FsmAddTimer(&st->l2.t200, st->l2.T200, EV_L2_T200, NULL, 11);
  1112. }
  1113. if (skb_queue_len(&l2->i_queue) && cansend(st))
  1114. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  1115. }
  1116. static void
  1117. l2_st8_got_super(struct FsmInst *fi, int event, void *arg)
  1118. {
  1119. struct PStack *st = fi->userdata;
  1120. struct sk_buff *skb = arg;
  1121. int PollFlag, rsp, rnr = 0;
  1122. unsigned int nr;
  1123. struct Layer2 *l2 = &st->l2;
  1124. rsp = *skb->data & 0x2;
  1125. if (test_bit(FLG_ORIG, &l2->flag))
  1126. rsp = !rsp;
  1127. skb_pull(skb, l2addrsize(l2));
  1128. if (IsRNR(skb->data, st)) {
  1129. set_peer_busy(l2);
  1130. rnr = 1;
  1131. } else
  1132. clear_peer_busy(l2);
  1133. if (test_bit(FLG_MOD128, &l2->flag)) {
  1134. PollFlag = (skb->data[1] & 0x1) == 0x1;
  1135. nr = skb->data[1] >> 1;
  1136. } else {
  1137. PollFlag = (skb->data[0] & 0x10);
  1138. nr = (skb->data[0] >> 5) & 0x7;
  1139. }
  1140. FreeSkb(skb);
  1141. if (rsp && PollFlag) {
  1142. if (legalnr(st, nr)) {
  1143. if (rnr) {
  1144. restart_t200(st, 15);
  1145. } else {
  1146. stop_t200(st, 16);
  1147. FsmAddTimer(&l2->t203, l2->T203,
  1148.     EV_L2_T203, NULL, 5);
  1149. setva(st, nr);
  1150. }
  1151. invoke_retransmission(st, nr);
  1152. FsmChangeState(fi, ST_L2_7);
  1153. if (skb_queue_len(&l2->i_queue) && cansend(st))
  1154. st->l2.l2l1(st, PH_PULL | REQUEST, NULL);
  1155. } else
  1156. nrerrorrecovery(fi);
  1157. } else {
  1158. if (!rsp && PollFlag)
  1159. enquiry_response(st);
  1160. if (legalnr(st, nr)) {
  1161. setva(st, nr);
  1162. } else
  1163. nrerrorrecovery(fi);
  1164. }
  1165. }
  1166. static void
  1167. l2_got_FRMR(struct FsmInst *fi, int event, void *arg)
  1168. {
  1169. struct PStack *st = fi->userdata;
  1170. struct sk_buff *skb = arg;
  1171. skb_pull(skb, l2addrsize(&st->l2) + 1);
  1172. if (!(skb->data[0] & 1) || ((skb->data[0] & 3) == 1) || /* I or S */
  1173.     (IsUA(skb->data) && (fi->state == ST_L2_7))) {
  1174. st->ma.layer(st, MDL_ERROR | INDICATION, (void *) 'K');
  1175. establishlink(fi);
  1176. test_and_clear_bit(FLG_L3_INIT, &st->l2.flag);
  1177. }
  1178. FreeSkb(skb);
  1179. }
  1180. static void
  1181. l2_st24_tei_remove(struct FsmInst *fi, int event, void *arg)
  1182. {
  1183. struct PStack *st = fi->userdata;
  1184. skb_queue_purge(&st->l2.ui_queue);
  1185. st->l2.tei = -1;
  1186. FsmChangeState(fi, ST_L2_1);
  1187. }
  1188. static void
  1189. l2_st3_tei_remove(struct FsmInst *fi, int event, void *arg)
  1190. {
  1191. struct PStack *st = fi->userdata;
  1192. skb_queue_purge(&st->l2.ui_queue);
  1193. st->l2.tei = -1;
  1194. st->l2.l2l3(st, DL_RELEASE | INDICATION, NULL);
  1195. FsmChangeState(fi, ST_L2_1);
  1196. }
  1197. static void
  1198. l2_st5_tei_remove(struct FsmInst *fi, int event, void *arg)
  1199. {
  1200. struct PStack *st = fi->userdata;
  1201. skb_queue_purge(&st->l2.i_queue);
  1202. skb_queue_purge(&st->l2.ui_queue);
  1203. freewin(st);
  1204. st->l2.tei = -1;
  1205. stop_t200(st, 17);
  1206. st5_dl_release_l2l3(st);
  1207. FsmChangeState(fi, ST_L2_1);
  1208. }
  1209. static void
  1210. l2_st6_tei_remove(struct FsmInst *fi, int event, void *arg)
  1211. {
  1212. struct PStack *st = fi->userdata;
  1213. skb_queue_purge(&st->l2.ui_queue);
  1214. st->l2.tei = -1;
  1215. stop_t200(st, 18);
  1216. st->l2.l2l3(st, DL_RELEASE | CONFIRM, NULL);
  1217. FsmChangeState(fi, ST_L2_1);
  1218. }
  1219. static void
  1220. l2_tei_remove(struct FsmInst *fi, int event, void *arg)
  1221. {
  1222. struct PStack *st = fi->userdata;
  1223. skb_queue_purge(&st->l2.i_queue);
  1224. skb_queue_purge(&st->l2.ui_queue);
  1225. freewin(st);
  1226. st->l2.tei = -1;
  1227. stop_t200(st, 17);
  1228. FsmDelTimer(&st->l2.t203, 19);
  1229. st->l2.l2l3(st, DL_RELEASE | INDICATION, NULL);
  1230. FsmChangeState(fi, ST_L2_1);
  1231. }
  1232. static void
  1233. l2_st14_persistant_da(struct FsmInst *fi, int event, void *arg)
  1234. {
  1235. struct PStack *st = fi->userdata;
  1236. skb_queue_purge(&st->l2.i_queue);
  1237. skb_queue_purge(&st->l2.ui_queue);
  1238. if (test_and_clear_bit(FLG_ESTAB_PEND, &st->l2.flag))
  1239. st->l2.l2l3(st, DL_RELEASE | INDICATION, NULL);
  1240. }
  1241. static void
  1242. l2_st5_persistant_da(struct FsmInst *fi, int event, void *arg)
  1243. {
  1244. struct PStack *st = fi->userdata;
  1245. skb_queue_purge(&st->l2.i_queue);
  1246. skb_queue_purge(&st->l2.ui_queue);
  1247. freewin(st);
  1248. stop_t200(st, 19);
  1249. st5_dl_release_l2l3(st);
  1250. FsmChangeState(fi, ST_L2_4);
  1251. }
  1252. static void
  1253. l2_st6_persistant_da(struct FsmInst *fi, int event, void *arg)
  1254. {
  1255. struct PStack *st = fi->userdata;
  1256. skb_queue_purge(&st->l2.ui_queue);
  1257. stop_t200(st, 20);
  1258. st->l2.l2l3(st, DL_RELEASE | CONFIRM, NULL);
  1259. FsmChangeState(fi, ST_L2_4);
  1260. }
  1261. static void
  1262. l2_persistant_da(struct FsmInst *fi, int event, void *arg)
  1263. {
  1264. struct PStack *st = fi->userdata;
  1265. skb_queue_purge(&st->l2.i_queue);
  1266. skb_queue_purge(&st->l2.ui_queue);
  1267. freewin(st);
  1268. stop_t200(st, 19);
  1269. FsmDelTimer(&st->l2.t203, 19);
  1270. st->l2.l2l3(st, DL_RELEASE | INDICATION, NULL);
  1271. FsmChangeState(fi, ST_L2_4);
  1272. }
  1273. static void
  1274. l2_set_own_busy(struct FsmInst *fi, int event, void *arg)
  1275. {
  1276. struct PStack *st = fi->userdata;
  1277. if(!test_and_set_bit(FLG_OWN_BUSY, &st->l2.flag)) {
  1278. enquiry_cr(st, RNR, RSP, 0);
  1279. test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
  1280. }
  1281. }
  1282. static void
  1283. l2_clear_own_busy(struct FsmInst *fi, int event, void *arg)
  1284. {
  1285. struct PStack *st = fi->userdata;
  1286. if(!test_and_clear_bit(FLG_OWN_BUSY, &st->l2.flag)) {
  1287. enquiry_cr(st, RR, RSP, 0);
  1288. test_and_clear_bit(FLG_ACK_PEND, &st->l2.flag);
  1289. }
  1290. }
  1291. static void
  1292. l2_frame_error(struct FsmInst *fi, int event, void *arg)
  1293. {
  1294. struct PStack *st = fi->userdata;
  1295. st->ma.layer(st, MDL_ERROR | INDICATION, arg);
  1296. }
  1297. static void
  1298. l2_frame_error_reest(struct FsmInst *fi, int event, void *arg)
  1299. {
  1300. struct PStack *st = fi->userdata;
  1301. st->ma.layer(st, MDL_ERROR | INDICATION, arg);
  1302. establishlink(fi);
  1303. test_and_clear_bit(FLG_L3_INIT, &st->l2.flag);
  1304. }
  1305. static struct FsmNode L2FnList[] __initdata =
  1306. {
  1307. {ST_L2_1, EV_L2_DL_ESTABLISH_REQ, l2_mdl_assign},
  1308. {ST_L2_2, EV_L2_DL_ESTABLISH_REQ, l2_go_st3},
  1309. {ST_L2_4, EV_L2_DL_ESTABLISH_REQ, l2_establish},
  1310. {ST_L2_5, EV_L2_DL_ESTABLISH_REQ, l2_discard_i_setl3},
  1311. {ST_L2_7, EV_L2_DL_ESTABLISH_REQ, l2_l3_reestablish},
  1312. {ST_L2_8, EV_L2_DL_ESTABLISH_REQ, l2_l3_reestablish},
  1313. {ST_L2_4, EV_L2_DL_RELEASE_REQ, l2_release},
  1314. {ST_L2_5, EV_L2_DL_RELEASE_REQ, l2_pend_rel},
  1315. {ST_L2_7, EV_L2_DL_RELEASE_REQ, l2_disconnect},
  1316. {ST_L2_8, EV_L2_DL_RELEASE_REQ, l2_disconnect},
  1317. {ST_L2_5, EV_L2_DL_DATA, l2_feed_i_if_reest},
  1318. {ST_L2_7, EV_L2_DL_DATA, l2_feed_i_pull},
  1319. {ST_L2_8, EV_L2_DL_DATA, l2_feed_iqueue},
  1320. {ST_L2_1, EV_L2_DL_UNIT_DATA, l2_queue_ui_assign},
  1321. {ST_L2_2, EV_L2_DL_UNIT_DATA, l2_queue_ui},
  1322. {ST_L2_3, EV_L2_DL_UNIT_DATA, l2_queue_ui},
  1323. {ST_L2_4, EV_L2_DL_UNIT_DATA, l2_send_ui},
  1324. {ST_L2_5, EV_L2_DL_UNIT_DATA, l2_send_ui},
  1325. {ST_L2_6, EV_L2_DL_UNIT_DATA, l2_send_ui},
  1326. {ST_L2_7, EV_L2_DL_UNIT_DATA, l2_send_ui},
  1327. {ST_L2_8, EV_L2_DL_UNIT_DATA, l2_send_ui},
  1328. {ST_L2_1, EV_L2_MDL_ASSIGN, l2_got_tei},
  1329. {ST_L2_2, EV_L2_MDL_ASSIGN, l2_got_tei},
  1330. {ST_L2_3, EV_L2_MDL_ASSIGN, l2_got_tei},
  1331. {ST_L2_2, EV_L2_MDL_ERROR, l2_st24_tei_remove},
  1332. {ST_L2_3, EV_L2_MDL_ERROR, l2_st3_tei_remove},
  1333. {ST_L2_4, EV_L2_MDL_REMOVE, l2_st24_tei_remove},
  1334. {ST_L2_5, EV_L2_MDL_REMOVE, l2_st5_tei_remove},
  1335. {ST_L2_6, EV_L2_MDL_REMOVE, l2_st6_tei_remove},
  1336. {ST_L2_7, EV_L2_MDL_REMOVE, l2_tei_remove},
  1337. {ST_L2_8, EV_L2_MDL_REMOVE, l2_tei_remove},
  1338. {ST_L2_4, EV_L2_SABME, l2_start_multi},
  1339. {ST_L2_5, EV_L2_SABME, l2_send_UA},
  1340. {ST_L2_6, EV_L2_SABME, l2_send_DM},
  1341. {ST_L2_7, EV_L2_SABME, l2_restart_multi},
  1342. {ST_L2_8, EV_L2_SABME, l2_restart_multi},
  1343. {ST_L2_4, EV_L2_DISC, l2_send_DM},
  1344. {ST_L2_5, EV_L2_DISC, l2_send_DM},
  1345. {ST_L2_6, EV_L2_DISC, l2_send_UA},
  1346. {ST_L2_7, EV_L2_DISC, l2_stop_multi},
  1347. {ST_L2_8, EV_L2_DISC, l2_stop_multi},
  1348. {ST_L2_4, EV_L2_UA, l2_mdl_error_ua},
  1349. {ST_L2_5, EV_L2_UA, l2_connected},
  1350. {ST_L2_6, EV_L2_UA, l2_released},
  1351. {ST_L2_7, EV_L2_UA, l2_mdl_error_ua},
  1352. {ST_L2_8, EV_L2_UA, l2_mdl_error_ua},
  1353. {ST_L2_4, EV_L2_DM, l2_reestablish},
  1354. {ST_L2_5, EV_L2_DM, l2_st5_dm_release},
  1355. {ST_L2_6, EV_L2_DM, l2_st6_dm_release},
  1356. {ST_L2_7, EV_L2_DM, l2_mdl_error_dm},
  1357. {ST_L2_8, EV_L2_DM, l2_st8_mdl_error_dm},
  1358. {ST_L2_1, EV_L2_UI, l2_got_ui},
  1359. {ST_L2_2, EV_L2_UI, l2_got_ui},
  1360. {ST_L2_3, EV_L2_UI, l2_got_ui},
  1361. {ST_L2_4, EV_L2_UI, l2_got_ui},
  1362. {ST_L2_5, EV_L2_UI, l2_got_ui},
  1363. {ST_L2_6, EV_L2_UI, l2_got_ui},
  1364. {ST_L2_7, EV_L2_UI, l2_got_ui},
  1365. {ST_L2_8, EV_L2_UI, l2_got_ui},
  1366. {ST_L2_7, EV_L2_FRMR, l2_got_FRMR},
  1367. {ST_L2_8, EV_L2_FRMR, l2_got_FRMR},
  1368. {ST_L2_7, EV_L2_SUPER, l2_st7_got_super},
  1369. {ST_L2_8, EV_L2_SUPER, l2_st8_got_super},
  1370. {ST_L2_7, EV_L2_I, l2_got_iframe},
  1371. {ST_L2_8, EV_L2_I, l2_got_iframe},
  1372. {ST_L2_5, EV_L2_T200, l2_st5_tout_200},
  1373. {ST_L2_6, EV_L2_T200, l2_st6_tout_200},
  1374. {ST_L2_7, EV_L2_T200, l2_st7_tout_200},
  1375. {ST_L2_8, EV_L2_T200, l2_st8_tout_200},
  1376. {ST_L2_7, EV_L2_T203, l2_st7_tout_203},
  1377. {ST_L2_7, EV_L2_ACK_PULL, l2_pull_iqueue},
  1378. {ST_L2_7, EV_L2_SET_OWN_BUSY, l2_set_own_busy},
  1379. {ST_L2_8, EV_L2_SET_OWN_BUSY, l2_set_own_busy},
  1380. {ST_L2_7, EV_L2_CLEAR_OWN_BUSY, l2_clear_own_busy},
  1381. {ST_L2_8, EV_L2_CLEAR_OWN_BUSY, l2_clear_own_busy},
  1382. {ST_L2_4, EV_L2_FRAME_ERROR, l2_frame_error},
  1383. {ST_L2_5, EV_L2_FRAME_ERROR, l2_frame_error},
  1384. {ST_L2_6, EV_L2_FRAME_ERROR, l2_frame_error},
  1385. {ST_L2_7, EV_L2_FRAME_ERROR, l2_frame_error_reest},
  1386. {ST_L2_8, EV_L2_FRAME_ERROR, l2_frame_error_reest},
  1387. {ST_L2_1, EV_L1_DEACTIVATE, l2_st14_persistant_da},
  1388. {ST_L2_2, EV_L1_DEACTIVATE, l2_st24_tei_remove},
  1389. {ST_L2_3, EV_L1_DEACTIVATE, l2_st3_tei_remove},
  1390. {ST_L2_4, EV_L1_DEACTIVATE, l2_st14_persistant_da},
  1391. {ST_L2_5, EV_L1_DEACTIVATE, l2_st5_persistant_da},
  1392. {ST_L2_6, EV_L1_DEACTIVATE, l2_st6_persistant_da},
  1393. {ST_L2_7, EV_L1_DEACTIVATE, l2_persistant_da},
  1394. {ST_L2_8, EV_L1_DEACTIVATE, l2_persistant_da},
  1395. };
  1396. #define L2_FN_COUNT (sizeof(L2FnList)/sizeof(struct FsmNode))
  1397. static void
  1398. isdnl2_l1l2(struct PStack *st, int pr, void *arg)
  1399. {
  1400. struct sk_buff *skb = arg;
  1401. u_char *datap;
  1402. int ret = 1, len;
  1403. int c = 0;
  1404. switch (pr) {
  1405. case (PH_DATA | INDICATION):
  1406. datap = skb->data;
  1407. len = l2addrsize(&st->l2);
  1408. if (skb->len > len)
  1409. datap += len;
  1410. else {
  1411. FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *) 'N');
  1412. FreeSkb(skb);
  1413. return;
  1414. }
  1415. if (!(*datap & 1)) { /* I-Frame */
  1416. if(!(c = iframe_error(st, skb)))
  1417. ret = FsmEvent(&st->l2.l2m, EV_L2_I, skb);
  1418. } else if (IsSFrame(datap, st)) { /* S-Frame */
  1419. if(!(c = super_error(st, skb)))
  1420. ret = FsmEvent(&st->l2.l2m, EV_L2_SUPER, skb);
  1421. } else if (IsUI(datap)) {
  1422. if(!(c = UI_error(st, skb)))
  1423. ret = FsmEvent(&st->l2.l2m, EV_L2_UI, skb);
  1424. } else if (IsSABME(datap, st)) {
  1425. if(!(c = unnum_error(st, skb, CMD)))
  1426. ret = FsmEvent(&st->l2.l2m, EV_L2_SABME, skb);
  1427. } else if (IsUA(datap)) {
  1428. if(!(c = unnum_error(st, skb, RSP)))
  1429. ret = FsmEvent(&st->l2.l2m, EV_L2_UA, skb);
  1430. } else if (IsDISC(datap)) {
  1431. if(!(c = unnum_error(st, skb, CMD)))
  1432. ret = FsmEvent(&st->l2.l2m, EV_L2_DISC, skb);
  1433. } else if (IsDM(datap)) {
  1434. if(!(c = unnum_error(st, skb, RSP)))
  1435. ret = FsmEvent(&st->l2.l2m, EV_L2_DM, skb);
  1436. } else if (IsFRMR(datap)) {
  1437. if(!(c = FRMR_error(st,skb)))
  1438. ret = FsmEvent(&st->l2.l2m, EV_L2_FRMR, skb);
  1439. } else {
  1440. FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *) 'L');
  1441. FreeSkb(skb);
  1442. ret = 0;
  1443. }
  1444. if(c) {
  1445. FreeSkb(skb);
  1446. FsmEvent(&st->l2.l2m, EV_L2_FRAME_ERROR, (void *)(long)c);
  1447. ret = 0;
  1448. }
  1449. if (ret)
  1450. FreeSkb(skb);
  1451. break;
  1452. case (PH_PULL | CONFIRM):
  1453. FsmEvent(&st->l2.l2m, EV_L2_ACK_PULL, arg);
  1454. break;
  1455. case (PH_PAUSE | INDICATION):
  1456. test_and_set_bit(FLG_DCHAN_BUSY, &st->l2.flag);
  1457. break;
  1458. case (PH_PAUSE | CONFIRM):
  1459. test_and_clear_bit(FLG_DCHAN_BUSY, &st->l2.flag);
  1460. break;
  1461. case (PH_ACTIVATE | CONFIRM):
  1462. case (PH_ACTIVATE | INDICATION):
  1463. test_and_set_bit(FLG_L1_ACTIV, &st->l2.flag);
  1464. if (test_and_clear_bit(FLG_ESTAB_PEND, &st->l2.flag))
  1465. FsmEvent(&st->l2.l2m, EV_L2_DL_ESTABLISH_REQ, arg);
  1466. break;
  1467. case (PH_DEACTIVATE | INDICATION):
  1468. case (PH_DEACTIVATE | CONFIRM):
  1469. test_and_clear_bit(FLG_L1_ACTIV, &st->l2.flag);
  1470. FsmEvent(&st->l2.l2m, EV_L1_DEACTIVATE, arg);
  1471. break;
  1472. default:
  1473. l2m_debug(&st->l2.l2m, "l2 unknown pr %04x", pr);
  1474. break;
  1475. }
  1476. }
  1477. static void
  1478. isdnl2_l3l2(struct PStack *st, int pr, void *arg)
  1479. {
  1480. switch (pr) {
  1481. case (DL_DATA | REQUEST):
  1482. if (FsmEvent(&st->l2.l2m, EV_L2_DL_DATA, arg)) {
  1483. dev_kfree_skb((struct sk_buff *) arg);
  1484. }
  1485. break;
  1486. case (DL_UNIT_DATA | REQUEST):
  1487. if (FsmEvent(&st->l2.l2m, EV_L2_DL_UNIT_DATA, arg)) {
  1488. dev_kfree_skb((struct sk_buff *) arg);
  1489. }
  1490. break;
  1491. case (DL_ESTABLISH | REQUEST):
  1492. if (test_bit(FLG_L1_ACTIV, &st->l2.flag)) {
  1493. if (test_bit(FLG_LAPD, &st->l2.flag) ||
  1494. test_bit(FLG_ORIG, &st->l2.flag)) {
  1495. FsmEvent(&st->l2.l2m, EV_L2_DL_ESTABLISH_REQ, arg);
  1496. }
  1497. } else {
  1498. if (test_bit(FLG_LAPD, &st->l2.flag) ||
  1499. test_bit(FLG_ORIG, &st->l2.flag)) {
  1500. test_and_set_bit(FLG_ESTAB_PEND, &st->l2.flag);
  1501. }
  1502. st->l2.l2l1(st, PH_ACTIVATE, NULL);
  1503. }
  1504. break;
  1505. case (DL_RELEASE | REQUEST):
  1506. if (test_bit(FLG_LAPB, &st->l2.flag)) {
  1507. st->l2.l2l1(st, PH_DEACTIVATE, NULL);
  1508. }
  1509. FsmEvent(&st->l2.l2m, EV_L2_DL_RELEASE_REQ, arg);
  1510. break;
  1511. case (MDL_ASSIGN | REQUEST):
  1512. FsmEvent(&st->l2.l2m, EV_L2_MDL_ASSIGN, arg);
  1513. break;
  1514. case (MDL_REMOVE | REQUEST):
  1515. FsmEvent(&st->l2.l2m, EV_L2_MDL_REMOVE, arg);
  1516. break;
  1517. case (MDL_ERROR | RESPONSE):
  1518. FsmEvent(&st->l2.l2m, EV_L2_MDL_ERROR, arg);
  1519. break;
  1520. }
  1521. }
  1522. void
  1523. releasestack_isdnl2(struct PStack *st)
  1524. {
  1525. FsmDelTimer(&st->l2.t200, 21);
  1526. FsmDelTimer(&st->l2.t203, 16);
  1527. skb_queue_purge(&st->l2.i_queue);
  1528. skb_queue_purge(&st->l2.ui_queue);
  1529. ReleaseWin(&st->l2);
  1530. }
  1531. static void
  1532. l2m_debug(struct FsmInst *fi, char *fmt, ...)
  1533. {
  1534. va_list args;
  1535. struct PStack *st = fi->userdata;
  1536. va_start(args, fmt);
  1537. VHiSax_putstatus(st->l1.hardware, st->l2.debug_id, fmt, args);
  1538. va_end(args);
  1539. }
  1540. void
  1541. setstack_isdnl2(struct PStack *st, char *debug_id)
  1542. {
  1543. st->l1.l1l2 = isdnl2_l1l2;
  1544. st->l3.l3l2 = isdnl2_l3l2;
  1545. skb_queue_head_init(&st->l2.i_queue);
  1546. skb_queue_head_init(&st->l2.ui_queue);
  1547. InitWin(&st->l2);
  1548. st->l2.debug = 0;
  1549. st->l2.l2m.fsm = &l2fsm;
  1550. if (test_bit(FLG_LAPB, &st->l2.flag))
  1551. st->l2.l2m.state = ST_L2_4;
  1552. else
  1553. st->l2.l2m.state = ST_L2_1;
  1554. st->l2.l2m.debug = 0;
  1555. st->l2.l2m.userdata = st;
  1556. st->l2.l2m.userint = 0;
  1557. st->l2.l2m.printdebug = l2m_debug;
  1558. strcpy(st->l2.debug_id, debug_id);
  1559. FsmInitTimer(&st->l2.l2m, &st->l2.t200);
  1560. FsmInitTimer(&st->l2.l2m, &st->l2.t203);
  1561. }
  1562. static void
  1563. transl2_l3l2(struct PStack *st, int pr, void *arg)
  1564. {
  1565. switch (pr) {
  1566. case (DL_DATA | REQUEST):
  1567. case (DL_UNIT_DATA | REQUEST):
  1568. st->l2.l2l1(st, PH_DATA | REQUEST, arg);
  1569. break;
  1570. case (DL_ESTABLISH | REQUEST):
  1571. st->l2.l2l1(st, PH_ACTIVATE | REQUEST, NULL);
  1572. break;
  1573. case (DL_RELEASE | REQUEST):
  1574. st->l2.l2l1(st, PH_DEACTIVATE | REQUEST, NULL);
  1575. break;
  1576. }
  1577. }
  1578. void
  1579. setstack_transl2(struct PStack *st)
  1580. {
  1581. st->l3.l3l2 = transl2_l3l2;
  1582. }
  1583. void
  1584. releasestack_transl2(struct PStack *st)
  1585. {
  1586. }
  1587. int __init
  1588. Isdnl2New(void)
  1589. {
  1590. l2fsm.state_count = L2_STATE_COUNT;
  1591. l2fsm.event_count = L2_EVENT_COUNT;
  1592. l2fsm.strEvent = strL2Event;
  1593. l2fsm.strState = strL2State;
  1594. return FsmNew(&l2fsm, L2FnList, L2_FN_COUNT);
  1595. }
  1596. void
  1597. Isdnl2Free(void)
  1598. {
  1599. FsmFree(&l2fsm);
  1600. }