-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpacket_interface.h
110 lines (98 loc) · 4.02 KB
/
packet_interface.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#ifndef __PACKET_INTERFACE_H_
#define __PACKET_INTERFACE_H_
#include <stddef.h> /* size_t */
#include <stdint.h> /* uintx_t */
/* Raccourci pour struct pkt */
typedef struct pkt pkt_t;
/* Types de paquets */
typedef enum {
PTYPE_DATA = 1,
PTYPE_ACK = 2,
} ptypes_t;
/* Taille maximale permise pour le payload */
#define MAX_PAYLOAD_SIZE 512
/* Taille maximale de Window */
#define MAX_WINDOW_SIZE 31
/* Valeur de retours des fonctions */
typedef enum {
PKT_OK = 0, /* Le paquet a Ć©tĆ© traitĆ© avec succĆØs */
E_TYPE, /* Erreur liƩe au champs Type */
E_LENGTH, /* Erreur liƩe au champs Length */
E_CRC, /* CRC invalide */
E_WINDOW, /* Erreur liƩe au champs Window */
E_SEQNUM, /* NumƩro de sƩquence invalide */
E_NOMEM, /* Pas assez de mƩmoire */
E_NOHEADER, /* Le paquet n'a pas de header (trop court) */
E_UNCONSISTENT, /* Le paquet est incohƩrent */
} pkt_status_code;
/* Alloue et initialise une struct pkt
* @return: NULL en cas d'erreur */
pkt_t* pkt_new();
/* LibĆØre le pointeur vers la struct pkt, ainsi que toutes les
* ressources associƩes
*/
void pkt_del(pkt_t*);
/*
* DƩcode des donnƩes reƧues et crƩe une nouvelle structure pkt.
* Le paquet reƧu est en network byte-order.
* La fonction vƩrifie que:
* - Le CRC32 des donnĆ©es reƧues est le mĆŖme que celui dĆ©codĆ© Ć la fin
* du flux de donnƩes
* - Le type du paquet est valide
* - La longeur du paquet est valide et cohƩrente avec le nombre d'octets
* reƧus.
*
* @data: L'ensemble d'octets constituant le paquet reƧu
* @len: Le nombre de bytes reƧus
* @pkt: Une struct pkt valide
* @post: pkt est la reprƩsentation du paquet reƧu
*
* @return: Un code indiquant si l'opƩration a rƩussi ou reprƩsentant
* l'erreur rencontrƩe.
*/
pkt_status_code pkt_decode(const char *data, const size_t len, pkt_t *pkt);
/*
* Encode une struct pkt dans un buffer, prĆŖt Ć ĆŖtre envoyĆ© sur le rĆ©seau
* (c-Ć -d en network byte-order), incluant le CRC32 du header et payload.
*
* @pkt: La structure Ć encoder
* @buf: Le buffer dans lequel la structure sera encodƩe
* @len: La taille disponible dans le buffer
* @len-POST: Le nombre de d'octets Ć©crit dans le buffer
* @return: Un code indiquant si l'opƩration a rƩussi ou E_NOMEM si
* le buffer est trop petit.
*/
pkt_status_code pkt_encode(const pkt_t*, char *buf, size_t *len);
/* Accesseurs pour les champs toujours prƩsents du paquet.
* Les valeurs renvoyƩes sont toutes dans l'endianness native
* de la machine!
*/
ptypes_t pkt_get_type (const pkt_t*);
uint8_t pkt_get_window (const pkt_t*);
uint8_t pkt_get_seqnum (const pkt_t*);
uint16_t pkt_get_length (const pkt_t*);
uint32_t pkt_get_timestamp(const pkt_t*);
uint32_t pkt_get_crc (const pkt_t*);
/* Renvoie un pointeur vers le payload du paquet, ou NULL s'il n'y
* en a pas.
*/
const char* pkt_get_payload(const pkt_t*);
/* Setters pour les champs obligatoires du paquet. Si les valeurs
* fournies ne sont pas dans les limites acceptables, les fonctions
* doivent renvoyer un code d'erreur adaptƩ.
* Les valeurs fournies sont dans l'endianness native de la machine!
*/
pkt_status_code pkt_set_type (pkt_t*, const ptypes_t type);
pkt_status_code pkt_set_window (pkt_t*, const uint8_t window);
pkt_status_code pkt_set_seqnum (pkt_t*, const uint8_t seqnum);
pkt_status_code pkt_set_length (pkt_t*, const uint16_t length);
pkt_status_code pkt_set_timestamp(pkt_t*, const uint32_t crc);
pkt_status_code pkt_set_crc (pkt_t*, const uint32_t crc);
/* DĆ©fini la valeur du champs payload du paquet.
* @data: Une succession d'octets reprƩsentants le payload
* @length: Le nombre d'octets composant le payload
* @POST: pkt_get_length(pkt) == length */
pkt_status_code pkt_set_payload(pkt_t*,
const char *data,
const uint16_t length);
#endif /* __PACKET_INTERFACE_H_ */