Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
26a8c7a57a9728c87e2d76823ed2103fac74da23
[simgrid.git] / examples / msg / bittorrent / messages.h
1 /* Copyright (c) 2012. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef BITTORRENT_MESSAGES_H_
8 #define BITTORRENT_MESSAGES_H_
9 #include <msg/msg.h>
10
11 /**
12  * Message sizes
13  * Sizes based on report by A. Legout et al, Understanding BitTorrent: An Experimental Perspective
14  * http://hal.inria.fr/inria-00000156/en
15  */
16 #define MESSAGE_HANDSHAKE_SIZE 68
17 #define MESSAGE_CHOKE_SIZE 5
18 #define MESSAGE_UNCHOKE_SIZE 5
19 #define MESSAGE_INTERESTED_SIZE 5
20 #define MESSAGE_NOTINTERESTED_SIZE 5
21 #define MESSAGE_HAVE_SIZE 9
22 #define MESSAGE_BITFIELD_SIZE 5
23 #define MESSAGE_REQUEST_SIZE 17
24 #define MESSAGE_PIECE_SIZE 13
25 #define MESSAGE_CANCEL_SIZE 17
26
27 /**
28  * Types of messages exchanged between two peers.
29  */
30 typedef enum {
31   MESSAGE_HANDSHAKE,
32   MESSAGE_CHOKE,
33   MESSAGE_UNCHOKE,
34   MESSAGE_INTERESTED,
35   MESSAGE_NOTINTERESTED,
36   MESSAGE_HAVE,
37   MESSAGE_BITFIELD,
38   MESSAGE_REQUEST,
39   MESSAGE_PIECE,
40   MESSAGE_CANCEL
41 } e_message_type;
42
43 /**
44  * Message data
45  */
46 typedef struct s_message {
47   e_message_type type;
48   const char *mailbox;
49   const char *issuer_host_name;
50   int peer_id;
51   char *bitfield;
52   int index;
53   int block_index;
54   int block_length;
55   int stalled:1;
56 } s_message_t, *message_t;
57 /**
58  * Builds a new value-less message
59  */
60 msg_task_t task_message_new(e_message_type type,
61                             const char *issuer_host_name,
62                             const char *mailbox, int peer_id, int size);
63 /**
64  * Builds a new "have/piece" message
65  */
66 msg_task_t task_message_index_new(e_message_type type,
67                                   const char *issuer_host_name,
68                                   const char *mailbox, int peer_id,
69                                   int index, int varsize);
70 /**
71  * Builds a new bitfield message
72  */
73 msg_task_t task_message_bitfield_new(const char *issuer_host_name,
74                                      const char *mailbox, int peer_id,
75                                      char *bitfield, int bitfield_size);
76 /**
77  * Builds a new "request" message
78  */
79 msg_task_t task_message_request_new(const char *issuer_host_name,
80                                     const char *mailbox, int peer_id,
81                                     int index, int block_index,
82                                     int block_length);
83
84 /**
85  * Build a new "piece" message
86  */
87 msg_task_t task_message_piece_new(const char *issuer_host_name,
88                                   const char *mailbox, int peer_id, int index,
89                                   int stalled, int block_index,
90                                   int block_length, int block_size);
91 /**
92  * Free a message task
93  */
94 void task_message_free(void *);
95
96 int task_message_size(e_message_type type);
97 #endif /* BITTORRENT_MESSAGES_H_ */