1 /* Copyright (c) 2012-2021. The SimGrid Team.
2 * All rights reserved. */
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. */
7 #ifndef BITTORRENT_BITTORRENT_H_
8 #define BITTORRENT_BITTORRENT_H_
9 #include <simgrid/actor.h>
10 #include <simgrid/engine.h>
11 #include <simgrid/host.h>
12 #include <simgrid/mailbox.h>
15 #include <xbt/sysdep.h>
17 #define MAILBOX_SIZE 40
18 #define TRACKER_MAILBOX "tracker_mailbox"
19 /** Max number of pairs sent by the tracker to clients */
20 #define MAXIMUM_PEERS 50
21 /** Interval of time where the peer should send a request to the tracker */
22 #define TRACKER_QUERY_INTERVAL 1000
23 /** Communication size for a task to the tracker */
24 #define TRACKER_COMM_SIZE 1
25 #define GET_PEERS_TIMEOUT 10000
26 /** Number of peers that can be unchocked at a given time */
27 #define MAX_UNCHOKED_PEERS 4
28 /** Interval between each update of the choked peers */
29 #define UPDATE_CHOKED_INTERVAL 30
32 * Sizes based on report by A. Legout et al, Understanding BitTorrent: An Experimental Perspective
33 * http://hal.inria.fr/inria-00000156/en
35 #define MESSAGE_HANDSHAKE_SIZE 68
36 #define MESSAGE_CHOKE_SIZE 5
37 #define MESSAGE_UNCHOKE_SIZE 5
38 #define MESSAGE_INTERESTED_SIZE 5
39 #define MESSAGE_NOTINTERESTED_SIZE 5
40 #define MESSAGE_HAVE_SIZE 9
41 #define MESSAGE_BITFIELD_SIZE 5
42 #define MESSAGE_REQUEST_SIZE 17
43 #define MESSAGE_PIECE_SIZE 13
44 #define MESSAGE_CANCEL_SIZE 17
46 /** Types of messages exchanged between two peers. */
52 MESSAGE_NOTINTERESTED,
61 typedef struct s_message {
64 sg_mailbox_t return_mailbox;
65 unsigned int bitfield;
70 typedef s_message_t* message_t;
72 /** Builds a new value-less message */
73 message_t message_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox);
74 /** Builds a new "have/piece" message */
75 message_t message_index_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox, int index);
76 message_t message_other_new(e_message_type type, int peer_id, sg_mailbox_t return_mailbox, unsigned int bitfield);
77 /** Builds a new "request" message */
78 message_t message_request_new(int peer_id, sg_mailbox_t return_mailbox, int piece, int block_index, int block_length);
79 /** Build a new "piece" message */
80 message_t message_piece_new(int peer_id, sg_mailbox_t return_mailbox, int index, int block_index, int block_length);
82 #endif /* BITTORRENT_BITTORRENT_H_ */