From 3969d78ac46133dba88949f4996c564be97e1a71 Mon Sep 17 00:00:00 2001 From: ingenzi <vany.ingenzi@student.uclouvain.be> Date: Sun, 10 Apr 2022 10:12:37 +0200 Subject: [PATCH] Intercepting FEC packets --- src/packet_interface.c | 2 +- src/receiver_utils.c | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/packet_interface.c b/src/packet_interface.c index 7193b58..783380c 100644 --- a/src/packet_interface.c +++ b/src/packet_interface.c @@ -74,7 +74,7 @@ pkt_status_code pkt_decode_data_fec(const char *data, const size_t len, pkt_t *p if ( length > 0 ) expected_len += CRC_SIZE; - if ( len != expected_len ) + if ( len != expected_len && type != PTYPE_FEC) return E_UNCONSISTENT; // We set the TR to 0 in order to calculcate the CRC on the header diff --git a/src/receiver_utils.c b/src/receiver_utils.c index 423b4a2..f8cfc56 100644 --- a/src/receiver_utils.c +++ b/src/receiver_utils.c @@ -210,6 +210,13 @@ int prepare_ack_to_send(receiver_state_t * state) int handle_fec_pkt(receiver_state_t * state, const pkt_t * pkt) { ASSERT(state != NULL && pkt != NULL); + if (state->last_received_in_order > pkt_get_seqnum(pkt)) + { + DEBUG("Received FEC with seqnum %d but wasn't used since last received in order is %d", pkt_get_seqnum(pkt), state->last_received_in_order); + return 0; + } + // Add FEC to state buffer of fec + // See if there's FEC that can be used and update buffer return 0; } @@ -224,6 +231,9 @@ int handle_fec_pkt(receiver_state_t * state, const pkt_t * pkt) */ int handle_data_pkt(receiver_state_t * state, const pkt_t * pkt) { + DEBUG("Received data packet seqnum %d with timestamp %d | current_window_size : %d, current_window_start : %d", + pkt_get_seqnum(pkt), pkt_get_timestamp(pkt), state->curr_recv_window, state->recv_window_start); + if (update_buffer_upon_new_data(state, pkt) != 0) return -1; if (prepare_ack_to_send(state) != 0) return -1; @@ -297,9 +307,6 @@ int handle_truncated_pkt(receiver_state_t * state, const pkt_t * pkt) */ int handle_valid_pkt(receiver_state_t * state, const pkt_t * pkt) { - // Feck - Not handled for now - if (pkt_get_type(pkt) != PTYPE_DATA) return 0; - // Is it in the receive_window ? uint8_t seqnum = pkt_get_seqnum(pkt); int in_window = (seqnum >= state->recv_window_start); @@ -318,15 +325,16 @@ int handle_valid_pkt(receiver_state_t * state, const pkt_t * pkt) uint8_t tr = pkt_get_tr(pkt); if (tr == 1) - { /* If truncated */ + { /* If truncated */ return handle_truncated_pkt(state, pkt); } else if (pkt_get_type(pkt) == PTYPE_DATA) - { /* Not */ + { /* Type DATA */ return handle_data_pkt(state, pkt); } else if (pkt_get_type(pkt) == PTYPE_FEC) - { + { /* Type FEC */ return handle_fec_pkt(state, pkt); } + return 0; } @@ -355,14 +363,11 @@ int handle_incoming(struct pollfd * pfd, receiver_state_t * state) pkt_status_code pkt_status = pkt_decode(buffer, read_bytes, pkt); if (pkt_status == 0) { - DEBUG("Received packet seqnum %d with timestamp %d | current_window_size : %d, current_window_start : %d", - pkt_get_seqnum(pkt), pkt_get_timestamp(pkt), state->curr_recv_window, state->recv_window_start); if (handle_valid_pkt(state, (const pkt_t *) pkt) != 0) return -1; } else { - /* If the packet has been damaged we can discuss if it's better to send a ACK - or not but for now we just ignore it */ DEBUG("Received a damaged packet with %d status.", pkt_status); + // See if there's a FEC that can be used and update buffer pkt_del(pkt); return prepare_ack_to_send(state); } -- GitLab