patch-1.3.60 linux/net/ax25/ax25_timer.c

Next file: linux/net/core/dev.c
Previous file: linux/net/ax25/ax25_subr.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v1.3.59/linux/net/ax25/ax25_timer.c linux/net/ax25/ax25_timer.c
@@ -1,5 +1,5 @@
 /*
- *	AX.25 release 030
+ *	AX.25 release 031
  *
  *	This is ALPHA test software. This code may break your machine, randomly fail to work with new 
  *	releases, misbehave and/or generally screw up. It might even work. 
@@ -111,6 +111,7 @@
 			if (ax25->sk != NULL) {
 				if (ax25->sk->rmem_alloc < (ax25->sk->rcvbuf / 2) && (ax25->condition & OWN_RX_BUSY_CONDITION)) {
 					ax25->condition &= ~OWN_RX_BUSY_CONDITION;
+					if (!ax25->dama_slave) /* dl1bke */
 					ax25_send_control(ax25, RR, POLLOFF, C_RESPONSE);
 					ax25->condition &= ~ACK_PENDING_CONDITION;
 					break;
@@ -119,7 +120,8 @@
 			/*
 			 * Check for frames to transmit.
 			 */
-			ax25_kick(ax25);
+			if (!ax25->dama_slave)
+				ax25_kick(ax25);	/* dl1bke 960114 */
 			break;
 
 		default:
@@ -130,12 +132,41 @@
 		if (ax25->state == AX25_STATE_3 || ax25->state == AX25_STATE_4) {
 			if (ax25->condition & ACK_PENDING_CONDITION) {
 				ax25->condition &= ~ACK_PENDING_CONDITION;
+				if (!ax25->dama_slave)			/* dl1bke 960114 */
 				ax25_timeout_response(ax25);
 			}
 		}
 	}
 
-	if (ax25->t3timer > 0 && --ax25->t3timer == 0) {
+	if (ax25->t3timer > 0 && --ax25->t3timer == 0) 
+	{
+	
+		/* dl1bke 960114: T3 expires and we are in DAMA mode:  */
+		/*                send a DISC and abort the connection */
+		 
+		if (ax25->dama_slave)
+		{
+#ifdef CONFIG_NETROM
+			nr_link_failed(&ax25->dest_addr, ax25->device);
+#endif
+			ax25_clear_queues(ax25);
+			ax25_send_control(ax25, DISC, POLLON, C_COMMAND);
+				
+			ax25->state = AX25_STATE_0;
+			if (ax25->sk != NULL)
+			{
+				if (ax25->sk->debug)
+					printk("T3 Timeout\n");
+				ax25->sk->state = TCP_CLOSE;
+				ax25->sk->err   = ETIMEDOUT;
+				if (!ax25->sk->dead)
+					ax25->sk->state_change(ax25->sk);
+				ax25->sk->dead  = 1;
+			}
+			
+			return;
+		}
+		
 		if (ax25->state == AX25_STATE_3) {
 			ax25->n2count = 0;
 			ax25_transmit_enquiry(ax25);
@@ -144,11 +175,35 @@
 		ax25->t3timer = ax25->t3;
 	}
 
+	/* dl1bke 960114: DAMA T1 timeouts are handled in ax25_dama_slave_transmit */
+	/* 		  nevertheless we have to re-enqueue the timer struct...   */
+	
 	if (ax25->t1timer == 0 || --ax25->t1timer > 0) {
+	
 		ax25_reset_timer(ax25);
 		return;
 	}
 
+	if (!ax25_dev_is_dama_slave(ax25->device))
+	{
+		if (ax25->dama_slave) ax25->dama_slave = 0;
+		ax25_t1_timeout(ax25);
+	}
+}
+
+
+/* dl1bke 960114: The DAMA protocol requires to send data and SABM/DISC
+ *                within the poll of any connected channel. Remember 
+ *                that we are not allowed to send anything unless we
+ *                get polled by the Master.
+ *                
+ *                Thus we'll have to do parts of our T1 handling in
+ *                ax25_enquiry_response().
+ */
+
+
+void ax25_t1_timeout(ax25_cb * ax25)
+{	
 	switch (ax25->state) {
 		case AX25_STATE_1: 
 			if (ax25->n2count == ax25->n2) {
@@ -169,14 +224,14 @@
 					ax25->modulus = MODULUS;
 					ax25->window  = ax25_dev_get_value(ax25->device, AX25_VALUES_WINDOW);
 					ax25->n2count = 0;
-					ax25_send_control(ax25, SABM, POLLON, C_COMMAND);
+					ax25_send_control(ax25, SABM, ax25_dev_is_dama_slave(ax25->device)? POLLOFF : POLLON, C_COMMAND);
 				}
 			} else {
 				ax25->n2count++;
 				if (ax25->modulus == MODULUS) {
-					ax25_send_control(ax25, SABM, POLLON, C_COMMAND);
+					ax25_send_control(ax25, SABM, ax25_dev_is_dama_slave(ax25->device)? POLLOFF : POLLON, C_COMMAND);
 				} else {
-					ax25_send_control(ax25, SABME, POLLON, C_COMMAND);
+					ax25_send_control(ax25, SABME, ax25_dev_is_dama_slave(ax25->device)? POLLOFF : POLLON, C_COMMAND);
 				}
 			}
 			break;
@@ -188,6 +243,8 @@
 #endif
 				ax25_clear_queues(ax25);
 				ax25->state = AX25_STATE_0;
+				ax25_send_control(ax25, DISC, POLLON, C_COMMAND); /* dl1bke */
+				
 				if (ax25->sk != NULL) {
 					ax25->sk->state = TCP_CLOSE;
 					ax25->sk->err   = ETIMEDOUT;
@@ -197,12 +254,14 @@
 				}
 			} else {
 				ax25->n2count++;
+				if (!ax25_dev_is_dama_slave(ax25->device))	/* dl1bke */
 				ax25_send_control(ax25, DISC, POLLON, C_COMMAND);
 			}
 			break;
 
 		case AX25_STATE_3: 
 			ax25->n2count = 1;
+			if (!ax25->dama_slave)			/* dl1bke 960114 */
 			ax25_transmit_enquiry(ax25);
 			ax25->state   = AX25_STATE_4;
 			break;
@@ -216,6 +275,8 @@
 				ax25_send_control(ax25, DM, POLLON, C_RESPONSE);
 				ax25->state = AX25_STATE_0;
 				if (ax25->sk != NULL) {
+					if (ax25->sk->debug)
+						printk("Link Failure\n");
 					ax25->sk->state = TCP_CLOSE;
 					ax25->sk->err   = ETIMEDOUT;
 					if (!ax25->sk->dead)
@@ -224,6 +285,7 @@
 				}
 			} else {
 				ax25->n2count++;
+				if (!ax25->dama_slave)		/* dl1bke 960114 */
 				ax25_transmit_enquiry(ax25);
 			}
 			break;

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov with Sam's (original) version
of this