diff options
| author | Arnaldo Carvalho de Melo <acme@conectiva.com.br> | 2002-09-22 16:42:48 -0300 |
|---|---|---|
| committer | David S. Miller <davem@nuts.ninka.net> | 2002-09-22 16:42:48 -0300 |
| commit | 1d84746d10682242fc4b56aa5c72d9d23ad8efe2 (patch) | |
| tree | 9e1fff46bb812acc3d40bd19e3ba50cbd454404a | |
| parent | 2efc5e416227ebb8c3bf42584c35469a02268306 (diff) | |
[LLC] use sk->state_change when p_flag is cleared or core state changes
| -rw-r--r-- | include/net/llc_c_ac.h | 2 | ||||
| -rw-r--r-- | net/llc/llc_c_ac.c | 23 | ||||
| -rw-r--r-- | net/llc/llc_conn.c | 10 | ||||
| -rw-r--r-- | net/llc/llc_main.c | 2 |
4 files changed, 27 insertions, 10 deletions
diff --git a/include/net/llc_c_ac.h b/include/net/llc_c_ac.h index 221899a24530..45f020aa69d5 100644 --- a/include/net/llc_c_ac.h +++ b/include/net/llc_c_ac.h @@ -216,4 +216,6 @@ extern void llc_conn_busy_tmr_cb(unsigned long timeout_data); extern void llc_conn_pf_cycle_tmr_cb(unsigned long timeout_data); extern void llc_conn_ack_tmr_cb(unsigned long timeout_data); extern void llc_conn_rej_tmr_cb(unsigned long timeout_data); + +extern void llc_conn_set_p_flag(struct sock *sk, u8 value); #endif /* LLC_C_AC_H */ diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c index b53e5ec3de5f..746a5d58fe34 100644 --- a/net/llc/llc_c_ac.c +++ b/net/llc/llc_c_ac.c @@ -813,6 +813,16 @@ int llc_conn_ac_send_ack_xxx_x_set_0(struct sock *sk, struct sk_buff *skb) return rc; } +void llc_conn_set_p_flag(struct sock *sk, u8 value) +{ + int state_changed = llc_sk(sk)->p_flag && !value; + + llc_sk(sk)->p_flag = value; + + if (state_changed) + sk->state_change(sk); +} + int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) { int rc = 1; @@ -834,7 +844,8 @@ int llc_conn_ac_send_sabme_cmd_p_set_x(struct sock *sk, struct sk_buff *skb) rc = 0; llc_conn_send_pdu(sk, nskb); } - llc->p_flag = p_bit; + llc_conn_set_p_flag(sk, p_bit); + return rc; } @@ -897,7 +908,7 @@ int llc_conn_ac_start_p_timer(struct sock *sk, struct sk_buff *skb) { struct llc_opt *llc = llc_sk(sk); - llc->p_flag = 1; + llc_conn_set_p_flag(sk, 1); mod_timer(&llc->pf_cycle_timer.timer, jiffies + llc->pf_cycle_timer.expire * HZ); return 0; @@ -1205,7 +1216,7 @@ int llc_conn_ac_stop_p_timer(struct sock *sk, struct sk_buff *skb) struct llc_opt *llc = llc_sk(sk); del_timer(&llc->pf_cycle_timer.timer); - llc->p_flag = 0; + llc_conn_set_p_flag(sk, 0); return 0; } @@ -1259,7 +1270,7 @@ int llc_conn_ac_upd_p_flag(struct sock *sk, struct sk_buff *skb) llc_pdu_decode_pf_bit(skb, &f_bit); if (f_bit) { - llc_sk(sk)->p_flag = 0; + llc_conn_set_p_flag(sk, 0); llc_conn_ac_stop_p_timer(sk, skb); } } @@ -1294,13 +1305,13 @@ int llc_conn_ac_set_data_flag_1_if_data_flag_eq_0(struct sock *sk, int llc_conn_ac_set_p_flag_0(struct sock *sk, struct sk_buff *skb) { - llc_sk(sk)->p_flag = 0; + llc_conn_set_p_flag(sk, 0); return 0; } int llc_conn_ac_set_p_flag_1(struct sock *sk, struct sk_buff *skb) { - llc_sk(sk)->p_flag = 1; + llc_conn_set_p_flag(sk, 1); return 0; } diff --git a/net/llc/llc_conn.c b/net/llc/llc_conn.c index 377887a246e4..d073738f0004 100644 --- a/net/llc/llc_conn.c +++ b/net/llc/llc_conn.c @@ -378,16 +378,20 @@ void llc_conn_free_ev(struct sk_buff *skb) static int llc_conn_service(struct sock *sk, struct sk_buff *skb) { int rc = 1; + struct llc_opt *llc = llc_sk(sk); struct llc_conn_state_trans *trans; - if (llc_sk(sk)->state > NBR_CONN_STATES) + if (llc->state > NBR_CONN_STATES) goto out; rc = 0; trans = llc_qualify_conn_ev(sk, skb); if (trans) { rc = llc_exec_conn_trans_actions(sk, trans, skb); - if (!rc && trans->next_state != NO_STATE_CHANGE) - llc_sk(sk)->state = trans->next_state; + if (!rc && trans->next_state != NO_STATE_CHANGE) { + llc->state = trans->next_state; + if (!llc_data_accept_state(llc->state)) + sk->state_change(sk); + } } out: return rc; diff --git a/net/llc/llc_main.c b/net/llc/llc_main.c index ecc52456fff6..4326773996ec 100644 --- a/net/llc/llc_main.c +++ b/net/llc/llc_main.c @@ -304,7 +304,7 @@ void llc_sk_reset(struct sock *sk) llc->remote_busy_flag = 0; llc->cause_flag = 0; llc->retry_count = 0; - llc->p_flag = 0; + llc_conn_set_p_flag(sk, 0); llc->f_flag = 0; llc->s_flag = 0; llc->ack_pf = 0; |
