Linux Audio

Check our new training course

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