Skip to content
Extraits de code Groupes Projets
Valider 0cafa594 rédigé par Samuel de Meester de Ravestein's avatar Samuel de Meester de Ravestein
Parcourir les fichiers

version without fec almost done (sender)

parent a88165d8
Branches master
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -30,8 +30,8 @@ typedef struct state { ...@@ -30,8 +30,8 @@ typedef struct state {
pkt_t *buffer[WINDOW_SIZE]; pkt_t *buffer[WINDOW_SIZE];
uint8_t head; // place last element insert +1 in the buffer (free place) uint8_t head; // place last element insert +1 in the buffer (free place)
uint8_t tail; // place oldest element insert in the buffer uint8_t tail; // place oldest element insert in the buffer
uint8_t last_ack_seqnum;
uint8_t last_sent_seqnum; uint8_t last_sent_seqnum;
uint8_t map_seqnum_to_buffer_place[SEQNUM_RANGE];
} sender_state_t; } sender_state_t;
sender_state_t *state_new(); sender_state_t *state_new();
...@@ -44,7 +44,5 @@ int loop_over_timers(sender_state_t *state, int socket_fd); ...@@ -44,7 +44,5 @@ int loop_over_timers(sender_state_t *state, int socket_fd);
int read_and_send(); int read_and_send();
int handle_returning_pkt();
#endif #endif
\ No newline at end of file
...@@ -49,7 +49,7 @@ int main(int argc, char **argv) { ...@@ -49,7 +49,7 @@ int main(int argc, char **argv) {
DEBUG_DUMP("Some bytes", 11); // You can use it with any pointer type DEBUG_DUMP("Some bytes", 11); // You can use it with any pointer type
// This is not an error per-se. // This is not an error per-se.
ERROR("Sender has following arguments: \n\tfilename is %s,\n\t stats_filename is %s,\n\t fec_enabled is %d,\n\t receiver_ip is %s,\n\t receiver_port is %u\n", ERROR("Sender has following arguments: \n\t\tfilename is %s,\n\t\tstats_filename is %s,\n\t\tfec_enabled is %d,\n\t\treceiver_ip is %s,\n\t\treceiver_port is %u",
filename, stats_filename, fec_enabled, receiver_ip, receiver_port); filename, stats_filename, fec_enabled, receiver_ip, receiver_port);
DEBUG("You can only see me if %s", "you built me using `make debug`"); DEBUG("You can only see me if %s", "you built me using `make debug`");
...@@ -64,7 +64,7 @@ int main(int argc, char **argv) { ...@@ -64,7 +64,7 @@ int main(int argc, char **argv) {
struct sockaddr_in6 receiver_addr; struct sockaddr_in6 receiver_addr;
if (real_address(receiver_ip, &receiver_addr) != NULL) if (real_address(receiver_ip, &receiver_addr) != NULL)
{ {
ERROR("An error occured when computing the real address from ip\n"); ERROR("An error occured when computing the real address from ip");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -73,7 +73,7 @@ int main(int argc, char **argv) { ...@@ -73,7 +73,7 @@ int main(int argc, char **argv) {
if (socket_fd == -1) if (socket_fd == -1)
{ {
close(socket_fd); close(socket_fd);
ERROR("An error occured when sender trying to create its connecting socket\n"); ERROR("An error occured when sender trying to create its connecting socket");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -82,7 +82,7 @@ int main(int argc, char **argv) { ...@@ -82,7 +82,7 @@ int main(int argc, char **argv) {
if (sending_fd == -1) if (sending_fd == -1)
{ {
close(socket_fd); close(socket_fd);
ERROR("An error occured while trying to open the file\n"); ERROR("An error occured while trying to open the file");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -93,7 +93,7 @@ int main(int argc, char **argv) { ...@@ -93,7 +93,7 @@ int main(int argc, char **argv) {
{ {
close(socket_fd); close(socket_fd);
close(sending_fd); close(sending_fd);
ERROR("Calloc failed for pfd\n"); ERROR("Calloc failed for pfd");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -106,7 +106,7 @@ int main(int argc, char **argv) { ...@@ -106,7 +106,7 @@ int main(int argc, char **argv) {
{ {
close(socket_fd); close(socket_fd);
close(sending_fd); close(sending_fd);
ERROR("Calloc failed for state\n"); ERROR("Calloc failed for state");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -120,7 +120,7 @@ int main(int argc, char **argv) { ...@@ -120,7 +120,7 @@ int main(int argc, char **argv) {
{ {
close(socket_fd); close(socket_fd);
close(sending_fd); close(sending_fd);
ERROR("poll function failed\n"); ERROR("poll function failed");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
...@@ -132,7 +132,7 @@ int main(int argc, char **argv) { ...@@ -132,7 +132,7 @@ int main(int argc, char **argv) {
{ {
close(socket_fd); close(socket_fd);
close(sending_fd); close(sending_fd);
ERROR("handle_returning_pkt or loop_over_timers function failed\n"); ERROR("handle_returning_pkt or loop_over_timers function failed");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
...@@ -143,7 +143,7 @@ int main(int argc, char **argv) { ...@@ -143,7 +143,7 @@ int main(int argc, char **argv) {
{ {
close(socket_fd); close(socket_fd);
close(sending_fd); close(sending_fd);
ERROR("read_and_send function failed\n"); ERROR("read_and_send function failed");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
......
...@@ -35,8 +35,29 @@ int handle_returning_ack_nack(sender_state_t *state, int socket_fd) ...@@ -35,8 +35,29 @@ int handle_returning_ack_nack(sender_state_t *state, int socket_fd)
pkt_status_code pkt_status = pkt_decode(buffer, read_bytes, pkt); pkt_status_code pkt_status = pkt_decode(buffer, read_bytes, pkt);
if (pkt_status != PKT_OK) if (pkt_status != PKT_OK)
{ {
DEBUG("Decode function on a received pkt failed with status: %d", pkt_status); DEBUG("Decode function on a received pkt failed with status: %d so we discard the pkt", pkt_status);
return -1; return 0;
}
// TODO: what about the nack ??
if (pkt_get_type(pkt) == PTYPE_NACK)
{
DEBUG("Discard a NACK");
return 0;
}
// From here we consider a valid ack
DEBUG("The ACK of: %d has been received", pkt_get_seqnum(pkt));
uint8_t place = state->map_seqnum_to_buffer_place[pkt_get_seqnum(pkt)];
pkt_del(state->buffer[place]);
state->buffer[place] = NULL;
if (place == state->tail)
{
for (uint8_t i = place; (state->buffer[i] == NULL) && place != state->head; i++)
{
state->tail++;
state->s_window_size++;
}
} }
pkt_del(pkt); pkt_del(pkt);
return 0; return 0;
...@@ -52,10 +73,9 @@ int loop_over_timers(sender_state_t *state, int socket_fd) ...@@ -52,10 +73,9 @@ int loop_over_timers(sender_state_t *state, int socket_fd)
// The slot contains a sended packet // The slot contains a sended packet
if (state->buffer[i] != NULL) if (state->buffer[i] != NULL)
{ {
// When timer is over, we send back the packet // When the timer is over, we send the packet back
if ((curr_time - state->timers[i]) >= TIMER_LIMIT) if ((curr_time - state->timers[i]) >= TIMER_LIMIT)
{ {
DEBUG("A packet is sent back");
pkt_t *pkt = state->buffer[i]; pkt_t *pkt = state->buffer[i];
char packet_to_be_sent[PKT_MAX_LEN]; char packet_to_be_sent[PKT_MAX_LEN];
size_t len = PKT_MAX_LEN; size_t len = PKT_MAX_LEN;
...@@ -65,6 +85,7 @@ int loop_over_timers(sender_state_t *state, int socket_fd) ...@@ -65,6 +85,7 @@ int loop_over_timers(sender_state_t *state, int socket_fd)
if (sent == -1) return -1; if (sent == -1) return -1;
state->timers[i] = curr_time; state->timers[i] = curr_time;
DEBUG("The pkt with seqnum: %d has been sent back", pkt_get_seqnum(pkt));
} }
} }
} }
...@@ -73,7 +94,7 @@ int loop_over_timers(sender_state_t *state, int socket_fd) ...@@ -73,7 +94,7 @@ int loop_over_timers(sender_state_t *state, int socket_fd)
int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) int read_and_send(sender_state_t *state, int sending_fd, int socket_fd)
{ {
// Checking if both the sender and receiver buffer has some room left
if ((state->r_window_size == 0) || (state->s_window_size == 0)) return 0; if ((state->r_window_size == 0) || (state->s_window_size == 0)) return 0;
state->s_window_size--; state->s_window_size--;
...@@ -110,8 +131,11 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) ...@@ -110,8 +131,11 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd)
struct timeval time; struct timeval time;
gettimeofday(&time, NULL); gettimeofday(&time, NULL);
state->timers[state->head] = time.tv_usec; state->timers[state->head] = time.tv_usec;
state->map_seqnum_to_buffer_place[pkt_get_seqnum(pkt)] = state->head;
state->head = (state->head + 1) % WINDOW_SIZE; state->head = (state->head + 1) % WINDOW_SIZE;
DEBUG("The pkt with seqnum: %d has been sent", pkt_get_seqnum(pkt));
// Checking if we're at the end of the file // Checking if we're at the end of the file
off_t old_position = lseek(sending_fd, 0, SEEK_CUR); off_t old_position = lseek(sending_fd, 0, SEEK_CUR);
off_t end_position = lseek(sending_fd, 0, SEEK_END); off_t end_position = lseek(sending_fd, 0, SEEK_END);
...@@ -119,8 +143,3 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd) ...@@ -119,8 +143,3 @@ int read_and_send(sender_state_t *state, int sending_fd, int socket_fd)
lseek(sending_fd, 0, SEEK_SET); lseek(sending_fd, 0, SEEK_SET);
return old_position == end_position; return old_position == end_position;
} }
int handle_returning_pkt()
{
return 0;
}
\ No newline at end of file
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter