summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@conectiva.com.br>2002-09-22 16:42:48 -0300
committerDavid S. Miller <davem@nuts.ninka.net>2002-09-22 16:42:48 -0300
commit1d84746d10682242fc4b56aa5c72d9d23ad8efe2 (patch)
tree9e1fff46bb812acc3d40bd19e3ba50cbd454404a
parent2efc5e416227ebb8c3bf42584c35469a02268306 (diff)
[LLC] use sk->state_change when p_flag is cleared or core state changes
-rw-r--r--include/net/llc_c_ac.h2
-rw-r--r--net/llc/llc_c_ac.c23
-rw-r--r--net/llc/llc_conn.c10
-rw-r--r--net/llc/llc_main.c2
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;