lapb_in.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:17k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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