diff --git a/q921.c b/q921.c index 392d050..d3dbc3a 100644 --- a/q921.c +++ b/q921.c @@ -1781,6 +1781,7 @@ static pri_event *q921_rnr_rx(struct pri *ctrl, q921_h *h) } break; case Q921_TIMER_RECOVERY: + /* Q.921 Figure B.8 Q921 (Sheet 6 of 9) Page 85 */ ctrl->peer_rx_busy = 1; if (is_command(ctrl, h)) { if (h->s.p_f) { @@ -1793,6 +1794,15 @@ static pri_event *q921_rnr_rx(struct pri *ctrl, q921_h *h) q921_setstate(ctrl, Q921_AWAITING_ESTABLISHMENT); break; } + } else { + if (n_r_is_valid(ctrl, h->s.n_r)) { + update_v_a(ctrl, h->s.n_r); + break; + } else { + n_r_error_recovery(ctrl); + q921_setstate(ctrl, Q921_AWAITING_ESTABLISHMENT); + break; + } } } else { if (h->s.p_f) { @@ -1807,6 +1817,15 @@ static pri_event *q921_rnr_rx(struct pri *ctrl, q921_h *h) q921_setstate(ctrl, Q921_AWAITING_ESTABLISHMENT); break; } + } else { + if (n_r_is_valid(ctrl, h->s.n_r)) { + update_v_a(ctrl, h->s.n_r); + break; + } else { + n_r_error_recovery(ctrl); + q921_setstate(ctrl, Q921_AWAITING_ESTABLISHMENT); + break; + } } } break;