diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-07-20 14:56:40 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-07-20 14:56:40 +0000 |
commit | e308faf24f68e262d92d294a01ddca7a17e76762 (patch) | |
tree | 22c47cb315811834861f013067878ff664e95abd /net/ax25/ax25_ds_timer.c | |
parent | 30c6397ce63178fcb3e7963ac247f0a03132aca9 (diff) |
Sync with Linux 2.1.46.
Diffstat (limited to 'net/ax25/ax25_ds_timer.c')
-rw-r--r-- | net/ax25/ax25_ds_timer.c | 172 |
1 files changed, 52 insertions, 120 deletions
diff --git a/net/ax25/ax25_ds_timer.c b/net/ax25/ax25_ds_timer.c index 847be5790..841149996 100644 --- a/net/ax25/ax25_ds_timer.c +++ b/net/ax25/ax25_ds_timer.c @@ -1,5 +1,5 @@ /* - * AX.25 release 036 + * AX.25 release 037 * * This code REQUIRES 2.1.15 or higher/ NET3.038 * @@ -12,6 +12,7 @@ * History * AX.25 036 Jonathan(G4KLX) Cloned from ax25_timer.c. * Joerg(DL1BKE) Added DAMA Slave Timeout timer + * AX.25 037 Jonathan(G4KLX) New timer architecture. */ #include <linux/config.h> @@ -93,41 +94,21 @@ static void ax25_ds_timeout(unsigned long arg) if (ax25->ax25_dev != ax25_dev || !(ax25->condition & AX25_COND_DAMA_MODE)) continue; - ax25_link_failed(&ax25->dest_addr, ax25_dev->dev); - ax25_clear_queues(ax25); ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); - ax25->state = AX25_STATE_0; - - if (ax25->sk != NULL) { - SOCK_DEBUG(ax25->sk, "AX.25 DAMA Slave Timeout\n"); - ax25->sk->state = TCP_CLOSE; - ax25->sk->err = ETIMEDOUT; - ax25->sk->shutdown |= SEND_SHUTDOWN; - if (!ax25->sk->dead) - ax25->sk->state_change(ax25->sk); - ax25->sk->dead = 1; - } - - ax25_set_timer(ax25); /* notify socket... */ + ax25_disconnect(ax25, ETIMEDOUT); } ax25_dev_dama_off(ax25_dev); } -/* - * AX.25 TIMER - * - * This routine is called every 100ms. Decrement timer by this - * amount - if expired then process the event. - */ -void ax25_ds_timer(ax25_cb *ax25) +void ax25_ds_heartbeat_expiry(ax25_cb *ax25) { switch (ax25->state) { + case AX25_STATE_0: /* Magic here: If we listen() and a new link dies before it is accepted() it isn't 'dead' so doesn't get removed. */ if (ax25->sk == NULL || ax25->sk->destroy || (ax25->sk->state == TCP_LISTEN && ax25->sk->dead)) { - del_timer(&ax25->timer); ax25_destroy_socket(ax25); return; } @@ -144,71 +125,51 @@ void ax25_ds_timer(ax25_cb *ax25) } } break; - - default: - break; - } - - /* dl1bke 960114: T3 works much like the IDLE timeout, but - * gets reloaded with every frame for this - * connection. - */ - - if (ax25->t3timer > 0 && --ax25->t3timer == 0) { - ax25_link_failed(&ax25->dest_addr, ax25->ax25_dev->dev); - ax25_clear_queues(ax25); - ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); - - ax25->state = AX25_STATE_0; - ax25_dama_off(ax25); - - if (ax25->sk != NULL) { - SOCK_DEBUG(ax25->sk, "AX.25 T3 Timeout\n"); - ax25->sk->state = TCP_CLOSE; - ax25->sk->err = ETIMEDOUT; - ax25->sk->shutdown |= SEND_SHUTDOWN; - if (!ax25->sk->dead) - ax25->sk->state_change(ax25->sk); - ax25->sk->dead = 1; - } - - ax25_set_timer(ax25); - - return; } - /* dl1bke 960228: close the connection when IDLE expires. - * unlike T3 this timer gets reloaded only on - * I frames. - */ - - if (ax25->idletimer > 0 && --ax25->idletimer == 0) { - ax25_clear_queues(ax25); - - ax25->n2count = 0; - ax25->t3timer = ax25->t3; + ax25_start_heartbeat(ax25); +} + +/* dl1bke 960114: T3 works much like the IDLE timeout, but + * gets reloaded with every frame for this + * connection. + */ +void ax25_ds_t3timer_expiry(ax25_cb *ax25) +{ + ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); + ax25_dama_off(ax25); + ax25_disconnect(ax25, ETIMEDOUT); +} - /* state 1 or 2 should not happen, but... */ +/* dl1bke 960228: close the connection when IDLE expires. + * unlike T3 this timer gets reloaded only on + * I frames. + */ +void ax25_ds_idletimer_expiry(ax25_cb *ax25) +{ + ax25_clear_queues(ax25); - if (ax25->state == AX25_STATE_1 || ax25->state == AX25_STATE_2) - ax25->state = AX25_STATE_0; - else - ax25->state = AX25_STATE_2; + ax25->n2count = 0; - ax25->t1timer = ax25->t1 = ax25_calculate_t1(ax25); + /* state 1 or 2 should not happen, but... */ - if (ax25->sk != NULL) { - ax25->sk->state = TCP_CLOSE; - ax25->sk->err = 0; - ax25->sk->shutdown |= SEND_SHUTDOWN; - if (!ax25->sk->dead) - ax25->sk->state_change(ax25->sk); - ax25->sk->dead = 1; - ax25->sk->destroy = 1; - } + if (ax25->state == AX25_STATE_1 || ax25->state == AX25_STATE_2) + ax25->state = AX25_STATE_0; + else + ax25->state = AX25_STATE_2; + + ax25_calculate_t1(ax25); + ax25_start_t1timer(ax25); + ax25_start_t3timer(ax25); + + if (ax25->sk != NULL) { + ax25->sk->state = TCP_CLOSE; + ax25->sk->err = 0; + ax25->sk->shutdown |= SEND_SHUTDOWN; + if (!ax25->sk->dead) + ax25->sk->state_change(ax25->sk); + ax25->sk->dead = 1; } - - ax25_set_timer(ax25); } /* dl1bke 960114: The DAMA protocol requires to send data and SABM/DISC @@ -222,20 +183,12 @@ void ax25_ds_timer(ax25_cb *ax25) void ax25_ds_t1_timeout(ax25_cb *ax25) { switch (ax25->state) { + case AX25_STATE_1: if (ax25->n2count == ax25->n2) { if (ax25->modulus == AX25_MODULUS) { - ax25_link_failed(&ax25->dest_addr, ax25->ax25_dev->dev); - ax25_clear_queues(ax25); - ax25->state = AX25_STATE_0; - if (ax25->sk != NULL) { - ax25->sk->state = TCP_CLOSE; - ax25->sk->err = ETIMEDOUT; - ax25->sk->shutdown |= SEND_SHUTDOWN; - if (!ax25->sk->dead) - ax25->sk->state_change(ax25->sk); - ax25->sk->dead = 1; - } + ax25_disconnect(ax25, ETIMEDOUT); + return; } else { ax25->modulus = AX25_MODULUS; ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW]; @@ -253,19 +206,9 @@ void ax25_ds_t1_timeout(ax25_cb *ax25) case AX25_STATE_2: if (ax25->n2count == ax25->n2) { - ax25_link_failed(&ax25->dest_addr, ax25->ax25_dev->dev); - ax25_clear_queues(ax25); - ax25->state = AX25_STATE_0; ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); - - if (ax25->sk != NULL) { - ax25->sk->state = TCP_CLOSE; - ax25->sk->err = ETIMEDOUT; - ax25->sk->shutdown |= SEND_SHUTDOWN; - if (!ax25->sk->dead) - ax25->sk->state_change(ax25->sk); - ax25->sk->dead = 1; - } + ax25_disconnect(ax25, ETIMEDOUT); + return; } else { ax25->n2count++; } @@ -273,28 +216,17 @@ void ax25_ds_t1_timeout(ax25_cb *ax25) case AX25_STATE_3: if (ax25->n2count == ax25->n2) { - ax25_link_failed(&ax25->dest_addr, ax25->ax25_dev->dev); - ax25_clear_queues(ax25); ax25_send_control(ax25, AX25_DM, AX25_POLLON, AX25_RESPONSE); - ax25->state = AX25_STATE_0; - if (ax25->sk != NULL) { - SOCK_DEBUG(ax25->sk, "AX.25 link Failure\n"); - ax25->sk->state = TCP_CLOSE; - ax25->sk->err = ETIMEDOUT; - ax25->sk->shutdown |= SEND_SHUTDOWN; - if (!ax25->sk->dead) - ax25->sk->state_change(ax25->sk); - ax25->sk->dead = 1; - } + ax25_disconnect(ax25, ETIMEDOUT); + return; } else { ax25->n2count++; } break; } - ax25->t1timer = ax25->t1 = ax25_calculate_t1(ax25); - - ax25_set_timer(ax25); + ax25_calculate_t1(ax25); + ax25_start_t1timer(ax25); } #endif |