Преглед изворни кода

changed application data queue to only remove packet data when it has expired (the endpoint has sent data larger than the window size of the acknknowledgement

cecylia пре 7 година
родитељ
комит
dfb286a86f
2 измењених фајлова са 36 додато и 21 уклоњено
  1. 1 0
      relay_station/flow.h
  2. 35 21
      relay_station/slitheen-proxy.c

+ 1 - 0
relay_station/flow.h

@@ -40,6 +40,7 @@ typedef struct packet_st{
 	uint32_t seq_num;
 	uint16_t len;
 	uint8_t *data;
+	uint32_t expiration;
 	struct packet_st *next;
 } packet;
 

+ 35 - 21
relay_station/slitheen-proxy.c

@@ -207,31 +207,32 @@ void process_packet(struct packet_info *info){
 #endif
 
 
-		//remove acked data from opposite queue
+		/* Remove acknknowledged data from queue after TCP window is exceeded */
 		uint32_t ack_num = htonl(info->tcp_hdr->ack_num);
-		packet *saved_data = (incoming)? observed->upstream_app_data->first_packet :
-			observed->downstream_app_data->first_packet;
-		while((saved_data != NULL) &&(ack_num > saved_data->seq_num)){
-			//remove acked data
-			if(ack_num >= saved_data->seq_num + saved_data->len){
-				//remove entire block
-				if(incoming){
-					observed->upstream_app_data->first_packet = saved_data->next;
-				} else {
-					observed->downstream_app_data->first_packet = saved_data->next;
-				}
+		uint32_t end_seq = seq_num + info->app_data_len - 1;
+		uint32_t window = ack_num + htons(info->tcp_hdr->win_size);
 
-				free(saved_data->data);
-				free(saved_data);
-				saved_data = (incoming)? observed->upstream_app_data->first_packet :
-					observed->downstream_app_data->first_packet;
+#ifdef DEBUG
+		printf("Received sequence number %u\n", seq_num);
+		printf("Acknowledged up to %u with window expiring at %u\n", ack_num, window);
+		printf("Removing all packets up to %u\n", end_seq);
+#endif
+
+		packet *saved_data = (incoming)? observed->downstream_app_data->first_packet :
+			observed->upstream_app_data->first_packet;
+		while((saved_data != NULL) && (saved_data->expiration != 0) && (end_seq > saved_data->expiration)){
+			//remove entire block
+			if(incoming){
+				observed->downstream_app_data->first_packet = saved_data->next;
 			} else {
-				//remove partial block
-				uint32_t amt_acked = ack_num - saved_data->seq_num;
-				memmove(saved_data->data, saved_data->data+amt_acked, saved_data->len - amt_acked);
-				saved_data->len -= amt_acked;
-				saved_data->seq_num += amt_acked;
+				observed->upstream_app_data->first_packet = saved_data->next;
 			}
+
+			free(saved_data->data);
+			free(saved_data);
+			saved_data = (incoming)? observed->downstream_app_data->first_packet :
+				observed->upstream_app_data->first_packet;
+
 #ifdef DEBUG
 			if(saved_data != NULL){
 				printf("Currently saved seq_num is now %u\n", saved_data->seq_num);
@@ -242,6 +243,18 @@ void process_packet(struct packet_info *info){
 
 		}
 
+		/* Update expiration for packets based on TCP window size */
+		saved_data = (incoming)? observed->upstream_app_data->first_packet :
+			observed->downstream_app_data->first_packet;
+		while((saved_data != NULL) && (ack_num > saved_data->seq_num)){
+			//update window
+			if(ack_num >= saved_data->seq_num + saved_data->len){
+				//remove entire block
+				saved_data->expiration = window;
+			}
+			saved_data = saved_data->next;
+		}
+
 		//fill with retransmit data, process new data
 		uint32_t data_to_fill;
 		uint32_t data_to_process;
@@ -364,6 +377,7 @@ void process_packet(struct packet_info *info){
 				memcpy(new_block->data, info->app_data, info->app_data_len);
 				new_block->len = info->app_data_len;
 				new_block->next = NULL;
+				new_block->expiration = 0;
 
 				packet *saved_data = (incoming)? observed->downstream_app_data->first_packet :
 					observed->upstream_app_data->first_packet;