#include <xbt/sysdep.h>
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg_peers);
-connection_t connection_new(const char* id)
+connection_t connection_new(int id)
{
connection_t connection = xbt_new(s_connection_t, 1);
- connection->id = xbt_strdup(id);
- connection->mailbox = xbt_strdup(id);
+ connection->id = id;
+ connection->mailbox = bprintf("%d", id);
connection->bitfield = 0;
connection->current_piece = -1;
connection->interested = 0;
void connection_free(void* data)
{
connection_t co = (connection_t)data;
- xbt_free(co->id);
xbt_free(co->mailbox);
xbt_free(co);
}
/** Contains the connection data of a peer. */
typedef struct s_connection {
- char* id; // Peer id
+ int id; // Peer id
unsigned int bitfield; // Fields
char* mailbox;
int messages_count;
/** @brief Build a new connection object from the peer id.
* @param id id of the peer
*/
-connection_t connection_new(const char* id);
+connection_t connection_new(int id);
/** @brief Add a new value to the peer speed average
* @param connection connection data
* @param speed speed to add to the speed average
* @param peer_id id of the issuer
* @param size message size in bytes
*/
-msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
int size)
{
message_t message = xbt_new(s_message_t, 1);
}
/** Builds a message containing an index. */
-msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox,
- const char* peer_id, int index, int varsize)
+msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
+ int index, int varsize)
{
msg_task_t task = task_message_new(type, issuer_host_name, mailbox, peer_id, task_message_size(type) + varsize);
message_t message = MSG_task_get_data(task);
return task;
}
-msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, int peer_id,
unsigned int bitfield, int bitfield_size)
{
msg_task_t task = task_message_new(MESSAGE_BITFIELD, issuer_host_name, mailbox, peer_id,
return task;
}
-msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
int block_index, int block_length)
{
msg_task_t task = task_message_index_new(MESSAGE_REQUEST, issuer_host_name, mailbox, peer_id, index, 0);
return task;
}
-msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
int block_index, int block_length, int block_size)
{
msg_task_t task =
e_message_type type;
const char* mailbox;
const char* issuer_host_name;
- const char* peer_id;
+ int peer_id;
unsigned int bitfield;
int index;
int block_index;
typedef s_message_t* message_t;
/** Builds a new value-less message */
-msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
int size);
/** Builds a new "have/piece" message */
-msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox,
- const char* peer_id, int index, int varsize);
+msg_task_t task_message_index_new(e_message_type type, const char* issuer_host_name, const char* mailbox, int peer_id,
+ int index, int varsize);
/** Builds a new bitfield message */
-msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
+msg_task_t task_message_bitfield_new(const char* issuer_host_name, const char* mailbox, int peer_id,
unsigned int bitfield, int bitfield_size);
/** Builds a new "request" message */
-msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_request_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
int block_index, int block_length);
/** Build a new "piece" message */
-msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, const char* peer_id, int index,
+msg_task_t task_message_piece_new(const char* issuer_host_name, const char* mailbox, int peer_id, int index,
int block_index, int block_length, int block_size);
/** Free a message task */
void task_message_free(void*);
xbt_assert(argc == 3 || argc == 4, "Wrong number of arguments");
// Build peer object
- peer_t peer = peer_init(argv[1], argc == 4 ? 1 : 0);
+ peer_t peer = peer_init(xbt_str_parse_int(argv[1], "Invalid ID: %s"), argc == 4 ? 1 : 0);
// Retrieve deadline
double deadline = xbt_str_parse_double(argv[2], "Invalid deadline: %s");
char* status = xbt_malloc0(FILE_PIECES + 1);
get_status(&status, peer->bitfield);
- XBT_INFO("Hi, I'm joining the network with id %d", atoi(peer->id));
+ XBT_INFO("Hi, I'm joining the network with id %d", peer->id);
// Getting peer data from the tracker.
if (get_peers_data(peer)) {
XBT_DEBUG("Got %d peers from the tracker. Current status is: %s", xbt_dict_length(peer->peers), status);
}
}
if (has_finished(peer->bitfield))
- XBT_DEBUG("%s becomes a seeder", peer->id);
+ XBT_DEBUG("%d becomes a seeder", peer->id);
}
/** @brief Peer main loop when it is seeding
if (status == MSG_OK) {
tracker_task_data_t data = MSG_task_get_data(task_received);
unsigned i;
- const char* peer_id;
+ int peer_id;
// Add the peers the tracker gave us to our peer list.
xbt_dynar_foreach (data->peers, i, peer_id) {
- if (!strcmp(peer_id, peer->id))
- xbt_dict_set(peer->peers, peer_id, connection_new(peer_id), NULL);
+ if (peer_id != peer->id)
+ xbt_dict_set_ext(peer->peers, (char*)&peer_id, sizeof(int), connection_new(peer_id), NULL);
}
success = 1;
// free the communication and the task
* @param id id of the peer to take in the network
* @param seed indicates if the peer is a seed.
*/
-peer_t peer_init(const char* id, int seed)
+peer_t peer_init(int id, int seed)
{
peer_t peer = xbt_new(s_peer_t, 1);
- peer->id = xbt_strdup(id);
+ peer->id = id;
peer->hostname = MSG_host_get_name(MSG_host_self());
- snprintf(peer->mailbox, MAILBOX_SIZE - 1, "%s", id);
- snprintf(peer->mailbox_tracker, MAILBOX_SIZE - 1, "tracker_%s", id);
+ snprintf(peer->mailbox, MAILBOX_SIZE - 1, "%d", id);
+ snprintf(peer->mailbox_tracker, MAILBOX_SIZE - 1, "tracker_%d", id);
peer->peers = xbt_dict_new_homogeneous(NULL);
peer->active_peers = xbt_dict_new_homogeneous(NULL);
xbt_dict_free(&peer->peers);
xbt_dict_free(&peer->active_peers);
xbt_free(peer->pieces_count);
- xbt_free(peer->id);
xbt_free(peer);
}
{
if ((remote_peer->interested != 0) && (remote_peer->choked_upload == 0)) {
// add in the active peers set
- xbt_dict_set(peer->active_peers, remote_peer->id, remote_peer, NULL);
- } else if (xbt_dict_get_or_null(peer->active_peers, remote_peer->id)) {
- xbt_dict_remove(peer->active_peers, remote_peer->id);
+ xbt_dict_set_ext(peer->active_peers, (char*)&remote_peer->id, sizeof(int), remote_peer, NULL);
+ } else if (xbt_dict_get_or_null_ext(peer->active_peers, (char*)&remote_peer->id, sizeof(int))) {
+ xbt_dict_remove_ext(peer->active_peers, (char*)&remote_peer->id, sizeof(int));
}
}
message->issuer_host_name);
connection_t remote_peer;
- remote_peer = xbt_dict_get_or_null(peer->peers, message->peer_id);
+ remote_peer = xbt_dict_get_or_null_ext(peer->peers, (char*)&message->peer_id, sizeof(int));
switch (message->type) {
case MESSAGE_HANDSHAKE:
// Check if the peer is in our connection list.
if (remote_peer == 0) {
- xbt_dict_set(peer->peers, message->peer_id, connection_new(message->peer_id), NULL);
+ xbt_dict_set_ext(peer->peers, (char*)&message->peer_id, sizeof(int), connection_new(message->peer_id), NULL);
send_handshake(peer, message->mailbox);
}
// Send our bitfield to the peer
send_piece(peer, message->mailbox, message->index, message->block_index, message->block_length);
}
} else {
- XBT_DEBUG("\t for piece %s but he is choked.", message->peer_id);
+ XBT_DEBUG("\t for piece %d but he is choked.", message->peer_id);
}
break;
case MESSAGE_PIECE:
{
if (nb_interested_peers(peer) == 0)
return;
- XBT_DEBUG("(%s) update_choked peers %u active peers", peer->id, xbt_dict_size(peer->active_peers));
+ XBT_DEBUG("(%d) update_choked peers %u active peers", peer->id, xbt_dict_size(peer->active_peers));
// update the current round
peer->round = (peer->round + 1) % 3;
char* key;
}
if (peer_choosed != NULL)
- XBT_DEBUG("(%s) update_choked peers unchoked (%s) ; int (%d) ; choked (%d) ", peer->id, peer_choosed->id,
+ XBT_DEBUG("(%d) update_choked peers unchoked (%d) ; int (%d) ; choked (%d) ", peer->id, peer_choosed->id,
peer_choosed->interested, peer_choosed->choked_upload);
if (peer_choked != peer_choosed) {
if (peer_choked != NULL) {
xbt_assert((!peer_choked->choked_upload), "Tries to choked a choked peer");
peer_choked->choked_upload = 1;
- xbt_assert(strcmp(key_choked, peer_choked->id));
+ xbt_assert((*((int*)key_choked) == peer_choked->id));
update_active_peers_set(peer, peer_choked);
- XBT_DEBUG("(%s) Sending a CHOKE to %s", peer->id, peer_choked->id);
+ XBT_DEBUG("(%d) Sending a CHOKE to %d", peer->id, peer_choked->id);
send_choked(peer, peer_choked->mailbox);
}
if (peer_choosed != NULL) {
xbt_assert((peer_choosed->choked_upload), "Tries to unchoked an unchoked peer");
peer_choosed->choked_upload = 0;
- xbt_dict_set(peer->active_peers, peer_choosed->id, peer_choosed, NULL);
+ xbt_dict_set_ext(peer->active_peers, (char*)&peer_choosed->id, sizeof(int), peer_choosed, NULL);
peer_choosed->last_unchoke = MSG_get_clock();
- XBT_DEBUG("(%s) Sending a UNCHOKE to %s", peer->id, peer_choosed->id);
+ XBT_DEBUG("(%d) Sending a UNCHOKE to %d", peer->id, peer_choosed->id);
update_active_peers_set(peer, peer_choosed);
send_unchoked(peer, peer_choosed->mailbox);
}
/** Peer data */
typedef struct s_peer {
- char* id; // peer id
+ int id; // peer id
unsigned int bitfield; // list of pieces the peer has.
unsigned long long bitfield_blocks; // list of blocks the peer has.
void leech_loop(peer_t peer, double deadline);
void seed_loop(peer_t peer, double deadline);
-peer_t peer_init(const char* id, int seed);
+peer_t peer_init(int id, int seed);
void peer_free(peer_t peer);
char* print_bitfield(unsigned int bitfield);
RngStream stream = (RngStream)MSG_host_get_data(MSG_host_self());
// Building peers array
- xbt_dynar_t peers_list = xbt_dynar_new(sizeof(const char*), NULL);
+ xbt_dynar_t peers_list = xbt_dynar_new(sizeof(int), NULL);
XBT_INFO("Tracker launched.");
tracker_task_data_t data = MSG_task_get_data(task_received);
// Add the peer to our peer list.
if (is_in_list(peers_list, data->peer_id) == 0) {
- xbt_dynar_push(peers_list, &data->peer_id);
+ xbt_dynar_push_as(peers_list, int, data->peer_id);
}
// Sending peers to the peer
- const char* next_peer;
+ int next_peer;
int peers_length = xbt_dynar_length(peers_list);
for (int i = 0; i < MAXIMUM_PEERS && i < peers_length; i++) {
do {
- xbt_dynar_get_cpy(peers_list, RngStream_RandInt(stream, 0, peers_length - 1), &next_peer);
+ next_peer = xbt_dynar_get_as(peers_list, RngStream_RandInt(stream, 0, peers_length - 1), int);
} while (is_in_list(data->peers, next_peer));
- xbt_dynar_push(data->peers, &next_peer);
+ xbt_dynar_push_as(data->peers, int, next_peer);
}
// setting the interval
data->interval = TRACKER_QUERY_INTERVAL;
* Build a new task for the tracker.
* @param issuer_host_name Hostname of the issuer. For debugging purposes
*/
-tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
- int uploaded, int downloaded, int left)
+tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, int peer_id, int uploaded,
+ int downloaded, int left)
{
tracker_task_data_t task = xbt_new(s_tracker_task_data_t, 1);
task->downloaded = downloaded;
task->left = left;
- task->peers = xbt_dynar_new(sizeof(const char*), NULL);
+ task->peers = xbt_dynar_new(sizeof(int), NULL);
return task;
}
*/
void tracker_task_data_free(tracker_task_data_t task)
{
- xbt_dynar_free_container(&task->peers);
+ xbt_dynar_free(&task->peers);
xbt_free(task);
}
* @param peers dynar containing the peers
* @param id identifier of the peer to test
*/
-int is_in_list(xbt_dynar_t peers, const char* id)
+int is_in_list(xbt_dynar_t peers, int id)
{
return xbt_dynar_member(peers, &id);
}
const char* mailbox; // mailbox where the tracker should answer
const char* issuer_host_name; // hostname, for debug purposes
// Query data
- const char* peer_id; // peer id
+ int peer_id; // peer id
int uploaded; // how much the peer has already uploaded
int downloaded; // how much the peer has downloaded
int left; // how much the peer has left
} s_tracker_task_data_t;
typedef s_tracker_task_data_t* tracker_task_data_t;
-tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, const char* peer_id,
- int uploaded, int downloaded, int left);
+tracker_task_data_t tracker_task_data_new(const char* issuer_host_name, const char* mailbox, int peer_id, int uploaded,
+ int downloaded, int left);
void tracker_task_data_free(tracker_task_data_t task);
-int is_in_list(xbt_dynar_t peers, const char* id);
+int is_in_list(xbt_dynar_t peers, int id);
#endif /* BITTORRENT_TRACKER_H */