patch-2.1.44 linux/net/ax25/ax25_ds_timer.c

Next file: linux/net/ax25/ax25_iface.c
Previous file: linux/net/ax25/ax25_ds_subr.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.43/linux/net/ax25/ax25_ds_timer.c linux/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 @@
 		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 @@
 				}
 			}
 			break;
-
-		default:
-			break;
 	}
+
+	ax25_start_heartbeat(ax25);
+}
 	
-	/* 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);
+/* 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);
+}
 
-		ax25->state = AX25_STATE_0;
-		ax25_dama_off(ax25);
+/* 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->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->n2count = 0;
 
-		ax25_set_timer(ax25);
+	/* state 1 or 2 should not happen, but... */
 
-		return;
-	}
+	if (ax25->state == AX25_STATE_1 || ax25->state == AX25_STATE_2)
+		ax25->state = AX25_STATE_0;
+	else
+		ax25->state = AX25_STATE_2;
 
-	/* 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;
-
-		/* state 1 or 2 should not happen, but... */
-
-		if (ax25->state == AX25_STATE_1 || ax25->state == AX25_STATE_2)
-			ax25->state = AX25_STATE_0;
-		else
-			ax25->state = AX25_STATE_2;
-
-		ax25->t1timer = ax25->t1 = ax25_calculate_t1(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->sk->destroy   = 1;
-		}
+	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_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 @@
 
 		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 @@
 
 		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

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov