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;
rc = 0;
llc_conn_send_pdu(sk, nskb);
}
- llc->p_flag = p_bit;
+ llc_conn_set_p_flag(sk, p_bit);
+
return rc;
}
{
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;
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;
}
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);
}
}
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;
}
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;