lapb_in.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. /*
  2. * LAPB release 002
  3. *
  4. * This code REQUIRES 2.1.15 or higher/ NET3.038
  5. *
  6. * This module:
  7. * This module is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * as published by the Free Software Foundation; either version
  10. * 2 of the License, or (at your option) any later version.
  11. *
  12. * History
  13. * LAPB 001 Jonathan Naulor Started Coding
  14. * LAPB 002 Jonathan Naylor New timer architecture.
  15. * 2000-10-29 Henner Eisen lapb_data_indication() return status.
  16. */
  17. #include <linux/errno.h>
  18. #include <linux/types.h>
  19. #include <linux/socket.h>
  20. #include <linux/in.h>
  21. #include <linux/kernel.h>
  22. #include <linux/timer.h>
  23. #include <linux/string.h>
  24. #include <linux/sockios.h>
  25. #include <linux/net.h>
  26. #include <linux/inet.h>
  27. #include <linux/netdevice.h>
  28. #include <linux/skbuff.h>
  29. #include <linux/slab.h>
  30. #include <net/sock.h>
  31. #include <asm/uaccess.h>
  32. #include <asm/system.h>
  33. #include <linux/fcntl.h>
  34. #include <linux/mm.h>
  35. #include <linux/interrupt.h>
  36. #include <net/lapb.h>
  37. /*
  38. * State machine for state 0, Disconnected State.
  39. * The handling of the timer(s) is in file lapb_timer.c.
  40. */
  41. static void lapb_state0_machine(struct lapb_cb *lapb, struct sk_buff *skb,
  42. struct lapb_frame *frame)
  43. {
  44. switch (frame->type) {
  45. case LAPB_SABM:
  46. #if LAPB_DEBUG > 1
  47. printk(KERN_DEBUG "lapb: (%p) S0 RX SABM(%d)\n",
  48. lapb->dev, frame->pf);
  49. #endif
  50. if (lapb->mode & LAPB_EXTENDED) {
  51. #if LAPB_DEBUG > 1
  52. printk(KERN_DEBUG "lapb: (%p) S0 TX DM(%d)\n",
  53. lapb->dev, frame->pf);
  54. #endif
  55. lapb_send_control(lapb, LAPB_DM, frame->pf,
  56. LAPB_RESPONSE);
  57. } else {
  58. #if LAPB_DEBUG > 1
  59. printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n",
  60. lapb->dev, frame->pf);
  61. #endif
  62. #if LAPB_DEBUG > 0
  63. printk(KERN_DEBUG "lapb: (%p) S0 -> S3\n", lapb->dev);
  64. #endif
  65. lapb_send_control(lapb, LAPB_UA, frame->pf,
  66. LAPB_RESPONSE);
  67. lapb_stop_t1timer(lapb);
  68. lapb_stop_t2timer(lapb);
  69. lapb->state = LAPB_STATE_3;
  70. lapb->condition = 0x00;
  71. lapb->n2count = 0;
  72. lapb->vs = 0;
  73. lapb->vr = 0;
  74. lapb->va = 0;
  75. lapb_connect_indication(lapb, LAPB_OK);
  76. }
  77. break;
  78. case LAPB_SABME:
  79. #if LAPB_DEBUG > 1
  80. printk(KERN_DEBUG "lapb: (%p) S0 RX SABME(%d)\n",
  81. lapb->dev, frame->pf);
  82. #endif
  83. if (lapb->mode & LAPB_EXTENDED) {
  84. #if LAPB_DEBUG > 1
  85. printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n",
  86. lapb->dev, frame->pf);
  87. #endif
  88. #if LAPB_DEBUG > 0
  89. printk(KERN_DEBUG "lapb: (%p) S0 -> S3\n", lapb->dev);
  90. #endif
  91. lapb_send_control(lapb, LAPB_UA, frame->pf,
  92. LAPB_RESPONSE);
  93. lapb_stop_t1timer(lapb);
  94. lapb_stop_t2timer(lapb);
  95. lapb->state = LAPB_STATE_3;
  96. lapb->condition = 0x00;
  97. lapb->n2count = 0;
  98. lapb->vs = 0;
  99. lapb->vr = 0;
  100. lapb->va = 0;
  101. lapb_connect_indication(lapb, LAPB_OK);
  102. } else {
  103. #if LAPB_DEBUG > 1
  104. printk(KERN_DEBUG "lapb: (%p) S0 TX DM(%d)\n",
  105. lapb->dev, frame->pf);
  106. #endif
  107. lapb_send_control(lapb, LAPB_DM, frame->pf,
  108. LAPB_RESPONSE);
  109. }
  110. break;
  111. case LAPB_DISC:
  112. #if LAPB_DEBUG > 1
  113. printk(KERN_DEBUG "lapb: (%p) S0 RX DISC(%d)\n",
  114. lapb->dev, frame->pf);
  115. printk(KERN_DEBUG "lapb: (%p) S0 TX UA(%d)\n",
  116. lapb->dev, frame->pf);
  117. #endif
  118. lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);
  119. break;
  120. default:
  121. break;
  122. }
  123. kfree_skb(skb);
  124. }
  125. /*
  126. * State machine for state 1, Awaiting Connection State.
  127. * The handling of the timer(s) is in file lapb_timer.c.
  128. */
  129. static void lapb_state1_machine(struct lapb_cb *lapb, struct sk_buff *skb,
  130. struct lapb_frame *frame)
  131. {
  132. switch (frame->type) {
  133. case LAPB_SABM:
  134. #if LAPB_DEBUG > 1
  135. printk(KERN_DEBUG "lapb: (%p) S1 RX SABM(%d)\n",
  136. lapb->dev, frame->pf);
  137. #endif
  138. if (lapb->mode & LAPB_EXTENDED) {
  139. #if LAPB_DEBUG > 1
  140. printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n",
  141. lapb->dev, frame->pf);
  142. #endif
  143. lapb_send_control(lapb, LAPB_DM, frame->pf,
  144. LAPB_RESPONSE);
  145. } else {
  146. #if LAPB_DEBUG > 1
  147. printk(KERN_DEBUG "lapb: (%p) S1 TX UA(%d)\n",
  148. lapb->dev, frame->pf);
  149. #endif
  150. lapb_send_control(lapb, LAPB_UA, frame->pf,
  151. LAPB_RESPONSE);
  152. }
  153. break;
  154. case LAPB_SABME:
  155. #if LAPB_DEBUG > 1
  156. printk(KERN_DEBUG "lapb: (%p) S1 RX SABME(%d)\n",
  157. lapb->dev, frame->pf);
  158. #endif
  159. if (lapb->mode & LAPB_EXTENDED) {
  160. #if LAPB_DEBUG > 1
  161. printk(KERN_DEBUG "lapb: (%p) S1 TX UA(%d)\n",
  162. lapb->dev, frame->pf);
  163. #endif
  164. lapb_send_control(lapb, LAPB_UA, frame->pf,
  165. LAPB_RESPONSE);
  166. } else {
  167. #if LAPB_DEBUG > 1
  168. printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n",
  169. lapb->dev, frame->pf);
  170. #endif
  171. lapb_send_control(lapb, LAPB_DM, frame->pf,
  172. LAPB_RESPONSE);
  173. }
  174. break;
  175. case LAPB_DISC:
  176. #if LAPB_DEBUG > 1
  177. printk(KERN_DEBUG "lapb: (%p) S1 RX DISC(%d)\n",
  178. lapb->dev, frame->pf);
  179. printk(KERN_DEBUG "lapb: (%p) S1 TX DM(%d)\n",
  180. lapb->dev, frame->pf);
  181. #endif
  182. lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE);
  183. break;
  184. case LAPB_UA:
  185. #if LAPB_DEBUG > 1
  186. printk(KERN_DEBUG "lapb: (%p) S1 RX UA(%d)\n",
  187. lapb->dev, frame->pf);
  188. #endif
  189. if (frame->pf) {
  190. #if LAPB_DEBUG > 0
  191. printk(KERN_DEBUG "lapb: (%p) S1 -> S3\n", lapb->dev);
  192. #endif
  193. lapb_stop_t1timer(lapb);
  194. lapb_stop_t2timer(lapb);
  195. lapb->state = LAPB_STATE_3;
  196. lapb->condition = 0x00;
  197. lapb->n2count = 0;
  198. lapb->vs = 0;
  199. lapb->vr = 0;
  200. lapb->va = 0;
  201. lapb_connect_confirmation(lapb, LAPB_OK);
  202. }
  203. break;
  204. case LAPB_DM:
  205. #if LAPB_DEBUG > 1
  206. printk(KERN_DEBUG "lapb: (%p) S1 RX DM(%d)\n",
  207. lapb->dev, frame->pf);
  208. #endif
  209. if (frame->pf) {
  210. #if LAPB_DEBUG > 0
  211. printk(KERN_DEBUG "lapb: (%p) S1 -> S0\n", lapb->dev);
  212. #endif
  213. lapb_clear_queues(lapb);
  214. lapb->state = LAPB_STATE_0;
  215. lapb_start_t1timer(lapb);
  216. lapb_stop_t2timer(lapb);
  217. lapb_disconnect_indication(lapb, LAPB_REFUSED);
  218. }
  219. break;
  220. }
  221. kfree_skb(skb);
  222. }
  223. /*
  224. * State machine for state 2, Awaiting Release State.
  225. * The handling of the timer(s) is in file lapb_timer.c
  226. */
  227. static void lapb_state2_machine(struct lapb_cb *lapb, struct sk_buff *skb,
  228. struct lapb_frame *frame)
  229. {
  230. switch (frame->type) {
  231. case LAPB_SABM:
  232. case LAPB_SABME:
  233. #if LAPB_DEBUG > 1
  234. printk(KERN_DEBUG "lapb: (%p) S2 RX {SABM,SABME}(%d)\n",
  235. lapb->dev, frame->pf);
  236. printk(KERN_DEBUG "lapb: (%p) S2 TX DM(%d)\n",
  237. lapb->dev, frame->pf);
  238. #endif
  239. lapb_send_control(lapb, LAPB_DM, frame->pf, LAPB_RESPONSE);
  240. break;
  241. case LAPB_DISC:
  242. #if LAPB_DEBUG > 1
  243. printk(KERN_DEBUG "lapb: (%p) S2 RX DISC(%d)\n",
  244. lapb->dev, frame->pf);
  245. printk(KERN_DEBUG "lapb: (%p) S2 TX UA(%d)\n",
  246. lapb->dev, frame->pf);
  247. #endif
  248. lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);
  249. break;
  250. case LAPB_UA:
  251. #if LAPB_DEBUG > 1
  252. printk(KERN_DEBUG "lapb: (%p) S2 RX UA(%d)\n",
  253. lapb->dev, frame->pf);
  254. #endif
  255. if (frame->pf) {
  256. #if LAPB_DEBUG > 0
  257. printk(KERN_DEBUG "lapb: (%p) S2 -> S0\n", lapb->dev);
  258. #endif
  259. lapb->state = LAPB_STATE_0;
  260. lapb_start_t1timer(lapb);
  261. lapb_stop_t2timer(lapb);
  262. lapb_disconnect_confirmation(lapb, LAPB_OK);
  263. }
  264. break;
  265. case LAPB_DM:
  266. #if LAPB_DEBUG > 1
  267. printk(KERN_DEBUG "lapb: (%p) S2 RX DM(%d)\n",
  268. lapb->dev, frame->pf);
  269. #endif
  270. if (frame->pf) {
  271. #if LAPB_DEBUG > 0
  272. printk(KERN_DEBUG "lapb: (%p) S2 -> S0\n", lapb->dev);
  273. #endif
  274. lapb->state = LAPB_STATE_0;
  275. lapb_start_t1timer(lapb);
  276. lapb_stop_t2timer(lapb);
  277. lapb_disconnect_confirmation(lapb, LAPB_NOTCONNECTED);
  278. }
  279. break;
  280. case LAPB_I:
  281. case LAPB_REJ:
  282. case LAPB_RNR:
  283. case LAPB_RR:
  284. #if LAPB_DEBUG > 1
  285. printk(KERN_DEBUG "lapb: (%p) S2 RX {I,REJ,RNR,RR}(%d)\n",
  286. lapb->dev, frame->pf);
  287. printk(KERN_DEBUG "lapb: (%p) S2 RX DM(%d)\n",
  288. lapb->dev, frame->pf);
  289. #endif
  290. if (frame->pf)
  291. lapb_send_control(lapb, LAPB_DM, frame->pf,
  292. LAPB_RESPONSE);
  293. break;
  294. }
  295. kfree_skb(skb);
  296. }
  297. /*
  298. * State machine for state 3, Connected State.
  299. * The handling of the timer(s) is in file lapb_timer.c
  300. */
  301. static void lapb_state3_machine(struct lapb_cb *lapb, struct sk_buff *skb,
  302. struct lapb_frame *frame)
  303. {
  304. int queued = 0;
  305. int modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS :
  306. LAPB_SMODULUS;
  307. switch (frame->type) {
  308. case LAPB_SABM:
  309. #if LAPB_DEBUG > 1
  310. printk(KERN_DEBUG "lapb: (%p) S3 RX SABM(%d)\n",
  311. lapb->dev, frame->pf);
  312. #endif
  313. if (lapb->mode & LAPB_EXTENDED) {
  314. #if LAPB_DEBUG > 1
  315. printk(KERN_DEBUG "lapb: (%p) S3 TX DM(%d)\n",
  316. lapb->dev, frame->pf);
  317. #endif
  318. lapb_send_control(lapb, LAPB_DM, frame->pf,
  319. LAPB_RESPONSE);
  320. } else {
  321. #if LAPB_DEBUG > 1
  322. printk(KERN_DEBUG "lapb: (%p) S3 TX UA(%d)\n",
  323. lapb->dev, frame->pf);
  324. #endif
  325. lapb_send_control(lapb, LAPB_UA, frame->pf,
  326. LAPB_RESPONSE);
  327. lapb_stop_t1timer(lapb);
  328. lapb_stop_t2timer(lapb);
  329. lapb->condition = 0x00;
  330. lapb->n2count = 0;
  331. lapb->vs = 0;
  332. lapb->vr = 0;
  333. lapb->va = 0;
  334. lapb_requeue_frames(lapb);
  335. }
  336. break;
  337. case LAPB_SABME:
  338. #if LAPB_DEBUG > 1
  339. printk(KERN_DEBUG "lapb: (%p) S3 RX SABME(%d)\n",
  340. lapb->dev, frame->pf);
  341. #endif
  342. if (lapb->mode & LAPB_EXTENDED) {
  343. #if LAPB_DEBUG > 1
  344. printk(KERN_DEBUG "lapb: (%p) S3 TX UA(%d)\n",
  345. lapb->dev, frame->pf);
  346. #endif
  347. lapb_send_control(lapb, LAPB_UA, frame->pf,
  348. LAPB_RESPONSE);
  349. lapb_stop_t1timer(lapb);
  350. lapb_stop_t2timer(lapb);
  351. lapb->condition = 0x00;
  352. lapb->n2count = 0;
  353. lapb->vs = 0;
  354. lapb->vr = 0;
  355. lapb->va = 0;
  356. lapb_requeue_frames(lapb);
  357. } else {
  358. #if LAPB_DEBUG > 1
  359. printk(KERN_DEBUG "lapb: (%p) S3 TX DM(%d)\n",
  360. lapb->dev, frame->pf);
  361. #endif
  362. lapb_send_control(lapb, LAPB_DM, frame->pf,
  363. LAPB_RESPONSE);
  364. }
  365. break;
  366. case LAPB_DISC:
  367. #if LAPB_DEBUG > 1
  368. printk(KERN_DEBUG "lapb: (%p) S3 RX DISC(%d)\n",
  369. lapb->dev, frame->pf);
  370. #endif
  371. #if LAPB_DEBUG > 0
  372. printk(KERN_DEBUG "lapb: (%p) S3 -> S0\n", lapb->dev);
  373. #endif
  374. lapb_clear_queues(lapb);
  375. lapb_send_control(lapb, LAPB_UA, frame->pf, LAPB_RESPONSE);
  376. lapb_start_t1timer(lapb);
  377. lapb_stop_t2timer(lapb);
  378. lapb->state = LAPB_STATE_0;
  379. lapb_disconnect_indication(lapb, LAPB_OK);
  380. break;
  381. case LAPB_DM:
  382. #if LAPB_DEBUG > 1
  383. printk(KERN_DEBUG "lapb: (%p) S3 RX DM(%d)\n",
  384. lapb->dev, frame->pf);
  385. #endif
  386. #if LAPB_DEBUG > 0
  387. printk(KERN_DEBUG "lapb: (%p) S3 -> S0\n", lapb->dev);
  388. #endif
  389. lapb_clear_queues(lapb);
  390. lapb->state = LAPB_STATE_0;
  391. lapb_start_t1timer(lapb);
  392. lapb_stop_t2timer(lapb);
  393. lapb_disconnect_indication(lapb, LAPB_NOTCONNECTED);
  394. break;
  395. case LAPB_RNR:
  396. #if LAPB_DEBUG > 1
  397. printk(KERN_DEBUG "lapb: (%p) S3 RX RNR(%d) R%d\n",
  398. lapb->dev, frame->pf, frame->nr);
  399. #endif
  400. lapb->condition |= LAPB_PEER_RX_BUSY_CONDITION;
  401. lapb_check_need_response(lapb, frame->cr, frame->pf);
  402. if (lapb_validate_nr(lapb, frame->nr)) {
  403. lapb_check_iframes_acked(lapb, frame->nr);
  404. } else {
  405. lapb->frmr_data = *frame;
  406. lapb->frmr_type = LAPB_FRMR_Z;
  407. lapb_transmit_frmr(lapb);
  408. #if LAPB_DEBUG > 0
  409. printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->dev);
  410. #endif
  411. lapb_start_t1timer(lapb);
  412. lapb_stop_t2timer(lapb);
  413. lapb->state = LAPB_STATE_4;
  414. lapb->n2count = 0;
  415. }
  416. break;
  417. case LAPB_RR:
  418. #if LAPB_DEBUG > 1
  419. printk(KERN_DEBUG "lapb: (%p) S3 RX RR(%d) R%d\n",
  420. lapb->dev, frame->pf, frame->nr);
  421. #endif
  422. lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;
  423. lapb_check_need_response(lapb, frame->cr, frame->pf);
  424. if (lapb_validate_nr(lapb, frame->nr)) {
  425. lapb_check_iframes_acked(lapb, frame->nr);
  426. } else {
  427. lapb->frmr_data = *frame;
  428. lapb->frmr_type = LAPB_FRMR_Z;
  429. lapb_transmit_frmr(lapb);
  430. #if LAPB_DEBUG > 0
  431. printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->dev);
  432. #endif
  433. lapb_start_t1timer(lapb);
  434. lapb_stop_t2timer(lapb);
  435. lapb->state = LAPB_STATE_4;
  436. lapb->n2count = 0;
  437. }
  438. break;
  439. case LAPB_REJ:
  440. #if LAPB_DEBUG > 1
  441. printk(KERN_DEBUG "lapb: (%p) S3 RX REJ(%d) R%d\n",
  442. lapb->dev, frame->pf, frame->nr);
  443. #endif
  444. lapb->condition &= ~LAPB_PEER_RX_BUSY_CONDITION;
  445. lapb_check_need_response(lapb, frame->cr, frame->pf);
  446. if (lapb_validate_nr(lapb, frame->nr)) {
  447. lapb_frames_acked(lapb, frame->nr);
  448. lapb_stop_t1timer(lapb);
  449. lapb->n2count = 0;
  450. lapb_requeue_frames(lapb);
  451. } else {
  452. lapb->frmr_data = *frame;
  453. lapb->frmr_type = LAPB_FRMR_Z;
  454. lapb_transmit_frmr(lapb);
  455. #if LAPB_DEBUG > 0
  456. printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->dev);
  457. #endif
  458. lapb_start_t1timer(lapb);
  459. lapb_stop_t2timer(lapb);
  460. lapb->state = LAPB_STATE_4;
  461. lapb->n2count = 0;
  462. }
  463. break;
  464. case LAPB_I:
  465. #if LAPB_DEBUG > 1
  466. printk(KERN_DEBUG "lapb: (%p) S3 RX I(%d) S%d R%d\n",
  467. lapb->dev, frame->pf, frame->ns, frame->nr);
  468. #endif
  469. if (!lapb_validate_nr(lapb, frame->nr)) {
  470. lapb->frmr_data = *frame;
  471. lapb->frmr_type = LAPB_FRMR_Z;
  472. lapb_transmit_frmr(lapb);
  473. #if LAPB_DEBUG > 0
  474. printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->dev);
  475. #endif
  476. lapb_start_t1timer(lapb);
  477. lapb_stop_t2timer(lapb);
  478. lapb->state = LAPB_STATE_4;
  479. lapb->n2count = 0;
  480. break;
  481. }
  482. if (lapb->condition & LAPB_PEER_RX_BUSY_CONDITION)
  483. lapb_frames_acked(lapb, frame->nr);
  484. else
  485. lapb_check_iframes_acked(lapb, frame->nr);
  486. if (frame->ns == lapb->vr) {
  487. int cn;
  488. cn = lapb_data_indication(lapb, skb);
  489. queued = 1;
  490. /*
  491. * If upper layer has dropped the frame, we
  492. * basically ignore any further protocol
  493. * processing. This will cause the peer
  494. * to re-transmit the frame later like
  495. * a frame lost on the wire.
  496. */
  497. if (cn == NET_RX_DROP) {
  498. printk(KERN_DEBUG "LAPB: rx congestion\n");
  499. break;
  500. }
  501. lapb->vr = (lapb->vr + 1) % modulus;
  502. lapb->condition &= ~LAPB_REJECT_CONDITION;
  503. if (frame->pf)
  504. lapb_enquiry_response(lapb);
  505. else {
  506. if (!(lapb->condition &
  507. LAPB_ACK_PENDING_CONDITION)) {
  508. lapb->condition |= LAPB_ACK_PENDING_CONDITION;
  509. lapb_start_t2timer(lapb);
  510. }
  511. }
  512. } else {
  513. if (lapb->condition & LAPB_REJECT_CONDITION) {
  514. if (frame->pf)
  515. lapb_enquiry_response(lapb);
  516. } else {
  517. #if LAPB_DEBUG > 1
  518. printk(KERN_DEBUG
  519. "lapb: (%p) S3 TX REJ(%d) R%d\n",
  520. lapb->dev, frame->pf, lapb->vr);
  521. #endif
  522. lapb->condition |= LAPB_REJECT_CONDITION;
  523. lapb_send_control(lapb, LAPB_REJ, frame->pf,
  524. LAPB_RESPONSE);
  525. lapb->condition &= ~LAPB_ACK_PENDING_CONDITION;
  526. }
  527. }
  528. break;
  529. case LAPB_FRMR:
  530. #if LAPB_DEBUG > 1
  531. printk(KERN_DEBUG "lapb: (%p) S3 RX FRMR(%d) %02X "
  532. "%02X %02X %02X %02X\n", lapb->dev, frame->pf,
  533. skb->data[0], skb->data[1], skb->data[2],
  534. skb->data[3], skb->data[4]);
  535. #endif
  536. lapb_establish_data_link(lapb);
  537. #if LAPB_DEBUG > 0
  538. printk(KERN_DEBUG "lapb: (%p) S3 -> S1\n", lapb->dev);
  539. #endif
  540. lapb_requeue_frames(lapb);
  541. lapb->state = LAPB_STATE_1;
  542. break;
  543. case LAPB_ILLEGAL:
  544. #if LAPB_DEBUG > 1
  545. printk(KERN_DEBUG "lapb: (%p) S3 RX ILLEGAL(%d)\n",
  546. lapb->dev, frame->pf);
  547. #endif
  548. lapb->frmr_data = *frame;
  549. lapb->frmr_type = LAPB_FRMR_W;
  550. lapb_transmit_frmr(lapb);
  551. #if LAPB_DEBUG > 0
  552. printk(KERN_DEBUG "lapb: (%p) S3 -> S4\n", lapb->dev);
  553. #endif
  554. lapb_start_t1timer(lapb);
  555. lapb_stop_t2timer(lapb);
  556. lapb->state = LAPB_STATE_4;
  557. lapb->n2count = 0;
  558. break;
  559. }
  560. if (!queued)
  561. kfree_skb(skb);
  562. }
  563. /*
  564. * State machine for state 4, Frame Reject State.
  565. * The handling of the timer(s) is in file lapb_timer.c.
  566. */
  567. static void lapb_state4_machine(struct lapb_cb *lapb, struct sk_buff *skb,
  568. struct lapb_frame *frame)
  569. {
  570. switch (frame->type) {
  571. case LAPB_SABM:
  572. #if LAPB_DEBUG > 1
  573. printk(KERN_DEBUG "lapb: (%p) S4 RX SABM(%d)\n",
  574. lapb->dev, frame->pf);
  575. #endif
  576. if (lapb->mode & LAPB_EXTENDED) {
  577. #if LAPB_DEBUG > 1
  578. printk(KERN_DEBUG "lapb: (%p) S4 TX DM(%d)\n",
  579. lapb->dev, frame->pf);
  580. #endif
  581. lapb_send_control(lapb, LAPB_DM, frame->pf,
  582. LAPB_RESPONSE);
  583. } else {
  584. #if LAPB_DEBUG > 1
  585. printk(KERN_DEBUG "lapb: (%p) S4 TX UA(%d)\n",
  586. lapb->dev, frame->pf);
  587. #endif
  588. #if LAPB_DEBUG > 0
  589. printk(KERN_DEBUG "lapb: (%p) S4 -> S3\n", lapb->dev);
  590. #endif
  591. lapb_send_control(lapb, LAPB_UA, frame->pf,
  592. LAPB_RESPONSE);
  593. lapb_stop_t1timer(lapb);
  594. lapb_stop_t2timer(lapb);
  595. lapb->state = LAPB_STATE_3;
  596. lapb->condition = 0x00;
  597. lapb->n2count = 0;
  598. lapb->vs = 0;
  599. lapb->vr = 0;
  600. lapb->va = 0;
  601. lapb_connect_indication(lapb, LAPB_OK);
  602. }
  603. break;
  604. case LAPB_SABME:
  605. #if LAPB_DEBUG > 1
  606. printk(KERN_DEBUG "lapb: (%p) S4 RX SABME(%d)\n",
  607. lapb->dev, frame->pf);
  608. #endif
  609. if (lapb->mode & LAPB_EXTENDED) {
  610. #if LAPB_DEBUG > 1
  611. printk(KERN_DEBUG "lapb: (%p) S4 TX UA(%d)\n",
  612. lapb->dev, frame->pf);
  613. #endif
  614. #if LAPB_DEBUG > 0
  615. printk(KERN_DEBUG "lapb: (%p) S4 -> S3\n", lapb->dev);
  616. #endif
  617. lapb_send_control(lapb, LAPB_UA, frame->pf,
  618. LAPB_RESPONSE);
  619. lapb_stop_t1timer(lapb);
  620. lapb_stop_t2timer(lapb);
  621. lapb->state = LAPB_STATE_3;
  622. lapb->condition = 0x00;
  623. lapb->n2count = 0;
  624. lapb->vs = 0;
  625. lapb->vr = 0;
  626. lapb->va = 0;
  627. lapb_connect_indication(lapb, LAPB_OK);
  628. } else {
  629. #if LAPB_DEBUG > 1
  630. printk(KERN_DEBUG "lapb: (%p) S4 TX DM(%d)\n",
  631. lapb->dev, frame->pf);
  632. #endif
  633. lapb_send_control(lapb, LAPB_DM, frame->pf,
  634. LAPB_RESPONSE);
  635. }
  636. break;
  637. }
  638. kfree_skb(skb);
  639. }
  640. /*
  641. * Process an incoming LAPB frame
  642. */
  643. void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *skb)
  644. {
  645. struct lapb_frame frame;
  646. if (lapb_decode(lapb, skb, &frame) < 0) {
  647. kfree_skb(skb);
  648. return;
  649. }
  650. switch (lapb->state) {
  651. case LAPB_STATE_0:
  652. lapb_state0_machine(lapb, skb, &frame); break;
  653. case LAPB_STATE_1:
  654. lapb_state1_machine(lapb, skb, &frame); break;
  655. case LAPB_STATE_2:
  656. lapb_state2_machine(lapb, skb, &frame); break;
  657. case LAPB_STATE_3:
  658. lapb_state3_machine(lapb, skb, &frame); break;
  659. case LAPB_STATE_4:
  660. lapb_state4_machine(lapb, skb, &frame); break;
  661. }
  662. lapb_kick(lapb);
  663. }