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

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
Loading
Loading
Loading
Loading
+33 −8
Original line number Diff line number Diff line
@@ -74,16 +74,43 @@ void x25_link_control(struct sk_buff *skb, struct x25_neigh *nb,

	switch (frametype) {
	case X25_RESTART_REQUEST:
		switch (nb->state) {
		case X25_LINK_STATE_2:
			confirm = !x25_t20timer_pending(nb);
			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);
			break;
		}
		break;

	case X25_RESTART_CONFIRMATION:
		switch (nb->state) {
		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;

	case X25_DIAGNOSTIC:
@@ -214,8 +241,6 @@ void x25_link_established(struct x25_neigh *nb)
{
	switch (nb->state) {
	case X25_LINK_STATE_0:
		nb->state = X25_LINK_STATE_2;
		break;
	case X25_LINK_STATE_1:
		x25_transmit_restart_request(nb);
		nb->state = X25_LINK_STATE_2;