Linux Audio

Check our new training course

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