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