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}
557