1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * llc_c_ac.c - actions performed during connection state transition.
4 *
5 * Description:
6 * Functions in this module are implementation of connection component actions
7 * Details of actions can be found in IEEE-802.2 standard document.
8 * All functions have one connection and one event as input argument. All of
9 * them return 0 On success and 1 otherwise.
10 *
11 * Copyright (c) 1997 by Procom Technology, Inc.
12 * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
13 */
14 #include <linux/netdevice.h>
15 #include <linux/slab.h>
16 #include <net/llc_conn.h>
17 #include <net/llc_sap.h>
18 #include <net/sock.h>
19 #include <net/llc_c_ev.h>
20 #include <net/llc_c_ac.h>
21 #include <net/llc_c_st.h>
22 #include <net/llc_pdu.h>
23 #include <net/llc.h>
24
25
26 static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb);
27 static void llc_process_tmr_ev(struct sock *sk, struct sk_buff *skb);
28 static int llc_conn_ac_data_confirm(struct sock *sk, struct sk_buff *ev);
29
30 static int llc_conn_ac_inc_npta_value(struct sock *sk, struct sk_buff *skb);
31
32 static int llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock *sk,
33 struct sk_buff *skb);
34
35 static int llc_conn_ac_set_p_flag_1(struct sock *sk, struct sk_buff *skb);
36
37 #define INCORRECT 0
38
llc_conn_ac_clear_remote_busy(struct sock * sk,struct sk_buff * skb)39 int llc_conn_ac_clear_remote_busy(struct sock *sk, struct sk_buff *skb)
40 {
41 struct llc_sock *llc = llc_sk(sk);
42
43 if (llc->remote_busy_flag) {
44 u8 nr;
45 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
46
47 llc->remote_busy_flag = 0;
48 timer_delete(&llc->busy_state_timer.timer);
49 nr = LLC_I_GET_NR(pdu);
50 llc_conn_resend_i_pdu_as_cmd(sk, nr, 0);
51 }
52 return 0;
53 }
54
llc_conn_ac_conn_ind(struct sock * sk,struct sk_buff * skb)55 int llc_conn_ac_conn_ind(struct sock *sk, struct sk_buff *skb)
56 {
57 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
58
59 ev->ind_prim = LLC_CONN_PRIM;
60 return 0;
61 }
62
llc_conn_ac_conn_confirm(struct sock * sk,struct sk_buff * skb)63 int llc_conn_ac_conn_confirm(struct sock *sk, struct sk_buff *skb)
64 {
65 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
66
67 ev->cfm_prim = LLC_CONN_PRIM;
68 return 0;
69 }
70
llc_conn_ac_data_confirm(struct sock * sk,struct sk_buff * skb)71 static int llc_conn_ac_data_confirm(struct sock *sk, struct sk_buff *skb)
72 {
73 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
74
75 ev->cfm_prim = LLC_DATA_PRIM;
76 return 0;
77 }
78
llc_conn_ac_data_ind(struct sock * sk,struct sk_buff * skb)79 int llc_conn_ac_data_ind(struct sock *sk, struct sk_buff *skb)
80 {
81 llc_conn_rtn_pdu(sk, skb);
82 return 0;
83 }
84
llc_conn_ac_disc_ind(struct sock * sk,struct sk_buff * skb)85 int llc_conn_ac_disc_ind(struct sock *sk, struct sk_buff *skb)
86 {
87 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
88 u8 reason = 0;
89 int rc = 0;
90
91 if (ev->type == LLC_CONN_EV_TYPE_PDU) {
92 struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
93
94 if (LLC_PDU_IS_RSP(pdu) &&
95 LLC_PDU_TYPE_IS_U(pdu) &&
96 LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_DM)
97 reason = LLC_DISC_REASON_RX_DM_RSP_PDU;
98 else if (LLC_PDU_IS_CMD(pdu) &&
99 LLC_PDU_TYPE_IS_U(pdu) &&
100 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_DISC)
101 reason = LLC_DISC_REASON_RX_DISC_CMD_PDU;
102 } else if (ev->type == LLC_CONN_EV_TYPE_ACK_TMR)
103 reason = LLC_DISC_REASON_ACK_TMR_EXP;
104 else
105 rc = -EINVAL;
106 if (!rc) {
107 ev->reason = reason;
108 ev->ind_prim = LLC_DISC_PRIM;
109 }
110 return rc;
111 }
112
llc_conn_ac_disc_confirm(struct sock * sk,struct sk_buff * skb)113 int llc_conn_ac_disc_confirm(struct sock *sk, struct sk_buff *skb)
114 {
115 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
116
117 ev->reason = ev->status;
118 ev->cfm_prim = LLC_DISC_PRIM;
119 return 0;
120 }
121
llc_conn_ac_rst_ind(struct sock * sk,struct sk_buff * skb)122 int llc_conn_ac_rst_ind(struct sock *sk, struct sk_buff *skb)
123 {
124 u8 reason = 0;
125 int rc = 1;
126 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
127 struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
128 struct llc_sock *llc = llc_sk(sk);
129
130 switch (ev->type) {
131 case LLC_CONN_EV_TYPE_PDU:
132 if (LLC_PDU_IS_RSP(pdu) &&
133 LLC_PDU_TYPE_IS_U(pdu) &&
134 LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_FRMR) {
135 reason = LLC_RESET_REASON_LOCAL;
136 rc = 0;
137 } else if (LLC_PDU_IS_CMD(pdu) &&
138 LLC_PDU_TYPE_IS_U(pdu) &&
139 LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_SABME) {
140 reason = LLC_RESET_REASON_REMOTE;
141 rc = 0;
142 }
143 break;
144 case LLC_CONN_EV_TYPE_ACK_TMR:
145 case LLC_CONN_EV_TYPE_P_TMR:
146 case LLC_CONN_EV_TYPE_REJ_TMR:
147 case LLC_CONN_EV_TYPE_BUSY_TMR:
148 if (llc->retry_count > llc->n2) {
149 reason = LLC_RESET_REASON_LOCAL;
150 rc = 0;
151 }
152 break;
153 }
154 if (!rc) {
155 ev->reason = reason;
156 ev->ind_prim = LLC_RESET_PRIM;
157 }
158 return rc;
159 }
160
llc_conn_ac_rst_confirm(struct sock * sk,struct sk_buff * skb)161 int llc_conn_ac_rst_confirm(struct sock *sk, struct sk_buff *skb)
162 {
163 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
164
165 ev->reason = 0;
166 ev->cfm_prim = LLC_RESET_PRIM;
167 return 0;
168 }
169
llc_conn_ac_clear_remote_busy_if_f_eq_1(struct sock * sk,struct sk_buff * skb)170 int llc_conn_ac_clear_remote_busy_if_f_eq_1(struct sock *sk,
171 struct sk_buff *skb)
172 {
173 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
174
175 if (LLC_PDU_IS_RSP(pdu) &&
176 LLC_PDU_TYPE_IS_I(pdu) &&
177 LLC_I_PF_IS_1(pdu) && llc_sk(sk)->ack_pf)
178 llc_conn_ac_clear_remote_busy(sk, skb);
179 return 0;
180 }
181
llc_conn_ac_stop_rej_tmr_if_data_flag_eq_2(struct sock * sk,struct sk_buff * skb)182 int llc_conn_ac_stop_rej_tmr_if_data_flag_eq_2(struct sock *sk,
183 struct sk_buff *skb)
184 {
185 struct llc_sock *llc = llc_sk(sk);
186
187 if (llc->data_flag == 2)
188 timer_delete(&llc->rej_sent_timer.timer);
189 return 0;
190 }
191
llc_conn_ac_send_disc_cmd_p_set_x(struct sock * sk,struct sk_buff * skb)192 int llc_conn_ac_send_disc_cmd_p_set_x(struct sock *sk, struct sk_buff *skb)
193 {
194 int rc = -ENOBUFS;
195 struct llc_sock *llc = llc_sk(sk);
196 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
197
198 if (nskb) {
199 struct llc_sap *sap = llc->sap;
200
201 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
202 llc->daddr.lsap, LLC_PDU_CMD);
203 llc_pdu_init_as_disc_cmd(nskb, 1);
204 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
205 if (unlikely(rc))
206 goto free;
207 llc_conn_send_pdu(sk, nskb);
208 llc_conn_ac_set_p_flag_1(sk, skb);
209 }
210 out:
211 return rc;
212 free:
213 kfree_skb(nskb);
214 goto out;
215 }
216
llc_conn_ac_send_dm_rsp_f_set_p(struct sock * sk,struct sk_buff * skb)217 int llc_conn_ac_send_dm_rsp_f_set_p(struct sock *sk, struct sk_buff *skb)
218 {
219 int rc = -ENOBUFS;
220 struct llc_sock *llc = llc_sk(sk);
221 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
222
223 if (nskb) {
224 struct llc_sap *sap = llc->sap;
225 u8 f_bit;
226
227 llc_pdu_decode_pf_bit(skb, &f_bit);
228 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
229 llc->daddr.lsap, LLC_PDU_RSP);
230 llc_pdu_init_as_dm_rsp(nskb, f_bit);
231 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
232 if (unlikely(rc))
233 goto free;
234 llc_conn_send_pdu(sk, nskb);
235 }
236 out:
237 return rc;
238 free:
239 kfree_skb(nskb);
240 goto out;
241 }
242
llc_conn_ac_send_dm_rsp_f_set_1(struct sock * sk,struct sk_buff * skb)243 int llc_conn_ac_send_dm_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
244 {
245 int rc = -ENOBUFS;
246 struct llc_sock *llc = llc_sk(sk);
247 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
248
249 if (nskb) {
250 struct llc_sap *sap = llc->sap;
251
252 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
253 llc->daddr.lsap, LLC_PDU_RSP);
254 llc_pdu_init_as_dm_rsp(nskb, 1);
255 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
256 if (unlikely(rc))
257 goto free;
258 llc_conn_send_pdu(sk, nskb);
259 }
260 out:
261 return rc;
262 free:
263 kfree_skb(nskb);
264 goto out;
265 }
266
llc_conn_ac_send_frmr_rsp_f_set_x(struct sock * sk,struct sk_buff * skb)267 int llc_conn_ac_send_frmr_rsp_f_set_x(struct sock *sk, struct sk_buff *skb)
268 {
269 u8 f_bit;
270 int rc = -ENOBUFS;
271 struct sk_buff *nskb;
272 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
273 struct llc_sock *llc = llc_sk(sk);
274
275 llc->rx_pdu_hdr = *((u32 *)pdu);
276 if (LLC_PDU_IS_CMD(pdu))
277 llc_pdu_decode_pf_bit(skb, &f_bit);
278 else
279 f_bit = 0;
280 nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U,
281 sizeof(struct llc_frmr_info));
282 if (nskb) {
283 struct llc_sap *sap = llc->sap;
284
285 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
286 llc->daddr.lsap, LLC_PDU_RSP);
287 llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS,
288 llc->vR, INCORRECT);
289 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
290 if (unlikely(rc))
291 goto free;
292 llc_conn_send_pdu(sk, nskb);
293 }
294 out:
295 return rc;
296 free:
297 kfree_skb(nskb);
298 goto out;
299 }
300
llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock * sk,struct sk_buff * skb)301 int llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock *sk, struct sk_buff *skb)
302 {
303 int rc = -ENOBUFS;
304 struct llc_sock *llc = llc_sk(sk);
305 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U,
306 sizeof(struct llc_frmr_info));
307
308 if (nskb) {
309 struct llc_sap *sap = llc->sap;
310 struct llc_pdu_sn *pdu = (struct llc_pdu_sn *)&llc->rx_pdu_hdr;
311
312 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
313 llc->daddr.lsap, LLC_PDU_RSP);
314 llc_pdu_init_as_frmr_rsp(nskb, pdu, 0, llc->vS,
315 llc->vR, INCORRECT);
316 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
317 if (unlikely(rc))
318 goto free;
319 llc_conn_send_pdu(sk, nskb);
320 }
321 out:
322 return rc;
323 free:
324 kfree_skb(nskb);
325 goto out;
326 }
327
llc_conn_ac_resend_frmr_rsp_f_set_p(struct sock * sk,struct sk_buff * skb)328 int llc_conn_ac_resend_frmr_rsp_f_set_p(struct sock *sk, struct sk_buff *skb)
329 {
330 u8 f_bit;
331 int rc = -ENOBUFS;
332 struct sk_buff *nskb;
333 struct llc_sock *llc = llc_sk(sk);
334
335 llc_pdu_decode_pf_bit(skb, &f_bit);
336 nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U,
337 sizeof(struct llc_frmr_info));
338 if (nskb) {
339 struct llc_sap *sap = llc->sap;
340 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
341
342 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
343 llc->daddr.lsap, LLC_PDU_RSP);
344 llc_pdu_init_as_frmr_rsp(nskb, pdu, f_bit, llc->vS,
345 llc->vR, INCORRECT);
346 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
347 if (unlikely(rc))
348 goto free;
349 llc_conn_send_pdu(sk, nskb);
350 }
351 out:
352 return rc;
353 free:
354 kfree_skb(nskb);
355 goto out;
356 }
357
llc_conn_ac_send_i_cmd_p_set_1(struct sock * sk,struct sk_buff * skb)358 int llc_conn_ac_send_i_cmd_p_set_1(struct sock *sk, struct sk_buff *skb)
359 {
360 int rc;
361 struct llc_sock *llc = llc_sk(sk);
362 struct llc_sap *sap = llc->sap;
363
364 llc_pdu_header_init(skb, LLC_PDU_TYPE_I, sap->laddr.lsap,
365 llc->daddr.lsap, LLC_PDU_CMD);
366 llc_pdu_init_as_i_cmd(skb, 1, llc->vS, llc->vR);
367 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac);
368 if (likely(!rc)) {
369 skb_get(skb);
370 llc_conn_send_pdu(sk, skb);
371 llc_conn_ac_inc_vs_by_1(sk, skb);
372 }
373 return rc;
374 }
375
llc_conn_ac_send_i_cmd_p_set_0(struct sock * sk,struct sk_buff * skb)376 static int llc_conn_ac_send_i_cmd_p_set_0(struct sock *sk, struct sk_buff *skb)
377 {
378 int rc;
379 struct llc_sock *llc = llc_sk(sk);
380 struct llc_sap *sap = llc->sap;
381
382 llc_pdu_header_init(skb, LLC_PDU_TYPE_I, sap->laddr.lsap,
383 llc->daddr.lsap, LLC_PDU_CMD);
384 llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR);
385 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac);
386 if (likely(!rc)) {
387 skb_get(skb);
388 llc_conn_send_pdu(sk, skb);
389 llc_conn_ac_inc_vs_by_1(sk, skb);
390 }
391 return rc;
392 }
393
llc_conn_ac_send_i_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)394 int llc_conn_ac_send_i_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
395 {
396 int rc;
397 struct llc_sock *llc = llc_sk(sk);
398 struct llc_sap *sap = llc->sap;
399
400 llc_pdu_header_init(skb, LLC_PDU_TYPE_I, sap->laddr.lsap,
401 llc->daddr.lsap, LLC_PDU_CMD);
402 llc_pdu_init_as_i_cmd(skb, 0, llc->vS, llc->vR);
403 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac);
404 if (likely(!rc)) {
405 skb_get(skb);
406 llc_conn_send_pdu(sk, skb);
407 llc_conn_ac_inc_vs_by_1(sk, skb);
408 }
409 return 0;
410 }
411
llc_conn_ac_resend_i_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)412 int llc_conn_ac_resend_i_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
413 {
414 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
415 u8 nr = LLC_I_GET_NR(pdu);
416
417 llc_conn_resend_i_pdu_as_cmd(sk, nr, 0);
418 return 0;
419 }
420
llc_conn_ac_resend_i_xxx_x_set_0_or_send_rr(struct sock * sk,struct sk_buff * skb)421 int llc_conn_ac_resend_i_xxx_x_set_0_or_send_rr(struct sock *sk,
422 struct sk_buff *skb)
423 {
424 u8 nr;
425 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
426 int rc = -ENOBUFS;
427 struct llc_sock *llc = llc_sk(sk);
428 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
429
430 if (nskb) {
431 struct llc_sap *sap = llc->sap;
432
433 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
434 llc->daddr.lsap, LLC_PDU_RSP);
435 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR);
436 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
437 if (likely(!rc))
438 llc_conn_send_pdu(sk, nskb);
439 else
440 kfree_skb(nskb);
441 }
442 if (rc) {
443 nr = LLC_I_GET_NR(pdu);
444 rc = 0;
445 llc_conn_resend_i_pdu_as_cmd(sk, nr, 0);
446 }
447 return rc;
448 }
449
llc_conn_ac_resend_i_rsp_f_set_1(struct sock * sk,struct sk_buff * skb)450 int llc_conn_ac_resend_i_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
451 {
452 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
453 u8 nr = LLC_I_GET_NR(pdu);
454
455 llc_conn_resend_i_pdu_as_rsp(sk, nr, 1);
456 return 0;
457 }
458
llc_conn_ac_send_rej_cmd_p_set_1(struct sock * sk,struct sk_buff * skb)459 int llc_conn_ac_send_rej_cmd_p_set_1(struct sock *sk, struct sk_buff *skb)
460 {
461 int rc = -ENOBUFS;
462 struct llc_sock *llc = llc_sk(sk);
463 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
464
465 if (nskb) {
466 struct llc_sap *sap = llc->sap;
467
468 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
469 llc->daddr.lsap, LLC_PDU_CMD);
470 llc_pdu_init_as_rej_cmd(nskb, 1, llc->vR);
471 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
472 if (unlikely(rc))
473 goto free;
474 llc_conn_send_pdu(sk, nskb);
475 }
476 out:
477 return rc;
478 free:
479 kfree_skb(nskb);
480 goto out;
481 }
482
llc_conn_ac_send_rej_rsp_f_set_1(struct sock * sk,struct sk_buff * skb)483 int llc_conn_ac_send_rej_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
484 {
485 int rc = -ENOBUFS;
486 struct llc_sock *llc = llc_sk(sk);
487 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
488
489 if (nskb) {
490 struct llc_sap *sap = llc->sap;
491
492 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
493 llc->daddr.lsap, LLC_PDU_RSP);
494 llc_pdu_init_as_rej_rsp(nskb, 1, llc->vR);
495 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
496 if (unlikely(rc))
497 goto free;
498 llc_conn_send_pdu(sk, nskb);
499 }
500 out:
501 return rc;
502 free:
503 kfree_skb(nskb);
504 goto out;
505 }
506
llc_conn_ac_send_rej_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)507 int llc_conn_ac_send_rej_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
508 {
509 int rc = -ENOBUFS;
510 struct llc_sock *llc = llc_sk(sk);
511 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
512
513 if (nskb) {
514 struct llc_sap *sap = llc->sap;
515
516 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
517 llc->daddr.lsap, LLC_PDU_RSP);
518 llc_pdu_init_as_rej_rsp(nskb, 0, llc->vR);
519 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
520 if (unlikely(rc))
521 goto free;
522 llc_conn_send_pdu(sk, nskb);
523 }
524 out:
525 return rc;
526 free:
527 kfree_skb(nskb);
528 goto out;
529 }
530
llc_conn_ac_send_rnr_cmd_p_set_1(struct sock * sk,struct sk_buff * skb)531 int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb)
532 {
533 int rc = -ENOBUFS;
534 struct llc_sock *llc = llc_sk(sk);
535 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
536
537 if (nskb) {
538 struct llc_sap *sap = llc->sap;
539
540 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
541 llc->daddr.lsap, LLC_PDU_CMD);
542 llc_pdu_init_as_rnr_cmd(nskb, 1, llc->vR);
543 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
544 if (unlikely(rc))
545 goto free;
546 llc_conn_send_pdu(sk, nskb);
547 }
548 out:
549 return rc;
550 free:
551 kfree_skb(nskb);
552 goto out;
553 }
554
llc_conn_ac_send_rnr_rsp_f_set_1(struct sock * sk,struct sk_buff * skb)555 int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
556 {
557 int rc = -ENOBUFS;
558 struct llc_sock *llc = llc_sk(sk);
559 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
560
561 if (nskb) {
562 struct llc_sap *sap = llc->sap;
563
564 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
565 llc->daddr.lsap, LLC_PDU_RSP);
566 llc_pdu_init_as_rnr_rsp(nskb, 1, llc->vR);
567 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
568 if (unlikely(rc))
569 goto free;
570 llc_conn_send_pdu(sk, nskb);
571 }
572 out:
573 return rc;
574 free:
575 kfree_skb(nskb);
576 goto out;
577 }
578
llc_conn_ac_send_rnr_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)579 int llc_conn_ac_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
580 {
581 int rc = -ENOBUFS;
582 struct llc_sock *llc = llc_sk(sk);
583 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
584
585 if (nskb) {
586 struct llc_sap *sap = llc->sap;
587
588 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
589 llc->daddr.lsap, LLC_PDU_RSP);
590 llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR);
591 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
592 if (unlikely(rc))
593 goto free;
594 llc_conn_send_pdu(sk, nskb);
595 }
596 out:
597 return rc;
598 free:
599 kfree_skb(nskb);
600 goto out;
601 }
602
llc_conn_ac_set_remote_busy(struct sock * sk,struct sk_buff * skb)603 int llc_conn_ac_set_remote_busy(struct sock *sk, struct sk_buff *skb)
604 {
605 struct llc_sock *llc = llc_sk(sk);
606
607 if (!llc->remote_busy_flag) {
608 llc->remote_busy_flag = 1;
609 mod_timer(&llc->busy_state_timer.timer,
610 jiffies + llc->busy_state_timer.expire);
611 }
612 return 0;
613 }
614
llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)615 int llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
616 {
617 int rc = -ENOBUFS;
618 struct llc_sock *llc = llc_sk(sk);
619 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
620
621 if (nskb) {
622 struct llc_sap *sap = llc->sap;
623
624 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
625 llc->daddr.lsap, LLC_PDU_RSP);
626 llc_pdu_init_as_rnr_rsp(nskb, 0, llc->vR);
627 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
628 if (unlikely(rc))
629 goto free;
630 llc_conn_send_pdu(sk, nskb);
631 }
632 out:
633 return rc;
634 free:
635 kfree_skb(nskb);
636 goto out;
637 }
638
llc_conn_ac_send_rr_cmd_p_set_1(struct sock * sk,struct sk_buff * skb)639 int llc_conn_ac_send_rr_cmd_p_set_1(struct sock *sk, struct sk_buff *skb)
640 {
641 int rc = -ENOBUFS;
642 struct llc_sock *llc = llc_sk(sk);
643 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
644
645 if (nskb) {
646 struct llc_sap *sap = llc->sap;
647
648 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
649 llc->daddr.lsap, LLC_PDU_CMD);
650 llc_pdu_init_as_rr_cmd(nskb, 1, llc->vR);
651 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
652 if (unlikely(rc))
653 goto free;
654 llc_conn_send_pdu(sk, nskb);
655 }
656 out:
657 return rc;
658 free:
659 kfree_skb(nskb);
660 goto out;
661 }
662
llc_conn_ac_send_rr_rsp_f_set_1(struct sock * sk,struct sk_buff * skb)663 int llc_conn_ac_send_rr_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
664 {
665 int rc = -ENOBUFS;
666 struct llc_sock *llc = llc_sk(sk);
667 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
668
669 if (nskb) {
670 struct llc_sap *sap = llc->sap;
671 u8 f_bit = 1;
672
673 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
674 llc->daddr.lsap, LLC_PDU_RSP);
675 llc_pdu_init_as_rr_rsp(nskb, f_bit, llc->vR);
676 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
677 if (unlikely(rc))
678 goto free;
679 llc_conn_send_pdu(sk, nskb);
680 }
681 out:
682 return rc;
683 free:
684 kfree_skb(nskb);
685 goto out;
686 }
687
llc_conn_ac_send_ack_rsp_f_set_1(struct sock * sk,struct sk_buff * skb)688 int llc_conn_ac_send_ack_rsp_f_set_1(struct sock *sk, struct sk_buff *skb)
689 {
690 int rc = -ENOBUFS;
691 struct llc_sock *llc = llc_sk(sk);
692 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
693
694 if (nskb) {
695 struct llc_sap *sap = llc->sap;
696
697 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
698 llc->daddr.lsap, LLC_PDU_RSP);
699 llc_pdu_init_as_rr_rsp(nskb, 1, llc->vR);
700 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
701 if (unlikely(rc))
702 goto free;
703 llc_conn_send_pdu(sk, nskb);
704 }
705 out:
706 return rc;
707 free:
708 kfree_skb(nskb);
709 goto out;
710 }
711
llc_conn_ac_send_rr_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)712 int llc_conn_ac_send_rr_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
713 {
714 int rc = -ENOBUFS;
715 struct llc_sock *llc = llc_sk(sk);
716 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
717
718 if (nskb) {
719 struct llc_sap *sap = llc->sap;
720
721 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
722 llc->daddr.lsap, LLC_PDU_RSP);
723 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR);
724 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
725 if (unlikely(rc))
726 goto free;
727 llc_conn_send_pdu(sk, nskb);
728 }
729 out:
730 return rc;
731 free:
732 kfree_skb(nskb);
733 goto out;
734 }
735
llc_conn_ac_send_ack_xxx_x_set_0(struct sock * sk,struct sk_buff * skb)736 int llc_conn_ac_send_ack_xxx_x_set_0(struct sock *sk, struct sk_buff *skb)
737 {
738 int rc = -ENOBUFS;
739 struct llc_sock *llc = llc_sk(sk);
740 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
741
742 if (nskb) {
743 struct llc_sap *sap = llc->sap;
744
745 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
746 llc->daddr.lsap, LLC_PDU_RSP);
747 llc_pdu_init_as_rr_rsp(nskb, 0, llc->vR);
748 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
749 if (unlikely(rc))
750 goto free;
751 llc_conn_send_pdu(sk, nskb);
752 }
753 out:
754 return rc;
755 free:
756 kfree_skb(nskb);
757 goto out;
758 }
759
llc_conn_set_p_flag(struct sock * sk,u8 value)760 void llc_conn_set_p_flag(struct sock *sk, u8 value)
761 {
762 int state_changed = llc_sk(sk)->p_flag && !value;
763
764 llc_sk(sk)->p_flag = value;
765
766 if (state_changed)
767 sk->sk_state_change(sk);
768 }
769
llc_conn_ac_send_sabme_cmd_p_set_x(struct sock * sk,struct sk_buff * skb)770 int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb)
771 {
772 int rc = -ENOBUFS;
773 struct llc_sock *llc = llc_sk(sk);
774 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
775
776 if (nskb) {
777 struct llc_sap *sap = llc->sap;
778 const u8 *dmac = llc->daddr.mac;
779
780 if (llc->dev->flags & IFF_LOOPBACK)
781 dmac = llc->dev->dev_addr;
782 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
783 llc->daddr.lsap, LLC_PDU_CMD);
784 llc_pdu_init_as_sabme_cmd(nskb, 1);
785 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, dmac);
786 if (unlikely(rc))
787 goto free;
788 llc_conn_send_pdu(sk, nskb);
789 llc_conn_set_p_flag(sk, 1);
790 }
791 out:
792 return rc;
793 free:
794 kfree_skb(nskb);
795 goto out;
796 }
797
llc_conn_ac_send_ua_rsp_f_set_p(struct sock * sk,struct sk_buff * skb)798 int llc_conn_ac_send_ua_rsp_f_set_p(struct sock *sk, struct sk_buff *skb)
799 {
800 u8 f_bit;
801 int rc = -ENOBUFS;
802 struct llc_sock *llc = llc_sk(sk);
803 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_U, 0);
804
805 llc_pdu_decode_pf_bit(skb, &f_bit);
806 if (nskb) {
807 struct llc_sap *sap = llc->sap;
808
809 nskb->dev = llc->dev;
810 llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, sap->laddr.lsap,
811 llc->daddr.lsap, LLC_PDU_RSP);
812 llc_pdu_init_as_ua_rsp(nskb, f_bit);
813 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
814 if (unlikely(rc))
815 goto free;
816 llc_conn_send_pdu(sk, nskb);
817 }
818 out:
819 return rc;
820 free:
821 kfree_skb(nskb);
822 goto out;
823 }
824
llc_conn_ac_set_s_flag_0(struct sock * sk,struct sk_buff * skb)825 int llc_conn_ac_set_s_flag_0(struct sock *sk, struct sk_buff *skb)
826 {
827 llc_sk(sk)->s_flag = 0;
828 return 0;
829 }
830
llc_conn_ac_set_s_flag_1(struct sock * sk,struct sk_buff * skb)831 int llc_conn_ac_set_s_flag_1(struct sock *sk, struct sk_buff *skb)
832 {
833 llc_sk(sk)->s_flag = 1;
834 return 0;
835 }
836
llc_conn_ac_start_p_timer(struct sock * sk,struct sk_buff * skb)837 int llc_conn_ac_start_p_timer(struct sock *sk, struct sk_buff *skb)
838 {
839 struct llc_sock *llc = llc_sk(sk);
840
841 llc_conn_set_p_flag(sk, 1);
842 mod_timer(&llc->pf_cycle_timer.timer,
843 jiffies + llc->pf_cycle_timer.expire);
844 return 0;
845 }
846
847 /**
848 * llc_conn_ac_send_ack_if_needed - check if ack is needed
849 * @sk: current connection structure
850 * @skb: current event
851 *
852 * Checks number of received PDUs which have not been acknowledged, yet,
853 * If number of them reaches to "npta"(Number of PDUs To Acknowledge) then
854 * sends an RR response as acknowledgement for them. Returns 0 for
855 * success, 1 otherwise.
856 */
llc_conn_ac_send_ack_if_needed(struct sock * sk,struct sk_buff * skb)857 int llc_conn_ac_send_ack_if_needed(struct sock *sk, struct sk_buff *skb)
858 {
859 u8 pf_bit;
860 struct llc_sock *llc = llc_sk(sk);
861
862 llc_pdu_decode_pf_bit(skb, &pf_bit);
863 llc->ack_pf |= pf_bit & 1;
864 if (!llc->ack_must_be_send) {
865 llc->first_pdu_Ns = llc->vR;
866 llc->ack_must_be_send = 1;
867 llc->ack_pf = pf_bit & 1;
868 }
869 if (((llc->vR - llc->first_pdu_Ns + 1 + LLC_2_SEQ_NBR_MODULO)
870 % LLC_2_SEQ_NBR_MODULO) >= llc->npta) {
871 llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb);
872 llc->ack_must_be_send = 0;
873 llc->ack_pf = 0;
874 llc_conn_ac_inc_npta_value(sk, skb);
875 }
876 return 0;
877 }
878
879 /**
880 * llc_conn_ac_rst_sendack_flag - resets ack_must_be_send flag
881 * @sk: current connection structure
882 * @skb: current event
883 *
884 * This action resets ack_must_be_send flag of given connection, this flag
885 * indicates if there is any PDU which has not been acknowledged yet.
886 * Returns 0 for success, 1 otherwise.
887 */
llc_conn_ac_rst_sendack_flag(struct sock * sk,struct sk_buff * skb)888 int llc_conn_ac_rst_sendack_flag(struct sock *sk, struct sk_buff *skb)
889 {
890 llc_sk(sk)->ack_must_be_send = llc_sk(sk)->ack_pf = 0;
891 return 0;
892 }
893
894 /**
895 * llc_conn_ac_send_i_rsp_f_set_ackpf - acknowledge received PDUs
896 * @sk: current connection structure
897 * @skb: current event
898 *
899 * Sends an I response PDU with f-bit set to ack_pf flag as acknowledge to
900 * all received PDUs which have not been acknowledged, yet. ack_pf flag is
901 * set to one if one PDU with p-bit set to one is received. Returns 0 for
902 * success, 1 otherwise.
903 */
llc_conn_ac_send_i_rsp_f_set_ackpf(struct sock * sk,struct sk_buff * skb)904 static int llc_conn_ac_send_i_rsp_f_set_ackpf(struct sock *sk,
905 struct sk_buff *skb)
906 {
907 int rc;
908 struct llc_sock *llc = llc_sk(sk);
909 struct llc_sap *sap = llc->sap;
910
911 llc_pdu_header_init(skb, LLC_PDU_TYPE_I, sap->laddr.lsap,
912 llc->daddr.lsap, LLC_PDU_RSP);
913 llc_pdu_init_as_i_cmd(skb, llc->ack_pf, llc->vS, llc->vR);
914 rc = llc_mac_hdr_init(skb, llc->dev->dev_addr, llc->daddr.mac);
915 if (likely(!rc)) {
916 skb_get(skb);
917 llc_conn_send_pdu(sk, skb);
918 llc_conn_ac_inc_vs_by_1(sk, skb);
919 }
920 return rc;
921 }
922
923 /**
924 * llc_conn_ac_send_i_as_ack - sends an I-format PDU to acknowledge rx PDUs
925 * @sk: current connection structure.
926 * @skb: current event.
927 *
928 * This action sends an I-format PDU as acknowledge to received PDUs which
929 * have not been acknowledged, yet, if there is any. By using of this
930 * action number of acknowledgements decreases, this technic is called
931 * piggy backing. Returns 0 for success, 1 otherwise.
932 */
llc_conn_ac_send_i_as_ack(struct sock * sk,struct sk_buff * skb)933 int llc_conn_ac_send_i_as_ack(struct sock *sk, struct sk_buff *skb)
934 {
935 struct llc_sock *llc = llc_sk(sk);
936 int ret;
937
938 if (llc->ack_must_be_send) {
939 ret = llc_conn_ac_send_i_rsp_f_set_ackpf(sk, skb);
940 llc->ack_must_be_send = 0 ;
941 llc->ack_pf = 0;
942 } else {
943 ret = llc_conn_ac_send_i_cmd_p_set_0(sk, skb);
944 }
945
946 return ret;
947 }
948
949 /**
950 * llc_conn_ac_send_rr_rsp_f_set_ackpf - ack all rx PDUs not yet acked
951 * @sk: current connection structure.
952 * @skb: current event.
953 *
954 * This action sends an RR response with f-bit set to ack_pf flag as
955 * acknowledge to all received PDUs which have not been acknowledged, yet,
956 * if there is any. ack_pf flag indicates if a PDU has been received with
957 * p-bit set to one. Returns 0 for success, 1 otherwise.
958 */
llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock * sk,struct sk_buff * skb)959 static int llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock *sk,
960 struct sk_buff *skb)
961 {
962 int rc = -ENOBUFS;
963 struct llc_sock *llc = llc_sk(sk);
964 struct sk_buff *nskb = llc_alloc_frame(sk, llc->dev, LLC_PDU_TYPE_S, 0);
965
966 if (nskb) {
967 struct llc_sap *sap = llc->sap;
968
969 llc_pdu_header_init(nskb, LLC_PDU_TYPE_S, sap->laddr.lsap,
970 llc->daddr.lsap, LLC_PDU_RSP);
971 llc_pdu_init_as_rr_rsp(nskb, llc->ack_pf, llc->vR);
972 rc = llc_mac_hdr_init(nskb, llc->dev->dev_addr, llc->daddr.mac);
973 if (unlikely(rc))
974 goto free;
975 llc_conn_send_pdu(sk, nskb);
976 }
977 out:
978 return rc;
979 free:
980 kfree_skb(nskb);
981 goto out;
982 }
983
984 /**
985 * llc_conn_ac_inc_npta_value - tries to make value of npta greater
986 * @sk: current connection structure.
987 * @skb: current event.
988 *
989 * After "inc_cntr" times calling of this action, "npta" increase by one.
990 * this action tries to make vale of "npta" greater as possible; number of
991 * acknowledgements decreases by increasing of "npta". Returns 0 for
992 * success, 1 otherwise.
993 */
llc_conn_ac_inc_npta_value(struct sock * sk,struct sk_buff * skb)994 static int llc_conn_ac_inc_npta_value(struct sock *sk, struct sk_buff *skb)
995 {
996 struct llc_sock *llc = llc_sk(sk);
997
998 if (!llc->inc_cntr) {
999 llc->dec_step = 0;
1000 llc->dec_cntr = llc->inc_cntr = 2;
1001 ++llc->npta;
1002 if (llc->npta > LLC_2_SEQ_NBR_MODULO - 1)
1003 llc->npta = LLC_2_SEQ_NBR_MODULO - 1;
1004 } else
1005 --llc->inc_cntr;
1006 return 0;
1007 }
1008
1009 /**
1010 * llc_conn_ac_adjust_npta_by_rr - decreases "npta" by one
1011 * @sk: current connection structure.
1012 * @skb: current event.
1013 *
1014 * After receiving "dec_cntr" times RR command, this action decreases
1015 * "npta" by one. Returns 0 for success, 1 otherwise.
1016 */
llc_conn_ac_adjust_npta_by_rr(struct sock * sk,struct sk_buff * skb)1017 int llc_conn_ac_adjust_npta_by_rr(struct sock *sk, struct sk_buff *skb)
1018 {
1019 struct llc_sock *llc = llc_sk(sk);
1020
1021 if (!llc->connect_step && !llc->remote_busy_flag) {
1022 if (!llc->dec_step) {
1023 if (!llc->dec_cntr) {
1024 llc->inc_cntr = llc->dec_cntr = 2;
1025 if (llc->npta > 0)
1026 llc->npta = llc->npta - 1;
1027 } else
1028 llc->dec_cntr -=1;
1029 }
1030 } else
1031 llc->connect_step = 0 ;
1032 return 0;
1033 }
1034
1035 /**
1036 * llc_conn_ac_adjust_npta_by_rnr - decreases "npta" by one
1037 * @sk: current connection structure.
1038 * @skb: current event.
1039 *
1040 * After receiving "dec_cntr" times RNR command, this action decreases
1041 * "npta" by one. Returns 0 for success, 1 otherwise.
1042 */
llc_conn_ac_adjust_npta_by_rnr(struct sock * sk,struct sk_buff * skb)1043 int llc_conn_ac_adjust_npta_by_rnr(struct sock *sk, struct sk_buff *skb)
1044 {
1045 struct llc_sock *llc = llc_sk(sk);
1046
1047 if (llc->remote_busy_flag)
1048 if (!llc->dec_step) {
1049 if (!llc->dec_cntr) {
1050 llc->inc_cntr = llc->dec_cntr = 2;
1051 if (llc->npta > 0)
1052 --llc->npta;
1053 } else
1054 --llc->dec_cntr;
1055 }
1056 return 0;
1057 }
1058
1059 /**
1060 * llc_conn_ac_dec_tx_win_size - decreases tx window size
1061 * @sk: current connection structure.
1062 * @skb: current event.
1063 *
1064 * After receiving of a REJ command or response, transmit window size is
1065 * decreased by number of PDUs which are outstanding yet. Returns 0 for
1066 * success, 1 otherwise.
1067 */
llc_conn_ac_dec_tx_win_size(struct sock * sk,struct sk_buff * skb)1068 int llc_conn_ac_dec_tx_win_size(struct sock *sk, struct sk_buff *skb)
1069 {
1070 struct llc_sock *llc = llc_sk(sk);
1071 u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q);
1072
1073 if (llc->k - unacked_pdu < 1)
1074 llc->k = 1;
1075 else
1076 llc->k -= unacked_pdu;
1077 return 0;
1078 }
1079
1080 /**
1081 * llc_conn_ac_inc_tx_win_size - tx window size is inc by 1
1082 * @sk: current connection structure.
1083 * @skb: current event.
1084 *
1085 * After receiving an RR response with f-bit set to one, transmit window
1086 * size is increased by one. Returns 0 for success, 1 otherwise.
1087 */
llc_conn_ac_inc_tx_win_size(struct sock * sk,struct sk_buff * skb)1088 int llc_conn_ac_inc_tx_win_size(struct sock *sk, struct sk_buff *skb)
1089 {
1090 struct llc_sock *llc = llc_sk(sk);
1091
1092 llc->k += 1;
1093 if (llc->k > LLC_2_SEQ_NBR_MODULO - 1)
1094 llc->k = LLC_2_SEQ_NBR_MODULO - 1;
1095 return 0;
1096 }
1097
llc_conn_ac_stop_all_timers(struct sock * sk,struct sk_buff * skb)1098 int llc_conn_ac_stop_all_timers(struct sock *sk, struct sk_buff *skb)
1099 {
1100 llc_sk_stop_all_timers(sk, false);
1101 return 0;
1102 }
1103
llc_conn_ac_stop_other_timers(struct sock * sk,struct sk_buff * skb)1104 int llc_conn_ac_stop_other_timers(struct sock *sk, struct sk_buff *skb)
1105 {
1106 struct llc_sock *llc = llc_sk(sk);
1107
1108 timer_delete(&llc->rej_sent_timer.timer);
1109 timer_delete(&llc->pf_cycle_timer.timer);
1110 timer_delete(&llc->busy_state_timer.timer);
1111 llc->ack_must_be_send = 0;
1112 llc->ack_pf = 0;
1113 return 0;
1114 }
1115
llc_conn_ac_start_ack_timer(struct sock * sk,struct sk_buff * skb)1116 int llc_conn_ac_start_ack_timer(struct sock *sk, struct sk_buff *skb)
1117 {
1118 struct llc_sock *llc = llc_sk(sk);
1119
1120 mod_timer(&llc->ack_timer.timer, jiffies + llc->ack_timer.expire);
1121 return 0;
1122 }
1123
llc_conn_ac_start_rej_timer(struct sock * sk,struct sk_buff * skb)1124 int llc_conn_ac_start_rej_timer(struct sock *sk, struct sk_buff *skb)
1125 {
1126 struct llc_sock *llc = llc_sk(sk);
1127
1128 mod_timer(&llc->rej_sent_timer.timer,
1129 jiffies + llc->rej_sent_timer.expire);
1130 return 0;
1131 }
1132
llc_conn_ac_start_ack_tmr_if_not_running(struct sock * sk,struct sk_buff * skb)1133 int llc_conn_ac_start_ack_tmr_if_not_running(struct sock *sk,
1134 struct sk_buff *skb)
1135 {
1136 struct llc_sock *llc = llc_sk(sk);
1137
1138 if (!timer_pending(&llc->ack_timer.timer))
1139 mod_timer(&llc->ack_timer.timer,
1140 jiffies + llc->ack_timer.expire);
1141 return 0;
1142 }
1143
llc_conn_ac_stop_ack_timer(struct sock * sk,struct sk_buff * skb)1144 int llc_conn_ac_stop_ack_timer(struct sock *sk, struct sk_buff *skb)
1145 {
1146 timer_delete(&llc_sk(sk)->ack_timer.timer);
1147 return 0;
1148 }
1149
llc_conn_ac_stop_p_timer(struct sock * sk,struct sk_buff * skb)1150 int llc_conn_ac_stop_p_timer(struct sock *sk, struct sk_buff *skb)
1151 {
1152 struct llc_sock *llc = llc_sk(sk);
1153
1154 timer_delete(&llc->pf_cycle_timer.timer);
1155 llc_conn_set_p_flag(sk, 0);
1156 return 0;
1157 }
1158
llc_conn_ac_stop_rej_timer(struct sock * sk,struct sk_buff * skb)1159 int llc_conn_ac_stop_rej_timer(struct sock *sk, struct sk_buff *skb)
1160 {
1161 timer_delete(&llc_sk(sk)->rej_sent_timer.timer);
1162 return 0;
1163 }
1164
llc_conn_ac_upd_nr_received(struct sock * sk,struct sk_buff * skb)1165 int llc_conn_ac_upd_nr_received(struct sock *sk, struct sk_buff *skb)
1166 {
1167 int acked;
1168 u16 unacked = 0;
1169 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
1170 struct llc_sock *llc = llc_sk(sk);
1171
1172 llc->last_nr = PDU_SUPV_GET_Nr(pdu);
1173 acked = llc_conn_remove_acked_pdus(sk, llc->last_nr, &unacked);
1174 /* On loopback we don't queue I frames in unack_pdu_q queue. */
1175 if (acked > 0 || (llc->dev->flags & IFF_LOOPBACK)) {
1176 llc->retry_count = 0;
1177 timer_delete(&llc->ack_timer.timer);
1178 if (llc->failed_data_req) {
1179 /* already, we did not accept data from upper layer
1180 * (tx_window full or unacceptable state). Now, we
1181 * can send data and must inform to upper layer.
1182 */
1183 llc->failed_data_req = 0;
1184 llc_conn_ac_data_confirm(sk, skb);
1185 }
1186 if (unacked)
1187 mod_timer(&llc->ack_timer.timer,
1188 jiffies + llc->ack_timer.expire);
1189 } else if (llc->failed_data_req) {
1190 u8 f_bit;
1191
1192 llc_pdu_decode_pf_bit(skb, &f_bit);
1193 if (f_bit == 1) {
1194 llc->failed_data_req = 0;
1195 llc_conn_ac_data_confirm(sk, skb);
1196 }
1197 }
1198 return 0;
1199 }
1200
llc_conn_ac_upd_p_flag(struct sock * sk,struct sk_buff * skb)1201 int llc_conn_ac_upd_p_flag(struct sock *sk, struct sk_buff *skb)
1202 {
1203 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
1204
1205 if (LLC_PDU_IS_RSP(pdu)) {
1206 u8 f_bit;
1207
1208 llc_pdu_decode_pf_bit(skb, &f_bit);
1209 if (f_bit) {
1210 llc_conn_set_p_flag(sk, 0);
1211 llc_conn_ac_stop_p_timer(sk, skb);
1212 }
1213 }
1214 return 0;
1215 }
1216
llc_conn_ac_set_data_flag_2(struct sock * sk,struct sk_buff * skb)1217 int llc_conn_ac_set_data_flag_2(struct sock *sk, struct sk_buff *skb)
1218 {
1219 llc_sk(sk)->data_flag = 2;
1220 return 0;
1221 }
1222
llc_conn_ac_set_data_flag_0(struct sock * sk,struct sk_buff * skb)1223 int llc_conn_ac_set_data_flag_0(struct sock *sk, struct sk_buff *skb)
1224 {
1225 llc_sk(sk)->data_flag = 0;
1226 return 0;
1227 }
1228
llc_conn_ac_set_data_flag_1(struct sock * sk,struct sk_buff * skb)1229 int llc_conn_ac_set_data_flag_1(struct sock *sk, struct sk_buff *skb)
1230 {
1231 llc_sk(sk)->data_flag = 1;
1232 return 0;
1233 }
1234
llc_conn_ac_set_data_flag_1_if_data_flag_eq_0(struct sock * sk,struct sk_buff * skb)1235 int llc_conn_ac_set_data_flag_1_if_data_flag_eq_0(struct sock *sk,
1236 struct sk_buff *skb)
1237 {
1238 if (!llc_sk(sk)->data_flag)
1239 llc_sk(sk)->data_flag = 1;
1240 return 0;
1241 }
1242
llc_conn_ac_set_p_flag_0(struct sock * sk,struct sk_buff * skb)1243 int llc_conn_ac_set_p_flag_0(struct sock *sk, struct sk_buff *skb)
1244 {
1245 llc_conn_set_p_flag(sk, 0);
1246 return 0;
1247 }
1248
llc_conn_ac_set_p_flag_1(struct sock * sk,struct sk_buff * skb)1249 static int llc_conn_ac_set_p_flag_1(struct sock *sk, struct sk_buff *skb)
1250 {
1251 llc_conn_set_p_flag(sk, 1);
1252 return 0;
1253 }
1254
llc_conn_ac_set_remote_busy_0(struct sock * sk,struct sk_buff * skb)1255 int llc_conn_ac_set_remote_busy_0(struct sock *sk, struct sk_buff *skb)
1256 {
1257 llc_sk(sk)->remote_busy_flag = 0;
1258 return 0;
1259 }
1260
llc_conn_ac_set_cause_flag_0(struct sock * sk,struct sk_buff * skb)1261 int llc_conn_ac_set_cause_flag_0(struct sock *sk, struct sk_buff *skb)
1262 {
1263 llc_sk(sk)->cause_flag = 0;
1264 return 0;
1265 }
1266
llc_conn_ac_set_cause_flag_1(struct sock * sk,struct sk_buff * skb)1267 int llc_conn_ac_set_cause_flag_1(struct sock *sk, struct sk_buff *skb)
1268 {
1269 llc_sk(sk)->cause_flag = 1;
1270 return 0;
1271 }
1272
llc_conn_ac_set_retry_cnt_0(struct sock * sk,struct sk_buff * skb)1273 int llc_conn_ac_set_retry_cnt_0(struct sock *sk, struct sk_buff *skb)
1274 {
1275 llc_sk(sk)->retry_count = 0;
1276 return 0;
1277 }
1278
llc_conn_ac_inc_retry_cnt_by_1(struct sock * sk,struct sk_buff * skb)1279 int llc_conn_ac_inc_retry_cnt_by_1(struct sock *sk, struct sk_buff *skb)
1280 {
1281 llc_sk(sk)->retry_count++;
1282 return 0;
1283 }
1284
llc_conn_ac_set_vr_0(struct sock * sk,struct sk_buff * skb)1285 int llc_conn_ac_set_vr_0(struct sock *sk, struct sk_buff *skb)
1286 {
1287 llc_sk(sk)->vR = 0;
1288 return 0;
1289 }
1290
llc_conn_ac_inc_vr_by_1(struct sock * sk,struct sk_buff * skb)1291 int llc_conn_ac_inc_vr_by_1(struct sock *sk, struct sk_buff *skb)
1292 {
1293 llc_sk(sk)->vR = PDU_GET_NEXT_Vr(llc_sk(sk)->vR);
1294 return 0;
1295 }
1296
llc_conn_ac_set_vs_0(struct sock * sk,struct sk_buff * skb)1297 int llc_conn_ac_set_vs_0(struct sock *sk, struct sk_buff *skb)
1298 {
1299 llc_sk(sk)->vS = 0;
1300 return 0;
1301 }
1302
llc_conn_ac_set_vs_nr(struct sock * sk,struct sk_buff * skb)1303 int llc_conn_ac_set_vs_nr(struct sock *sk, struct sk_buff *skb)
1304 {
1305 llc_sk(sk)->vS = llc_sk(sk)->last_nr;
1306 return 0;
1307 }
1308
llc_conn_ac_inc_vs_by_1(struct sock * sk,struct sk_buff * skb)1309 static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb)
1310 {
1311 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % LLC_2_SEQ_NBR_MODULO;
1312 return 0;
1313 }
1314
llc_conn_tmr_common_cb(struct sock * sk,u8 type)1315 static void llc_conn_tmr_common_cb(struct sock *sk, u8 type)
1316 {
1317 struct sk_buff *skb = alloc_skb(0, GFP_ATOMIC);
1318
1319 bh_lock_sock(sk);
1320 if (skb) {
1321 struct llc_conn_state_ev *ev = llc_conn_ev(skb);
1322
1323 skb_set_owner_r(skb, sk);
1324 ev->type = type;
1325 llc_process_tmr_ev(sk, skb);
1326 }
1327 bh_unlock_sock(sk);
1328 }
1329
llc_conn_pf_cycle_tmr_cb(struct timer_list * t)1330 void llc_conn_pf_cycle_tmr_cb(struct timer_list *t)
1331 {
1332 struct llc_sock *llc = timer_container_of(llc, t,
1333 pf_cycle_timer.timer);
1334
1335 llc_conn_tmr_common_cb(&llc->sk, LLC_CONN_EV_TYPE_P_TMR);
1336 }
1337
llc_conn_busy_tmr_cb(struct timer_list * t)1338 void llc_conn_busy_tmr_cb(struct timer_list *t)
1339 {
1340 struct llc_sock *llc = timer_container_of(llc, t,
1341 busy_state_timer.timer);
1342
1343 llc_conn_tmr_common_cb(&llc->sk, LLC_CONN_EV_TYPE_BUSY_TMR);
1344 }
1345
llc_conn_ack_tmr_cb(struct timer_list * t)1346 void llc_conn_ack_tmr_cb(struct timer_list *t)
1347 {
1348 struct llc_sock *llc = timer_container_of(llc, t, ack_timer.timer);
1349
1350 llc_conn_tmr_common_cb(&llc->sk, LLC_CONN_EV_TYPE_ACK_TMR);
1351 }
1352
llc_conn_rej_tmr_cb(struct timer_list * t)1353 void llc_conn_rej_tmr_cb(struct timer_list *t)
1354 {
1355 struct llc_sock *llc = timer_container_of(llc, t,
1356 rej_sent_timer.timer);
1357
1358 llc_conn_tmr_common_cb(&llc->sk, LLC_CONN_EV_TYPE_REJ_TMR);
1359 }
1360
llc_conn_ac_rst_vs(struct sock * sk,struct sk_buff * skb)1361 int llc_conn_ac_rst_vs(struct sock *sk, struct sk_buff *skb)
1362 {
1363 llc_sk(sk)->X = llc_sk(sk)->vS;
1364 llc_conn_ac_set_vs_nr(sk, skb);
1365 return 0;
1366 }
1367
llc_conn_ac_upd_vs(struct sock * sk,struct sk_buff * skb)1368 int llc_conn_ac_upd_vs(struct sock *sk, struct sk_buff *skb)
1369 {
1370 struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
1371 u8 nr = PDU_SUPV_GET_Nr(pdu);
1372
1373 if (llc_circular_between(llc_sk(sk)->vS, nr, llc_sk(sk)->X))
1374 llc_conn_ac_set_vs_nr(sk, skb);
1375 return 0;
1376 }
1377
1378 /*
1379 * Non-standard actions; these not contained in IEEE specification; for
1380 * our own usage
1381 */
1382 /**
1383 * llc_conn_disc - removes connection from SAP list and frees it
1384 * @sk: closed connection
1385 * @skb: occurred event
1386 */
llc_conn_disc(struct sock * sk,struct sk_buff * skb)1387 int llc_conn_disc(struct sock *sk, struct sk_buff *skb)
1388 {
1389 /* FIXME: this thing seems to want to die */
1390 return 0;
1391 }
1392
1393 /**
1394 * llc_conn_reset - resets connection
1395 * @sk : reseting connection.
1396 * @skb: occurred event.
1397 *
1398 * Stop all timers, empty all queues and reset all flags.
1399 */
llc_conn_reset(struct sock * sk,struct sk_buff * skb)1400 int llc_conn_reset(struct sock *sk, struct sk_buff *skb)
1401 {
1402 llc_sk_reset(sk);
1403 return 0;
1404 }
1405
1406 /**
1407 * llc_circular_between - designates that b is between a and c or not
1408 * @a: lower bound
1409 * @b: element to see if is between a and b
1410 * @c: upper bound
1411 *
1412 * This function designates that b is between a and c or not (for example,
1413 * 0 is between 127 and 1). Returns 1 if b is between a and c, 0
1414 * otherwise.
1415 */
llc_circular_between(u8 a,u8 b,u8 c)1416 u8 llc_circular_between(u8 a, u8 b, u8 c)
1417 {
1418 b = b - a;
1419 c = c - a;
1420 return b <= c;
1421 }
1422
1423 /**
1424 * llc_process_tmr_ev - timer backend
1425 * @sk: active connection
1426 * @skb: occurred event
1427 *
1428 * This function is called from timer callback functions. When connection
1429 * is busy (during sending a data frame) timer expiration event must be
1430 * queued. Otherwise this event can be sent to connection state machine.
1431 * Queued events will process by llc_backlog_rcv function after sending
1432 * data frame.
1433 */
llc_process_tmr_ev(struct sock * sk,struct sk_buff * skb)1434 static void llc_process_tmr_ev(struct sock *sk, struct sk_buff *skb)
1435 {
1436 if (llc_sk(sk)->state == LLC_CONN_OUT_OF_SVC) {
1437 printk(KERN_WARNING "%s: timer called on closed connection\n",
1438 __func__);
1439 kfree_skb(skb);
1440 } else {
1441 if (!sock_owned_by_user(sk))
1442 llc_conn_state_process(sk, skb);
1443 else {
1444 llc_set_backlog_type(skb, LLC_EVENT);
1445 __sk_add_backlog(sk, skb);
1446 }
1447 }
1448 }
1449