1
/* Copyright (c) 2012. 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. */
6
#ifndef BITTORRENT_PEER_H
7
#define BITTORRENT_PEER_H
10
#include <xbt/dynar.h>
11
#include <xbt/RngStream.h>
12
#include "connection.h"
13
#include "bittorrent.h"
18
typedef struct s_peer {
21
int pieces; //number of pieces the peer has.
22
char *bitfield; //list of pieces the peer has.
23
char *bitfield_blocks; //list of blocks the peer has.
24
short *pieces_count; //number of peers that have each piece.
26
xbt_dynar_t current_pieces; //current pieces the peer is downloading
27
int current_piece; //current pieces
28
int pieces_requested; //number of pieces the peer has requested
30
xbt_dict_t peers; //peers list
31
xbt_dict_t active_peers; //active peers list
33
char mailbox[MAILBOX_SIZE]; //peer mailbox.
34
char mailbox_tracker[MAILBOX_SIZE]; //pair mailbox while communicating with the tracker.
35
const char *hostname; //peer hostname
37
msg_task_t task_received; //current task being received
38
msg_comm_t comm_received; //current comm
40
int round; //current round for the chocking algortihm.
42
RngStream stream; //RngStream for
44
double begin_receive_time; //time when the receiving communication has begun, useful for calculating host speed.
46
xbt_dynar_t pending_sends; // list of sends being delivered
52
int peer(int argc, char *argv[]);
54
int get_peers_data(peer_t peer);
55
void leech_loop(peer_t peer, double deadline);
56
void seed_loop(peer_t peer, double deadline);
58
void peer_init(peer_t, int id, int seed);
59
void peer_free(peer_t peer);
61
int has_finished(char *bitfield);
63
void handle_pending_sends(peer_t peer);
64
void handle_message(peer_t peer, msg_task_t task);
66
void wait_for_pieces(peer_t peer, double deadline);
68
void update_pieces_count_from_bitfield(peer_t peer, char *bitfield);
69
void update_current_piece(peer_t peer);
70
void update_choked_peers(peer_t peer);
72
void update_interested_after_receive(peer_t peer);
74
void update_bitfield_blocks(peer_t peer, int index, int block_index,
76
int piece_complete(peer_t peer, int index);
77
int get_first_block(peer_t peer, int piece);
80
void send_requests_to_peer(peer_t peer, connection_t remote_peer);
82
void send_interested_to_peers(peer_t peer);
83
void send_handshake_all(peer_t peer);
85
void send_interested(peer_t peer, const char *mailbox);
87
void send_notinterested(peer_t peer, const char *mailbox);
88
void send_handshake(peer_t peer, const char *mailbox);
89
void send_bitfield(peer_t peer, const char *mailbox);
90
void send_choked(peer_t peer, const char *mailbox);
91
void send_unchoked(peer_t peer, const char *mailbox);
92
void send_have(peer_t peer, int piece);
94
void send_request(peer_t peer, const char *mailbox, int piece, int block_index,
96
void send_piece(peer_t peer, const char *mailbox, int piece, int stalled,
97
int block_index, int block_length);
99
int in_current_pieces(peer_t peer, int piece);
100
#endif /* BITTORRENT_PEER_H */