Commit d023b2b9 authored by Martin Schiller's avatar Martin Schiller Committed by Jakub Kicinski

net/x25: fix restart request/confirm handling

We have to take the actual link state into account to handle
restart requests/confirms well.
Signed-off-by: default avatarMartin Schiller <ms@dev.tdt.de>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 62480b99
...@@ -74,16 +74,43 @@ void x25_link_control(struct sk_buff *skb, struct x25_neigh *nb, ...@@ -74,16 +74,43 @@ void x25_link_control(struct sk_buff *skb, struct x25_neigh *nb,
switch (frametype) { switch (frametype) {
case X25_RESTART_REQUEST: case X25_RESTART_REQUEST:
confirm = !x25_t20timer_pending(nb); switch (nb->state) {
x25_stop_t20timer(nb); case X25_LINK_STATE_2:
nb->state = X25_LINK_STATE_3; confirm = !x25_t20timer_pending(nb);
if (confirm) x25_stop_t20timer(nb);
nb->state = X25_LINK_STATE_3;
if (confirm)
x25_transmit_restart_confirmation(nb);
break;
case X25_LINK_STATE_3:
/* clear existing virtual calls */
x25_kill_by_neigh(nb);
x25_transmit_restart_confirmation(nb); x25_transmit_restart_confirmation(nb);
break;
}
break; break;
case X25_RESTART_CONFIRMATION: case X25_RESTART_CONFIRMATION:
x25_stop_t20timer(nb); switch (nb->state) {
nb->state = X25_LINK_STATE_3; case X25_LINK_STATE_2:
if (x25_t20timer_pending(nb)) {
x25_stop_t20timer(nb);
nb->state = X25_LINK_STATE_3;
} else {
x25_transmit_restart_request(nb);
x25_start_t20timer(nb);
}
break;
case X25_LINK_STATE_3:
/* clear existing virtual calls */
x25_kill_by_neigh(nb);
x25_transmit_restart_request(nb);
nb->state = X25_LINK_STATE_2;
x25_start_t20timer(nb);
break;
}
break; break;
case X25_DIAGNOSTIC: case X25_DIAGNOSTIC:
...@@ -214,8 +241,6 @@ void x25_link_established(struct x25_neigh *nb) ...@@ -214,8 +241,6 @@ void x25_link_established(struct x25_neigh *nb)
{ {
switch (nb->state) { switch (nb->state) {
case X25_LINK_STATE_0: case X25_LINK_STATE_0:
nb->state = X25_LINK_STATE_2;
break;
case X25_LINK_STATE_1: case X25_LINK_STATE_1:
x25_transmit_restart_request(nb); x25_transmit_restart_request(nb);
nb->state = X25_LINK_STATE_2; nb->state = X25_LINK_STATE_2;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment