First try at stop and wait

This commit is contained in:
keplyx 2020-05-04 12:06:48 +02:00
parent f2c1786168
commit 2afe7b5bf8

View file

@ -2,6 +2,8 @@
#include <api/mictcp_core.h>
struct mic_tcp_sock g_sock;
int next_msg_num;
short timeout_msec = 5000;
/**
* Permet de créer un socket entre lapplication et MIC-TCP.
@ -13,10 +15,11 @@ int mic_tcp_socket(start_mode sm) {
printf(__FUNCTION__);
printf("\n");
result = initialize_components(sm); /* Appel obligatoire */
set_loss_rate(0);
set_loss_rate(50);
g_sock.fd = result;
g_sock.state = IDLE;
next_msg_num = 1;
return result;
}
@ -30,7 +33,7 @@ int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) {
printf(__FUNCTION__);
printf("\n");
int result = 0; // TODO change in v2
int result = 0;
g_sock.addr = addr;
@ -46,7 +49,7 @@ int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) {
printf(__FUNCTION__);
printf("\n");
int result = 0; // TODO change in v2
int result = 0;
g_sock.state = ESTABLISHED;
@ -62,7 +65,7 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) {
printf(__FUNCTION__);
printf("\n");
int result = 0; // TODO change in v2
int result = 0;
g_sock.addr = addr;
g_sock.state = ESTABLISHED;
@ -78,20 +81,37 @@ int mic_tcp_send(int socket, char *mesg, int mesg_size) {
printf("[MIC-TCP] Appel de la fonction: ");
printf(__FUNCTION__);
printf("\n");
int result = -1;
struct mic_tcp_pdu pdu;
pdu.payload.data = mesg;
pdu.payload.size = mesg_size;
while (result == -1) {
struct mic_tcp_pdu pdu;
pdu.payload.data = mesg;
pdu.payload.size = mesg_size;
pdu.header.source_port = 0;
pdu.header.dest_port = g_sock.addr.port;
pdu.header.seq_num = 0;
pdu.header.ack_num = 0;
pdu.header.syn = 0;
pdu.header.ack = 0;
pdu.header.fin = 0;
pdu.header.source_port = 0;
pdu.header.dest_port = g_sock.addr.port;
pdu.header.seq_num = next_msg_num;
pdu.header.ack_num = 0;
pdu.header.syn = 0;
pdu.header.ack = 0;
pdu.header.fin = 0;
return IP_send(pdu, g_sock.addr);
if ((result = IP_send(pdu, g_sock.addr)) != -1) {
struct mic_tcp_pdu rcv_pdu;
struct mic_tcp_sock_addr rcv_sock_addr;
result = IP_recv(&rcv_pdu, &rcv_sock_addr, timeout_msec);
if (result == -1)
printf("[LOG] Timeout\n");
if (result != -1 && rcv_pdu.header.ack_num != next_msg_num + 1) {
printf("[LOG] ack_num: %d\n", rcv_pdu.header.ack_num);
result = -1;
}
}
}
next_msg_num = next_msg_num + 1;
return result;
}
/**
@ -144,5 +164,22 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) {
printf(__FUNCTION__);
printf("\n");
app_buffer_put(pdu.payload);
struct mic_tcp_pdu ack_pdu;
ack_pdu.header.source_port = 0;
ack_pdu.header.dest_port = addr.port;
ack_pdu.header.ack_num = 0;
ack_pdu.header.syn = 0;
ack_pdu.header.ack = 0;
ack_pdu.header.fin = 0;
printf("[LOG] next_msg_num: %d\n", next_msg_num);
printf("[LOG] seq_num: %d\n", pdu.header.seq_num);
if (pdu.header.seq_num == next_msg_num) {
next_msg_num = next_msg_num + 1;
app_buffer_put(pdu.payload);
}
ack_pdu.header.ack_num = next_msg_num;
printf("[LOG] Sending ack: %d\n", next_msg_num);
IP_send(ack_pdu, addr);
}