en train de mettre en place la recuperation assynchrone des ack
This commit is contained in:
parent
196ee68c96
commit
ed8e10c640
9 changed files with 319 additions and 77 deletions
Binary file not shown.
BIN
build/client
BIN
build/client
Binary file not shown.
BIN
build/gateway
BIN
build/gateway
Binary file not shown.
BIN
build/mictcp.o
BIN
build/mictcp.o
Binary file not shown.
BIN
build/server
BIN
build/server
Binary file not shown.
104
log_marche_bien
Normal file
104
log_marche_bien
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
source:
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_socket
|
||||||
|
----------------------------------
|
||||||
|
état du socket
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: IDLE
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 0
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
[TSOCK] Creation du socket MICTCP: OK
|
||||||
|
------------------------------------------
|
||||||
|
creation du pdu SYN:
|
||||||
|
ACK Flag: 0
|
||||||
|
FIN Flag: 0
|
||||||
|
SYN Flag: 1
|
||||||
|
Source Port: 0
|
||||||
|
Destination Port: 1234
|
||||||
|
Sequence Number: 0
|
||||||
|
Acknowledgment Number: 4294967295
|
||||||
|
Payload Size: 0
|
||||||
|
Payload Data is NULL
|
||||||
|
----------------------------------
|
||||||
|
----------------------------------
|
||||||
|
envoi du pdu SYN vers l'adresse :
|
||||||
|
IP Address: 127.0.0.1
|
||||||
|
Port: 1234
|
||||||
|
----------------------------------
|
||||||
|
puit:
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_socket
|
||||||
|
----------------------------------
|
||||||
|
état du socket
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: IDLE
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 0
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
[TSOCK] Creation du socket MICTCP: OK
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_bind
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: WAITING
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 1234
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
[TSOCK] Bind du socket MICTCP: OK
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_accept
|
||||||
|
[MICTCP-CORE] Demarrage du thread de reception reseau...
|
||||||
|
----------------------------------
|
||||||
|
état du socket en attendant l'établissement de connection
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: ACCEPTING
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 1234
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
je vais recv
|
||||||
|
j'ai recv
|
||||||
|
------------------------------------------
|
||||||
|
pdu reçu
|
||||||
|
ACK Flag: 0
|
||||||
|
FIN Flag: 0
|
||||||
|
SYN Flag: 1
|
||||||
|
Source Port: 0
|
||||||
|
Destination Port: 1234
|
||||||
|
Sequence Number: 0
|
||||||
|
Acknowledgment Number: 4294967295
|
||||||
|
Payload Size: 0
|
||||||
|
Payload Data is NULL
|
||||||
|
----------------------------------
|
||||||
|
[MIC-TCP] Appel de la fonction: process_syn_pdu
|
||||||
|
------------------------------------------
|
||||||
|
Construction du Pdu SYN ACK :
|
||||||
|
|
||||||
|
ACK Flag: 1
|
||||||
|
FIN Flag: 0
|
||||||
|
SYN Flag: 1
|
||||||
|
Source Port: 1234
|
||||||
|
Destination Port: 0
|
||||||
|
Sequence Number: 0
|
||||||
|
Acknowledgment Number: 0
|
||||||
|
Payload Size: 0
|
||||||
|
Payload Data is NULL
|
||||||
|
----------------------------------
|
||||||
|
----------------------------------
|
||||||
|
Envoi du PDU SYN ACK à l'adresse:
|
||||||
|
IP Address: localhost
|
||||||
|
Port: 0
|
||||||
|
----------------------------------
|
104
log_marche_pas
Normal file
104
log_marche_pas
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
source:
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_socket
|
||||||
|
----------------------------------
|
||||||
|
état du socket
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: IDLE
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 0
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
[TSOCK] Creation du socket MICTCP: OK
|
||||||
|
------------------------------------------
|
||||||
|
creation du pdu SYN:
|
||||||
|
ACK Flag: 0
|
||||||
|
FIN Flag: 0
|
||||||
|
SYN Flag: 1
|
||||||
|
Source Port: 0
|
||||||
|
Destination Port: 1234
|
||||||
|
Sequence Number: 0
|
||||||
|
Acknowledgment Number: 4294967295
|
||||||
|
Payload Size: 0
|
||||||
|
Payload Data is NULL
|
||||||
|
----------------------------------
|
||||||
|
----------------------------------
|
||||||
|
envoi du pdu SYN vers l'adresse :
|
||||||
|
IP Address: 127.0.0.1
|
||||||
|
Port: 1234
|
||||||
|
----------------------------------
|
||||||
|
puit
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_socket
|
||||||
|
----------------------------------
|
||||||
|
état du socket
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: IDLE
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 0
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
[TSOCK] Creation du socket MICTCP: OK
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_bind
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: WAITING
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 1234
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
[MICTCP-CORE] Demarrage du thread de reception reseau...
|
||||||
|
----------------------------------
|
||||||
|
[TSOCK] Bind du socket MICTCP: OK
|
||||||
|
[MIC-TCP] Appel de la fonction: mic_tcp_accept
|
||||||
|
----------------------------------
|
||||||
|
état du socket en attendant l'établissement de connection
|
||||||
|
Socket File Descriptor: 0
|
||||||
|
Socket Protocol State: ACCEPTING
|
||||||
|
Socket Address IP:
|
||||||
|
Socket Address Port: 1234
|
||||||
|
Remote Address IP:
|
||||||
|
Remote Address Port: 0
|
||||||
|
Local Sequence Number: 0
|
||||||
|
Remote Sequence Number: 0
|
||||||
|
----------------------------------
|
||||||
|
je vais recv
|
||||||
|
j'ai recv
|
||||||
|
------------------------------------------
|
||||||
|
pdu reçu
|
||||||
|
ACK Flag: 0
|
||||||
|
FIN Flag: 0
|
||||||
|
SYN Flag: 1
|
||||||
|
Source Port: 0
|
||||||
|
Destination Port: 1234
|
||||||
|
Sequence Number: 0
|
||||||
|
Acknowledgment Number: 4294967295
|
||||||
|
Payload Size: 0
|
||||||
|
Payload Data is NULL
|
||||||
|
----------------------------------
|
||||||
|
[MIC-TCP] Appel de la fonction: process_syn_pdu
|
||||||
|
------------------------------------------
|
||||||
|
Construction du Pdu SYN ACK :
|
||||||
|
|
||||||
|
ACK Flag: 1
|
||||||
|
FIN Flag: 0
|
||||||
|
SYN Flag: 1
|
||||||
|
Source Port: 1234
|
||||||
|
Destination Port: 0
|
||||||
|
Sequence Number: 0
|
||||||
|
Acknowledgment Number: 0
|
||||||
|
Payload Size: 0
|
||||||
|
Payload Data is NULL
|
||||||
|
----------------------------------
|
||||||
|
----------------------------------
|
||||||
|
Envoi du PDU SYN ACK à l'adresse:
|
||||||
|
IP Address: localhost
|
||||||
|
Port: 0
|
||||||
|
----------------------------------
|
|
@ -1,4 +1,5 @@
|
||||||
#include <api/mictcp_core.h>
|
#include <api/mictcp_core.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -13,7 +14,7 @@ int initialized = -1;
|
||||||
int sys_socket;
|
int sys_socket;
|
||||||
pthread_t listen_th;
|
pthread_t listen_th;
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
unsigned short loss_rate = 0;
|
unsigned short loss_rate = 20;
|
||||||
struct sockaddr_in remote_addr;
|
struct sockaddr_in remote_addr;
|
||||||
|
|
||||||
/* This is for the buffer */
|
/* This is for the buffer */
|
||||||
|
@ -134,12 +135,15 @@ int IP_recv(mic_tcp_pdu* pk, mic_tcp_sock_addr* addr, unsigned long timeout)
|
||||||
/* Convert the remainder to microseconds */
|
/* Convert the remainder to microseconds */
|
||||||
tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000;
|
tv.tv_usec = (timeout - tv.tv_sec * 1000) * 1000;
|
||||||
|
|
||||||
|
// printf("values of tv sec and usec : %ld, %ld\n",tv.tv_sec,tv.tv_usec);
|
||||||
/* Create a reception buffer */
|
/* Create a reception buffer */
|
||||||
int buffer_size = API_HD_Size + pk->payload.size;
|
int buffer_size = API_HD_Size + pk->payload.size;
|
||||||
char *buffer = malloc(buffer_size);
|
char *buffer = malloc(buffer_size);
|
||||||
|
int setsockopt_return_value;
|
||||||
if ((setsockopt(sys_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) >= 0) {
|
if ((setsockopt_return_value=setsockopt(sys_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv))) >= 0) {
|
||||||
|
// printf("debug : %d\n, return value of setsockopt : %d\n",__LINE__,setsockopt_return_value);
|
||||||
result = recvfrom(sys_socket, buffer, buffer_size, 0, (struct sockaddr *)&tmp_addr, &tmp_addr_size);
|
result = recvfrom(sys_socket, buffer, buffer_size, 0, (struct sockaddr *)&tmp_addr, &tmp_addr_size);
|
||||||
|
// printf("debug : %d\n",__LINE__);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != -1) {
|
if (result != -1) {
|
||||||
|
@ -162,6 +166,7 @@ int IP_recv(mic_tcp_pdu* pk, mic_tcp_sock_addr* addr, unsigned long timeout)
|
||||||
/* Free the reception buffer */
|
/* Free the reception buffer */
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|
||||||
|
printf("debug : %d\n",__LINE__);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
175
src/mictcp.c
175
src/mictcp.c
|
@ -6,6 +6,7 @@
|
||||||
#define WINDOW_SIZE 10
|
#define WINDOW_SIZE 10
|
||||||
#define LOSS_ACCEPTABILITY 0 // sur 10
|
#define LOSS_ACCEPTABILITY 0 // sur 10
|
||||||
#define ATTENTE_ACK 1
|
#define ATTENTE_ACK 1
|
||||||
|
#define PAYLOAD_SIZE 64
|
||||||
|
|
||||||
//================================== STRUCTURES =============================
|
//================================== STRUCTURES =============================
|
||||||
|
|
||||||
|
@ -42,7 +43,7 @@ pthread_t attente_ack_tid;
|
||||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
pthread_cond_t end_accept_cond = PTHREAD_COND_INITIALIZER;
|
pthread_cond_t end_accept_cond = PTHREAD_COND_INITIALIZER;
|
||||||
char debug=1;
|
char debug=1;
|
||||||
|
char version=2;
|
||||||
//================================== SIGNATURES DES FONCTIONS PRIVEES =============================
|
//================================== SIGNATURES DES FONCTIONS PRIVEES =============================
|
||||||
|
|
||||||
int valid_socket(int socket);
|
int valid_socket(int socket);
|
||||||
|
@ -122,7 +123,13 @@ int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr)
|
||||||
{
|
{
|
||||||
tab_sockets[socket].socket.state = ACCEPTING;
|
tab_sockets[socket].socket.state = ACCEPTING;
|
||||||
display_enhanced_socket(tab_sockets[socket], "état du socket en attendant l'établissement de connection");
|
display_enhanced_socket(tab_sockets[socket], "état du socket en attendant l'établissement de connection");
|
||||||
while (tab_sockets[socket].socket.state != ESTABLISHED){ //attente jusqu'a l'etablissement de la connexion
|
if (version<4){
|
||||||
|
tab_sockets[socket].socket.state = ESTABLISHED;
|
||||||
|
tab_sockets[socket].NoSeqDist=0;
|
||||||
|
tab_sockets[socket].NoSeqLoc=0;
|
||||||
|
|
||||||
|
}
|
||||||
|
while (tab_sockets[socket].socket.state != ESTABLISHED){ //attente jusqu'a l'etablissement de la connexion
|
||||||
if(pthread_mutex_lock(&mutex)!= 0){error("erreur lock mutex",__LINE__);} //lock mutex
|
if(pthread_mutex_lock(&mutex)!= 0){error("erreur lock mutex",__LINE__);} //lock mutex
|
||||||
pthread_cond_wait(&end_accept_cond,&mutex);
|
pthread_cond_wait(&end_accept_cond,&mutex);
|
||||||
if(pthread_mutex_unlock(&mutex)!= 0){error("erreur unlock mutex",__LINE__);} //unlock mutex
|
if(pthread_mutex_unlock(&mutex)!= 0){error("erreur unlock mutex",__LINE__);} //unlock mutex
|
||||||
|
@ -145,6 +152,14 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr)
|
||||||
{
|
{
|
||||||
tab_sockets[socket].dist_addr = addr;
|
tab_sockets[socket].dist_addr = addr;
|
||||||
tab_sockets[socket].NoSeqLoc = 0;
|
tab_sockets[socket].NoSeqLoc = 0;
|
||||||
|
|
||||||
|
if (version<4){
|
||||||
|
tab_sockets[socket].socket.state = ESTABLISHED;
|
||||||
|
display_enhanced_socket(tab_sockets[socket], "État du socket aprés l'établissement de la connection :");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
tab_sockets[socket].socket.state = SYN_SENT;
|
tab_sockets[socket].socket.state = SYN_SENT;
|
||||||
// create pdu syn
|
// create pdu syn
|
||||||
mic_tcp_pdu pdu;
|
mic_tcp_pdu pdu;
|
||||||
|
@ -231,65 +246,75 @@ int mic_tcp_send(int mic_sock, char *mesg, int mesg_size)
|
||||||
|
|
||||||
if (tab_sockets[mic_sock].socket.state != ESTABLISHED)
|
if (tab_sockets[mic_sock].socket.state != ESTABLISHED)
|
||||||
{
|
{
|
||||||
printf("non non non, t’es pas connecté \n");
|
printf("l'utilisateur n’es pas connecté \n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// create pdu
|
// create pdu
|
||||||
mic_tcp_pdu pdu;
|
mic_tcp_pdu pdu;
|
||||||
pdu.header.source_port = tab_sockets[mic_sock].socket.addr.port;
|
set_mic_tcp_pdu(
|
||||||
pdu.header.dest_port = tab_sockets[mic_sock].dist_addr.port;
|
&pdu,
|
||||||
pdu.header.seq_num = tab_sockets[mic_sock].NoSeqLoc;
|
tab_sockets[mic_sock].socket.addr.port,
|
||||||
pdu.header.ack_num = -1;
|
tab_sockets[mic_sock].dist_addr.port,
|
||||||
pdu.header.syn = 0;
|
tab_sockets[mic_sock].NoSeqLoc,
|
||||||
pdu.header.ack = 0;
|
-1,
|
||||||
pdu.header.fin = 0;
|
0,0,0,
|
||||||
|
mesg,mesg_size
|
||||||
|
);
|
||||||
|
display_mic_tcp_pdu(pdu, "creation du pdu data:");
|
||||||
|
|
||||||
pdu.payload.data = mesg;
|
display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "envoi du pdu data vers l'adresse :");
|
||||||
pdu.payload.size = mesg_size;
|
|
||||||
|
|
||||||
int sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr);
|
int sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr);
|
||||||
|
printf("Packet envoye\n");
|
||||||
|
if (version<2) return sent_size;
|
||||||
|
|
||||||
tab_sockets[mic_sock].socket.state = WAITING;
|
tab_sockets[mic_sock].socket.state = WAITING;
|
||||||
mic_tcp_pdu pdu_r;
|
mic_tcp_pdu pdu_r;
|
||||||
mic_tcp_sock_addr addr_r;
|
mic_tcp_sock_addr addr_r;
|
||||||
|
pdu_r.payload.size = PAYLOAD_SIZE;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (IP_recv(&pdu_r,&addr_r, timeout) == -1){
|
sleep(timeout);
|
||||||
|
printf("%d\n",__LINE__);
|
||||||
|
if (IP_recv(&pdu_r,&addr_r, 0) == -1){
|
||||||
|
printf("%d\n",__LINE__);
|
||||||
sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr);
|
sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr);
|
||||||
printf("j'envoie un doublon\n");
|
printf("%d\n",__LINE__);
|
||||||
|
printf("Pas de pdu recu, envoi d'un doublon\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
printf("PDU ACK de Data recu \n");
|
printf("%d\n",__LINE__);
|
||||||
display_mic_tcp_pdu(pdu_r,"pdu reçu :");
|
display_mic_tcp_pdu(pdu_r,"pdu reçu :");
|
||||||
|
|
||||||
if (pdu_r.header.ack == 1 && (tab_sockets[mic_sock].NoSeqLoc == pdu_r.header.ack_num)){
|
if (pdu_r.header.ack == 1 && (tab_sockets[mic_sock].NoSeqLoc == pdu_r.header.ack_num)){
|
||||||
printf("le bon Ack a été reçu\n");
|
printf("le bon Ack a été reçu\n");
|
||||||
if(!established){ //stoppe le thread de syn ack quand on est sûrs que la connexion est établie
|
|
||||||
established = 1;
|
|
||||||
}
|
|
||||||
tab_sockets[mic_sock].socket.state = ESTABLISHED;
|
tab_sockets[mic_sock].socket.state = ESTABLISHED;
|
||||||
break;
|
|
||||||
|
tab_sockets[mic_sock].NoSeqLoc = ((tab_sockets[mic_sock].NoSeqLoc + 1) % 2); //maj du no de seq uniquement lorsque ACK reçu (= synchronisation du noseq entre puits et src)
|
||||||
|
display_enhanced_socket(tab_sockets[mic_sock], "État du socket aprés la reception du ack");
|
||||||
|
return sent_size;
|
||||||
|
|
||||||
}else if(pdu_r.header.ack == 1 && pdu_r.header.syn == 1){
|
}else if(pdu_r.header.ack == 1 && pdu_r.header.syn == 1){
|
||||||
printf("PDU SYN ACK recu a nouveau (Doublon) \n");
|
printf("PDU SYN ACK recu a nouveau (Doublon) \n");
|
||||||
mic_tcp_pdu pdu_d;
|
mic_tcp_pdu pdu_d;
|
||||||
|
|
||||||
pdu_d.header.source_port = tab_sockets[mic_sock].socket.addr.port;
|
set_mic_tcp_pdu(
|
||||||
pdu_d.header.dest_port = tab_sockets[mic_sock].dist_addr.port;
|
&pdu_d,
|
||||||
pdu_d.header.seq_num = -1;
|
tab_sockets[mic_sock].socket.addr.port,
|
||||||
pdu_d.header.ack_num = tab_sockets[mic_sock].NoSeqDist;
|
tab_sockets[mic_sock].dist_addr.port,
|
||||||
pdu_d.header.syn = 0;
|
-1,
|
||||||
pdu_d.header.ack = 1;
|
pdu_r.header.seq_num,
|
||||||
pdu_d.header.fin = 0;
|
0,1,0,
|
||||||
|
NULL,0
|
||||||
|
);
|
||||||
|
|
||||||
pdu_d.payload.size = 0;
|
display_mic_tcp_pdu(pdu_d, "creation du pdu ACK:");
|
||||||
pdu_d.payload.data = NULL;
|
|
||||||
|
|
||||||
|
display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "envoi du pdu ACK vers l'adresse :");
|
||||||
IP_send(pdu_d, tab_sockets[mic_sock].dist_addr);
|
IP_send(pdu_d, tab_sockets[mic_sock].dist_addr);
|
||||||
printf("PDU ACK de connexion renvoyé\n");
|
|
||||||
|
|
||||||
display_mic_tcp_pdu(pdu_d, "Pdu ACK : \n");
|
}else {
|
||||||
|
printf("mauvais pdu reçu\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -299,8 +324,7 @@ int mic_tcp_send(int mic_sock, char *mesg, int mesg_size)
|
||||||
// tab_sockets[mic_sock].socket.state = ESTABLISHED;
|
// tab_sockets[mic_sock].socket.state = ESTABLISHED;
|
||||||
|
|
||||||
}
|
}
|
||||||
tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; //maj du no de seq uniquement lorsque ACK reçu (= synchronisation du noseq entre puits et src)
|
|
||||||
return sent_size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -366,9 +390,9 @@ void process_syn_pdu(mic_tcp_pdu pdu,mic_tcp_sock_addr addr, int mic_sock){
|
||||||
args->socket=mic_sock;
|
args->socket=mic_sock;
|
||||||
args->pdu_r=pdu_r;
|
args->pdu_r=pdu_r;
|
||||||
|
|
||||||
printf("avant creation thread\n");
|
printf("avant creation thread TESA\n");
|
||||||
pthread_create(&attente_ack_tid, NULL,attente_ack,(void *)args);
|
pthread_create(&attente_ack_tid, NULL,attente_ack,(void *)args);
|
||||||
printf("aprés creation thread\n");
|
printf("aprés creation thread TESA\n");
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -387,6 +411,11 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre
|
||||||
printf(debug?"socket non trouvé\n":"");
|
printf(debug?"socket non trouvé\n":"");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (version<2) {
|
||||||
|
app_buffer_put(pdu.payload); // envoyer la data dans le buffer
|
||||||
|
printf("data in the buffer\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (pdu.header.syn == 1 && tab_sockets[mic_sock].socket.state == ACCEPTING) // si PDU SYN
|
if (pdu.header.syn == 1 && tab_sockets[mic_sock].socket.state == ACCEPTING) // si PDU SYN
|
||||||
{
|
{
|
||||||
|
@ -412,51 +441,48 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre
|
||||||
else if(pdu.header.ack == 0 && pdu.header.seq_num == tab_sockets[mic_sock].NoSeqDist && tab_sockets[mic_sock].socket.state == ESTABLISHED)
|
else if(pdu.header.ack == 0 && pdu.header.seq_num == tab_sockets[mic_sock].NoSeqDist && tab_sockets[mic_sock].socket.state == ESTABLISHED)
|
||||||
{ // Si PDU de DATA
|
{ // Si PDU de DATA
|
||||||
printf("PDU data recu \n");
|
printf("PDU data recu \n");
|
||||||
mic_tcp_pdu pdu_r;
|
mic_tcp_pdu pdu_d;
|
||||||
pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port;
|
set_mic_tcp_pdu(
|
||||||
pdu_r.header.dest_port = tab_sockets[mic_sock].dist_addr.port;
|
&pdu_d,
|
||||||
pdu_r.header.seq_num = -1;
|
tab_sockets[mic_sock].socket.addr.port,
|
||||||
pdu_r.header.ack_num = tab_sockets[mic_sock].NoSeqDist;
|
tab_sockets[mic_sock].dist_addr.port,
|
||||||
pdu_r.header.syn = 0;
|
-1,
|
||||||
pdu_r.header.ack = 1;
|
pdu.header.seq_num,
|
||||||
pdu_r.header.fin = 0;
|
0,1,0,
|
||||||
pdu_r.payload.size =0;
|
NULL,0
|
||||||
tab_sockets[mic_sock].NoSeqDist = ((tab_sockets[mic_sock].NoSeqDist) + 1) % 2; //update n° seq distant
|
);
|
||||||
display_mic_tcp_pdu(pdu_r,"pdu ack créé :");
|
|
||||||
display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "adresse de destination :");
|
|
||||||
IP_send(pdu_r, tab_sockets[mic_sock].dist_addr);
|
|
||||||
printf("pdu ack envoyé\n");
|
|
||||||
|
|
||||||
|
display_mic_tcp_pdu(pdu_d, "creation du pdu ACK:");
|
||||||
|
|
||||||
|
display_mic_tcp_sock_addr(addr, "envoi du pdu ACK vers l'adresse :");
|
||||||
|
IP_send(pdu_d, addr);
|
||||||
|
|
||||||
|
|
||||||
|
tab_sockets[mic_sock].NoSeqDist = ((tab_sockets[mic_sock].NoSeqDist) + 1) % 2; //update n° seq distant
|
||||||
app_buffer_put(pdu.payload); // envoyer la data dans le buffer
|
app_buffer_put(pdu.payload); // envoyer la data dans le buffer
|
||||||
printf("data in the buffer\n");
|
printf("data in the buffer\n");
|
||||||
}
|
}
|
||||||
else if(pdu.header.ack == 0 && pdu.header.seq_num != tab_sockets[mic_sock].NoSeqDist && tab_sockets[mic_sock].socket.state == ESTABLISHED)
|
else if(pdu.header.ack == 0 && pdu.header.seq_num != tab_sockets[mic_sock].NoSeqDist && tab_sockets[mic_sock].socket.state == ESTABLISHED)
|
||||||
{ // Si Doublon PDU de DATA
|
{ // Si Doublon PDU de DATA
|
||||||
printf("PDU data recu (Doublon)\n");
|
printf("PDU data recu (Doublon)\n");
|
||||||
mic_tcp_pdu pdu_r;
|
mic_tcp_pdu pdu_d;
|
||||||
pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port;
|
set_mic_tcp_pdu(
|
||||||
pdu_r.header.dest_port = tab_sockets[mic_sock].dist_addr.port;
|
&pdu_d,
|
||||||
pdu_r.header.seq_num = -1;
|
tab_sockets[mic_sock].socket.addr.port,
|
||||||
pdu_r.header.ack_num = tab_sockets[mic_sock].NoSeqDist;
|
tab_sockets[mic_sock].dist_addr.port,
|
||||||
pdu_r.header.syn = 0;
|
-1,
|
||||||
pdu_r.header.ack = 1;
|
pdu.header.seq_num,
|
||||||
pdu_r.header.fin = 0;
|
0,1,0,
|
||||||
pdu_r.payload.size =0;
|
NULL,0
|
||||||
display_mic_tcp_pdu(pdu_r,"pdu ack créé :");
|
);
|
||||||
display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "adresse de destination :");
|
|
||||||
IP_send(pdu_r, tab_sockets[mic_sock].dist_addr);
|
|
||||||
printf("pdu ack envoyé\n");
|
|
||||||
|
|
||||||
}
|
display_mic_tcp_pdu(pdu_d, "recreation du pdu ACK:");
|
||||||
else if (pdu.header.ack == 1 && tab_sockets[mic_sock].socket.state == WAITING && (tab_sockets[mic_sock].NoSeqLoc != pdu.header.ack_num))
|
|
||||||
{
|
display_mic_tcp_sock_addr(addr, "renvoi du pdu ACK vers l'adresse :");
|
||||||
// si ACK de bon numéro de séquence
|
IP_send(pdu_d, addr);
|
||||||
printf("PDU ACK de Data recu \n");
|
|
||||||
// addValueCircularBuff(&tab_sockets[mic_sock].buffer,1); // PDU bien reçu
|
|
||||||
//update seq num ?
|
}else{
|
||||||
tab_sockets[mic_sock].socket.state = ESTABLISHED;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
|
|
||||||
printf("PDU inattendu recu :\n");
|
printf("PDU inattendu recu :\n");
|
||||||
display_enhanced_socket(tab_sockets[mic_sock], "l'état du socket");
|
display_enhanced_socket(tab_sockets[mic_sock], "l'état du socket");
|
||||||
|
@ -587,6 +613,9 @@ void * attente_ack(void * arg) {
|
||||||
{
|
{
|
||||||
if (tab_sockets[args->socket].socket.state == SYN_RECEIVED)
|
if (tab_sockets[args->socket].socket.state == SYN_RECEIVED)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
display_mic_tcp_pdu(args->pdu_r, "renvoi du pdu syn ack");
|
||||||
|
display_mic_tcp_sock_addr(tab_sockets[args->socket].dist_addr,"a l'adresse");
|
||||||
IP_send(args->pdu_r, tab_sockets[args->socket].dist_addr);
|
IP_send(args->pdu_r, tab_sockets[args->socket].dist_addr);
|
||||||
printf(debug?"TESA: je renvoie le Syn ack\n":"");
|
printf(debug?"TESA: je renvoie le Syn ack\n":"");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue