]> git.neil.brown.name Git - history.git/commitdiff
[LLC] use sk->state_change when p_flag is cleared or core state changes
authorArnaldo Carvalho de Melo <acme@conectiva.com.br>
Sun, 22 Sep 2002 19:42:48 +0000 (16:42 -0300)
committerDavid S. Miller <davem@nuts.ninka.net>
Sun, 22 Sep 2002 19:42:48 +0000 (16:42 -0300)
include/net/llc_c_ac.h
net/llc/llc_c_ac.c
net/llc/llc_conn.c
net/llc/llc_main.c

index 221899a245309040e4d2fa90a0f03fe138b29a3b..45f020aa69d5898c1180d7dc0ad6737377573a20 100644 (file)
@@ -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 */
index b53e5ec3de5f70fd380ef5fb8594f01677489c56..746a5d58fe348635f3192edaac6c20840b9d2e23 100644 (file)
@@ -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;
 }
 
index 377887a246e4d746843e1ebf508be0267e53623b..d073738f0004f969d1a8bb7c10d20f45846e328d 100644 (file)
@@ -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;
index ecc52456fff6605d96981cf7e61883d0e59967bd..4326773996eca5c873cd75f0731658631bba8a93 100644 (file)
@@ -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;