Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/lapb/lapb_in.c
26146 views
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
*/
39
static 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
*/
110
static 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
*/
186
static 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
*/
246
static 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
*/
472
static 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
*/
533
void 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
558