Add files via upload
This commit is contained in:
parent
3a59a6c63f
commit
c53de688f0
1 changed files with 178 additions and 75 deletions
237
src/mictcp.c
237
src/mictcp.c
|
@ -1,123 +1,226 @@
|
||||||
#include <mictcp.h>
|
#include <mictcp.h>
|
||||||
#include <api/mictcp_core.h>
|
#include <api/mictcp_core.h>
|
||||||
|
#define NBR_SOCKETS 1024
|
||||||
|
|
||||||
|
// FONCTIONS
|
||||||
|
|
||||||
|
|
||||||
|
static int socket_desc = 0;
|
||||||
|
static mic_tcp_sock tab_sockets[NBR_SOCKETS];
|
||||||
|
|
||||||
|
int valid_socket(int socket);
|
||||||
|
int bound_socket(int socket);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Permet de créer un socket entre l’application et MIC-TCP
|
* Permet de créer un socket entre l’application et MIC-TCP
|
||||||
* Retourne le descripteur du socket ou bien -1 en cas d'erreur
|
* Retourne le descripteur du socket ou bien -1 en cas d'erreur
|
||||||
*/
|
*/
|
||||||
int mic_tcp_socket(start_mode sm)
|
int mic_tcp_socket(start_mode sm) {
|
||||||
{
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
int result = -1;
|
printf(__FUNCTION__); printf("\n");
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
|
||||||
result = initialize_components(sm); /* Appel obligatoire */
|
|
||||||
set_loss_rate(0);
|
|
||||||
|
|
||||||
return result;
|
mic_tcp_sock *socket = &tab_sockets[socket_desc];
|
||||||
|
|
||||||
|
|
||||||
|
socket->fd = socket_desc++;
|
||||||
|
socket->state = IDLE;
|
||||||
|
//not bound yet
|
||||||
|
|
||||||
|
|
||||||
|
int result = initialize_components(sm); /* Appel obligatoire */
|
||||||
|
if (result<0){
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return socket->fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Permet d’attribuer une adresse à un socket.
|
* Permet d’attribuer une adresse à un socket.
|
||||||
* Retourne 0 si succès, et -1 en cas d’échec
|
* Retourne 0 si succès, et -1 en cas d’échec
|
||||||
*/
|
*/
|
||||||
int mic_tcp_bind(int socket, mic_tcp_sock_addr addr)
|
int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) {
|
||||||
{
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
printf(__FUNCTION__); printf("\n");
|
||||||
|
|
||||||
|
|
||||||
|
if(valid_socket(socket) && tab_sockets[socket].state ==IDLE){
|
||||||
|
tab_sockets[socket].addr = addr;
|
||||||
|
tab_sockets[socket].state = BOUND;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Met le socket en état d'acceptation de connexions
|
* Met le socket en état d'acceptation de connexion
|
||||||
* Retourne 0 si succès, -1 si erreur
|
* Retourne 0 si succès, -1 si erreur
|
||||||
*/
|
*/
|
||||||
int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr)
|
int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) {
|
||||||
{
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
printf(__FUNCTION__); printf("\n");
|
||||||
|
|
||||||
|
if(valid_socket(socket) && tab_sockets[socket].state == BOUND){
|
||||||
|
tab_sockets[socket].state = ACCEPTING;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Permet de réclamer l’établissement d’une connexion
|
* Permet de réclamer l’établissement d’une connexion
|
||||||
* Retourne 0 si la connexion est établie, et -1 en cas d’échec
|
* Retourne 0 si la connexion est établie, et -1 en cas d’échec
|
||||||
*/
|
*/
|
||||||
int mic_tcp_connect(int socket, mic_tcp_sock_addr addr)
|
|
||||||
{
|
int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) {
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
return -1;
|
printf(__FUNCTION__); printf("\n");
|
||||||
|
|
||||||
|
|
||||||
|
if(valid_socket(socket) && tab_sockets[socket].state == IDLE){
|
||||||
|
printf("%d\n", socket);
|
||||||
|
tab_sockets[socket].addr = addr;
|
||||||
|
tab_sockets[socket].state = ESTABLISHED;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Permet de réclamer l’envoi d’une donnée applicative
|
* Permet de réclamer l’envoi d’une donnée applicative
|
||||||
* Retourne la taille des données envoyées, et -1 en cas d'erreur
|
* Retourne la taille des données envoyées, et -1 en cas d'erreur
|
||||||
*/
|
*/
|
||||||
int mic_tcp_send (int mic_sock, char* mesg, int mesg_size)
|
|
||||||
{
|
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) {
|
||||||
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
|
printf(__FUNCTION__); printf("\n");
|
||||||
|
|
||||||
|
mic_tcp_sock socket=tab_sockets[mic_sock];
|
||||||
|
mic_tcp_header header;
|
||||||
|
|
||||||
|
// printf("%d\n", mic_sock);
|
||||||
|
if (socket.state!=ESTABLISHED){
|
||||||
|
printf("connection not established\n");
|
||||||
return -1;
|
return -1;
|
||||||
/*
|
|
||||||
int sent_size = -1;
|
|
||||||
mic_tcp_pdu PDU;
|
|
||||||
pdu.header = ---à remplir---
|
|
||||||
|
|
||||||
pdu.payload.data=msg;
|
|
||||||
pdu.payload.size=size;
|
|
||||||
|
|
||||||
sent_size = IP_send(PDU,--adress obtennue au connect--)
|
|
||||||
|
|
||||||
//Pas besoin de IP receive psq mode non connecté
|
|
||||||
|
|
||||||
return sent_size;
|
|
||||||
*/
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
header.dest_port=socket.addr.port;
|
||||||
|
|
||||||
|
int sent_size = -1;
|
||||||
|
mic_tcp_pdu pdu;
|
||||||
|
pdu.header = header;
|
||||||
|
pdu.payload.data = mesg;
|
||||||
|
pdu.payload.size = mesg_size;
|
||||||
|
|
||||||
|
//IP_recv quand fiabilité implémentée
|
||||||
|
|
||||||
|
sent_size = IP_send(pdu, socket.addr) ;
|
||||||
|
return sent_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Permet à l’application réceptrice de réclamer la récupération d’une donnée
|
* Permet à l’application réceptrice de réclamer la récupération d’une donnée
|
||||||
* stockée dans les buffers de réception du socket
|
* stockée dans les buffers de réception du socket
|
||||||
* Retourne le nombre d’octets lu ou bien -1 en cas d’erreur
|
* Retourne le nombre d’octets lu ou bien -1 en cas d’erreur
|
||||||
* NB : cette fonction fait appel à la fonction app_buffer_get()
|
* NB : cette fonction fait appel à la fonction app_buffer_get()
|
||||||
*/
|
*/
|
||||||
int mic_tcp_recv (int socket, char* mesg, int max_mesg_size)
|
int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) {
|
||||||
{
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
/*
|
printf(__FUNCTION__); printf("\n");
|
||||||
int deliver_size = -1;
|
|
||||||
mic_tcp_payload payload;
|
|
||||||
|
|
||||||
payload.data = mesg
|
if(!valid_socket(socket)){
|
||||||
payload.size = max_mesg_size;
|
|
||||||
|
|
||||||
deliver_size = app.buffer.get(payload);
|
|
||||||
|
|
||||||
|
|
||||||
return deliver_size;
|
|
||||||
*/
|
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int delivered_size;
|
||||||
|
mic_tcp_payload *payload;
|
||||||
|
payload->data= mesg;
|
||||||
|
payload->size = max_mesg_size;
|
||||||
|
delivered_size = app_buffer_get(*payload);
|
||||||
|
|
||||||
|
return delivered_size;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence
|
||||||
|
* et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans
|
||||||
|
* le buffer de réception du socket. Cette fonction utilise la fonction
|
||||||
|
* app_buffer_put(). Elle est appelée par initialize_components()
|
||||||
|
*/
|
||||||
|
void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) {
|
||||||
|
printf("[MIC-TCP] Appel de la fonction: ");
|
||||||
|
printf(__FUNCTION__); printf("\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
mic_tcp_sock_addr addr_emetteur = addr //pour clarification
|
||||||
|
//éventuellement trouver les bons socket, buffer et app
|
||||||
|
for (int iint valid_socket(int socket) =0; i<socket_desc; i++){
|
||||||
|
if(tab_sockets[i].state==ACCEPTING && tab_sockets[i].addr == addr) {break}
|
||||||
|
else if (i==socket_desc-1){return -1}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
app_buffer_put(pdu.payload);
|
||||||
|
|
||||||
|
/* Utile quand on fera du reliable
|
||||||
|
if(SeqPDU = SeqDist){ //packet valide
|
||||||
|
SendAck(SeqDist);
|
||||||
|
SeqDist++;
|
||||||
|
IP_send(ack);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Permet de réclamer la destruction d’un socket.
|
* Permet de réclamer la destruction d’un socket.
|
||||||
* Engendre la fermeture de la connexion suivant le modèle de TCP.
|
* Engendre la fermeture de la connexion suivant le modèle de TCP.
|
||||||
* Retourne 0 si tout se passe bien et -1 en cas d'erreur
|
* Retourne 0 si tout se passe bien et -1 en cas d'erreur
|
||||||
*/
|
*/
|
||||||
int mic_tcp_close (int socket)
|
int mic_tcp_close (int socket) {
|
||||||
{
|
printf("[MIC-TCP] Appel de la fonction : ");
|
||||||
printf("[MIC-TCP] Appel de la fonction : "); printf(__FUNCTION__); printf("\n");
|
printf(__FUNCTION__); printf("\n");
|
||||||
|
|
||||||
|
if(valid_socket(socket) && tab_sockets[socket].state == ESTABLISHED){
|
||||||
|
tab_sockets[socket].state = CLOSED;
|
||||||
|
tab_sockets[socket].fd = -1;
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Traitement d’un PDU MIC-TCP reçu (mise à jour des numéros de séquence
|
|
||||||
* et d'acquittement, etc.) puis insère les données utiles du PDU dans
|
|
||||||
* le buffer de réception du socket. Cette fonction utilise la fonction
|
|
||||||
* app_buffer_put().
|
|
||||||
*/
|
|
||||||
void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
app_buffer_put(pdu.payload);
|
|
||||||
|
|
||||||
// sur version fiable v2 : IP_send(ack)
|
/*---------------------------------------------*/
|
||||||
|
int valid_socket(int socket){
|
||||||
*/
|
if(socket > socket_desc-1 || tab_sockets[socket].fd == -1){
|
||||||
printf("[MIC-TCP] Appel de la fonction: "); printf(__FUNCTION__); printf("\n");
|
//printf("ah, ton socket il existe pas\n");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bound_socket(int socket){
|
||||||
|
if (tab_sockets[socket].addr.ip_addr_size ==-1){
|
||||||
|
//printf("socket not bound\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue