2 * llc_c_ac.c - actions performed during connection state transition.
5 * Functions in this module are implementation of connection component actions
6 * Details of actions can be found in IEEE-802.2 standard document.
7 * All functions have one connection and one event as input argument. All of
8 * them return 0 On success and 1 otherwise.
10 * Copyright (c) 1997 by Procom Technology, Inc.
11 * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
13 * This program can be redistributed or modified under the terms of the
14 * GNU General Public License as published by the Free Software Foundation.
15 * This program is distributed without any warranty or implied warranty
16 * of merchantability or fitness for a particular purpose.
18 * See the GNU General Public License for more details.
20 #include <linux/netdevice.h>
21 #include <net/llc_conn.h>
22 #include <net/llc_sap.h>
24 #include <net/llc_c_ev.h>
25 #include <net/llc_c_ac.h>
26 #include <net/llc_c_st.h>
27 #include <net/llc_pdu.h>
30 #include "llc_output.h"
32 static int llc_conn_ac_inc_vs_by_1(struct sock
*sk
, struct sk_buff
*skb
);
33 static void llc_process_tmr_ev(struct sock
*sk
, struct sk_buff
*skb
);
34 static int llc_conn_ac_data_confirm(struct sock
*sk
, struct sk_buff
*ev
);
36 static int llc_conn_ac_inc_npta_value(struct sock
*sk
, struct sk_buff
*skb
);
38 static int llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock
*sk
,
41 static int llc_conn_ac_set_p_flag_1(struct sock
*sk
, struct sk_buff
*skb
);
45 int llc_conn_ac_clear_remote_busy(struct sock
*sk
, struct sk_buff
*skb
)
47 struct llc_sock
*llc
= llc_sk(sk
);
49 if (llc
->remote_busy_flag
) {
51 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
53 llc
->remote_busy_flag
= 0;
54 del_timer(&llc
->busy_state_timer
.timer
);
55 nr
= LLC_I_GET_NR(pdu
);
56 llc_conn_resend_i_pdu_as_cmd(sk
, nr
, 0);
61 int llc_conn_ac_conn_ind(struct sock
*sk
, struct sk_buff
*skb
)
67 llc_pdu_decode_dsap(skb
, &dsap
);
68 sap
= llc_sap_find(dsap
);
70 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
71 struct llc_sock
*llc
= llc_sk(sk
);
73 llc_pdu_decode_sa(skb
, llc
->daddr
.mac
);
74 llc_pdu_decode_da(skb
, llc
->laddr
.mac
);
76 ev
->ind_prim
= LLC_CONN_PRIM
;
82 int llc_conn_ac_conn_confirm(struct sock
*sk
, struct sk_buff
*skb
)
84 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
86 ev
->cfm_prim
= LLC_CONN_PRIM
;
90 static int llc_conn_ac_data_confirm(struct sock
*sk
, struct sk_buff
*skb
)
92 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
94 ev
->cfm_prim
= LLC_DATA_PRIM
;
98 int llc_conn_ac_data_ind(struct sock
*sk
, struct sk_buff
*skb
)
100 llc_conn_rtn_pdu(sk
, skb
);
104 int llc_conn_ac_disc_ind(struct sock
*sk
, struct sk_buff
*skb
)
106 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
110 if (ev
->type
== LLC_CONN_EV_TYPE_PDU
) {
111 struct llc_pdu_un
*pdu
= llc_pdu_un_hdr(skb
);
113 if (LLC_PDU_IS_RSP(pdu
) &&
114 LLC_PDU_TYPE_IS_U(pdu
) &&
115 LLC_U_PDU_RSP(pdu
) == LLC_2_PDU_RSP_DM
)
116 reason
= LLC_DISC_REASON_RX_DM_RSP_PDU
;
117 else if (LLC_PDU_IS_CMD(pdu
) &&
118 LLC_PDU_TYPE_IS_U(pdu
) &&
119 LLC_U_PDU_CMD(pdu
) == LLC_2_PDU_CMD_DISC
)
120 reason
= LLC_DISC_REASON_RX_DISC_CMD_PDU
;
121 } else if (ev
->type
== LLC_CONN_EV_TYPE_ACK_TMR
)
122 reason
= LLC_DISC_REASON_ACK_TMR_EXP
;
127 ev
->ind_prim
= LLC_DISC_PRIM
;
132 int llc_conn_ac_disc_confirm(struct sock
*sk
, struct sk_buff
*skb
)
134 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
136 ev
->reason
= ev
->status
;
137 ev
->cfm_prim
= LLC_DISC_PRIM
;
141 int llc_conn_ac_rst_ind(struct sock
*sk
, struct sk_buff
*skb
)
145 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
146 struct llc_pdu_un
*pdu
= llc_pdu_un_hdr(skb
);
147 struct llc_sock
*llc
= llc_sk(sk
);
150 case LLC_CONN_EV_TYPE_PDU
:
151 if (LLC_PDU_IS_RSP(pdu
) &&
152 LLC_PDU_TYPE_IS_U(pdu
) &&
153 LLC_U_PDU_RSP(pdu
) == LLC_2_PDU_RSP_FRMR
) {
154 reason
= LLC_RESET_REASON_LOCAL
;
156 } else if (LLC_PDU_IS_CMD(pdu
) &&
157 LLC_PDU_TYPE_IS_U(pdu
) &&
158 LLC_U_PDU_CMD(pdu
) == LLC_2_PDU_CMD_SABME
) {
159 reason
= LLC_RESET_REASON_REMOTE
;
163 case LLC_CONN_EV_TYPE_ACK_TMR
:
164 case LLC_CONN_EV_TYPE_P_TMR
:
165 case LLC_CONN_EV_TYPE_REJ_TMR
:
166 case LLC_CONN_EV_TYPE_BUSY_TMR
:
167 if (llc
->retry_count
> llc
->n2
) {
168 reason
= LLC_RESET_REASON_LOCAL
;
175 ev
->ind_prim
= LLC_RESET_PRIM
;
180 int llc_conn_ac_rst_confirm(struct sock
*sk
, struct sk_buff
*skb
)
182 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
185 ev
->cfm_prim
= LLC_RESET_PRIM
;
189 int llc_conn_ac_clear_remote_busy_if_f_eq_1(struct sock
*sk
,
192 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
194 if (LLC_PDU_IS_RSP(pdu
) &&
195 LLC_PDU_TYPE_IS_I(pdu
) &&
196 LLC_I_PF_IS_1(pdu
) && llc_sk(sk
)->ack_pf
)
197 llc_conn_ac_clear_remote_busy(sk
, skb
);
201 int llc_conn_ac_stop_rej_tmr_if_data_flag_eq_2(struct sock
*sk
,
204 struct llc_sock
*llc
= llc_sk(sk
);
206 if (llc
->data_flag
== 2)
207 del_timer(&llc
->rej_sent_timer
.timer
);
211 int llc_conn_ac_send_disc_cmd_p_set_x(struct sock
*sk
, struct sk_buff
*skb
)
214 struct llc_sock
*llc
= llc_sk(sk
);
215 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
218 struct llc_sap
*sap
= llc
->sap
;
220 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
221 llc
->daddr
.lsap
, LLC_PDU_CMD
);
222 llc_pdu_init_as_disc_cmd(nskb
, 1);
223 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
226 llc_conn_send_pdu(sk
, nskb
);
227 llc_conn_ac_set_p_flag_1(sk
, skb
);
236 int llc_conn_ac_send_dm_rsp_f_set_p(struct sock
*sk
, struct sk_buff
*skb
)
239 struct llc_sock
*llc
= llc_sk(sk
);
240 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
243 struct llc_sap
*sap
= llc
->sap
;
246 llc_pdu_decode_pf_bit(skb
, &f_bit
);
247 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
248 llc
->daddr
.lsap
, LLC_PDU_RSP
);
249 llc_pdu_init_as_dm_rsp(nskb
, f_bit
);
250 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
253 llc_conn_send_pdu(sk
, nskb
);
262 int llc_conn_ac_send_dm_rsp_f_set_1(struct sock
*sk
, struct sk_buff
*skb
)
265 struct llc_sock
*llc
= llc_sk(sk
);
266 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
269 struct llc_sap
*sap
= llc
->sap
;
272 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
273 llc
->daddr
.lsap
, LLC_PDU_RSP
);
274 llc_pdu_init_as_dm_rsp(nskb
, f_bit
);
275 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
278 llc_conn_send_pdu(sk
, nskb
);
287 int llc_conn_ac_send_frmr_rsp_f_set_x(struct sock
*sk
, struct sk_buff
*skb
)
291 struct sk_buff
*nskb
;
292 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
293 struct llc_sock
*llc
= llc_sk(sk
);
295 llc
->rx_pdu_hdr
= *((u32
*)pdu
);
296 if (LLC_PDU_IS_CMD(pdu
))
297 llc_pdu_decode_pf_bit(skb
, &f_bit
);
300 nskb
= llc_alloc_frame(llc
->dev
);
302 struct llc_sap
*sap
= llc
->sap
;
304 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
305 llc
->daddr
.lsap
, LLC_PDU_RSP
);
306 llc_pdu_init_as_frmr_rsp(nskb
, pdu
, f_bit
, llc
->vS
,
308 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
311 llc_conn_send_pdu(sk
, nskb
);
320 int llc_conn_ac_resend_frmr_rsp_f_set_0(struct sock
*sk
, struct sk_buff
*skb
)
323 struct llc_sock
*llc
= llc_sk(sk
);
324 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
328 struct llc_sap
*sap
= llc
->sap
;
329 struct llc_pdu_sn
*pdu
= (struct llc_pdu_sn
*)&llc
->rx_pdu_hdr
;
331 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
332 llc
->daddr
.lsap
, LLC_PDU_RSP
);
333 llc_pdu_init_as_frmr_rsp(nskb
, pdu
, f_bit
, llc
->vS
,
335 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
338 llc_conn_send_pdu(sk
, nskb
);
347 int llc_conn_ac_resend_frmr_rsp_f_set_p(struct sock
*sk
, struct sk_buff
*skb
)
351 struct sk_buff
*nskb
;
352 struct llc_sock
*llc
= llc_sk(sk
);
354 llc_pdu_decode_pf_bit(skb
, &f_bit
);
355 nskb
= llc_alloc_frame(llc
->dev
);
357 struct llc_sap
*sap
= llc
->sap
;
358 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
360 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
361 llc
->daddr
.lsap
, LLC_PDU_RSP
);
362 llc_pdu_init_as_frmr_rsp(nskb
, pdu
, f_bit
, llc
->vS
,
364 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
367 llc_conn_send_pdu(sk
, nskb
);
376 int llc_conn_ac_send_i_cmd_p_set_1(struct sock
*sk
, struct sk_buff
*skb
)
379 struct llc_sock
*llc
= llc_sk(sk
);
380 struct llc_sap
*sap
= llc
->sap
;
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
, 1, llc
->vS
, llc
->vR
);
385 rc
= llc_mac_hdr_init(skb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
387 llc_conn_send_pdu(sk
, skb
);
388 llc_conn_ac_inc_vs_by_1(sk
, skb
);
393 static int llc_conn_ac_send_i_cmd_p_set_0(struct sock
*sk
, struct sk_buff
*skb
)
396 struct llc_sock
*llc
= llc_sk(sk
);
397 struct llc_sap
*sap
= llc
->sap
;
399 llc_pdu_header_init(skb
, LLC_PDU_TYPE_I
, sap
->laddr
.lsap
,
400 llc
->daddr
.lsap
, LLC_PDU_CMD
);
401 llc_pdu_init_as_i_cmd(skb
, 0, llc
->vS
, llc
->vR
);
402 rc
= llc_mac_hdr_init(skb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
404 llc_conn_send_pdu(sk
, skb
);
405 llc_conn_ac_inc_vs_by_1(sk
, skb
);
410 int llc_conn_ac_send_i_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
413 struct llc_sock
*llc
= llc_sk(sk
);
414 struct llc_sap
*sap
= llc
->sap
;
416 llc_pdu_header_init(skb
, LLC_PDU_TYPE_I
, sap
->laddr
.lsap
,
417 llc
->daddr
.lsap
, LLC_PDU_CMD
);
418 llc_pdu_init_as_i_cmd(skb
, 0, llc
->vS
, llc
->vR
);
419 rc
= llc_mac_hdr_init(skb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
421 llc_conn_send_pdu(sk
, skb
);
422 llc_conn_ac_inc_vs_by_1(sk
, skb
);
427 int llc_conn_ac_resend_i_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
429 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
430 u8 nr
= LLC_I_GET_NR(pdu
);
432 llc_conn_resend_i_pdu_as_cmd(sk
, nr
, 0);
436 int llc_conn_ac_resend_i_xxx_x_set_0_or_send_rr(struct sock
*sk
,
440 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
442 struct llc_sock
*llc
= llc_sk(sk
);
443 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
446 struct llc_sap
*sap
= llc
->sap
;
448 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
449 llc
->daddr
.lsap
, LLC_PDU_RSP
);
450 llc_pdu_init_as_rr_rsp(nskb
, 0, llc
->vR
);
451 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
453 llc_conn_send_pdu(sk
, nskb
);
458 nr
= LLC_I_GET_NR(pdu
);
460 llc_conn_resend_i_pdu_as_cmd(sk
, nr
, 0);
465 int llc_conn_ac_resend_i_rsp_f_set_1(struct sock
*sk
, struct sk_buff
*skb
)
467 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
468 u8 nr
= LLC_I_GET_NR(pdu
);
470 llc_conn_resend_i_pdu_as_rsp(sk
, nr
, 1);
474 int llc_conn_ac_send_rej_cmd_p_set_1(struct sock
*sk
, struct sk_buff
*skb
)
477 struct llc_sock
*llc
= llc_sk(sk
);
478 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
481 struct llc_sap
*sap
= llc
->sap
;
483 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
484 llc
->daddr
.lsap
, LLC_PDU_CMD
);
485 llc_pdu_init_as_rej_cmd(nskb
, 1, llc
->vR
);
486 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
489 llc_conn_send_pdu(sk
, nskb
);
498 int llc_conn_ac_send_rej_rsp_f_set_1(struct sock
*sk
, struct sk_buff
*skb
)
501 struct llc_sock
*llc
= llc_sk(sk
);
502 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
506 struct llc_sap
*sap
= llc
->sap
;
508 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
509 llc
->daddr
.lsap
, LLC_PDU_RSP
);
510 llc_pdu_init_as_rej_rsp(nskb
, f_bit
, llc
->vR
);
511 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
514 llc_conn_send_pdu(sk
, nskb
);
523 int llc_conn_ac_send_rej_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
526 struct llc_sock
*llc
= llc_sk(sk
);
527 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
530 struct llc_sap
*sap
= llc
->sap
;
533 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
534 llc
->daddr
.lsap
, LLC_PDU_RSP
);
535 llc_pdu_init_as_rej_rsp(nskb
, f_bit
, llc
->vR
);
536 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
539 llc_conn_send_pdu(sk
, nskb
);
548 int llc_conn_ac_send_rnr_cmd_p_set_1(struct sock
*sk
, struct sk_buff
*skb
)
551 struct llc_sock
*llc
= llc_sk(sk
);
552 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
555 struct llc_sap
*sap
= llc
->sap
;
557 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
558 llc
->daddr
.lsap
, LLC_PDU_CMD
);
559 llc_pdu_init_as_rnr_cmd(nskb
, 1, llc
->vR
);
560 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
563 llc_conn_send_pdu(sk
, nskb
);
572 int llc_conn_ac_send_rnr_rsp_f_set_1(struct sock
*sk
, struct sk_buff
*skb
)
575 struct llc_sock
*llc
= llc_sk(sk
);
576 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
579 struct llc_sap
*sap
= llc
->sap
;
582 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
583 llc
->daddr
.lsap
, LLC_PDU_RSP
);
584 llc_pdu_init_as_rnr_rsp(nskb
, f_bit
, llc
->vR
);
585 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
588 llc_conn_send_pdu(sk
, nskb
);
597 int llc_conn_ac_send_rnr_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
600 struct llc_sock
*llc
= llc_sk(sk
);
601 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
605 struct llc_sap
*sap
= llc
->sap
;
607 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
608 llc
->daddr
.lsap
, LLC_PDU_RSP
);
609 llc_pdu_init_as_rnr_rsp(nskb
, f_bit
, llc
->vR
);
610 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
613 llc_conn_send_pdu(sk
, nskb
);
622 int llc_conn_ac_set_remote_busy(struct sock
*sk
, struct sk_buff
*skb
)
624 struct llc_sock
*llc
= llc_sk(sk
);
626 if (!llc
->remote_busy_flag
) {
627 llc
->remote_busy_flag
= 1;
628 mod_timer(&llc
->busy_state_timer
.timer
,
629 jiffies
+ llc
->busy_state_timer
.expire
* HZ
);
634 int llc_conn_ac_opt_send_rnr_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
637 struct llc_sock
*llc
= llc_sk(sk
);
638 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
641 struct llc_sap
*sap
= llc
->sap
;
643 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
644 llc
->daddr
.lsap
, LLC_PDU_RSP
);
645 llc_pdu_init_as_rnr_rsp(nskb
, 0, llc
->vR
);
646 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
649 llc_conn_send_pdu(sk
, nskb
);
658 int llc_conn_ac_send_rr_cmd_p_set_1(struct sock
*sk
, struct sk_buff
*skb
)
661 struct llc_sock
*llc
= llc_sk(sk
);
662 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
665 struct llc_sap
*sap
= llc
->sap
;
667 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
668 llc
->daddr
.lsap
, LLC_PDU_CMD
);
669 llc_pdu_init_as_rr_cmd(nskb
, 1, llc
->vR
);
670 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
673 llc_conn_send_pdu(sk
, nskb
);
682 int llc_conn_ac_send_rr_rsp_f_set_1(struct sock
*sk
, struct sk_buff
*skb
)
685 struct llc_sock
*llc
= llc_sk(sk
);
686 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
689 struct llc_sap
*sap
= llc
->sap
;
692 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
693 llc
->daddr
.lsap
, LLC_PDU_RSP
);
694 llc_pdu_init_as_rr_rsp(nskb
, f_bit
, llc
->vR
);
695 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
698 llc_conn_send_pdu(sk
, nskb
);
707 int llc_conn_ac_send_ack_rsp_f_set_1(struct sock
*sk
, struct sk_buff
*skb
)
710 struct llc_sock
*llc
= llc_sk(sk
);
711 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
714 struct llc_sap
*sap
= llc
->sap
;
717 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
718 llc
->daddr
.lsap
, LLC_PDU_RSP
);
719 llc_pdu_init_as_rr_rsp(nskb
, f_bit
, llc
->vR
);
720 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
723 llc_conn_send_pdu(sk
, nskb
);
732 int llc_conn_ac_send_rr_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
735 struct llc_sock
*llc
= llc_sk(sk
);
736 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
739 struct llc_sap
*sap
= llc
->sap
;
741 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
742 llc
->daddr
.lsap
, LLC_PDU_RSP
);
743 llc_pdu_init_as_rr_rsp(nskb
, 0, llc
->vR
);
744 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
747 llc_conn_send_pdu(sk
, nskb
);
756 int llc_conn_ac_send_ack_xxx_x_set_0(struct sock
*sk
, struct sk_buff
*skb
)
759 struct llc_sock
*llc
= llc_sk(sk
);
760 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
763 struct llc_sap
*sap
= llc
->sap
;
765 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
766 llc
->daddr
.lsap
, LLC_PDU_RSP
);
767 llc_pdu_init_as_rr_rsp(nskb
, 0, llc
->vR
);
768 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
771 llc_conn_send_pdu(sk
, nskb
);
780 void llc_conn_set_p_flag(struct sock
*sk
, u8 value
)
782 int state_changed
= llc_sk(sk
)->p_flag
&& !value
;
784 llc_sk(sk
)->p_flag
= value
;
787 sk
->sk_state_change(sk
);
790 int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock
*sk
, struct sk_buff
*skb
)
793 struct llc_sock
*llc
= llc_sk(sk
);
794 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
797 struct llc_sap
*sap
= llc
->sap
;
798 u8
*dmac
= llc
->daddr
.mac
;
800 if (llc
->dev
->flags
& IFF_LOOPBACK
)
801 dmac
= llc
->dev
->dev_addr
;
802 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
803 llc
->daddr
.lsap
, LLC_PDU_CMD
);
804 llc_pdu_init_as_sabme_cmd(nskb
, 1);
805 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, dmac
);
808 llc_conn_send_pdu(sk
, nskb
);
809 llc_conn_set_p_flag(sk
, 1);
818 int llc_conn_ac_send_ua_rsp_f_set_p(struct sock
*sk
, struct sk_buff
*skb
)
822 struct llc_sock
*llc
= llc_sk(sk
);
823 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
825 llc_pdu_decode_pf_bit(skb
, &f_bit
);
827 struct llc_sap
*sap
= llc
->sap
;
829 nskb
->dev
= llc
->dev
;
830 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_U
, sap
->laddr
.lsap
,
831 llc
->daddr
.lsap
, LLC_PDU_RSP
);
832 llc_pdu_init_as_ua_rsp(nskb
, f_bit
);
833 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
836 llc_conn_send_pdu(sk
, nskb
);
845 int llc_conn_ac_set_s_flag_0(struct sock
*sk
, struct sk_buff
*skb
)
847 llc_sk(sk
)->s_flag
= 0;
851 int llc_conn_ac_set_s_flag_1(struct sock
*sk
, struct sk_buff
*skb
)
853 llc_sk(sk
)->s_flag
= 1;
857 int llc_conn_ac_start_p_timer(struct sock
*sk
, struct sk_buff
*skb
)
859 struct llc_sock
*llc
= llc_sk(sk
);
861 llc_conn_set_p_flag(sk
, 1);
862 mod_timer(&llc
->pf_cycle_timer
.timer
,
863 jiffies
+ llc
->pf_cycle_timer
.expire
* HZ
);
868 * llc_conn_ac_send_ack_if_needed - check if ack is needed
869 * @sk: current connection structure
870 * @skb: current event
872 * Checks number of received PDUs which have not been acknowledged, yet,
873 * If number of them reaches to "npta"(Number of PDUs To Acknowledge) then
874 * sends an RR response as acknowledgement for them. Returns 0 for
875 * success, 1 otherwise.
877 int llc_conn_ac_send_ack_if_needed(struct sock
*sk
, struct sk_buff
*skb
)
880 struct llc_sock
*llc
= llc_sk(sk
);
882 llc_pdu_decode_pf_bit(skb
, &pf_bit
);
883 llc
->ack_pf
|= pf_bit
& 1;
884 if (!llc
->ack_must_be_send
) {
885 llc
->first_pdu_Ns
= llc
->vR
;
886 llc
->ack_must_be_send
= 1;
887 llc
->ack_pf
= pf_bit
& 1;
889 if (((llc
->vR
- llc
->first_pdu_Ns
+ 129) % 128) >= llc
->npta
) {
890 llc_conn_ac_send_rr_rsp_f_set_ackpf(sk
, skb
);
891 llc
->ack_must_be_send
= 0;
893 llc_conn_ac_inc_npta_value(sk
, skb
);
899 * llc_conn_ac_rst_sendack_flag - resets ack_must_be_send flag
900 * @sk: current connection structure
901 * @skb: current event
903 * This action resets ack_must_be_send flag of given connection, this flag
904 * indicates if there is any PDU which has not been acknowledged yet.
905 * Returns 0 for success, 1 otherwise.
907 int llc_conn_ac_rst_sendack_flag(struct sock
*sk
, struct sk_buff
*skb
)
909 llc_sk(sk
)->ack_must_be_send
= llc_sk(sk
)->ack_pf
= 0;
914 * llc_conn_ac_send_i_rsp_f_set_ackpf - acknowledge received PDUs
915 * @sk: current connection structure
916 * @skb: current event
918 * Sends an I response PDU with f-bit set to ack_pf flag as acknowledge to
919 * all received PDUs which have not been acknowledged, yet. ack_pf flag is
920 * set to one if one PDU with p-bit set to one is received. Returns 0 for
921 * success, 1 otherwise.
923 static int llc_conn_ac_send_i_rsp_f_set_ackpf(struct sock
*sk
,
927 struct llc_sock
*llc
= llc_sk(sk
);
928 struct llc_sap
*sap
= llc
->sap
;
930 llc_pdu_header_init(skb
, LLC_PDU_TYPE_I
, sap
->laddr
.lsap
,
931 llc
->daddr
.lsap
, LLC_PDU_RSP
);
932 llc_pdu_init_as_i_cmd(skb
, llc
->ack_pf
, llc
->vS
, llc
->vR
);
933 rc
= llc_mac_hdr_init(skb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
935 llc_conn_send_pdu(sk
, skb
);
936 llc_conn_ac_inc_vs_by_1(sk
, skb
);
942 * llc_conn_ac_send_i_as_ack - sends an I-format PDU to acknowledge rx PDUs
943 * @sk: current connection structure.
944 * @skb: current event.
946 * This action sends an I-format PDU as acknowledge to received PDUs which
947 * have not been acknowledged, yet, if there is any. By using of this
948 * action number of acknowledgements decreases, this technic is called
949 * piggy backing. Returns 0 for success, 1 otherwise.
951 int llc_conn_ac_send_i_as_ack(struct sock
*sk
, struct sk_buff
*skb
)
953 struct llc_sock
*llc
= llc_sk(sk
);
955 if (llc
->ack_must_be_send
) {
956 llc_conn_ac_send_i_rsp_f_set_ackpf(sk
, skb
);
957 llc
->ack_must_be_send
= 0 ;
960 llc_conn_ac_send_i_cmd_p_set_0(sk
, skb
);
965 * llc_conn_ac_send_rr_rsp_f_set_ackpf - ack all rx PDUs not yet acked
966 * @sk: current connection structure.
967 * @skb: current event.
969 * This action sends an RR response with f-bit set to ack_pf flag as
970 * acknowledge to all received PDUs which have not been acknowledged, yet,
971 * if there is any. ack_pf flag indicates if a PDU has been received with
972 * p-bit set to one. Returns 0 for success, 1 otherwise.
974 static int llc_conn_ac_send_rr_rsp_f_set_ackpf(struct sock
*sk
,
978 struct llc_sock
*llc
= llc_sk(sk
);
979 struct sk_buff
*nskb
= llc_alloc_frame(llc
->dev
);
982 struct llc_sap
*sap
= llc
->sap
;
984 llc_pdu_header_init(nskb
, LLC_PDU_TYPE_S
, sap
->laddr
.lsap
,
985 llc
->daddr
.lsap
, LLC_PDU_RSP
);
986 llc_pdu_init_as_rr_rsp(nskb
, llc
->ack_pf
, llc
->vR
);
987 rc
= llc_mac_hdr_init(nskb
, llc
->dev
->dev_addr
, llc
->daddr
.mac
);
990 llc_conn_send_pdu(sk
, nskb
);
1000 * llc_conn_ac_inc_npta_value - tries to make value of npta greater
1001 * @sk: current connection structure.
1002 * @skb: current event.
1004 * After "inc_cntr" times calling of this action, "npta" increase by one.
1005 * this action tries to make vale of "npta" greater as possible; number of
1006 * acknowledgements decreases by increasing of "npta". Returns 0 for
1007 * success, 1 otherwise.
1009 static int llc_conn_ac_inc_npta_value(struct sock
*sk
, struct sk_buff
*skb
)
1011 struct llc_sock
*llc
= llc_sk(sk
);
1013 if (!llc
->inc_cntr
) {
1015 llc
->dec_cntr
= llc
->inc_cntr
= 2;
1017 if (llc
->npta
> 127)
1025 * llc_conn_ac_adjust_npta_by_rr - decreases "npta" by one
1026 * @sk: current connection structure.
1027 * @skb: current event.
1029 * After receiving "dec_cntr" times RR command, this action decreases
1030 * "npta" by one. Returns 0 for success, 1 otherwise.
1032 int llc_conn_ac_adjust_npta_by_rr(struct sock
*sk
, struct sk_buff
*skb
)
1034 struct llc_sock
*llc
= llc_sk(sk
);
1036 if (!llc
->connect_step
&& !llc
->remote_busy_flag
) {
1037 if (!llc
->dec_step
) {
1038 if (!llc
->dec_cntr
) {
1039 llc
->inc_cntr
= llc
->dec_cntr
= 2;
1041 llc
->npta
= llc
->npta
- 1;
1046 llc
->connect_step
= 0 ;
1051 * llc_conn_ac_adjust_npta_by_rnr - decreases "npta" by one
1052 * @sk: current connection structure.
1053 * @skb: current event.
1055 * After receiving "dec_cntr" times RNR command, this action decreases
1056 * "npta" by one. Returns 0 for success, 1 otherwise.
1058 int llc_conn_ac_adjust_npta_by_rnr(struct sock
*sk
, struct sk_buff
*skb
)
1060 struct llc_sock
*llc
= llc_sk(sk
);
1062 if (llc
->remote_busy_flag
)
1063 if (!llc
->dec_step
) {
1064 if (!llc
->dec_cntr
) {
1065 llc
->inc_cntr
= llc
->dec_cntr
= 2;
1075 * llc_conn_ac_dec_tx_win_size - decreases tx window size
1076 * @sk: current connection structure.
1077 * @skb: current event.
1079 * After receiving of a REJ command or response, transmit window size is
1080 * decreased by number of PDUs which are outstanding yet. Returns 0 for
1081 * success, 1 otherwise.
1083 int llc_conn_ac_dec_tx_win_size(struct sock
*sk
, struct sk_buff
*skb
)
1085 struct llc_sock
*llc
= llc_sk(sk
);
1086 u8 unacked_pdu
= skb_queue_len(&llc
->pdu_unack_q
);
1088 llc
->k
-= unacked_pdu
;
1095 * llc_conn_ac_inc_tx_win_size - tx window size is inc by 1
1096 * @sk: current connection structure.
1097 * @skb: current event.
1099 * After receiving an RR response with f-bit set to one, transmit window
1100 * size is increased by one. Returns 0 for success, 1 otherwise.
1102 int llc_conn_ac_inc_tx_win_size(struct sock
*sk
, struct sk_buff
*skb
)
1104 struct llc_sock
*llc
= llc_sk(sk
);
1112 int llc_conn_ac_stop_all_timers(struct sock
*sk
, struct sk_buff
*skb
)
1114 struct llc_sock
*llc
= llc_sk(sk
);
1116 del_timer(&llc
->pf_cycle_timer
.timer
);
1117 del_timer(&llc
->ack_timer
.timer
);
1118 del_timer(&llc
->rej_sent_timer
.timer
);
1119 del_timer(&llc
->busy_state_timer
.timer
);
1120 llc
->ack_must_be_send
= 0;
1125 int llc_conn_ac_stop_other_timers(struct sock
*sk
, struct sk_buff
*skb
)
1127 struct llc_sock
*llc
= llc_sk(sk
);
1129 del_timer(&llc
->rej_sent_timer
.timer
);
1130 del_timer(&llc
->pf_cycle_timer
.timer
);
1131 del_timer(&llc
->busy_state_timer
.timer
);
1132 llc
->ack_must_be_send
= 0;
1137 int llc_conn_ac_start_ack_timer(struct sock
*sk
, struct sk_buff
*skb
)
1139 struct llc_sock
*llc
= llc_sk(sk
);
1141 mod_timer(&llc
->ack_timer
.timer
, jiffies
+ llc
->ack_timer
.expire
* HZ
);
1145 int llc_conn_ac_start_rej_timer(struct sock
*sk
, struct sk_buff
*skb
)
1147 struct llc_sock
*llc
= llc_sk(sk
);
1149 mod_timer(&llc
->rej_sent_timer
.timer
,
1150 jiffies
+ llc
->rej_sent_timer
.expire
* HZ
);
1154 int llc_conn_ac_start_ack_tmr_if_not_running(struct sock
*sk
,
1155 struct sk_buff
*skb
)
1157 struct llc_sock
*llc
= llc_sk(sk
);
1159 if (!timer_pending(&llc
->ack_timer
.timer
))
1160 mod_timer(&llc
->ack_timer
.timer
,
1161 jiffies
+ llc
->ack_timer
.expire
* HZ
);
1165 int llc_conn_ac_stop_ack_timer(struct sock
*sk
, struct sk_buff
*skb
)
1167 del_timer(&llc_sk(sk
)->ack_timer
.timer
);
1171 int llc_conn_ac_stop_p_timer(struct sock
*sk
, struct sk_buff
*skb
)
1173 struct llc_sock
*llc
= llc_sk(sk
);
1175 del_timer(&llc
->pf_cycle_timer
.timer
);
1176 llc_conn_set_p_flag(sk
, 0);
1180 int llc_conn_ac_stop_rej_timer(struct sock
*sk
, struct sk_buff
*skb
)
1182 del_timer(&llc_sk(sk
)->rej_sent_timer
.timer
);
1186 int llc_conn_ac_upd_nr_received(struct sock
*sk
, struct sk_buff
*skb
)
1190 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
1191 struct llc_sock
*llc
= llc_sk(sk
);
1193 llc
->last_nr
= PDU_SUPV_GET_Nr(pdu
);
1194 acked
= llc_conn_remove_acked_pdus(sk
, llc
->last_nr
, &unacked
);
1195 /* On loopback we don't queue I frames in unack_pdu_q queue. */
1196 if (acked
> 0 || (llc
->dev
->flags
& IFF_LOOPBACK
)) {
1197 llc
->retry_count
= 0;
1198 del_timer(&llc
->ack_timer
.timer
);
1199 if (llc
->failed_data_req
) {
1200 /* already, we did not accept data from upper layer
1201 * (tx_window full or unacceptable state). Now, we
1202 * can send data and must inform to upper layer.
1204 llc
->failed_data_req
= 0;
1205 llc_conn_ac_data_confirm(sk
, skb
);
1208 mod_timer(&llc
->ack_timer
.timer
,
1209 jiffies
+ llc
->ack_timer
.expire
* HZ
);
1210 } else if (llc
->failed_data_req
) {
1213 llc_pdu_decode_pf_bit(skb
, &f_bit
);
1215 llc
->failed_data_req
= 0;
1216 llc_conn_ac_data_confirm(sk
, skb
);
1222 int llc_conn_ac_upd_p_flag(struct sock
*sk
, struct sk_buff
*skb
)
1224 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
1226 if (LLC_PDU_IS_RSP(pdu
)) {
1229 llc_pdu_decode_pf_bit(skb
, &f_bit
);
1231 llc_conn_set_p_flag(sk
, 0);
1232 llc_conn_ac_stop_p_timer(sk
, skb
);
1238 int llc_conn_ac_set_data_flag_2(struct sock
*sk
, struct sk_buff
*skb
)
1240 llc_sk(sk
)->data_flag
= 2;
1244 int llc_conn_ac_set_data_flag_0(struct sock
*sk
, struct sk_buff
*skb
)
1246 llc_sk(sk
)->data_flag
= 0;
1250 int llc_conn_ac_set_data_flag_1(struct sock
*sk
, struct sk_buff
*skb
)
1252 llc_sk(sk
)->data_flag
= 1;
1256 int llc_conn_ac_set_data_flag_1_if_data_flag_eq_0(struct sock
*sk
,
1257 struct sk_buff
*skb
)
1259 if (!llc_sk(sk
)->data_flag
)
1260 llc_sk(sk
)->data_flag
= 1;
1264 int llc_conn_ac_set_p_flag_0(struct sock
*sk
, struct sk_buff
*skb
)
1266 llc_conn_set_p_flag(sk
, 0);
1270 static int llc_conn_ac_set_p_flag_1(struct sock
*sk
, struct sk_buff
*skb
)
1272 llc_conn_set_p_flag(sk
, 1);
1276 int llc_conn_ac_set_remote_busy_0(struct sock
*sk
, struct sk_buff
*skb
)
1278 llc_sk(sk
)->remote_busy_flag
= 0;
1282 int llc_conn_ac_set_cause_flag_0(struct sock
*sk
, struct sk_buff
*skb
)
1284 llc_sk(sk
)->cause_flag
= 0;
1288 int llc_conn_ac_set_cause_flag_1(struct sock
*sk
, struct sk_buff
*skb
)
1290 llc_sk(sk
)->cause_flag
= 1;
1294 int llc_conn_ac_set_retry_cnt_0(struct sock
*sk
, struct sk_buff
*skb
)
1296 llc_sk(sk
)->retry_count
= 0;
1300 int llc_conn_ac_inc_retry_cnt_by_1(struct sock
*sk
, struct sk_buff
*skb
)
1302 llc_sk(sk
)->retry_count
++;
1306 int llc_conn_ac_set_vr_0(struct sock
*sk
, struct sk_buff
*skb
)
1312 int llc_conn_ac_inc_vr_by_1(struct sock
*sk
, struct sk_buff
*skb
)
1314 llc_sk(sk
)->vR
= PDU_GET_NEXT_Vr(llc_sk(sk
)->vR
);
1318 int llc_conn_ac_set_vs_0(struct sock
*sk
, struct sk_buff
*skb
)
1324 int llc_conn_ac_set_vs_nr(struct sock
*sk
, struct sk_buff
*skb
)
1326 llc_sk(sk
)->vS
= llc_sk(sk
)->last_nr
;
1330 int llc_conn_ac_inc_vs_by_1(struct sock
*sk
, struct sk_buff
*skb
)
1332 llc_sk(sk
)->vS
= (llc_sk(sk
)->vS
+ 1) % 128;
1336 void llc_conn_pf_cycle_tmr_cb(unsigned long timeout_data
)
1338 struct sock
*sk
= (struct sock
*)timeout_data
;
1339 struct sk_buff
*skb
= alloc_skb(0, GFP_ATOMIC
);
1343 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
1346 ev
->type
= LLC_CONN_EV_TYPE_P_TMR
;
1347 llc_process_tmr_ev(sk
, skb
);
1352 void llc_conn_busy_tmr_cb(unsigned long timeout_data
)
1354 struct sock
*sk
= (struct sock
*)timeout_data
;
1355 struct sk_buff
*skb
= alloc_skb(0, GFP_ATOMIC
);
1359 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
1362 ev
->type
= LLC_CONN_EV_TYPE_BUSY_TMR
;
1363 llc_process_tmr_ev(sk
, skb
);
1368 void llc_conn_ack_tmr_cb(unsigned long timeout_data
)
1370 struct sock
* sk
= (struct sock
*)timeout_data
;
1371 struct sk_buff
*skb
= alloc_skb(0, GFP_ATOMIC
);
1375 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
1378 ev
->type
= LLC_CONN_EV_TYPE_ACK_TMR
;
1379 llc_process_tmr_ev(sk
, skb
);
1384 void llc_conn_rej_tmr_cb(unsigned long timeout_data
)
1386 struct sock
*sk
= (struct sock
*)timeout_data
;
1387 struct sk_buff
*skb
= alloc_skb(0, GFP_ATOMIC
);
1391 struct llc_conn_state_ev
*ev
= llc_conn_ev(skb
);
1394 ev
->type
= LLC_CONN_EV_TYPE_REJ_TMR
;
1395 llc_process_tmr_ev(sk
, skb
);
1400 int llc_conn_ac_rst_vs(struct sock
*sk
, struct sk_buff
*skb
)
1402 llc_sk(sk
)->X
= llc_sk(sk
)->vS
;
1403 llc_conn_ac_set_vs_nr(sk
, skb
);
1407 int llc_conn_ac_upd_vs(struct sock
*sk
, struct sk_buff
*skb
)
1409 struct llc_pdu_sn
*pdu
= llc_pdu_sn_hdr(skb
);
1410 u8 nr
= PDU_SUPV_GET_Nr(pdu
);
1412 if (llc_circular_between(llc_sk(sk
)->vS
, nr
, llc_sk(sk
)->X
))
1413 llc_conn_ac_set_vs_nr(sk
, skb
);
1418 * Non-standard actions; these not contained in IEEE specification; for
1422 * llc_conn_disc - removes connection from SAP list and frees it
1423 * @sk: closed connection
1424 * @skb: occurred event
1426 int llc_conn_disc(struct sock
*sk
, struct sk_buff
*skb
)
1428 /* FIXME: this thing seems to want to die */
1433 * llc_conn_reset - resets connection
1434 * @sk : reseting connection.
1435 * @skb: occurred event.
1437 * Stop all timers, empty all queues and reset all flags.
1439 int llc_conn_reset(struct sock
*sk
, struct sk_buff
*skb
)
1446 * llc_circular_between - designates that b is between a and c or not
1448 * @b: element to see if is between a and b
1451 * This function designates that b is between a and c or not (for example,
1452 * 0 is between 127 and 1). Returns 1 if b is between a and c, 0
1455 u8
llc_circular_between(u8 a
, u8 b
, u8 c
)
1463 * llc_process_tmr_ev - timer backend
1464 * @sk: active connection
1465 * @skb: occurred event
1467 * This function is called from timer callback functions. When connection
1468 * is busy (during sending a data frame) timer expiration event must be
1469 * queued. Otherwise this event can be sent to connection state machine.
1470 * Queued events will process by llc_backlog_rcv function after sending
1473 static void llc_process_tmr_ev(struct sock
*sk
, struct sk_buff
*skb
)
1475 if (llc_sk(sk
)->state
== LLC_CONN_OUT_OF_SVC
) {
1476 printk(KERN_WARNING
"%s: timer called on closed connection\n",
1480 if (!sock_owned_by_user(sk
))
1481 llc_conn_state_process(sk
, skb
);
1483 llc_set_backlog_type(skb
, LLC_EVENT
);
1484 sk_add_backlog(sk
, skb
);