Thread (8 messages) 8 messages, 3 authors, 2012-08-13

[B.A.T.M.A.N.] [RFC 2/3] batman-adv: sender retransmission counter

flat view

From: Edo Monticelli <hidden>
Date: 2012-08-09 12:15:25
Subsystem: the rest · Maintainer: Linus Torvalds

Added a sender-side counter of the number of retransmission of the *same window*,
defaults to BATADV_BW_MAX_SENDER_RETRANSMISSIONS. After them, test is aborted.

Signed-off-by: Edo Monticelli <redacted>
---
 bw_meter.c |   18 +++++++++++++++---
 types.h    |    2 ++
 2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/bw_meter.c b/bw_meter.c
index b5a67d3..b582ab0 100644
--- a/bw_meter.c
+++ b/bw_meter.c
@@ -389,20 +389,31 @@ static void batadv_bw_sender_worker(struct work_struct *work)
 
 	/* if timedout, resend whole window */
 	if (batadv_has_timed_out(bw_vars->last_sent_time, BATADV_BW_TIMEOUT)) {
+		/* increase resend counters */
+		if (bw_vars->window_first == bw_vars->last_resent_window) {
+			bw_vars->retry_number += 1;
+			if (bw_vars->retry_number > BATADV_BW_MAX_RETRY) {
+				bw_vars->window_first = BATADV_BW_TOTAL_TO_SEND;
+				bw_vars->status = ABORTING;
+			}
+		} else {
+			bw_vars->retry_number = 0;
+		}
+
 		pr_info("RESENDING WHOLE WINDOW %d\n", bw_vars->window_first);
+		bw_vars->last_resent_window = bw_vars->window_first;
 		bw_vars->next_to_send = bw_vars->window_first;
 		batadv_bw_multiple_send(bat_priv, bw_vars);
 	}
 
+	/* if not finished, re-enqueue worker */
 	if (bw_vars->window_first < bw_vars->total_to_send) {
-		/* if not finished, re-enqueue worker */
 		if (batadv_bw_queue_sender_worker(bw_vars) == 0) {
 			batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
 				   "Meter: batadv_bw_start work already enqueued\n");
 		}
-
+	/* send the answer to batctl */
 	} else {
-		/* send the answer to batctl */
 		icmp_packet_rr = kmalloc(sizeof(*icmp_packet_rr), GFP_ATOMIC);
 		icmp_packet_rr->uid = bw_vars->socket_client->index;
 		result = (struct batadv_bw_result *)icmp_packet_rr;
@@ -492,6 +503,7 @@ void batadv_bw_start(struct batadv_socket_client *socket_client,
 	bw_vars->total_to_send = BATADV_BW_TOTAL_TO_SEND;
 	bw_vars->next_to_send = 0;
 	bw_vars->window_first = 0;
+	bw_vars->last_resent_window = 0;
 	bw_vars->bat_priv = bat_priv;
 	bw_vars->socket_client = socket_client;
 	bw_vars->last_sent_time = jiffies;
diff --git a/types.h b/types.h
index 813914c..e5ba150 100644
--- a/types.h
+++ b/types.h
@@ -253,6 +253,8 @@ struct batadv_bw_vars {
 	uint8_t status; /* see bm_meter_status */
 	unsigned long start_time;
 	unsigned long last_sent_time;
+	uint8_t retry_number;
+	uint16_t last_resent_window;
 };
 
 struct batadv_priv {
-- 
1.7.8.6
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help