aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bittorrent.c
diff options
context:
space:
mode:
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2005-08-16 05:58:50 +0000
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>2005-08-16 05:58:50 +0000
commitecef40293eff00d6089e2a56e7d0e2c3a5685e8a (patch)
tree75beafe9b6dcd7baff2c64494e69a710e1cbf1e6 /epan/dissectors/packet-bittorrent.c
parentcad536865663f51c8f2bb0c23dfc70f10fc6cc39 (diff)
From Peter Johansson: add an option to decode the client information,
and check the validity of messages a bit more carefully. Reformat a bit so not as much code is missed by those of us who like narrow editor windows. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@15369 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-bittorrent.c')
-rw-r--r--epan/dissectors/packet-bittorrent.c476
1 files changed, 286 insertions, 190 deletions
diff --git a/epan/dissectors/packet-bittorrent.c b/epan/dissectors/packet-bittorrent.c
index e57d13928e..d3021a8832 100644
--- a/epan/dissectors/packet-bittorrent.c
+++ b/epan/dissectors/packet-bittorrent.c
@@ -43,246 +43,339 @@
/*
* See
*
- * http://bittorrent.com/protocol.html
+ * http://bittorrent.com/protocol.html
+ * http://wiki.theory.org/BitTorrentSpecification
+ * http://bitconjurer.org/BitTorrent/protocol.html
*/
-#define BITTORRENT_MESSAGE_CHOKE 0
-#define BITTORRENT_MESSAGE_UNCHOKE 1
-#define BITTORRENT_MESSAGE_INTERESTED 2
-#define BITTORRENT_MESSAGE_NOT_INTERESTED 3
-#define BITTORRENT_MESSAGE_HAVE 4
-#define BITTORRENT_MESSAGE_BITFIELD 5
-#define BITTORRENT_MESSAGE_REQUEST 6
-#define BITTORRENT_MESSAGE_PIECE 7
-#define BITTORRENT_MESSAGE_CANCEL 8
+#define BITTORRENT_MESSAGE_CHOKE 0
+#define BITTORRENT_MESSAGE_UNCHOKE 1
+#define BITTORRENT_MESSAGE_INTERESTED 2
+#define BITTORRENT_MESSAGE_NOT_INTERESTED 3
+#define BITTORRENT_MESSAGE_HAVE 4
+#define BITTORRENT_MESSAGE_BITFIELD 5
+#define BITTORRENT_MESSAGE_REQUEST 6
+#define BITTORRENT_MESSAGE_PIECE 7
+#define BITTORRENT_MESSAGE_CANCEL 8
+
+#define BITTORRENT_HEADER_LENGTH 4
static const value_string bittorrent_messages[] = {
- { BITTORRENT_MESSAGE_CHOKE, "Choke" },
- { BITTORRENT_MESSAGE_UNCHOKE, "Unchoke" },
- { BITTORRENT_MESSAGE_INTERESTED, "Interested" },
- { BITTORRENT_MESSAGE_NOT_INTERESTED, "Not Interested" },
- { BITTORRENT_MESSAGE_HAVE, "Have" },
- { BITTORRENT_MESSAGE_BITFIELD, "Bitfield" },
- { BITTORRENT_MESSAGE_REQUEST, "Request" },
- { BITTORRENT_MESSAGE_PIECE, "Piece" },
- { BITTORRENT_MESSAGE_CANCEL, "Cancel" },
- { 0, NULL }
+ { BITTORRENT_MESSAGE_CHOKE, "Choke" },
+ { BITTORRENT_MESSAGE_UNCHOKE, "Unchoke" },
+ { BITTORRENT_MESSAGE_INTERESTED, "Interested" },
+ { BITTORRENT_MESSAGE_NOT_INTERESTED, "Not Interested" },
+ { BITTORRENT_MESSAGE_HAVE, "Have" },
+ { BITTORRENT_MESSAGE_BITFIELD, "Bitfield" },
+ { BITTORRENT_MESSAGE_REQUEST, "Request" },
+ { BITTORRENT_MESSAGE_PIECE, "Piece" },
+ { BITTORRENT_MESSAGE_CANCEL, "Cancel" },
+ { 0, NULL }
};
+static dissector_handle_t dissector_handle;
static int proto_bittorrent = -1;
static gint hf_bittorrent_field_length = -1;
static gint hf_bittorrent_prot_name_len = -1;
static gint hf_bittorrent_prot_name = -1;
-static gint hf_bittorrent_reserved = -1;
-static gint hf_bittorrent_sha1_hash = -1;
-static gint hf_bittorrent_peer_id = -1;
-static gint hf_bittorrent_msg_len = -1;
-static gint hf_bittorrent_msg_type = -1;
-static gint hf_bittorrent_bitfield_data = -1;
-static gint hf_bittorrent_piece_index = -1;
-static gint hf_bittorrent_piece_begin = -1;
-static gint hf_bittorrent_piece_length = -1;
-static gint hf_bittorrent_piece_data = -1;
+static gint hf_bittorrent_reserved = -1;
+static gint hf_bittorrent_sha1_hash = -1;
+static gint hf_bittorrent_peer_id = -1;
+static gint hf_bittorrent_msg_len = -1;
+static gint hf_bittorrent_msg_type = -1;
+static gint hf_bittorrent_bitfield_data = -1;
+static gint hf_bittorrent_piece_index = -1;
+static gint hf_bittorrent_piece_begin = -1;
+static gint hf_bittorrent_piece_length = -1;
+static gint hf_bittorrent_piece_data = -1;
static gint ett_bittorrent = -1;
static gint ett_bittorrent_msg = -1;
+static gint ett_peer_id = -1;
static gboolean bittorrent_desegment = TRUE;
+static gboolean decode_client_information = FALSE;
+
+struct client_information {
+ char id[4];
+ char *name;
+};
-static dissector_handle_t bittorrent_handle;
+static struct client_information peer_id[] = {
+ {"-AZ", "Azureus"},
+ {"-BB", "BitBuddy"},
+ {"-CT", "CTorrent"},
+ {"-MT", "MoonlightTorrent"},
+ {"-LT", "libtorrent"},
+ {"-BX", "Bittorrent X"},
+ {"-TS", "Torrentstorm"},
+ {"-TN", "TorrnetDotNET"},
+ {"-SS", "SwarmScope"},
+ {"-XT", "XanTorrent"},
+ {"-BS", "BTSlave"},
+ {"-ZT", "ZipTorrent"},
+ {"S", "Shadow's client"},
+ {"U", "UPnP NAT Bit Torrent"},
+ {"T", "BitTornado"},
+ {"A", "ABC"},
+ {"", NULL}
+};
static guint get_bittorrent_pdu_length(tvbuff_t *tvb, int offset)
{
- if (tvb_get_guint8(tvb, offset) == 19) {
- return 20 + 20 + 20 + 8;
- } else {
- guint32 length = tvb_get_ntohl(tvb, offset);
- return 4 + length;
- }
+ guint8 type;
+ guint32 length;
+
+ if (tvb_get_guint8(tvb, offset) == 19 &&
+ tvb_memeql(tvb, offset + 1, "BitTorrent protocol", 19) == 0) {
+ /* Return the length of a Handshake message */
+ return 1 + /* pstrlen */
+ 19 + /* pstr */
+ 8 + /* reserved */
+ 20 + /* SHA1 hash of the info key */
+ 20; /* peer id */
+ } else {
+ /* Try to validate the length of the message indicated by the header. */
+ length = tvb_get_ntohl(tvb, offset);
+ if(length == 0) {
+ /* keep-alive - no message ID */
+ return BITTORRENT_HEADER_LENGTH;
+ }
+ /* Do some sanity checking of the message, if we have the ID byte */
+ if(tvb_offset_exists(tvb, offset + BITTORRENT_HEADER_LENGTH)) {
+ type = tvb_get_guint8(tvb, offset + BITTORRENT_HEADER_LENGTH);
+ if(type <= BITTORRENT_MESSAGE_CANCEL) {
+ /* This seems to be a valid BitTorrent header with a known
+ type identifier */
+ return BITTORRENT_HEADER_LENGTH + length;
+ } else {
+ /* The type is not known, this message cannot be decoded
+ properly by this dissector. */
+ /* XXX - what we want to do here is to just dissect the rest
+ of this TCP segment as "continuation data"; if this is
+ a real BitTorrent connection, we probably didn't get some
+ data before this segment. */
+ DISSECTOR_ASSERT(!"Reassemble error?");
+ return 0;
+ }
+ } else {
+ /* For now, we just give up, so we don't end up dissecting
+ a message with a bogus length. */
+ DISSECTOR_ASSERT(!"Reassemble error?");
+ return 0;
+ }
+ }
}
static void dissect_bittorrent_message (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- int offset = 0;
- proto_tree *mtree;
- guint8 type;
- guint32 length = tvb_get_ntohl(tvb, offset);
- proto_item *ti = proto_tree_add_text(tree, tvb, offset, length, "BitTorrent Message");
-
- mtree = proto_item_add_subtree(ti, ett_bittorrent_msg);
-
- proto_tree_add_item(mtree, hf_bittorrent_msg_len, tvb, offset, 4, FALSE); offset+=4;
-
- /* Keepalive message */
- if (length == 0) {
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_set_str(pinfo->cinfo, COL_INFO, "BitTorrent KeepAlive message");
- }
- return;
- }
-
- type = tvb_get_guint8(tvb, offset);
- proto_tree_add_item(mtree, hf_bittorrent_msg_type, tvb, offset, 1, FALSE); offset+=1;
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- const char *val = match_strval(type, bittorrent_messages);
- if (val != NULL) {
- col_set_str(pinfo->cinfo, COL_INFO, val);
- }
- }
-
- switch (type)
- {
- case BITTORRENT_MESSAGE_CHOKE:
- case BITTORRENT_MESSAGE_UNCHOKE:
- case BITTORRENT_MESSAGE_INTERESTED:
- case BITTORRENT_MESSAGE_NOT_INTERESTED:
- /* No payload */
- break;
-
-
- case BITTORRENT_MESSAGE_REQUEST:
- case BITTORRENT_MESSAGE_CANCEL:
- proto_tree_add_item(mtree, hf_bittorrent_piece_index, tvb, offset, 4, FALSE); offset += 4;
- proto_tree_add_item(mtree, hf_bittorrent_piece_begin, tvb, offset, 4, FALSE); offset += 4;
- proto_tree_add_item(mtree, hf_bittorrent_piece_length, tvb, offset, 4, FALSE);
- break;
-
- case BITTORRENT_MESSAGE_HAVE:
- proto_tree_add_item(mtree, hf_bittorrent_piece_index, tvb, offset, 4, FALSE);
- break;
-
- case BITTORRENT_MESSAGE_BITFIELD:
- proto_tree_add_item(mtree, hf_bittorrent_bitfield_data, tvb, offset, tvb_length_remaining(tvb, offset), FALSE);
- break;
-
- case BITTORRENT_MESSAGE_PIECE:
- proto_tree_add_item(mtree, hf_bittorrent_piece_index, tvb, offset, 4, FALSE); offset += 4;
- proto_tree_add_item(mtree, hf_bittorrent_piece_begin, tvb, offset, 4, FALSE); offset += 4;
- proto_tree_add_item(mtree, hf_bittorrent_piece_data, tvb, offset, tvb_length_remaining(tvb, offset), FALSE);
- break;
- }
+ int offset = 0;
+ proto_tree *mtree;
+ guint8 type;
+ guint32 length;
+ proto_item *ti;
+
+ length = tvb_get_ntohl(tvb, offset);
+ ti = proto_tree_add_text(tree, tvb, offset, length + BITTORRENT_HEADER_LENGTH, "BitTorrent Message");
+ mtree = proto_item_add_subtree(ti, ett_bittorrent_msg);
+
+ proto_tree_add_item(mtree, hf_bittorrent_msg_len, tvb, offset, BITTORRENT_HEADER_LENGTH, FALSE);
+ offset += BITTORRENT_HEADER_LENGTH;
+
+ /* Keepalive message */
+ if (length == 0) {
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_set_str(pinfo->cinfo, COL_INFO, "BitTorrent KeepAlive message");
+ }
+ return;
+ }
+
+ type = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(mtree, hf_bittorrent_msg_type, tvb, offset, 1, FALSE);
+ offset += 1;
+ length -= 1;
+
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_add_str(pinfo->cinfo, COL_INFO,
+ val_to_str(type, bittorrent_messages, "Unknown message type %u"));
+ }
+
+ switch (type) {
+ case BITTORRENT_MESSAGE_CHOKE:
+ case BITTORRENT_MESSAGE_UNCHOKE:
+ case BITTORRENT_MESSAGE_INTERESTED:
+ case BITTORRENT_MESSAGE_NOT_INTERESTED:
+ /* No payload */
+ break;
+
+ case BITTORRENT_MESSAGE_REQUEST:
+ case BITTORRENT_MESSAGE_CANCEL:
+ proto_tree_add_item(mtree, hf_bittorrent_piece_index, tvb, offset, 4, FALSE); offset += 4;
+ proto_tree_add_item(mtree, hf_bittorrent_piece_begin, tvb, offset, 4, FALSE); offset += 4;
+ proto_tree_add_item(mtree, hf_bittorrent_piece_length, tvb, offset, 4, FALSE);
+ break;
+
+ case BITTORRENT_MESSAGE_HAVE:
+ proto_tree_add_item(mtree, hf_bittorrent_piece_index, tvb, offset, 4, FALSE);
+ break;
+
+ case BITTORRENT_MESSAGE_BITFIELD:
+ proto_tree_add_item(mtree, hf_bittorrent_bitfield_data, tvb, offset, length, FALSE);
+ break;
+
+ case BITTORRENT_MESSAGE_PIECE:
+ proto_tree_add_item(mtree, hf_bittorrent_piece_index, tvb, offset, 4, FALSE);
+ offset += 4;
+ length -= 4;
+ proto_tree_add_item(mtree, hf_bittorrent_piece_begin, tvb, offset, 4, FALSE);
+ offset += 4;
+ length -= 4;
+ proto_tree_add_item(mtree, hf_bittorrent_piece_data, tvb, offset, length, FALSE);
+ break;
+
+ default:
+ break;
+ }
}
static void dissect_bittorrent_welcome (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree)
{
- int offset = 0;
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_set_str(pinfo->cinfo, COL_INFO, "BitTorrent Handshake");
- }
-
- proto_tree_add_item(tree, hf_bittorrent_prot_name_len, tvb, offset, 1, FALSE); offset+=1;
- proto_tree_add_item(tree, hf_bittorrent_prot_name, tvb, offset, 19, FALSE); offset += 19;
- proto_tree_add_item(tree, hf_bittorrent_reserved, tvb, offset, 8, FALSE); offset += 8;
- proto_tree_add_item(tree, hf_bittorrent_sha1_hash, tvb, offset, 20, FALSE); offset += 20;
- proto_tree_add_item(tree, hf_bittorrent_peer_id, tvb, offset, 20, FALSE); offset += 20;
+ int offset = 0;
+ int i;
+ char *version;
+
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_set_str(pinfo->cinfo, COL_INFO, "BitTorrent Handshake");
+ }
+
+ proto_tree_add_item(tree, hf_bittorrent_prot_name_len, tvb, offset, 1, FALSE); offset+=1;
+ proto_tree_add_item(tree, hf_bittorrent_prot_name, tvb, offset, 19, FALSE); offset += 19;
+ proto_tree_add_item(tree, hf_bittorrent_reserved, tvb, offset, 8, FALSE); offset += 8;
+
+ proto_tree_add_item(tree, hf_bittorrent_sha1_hash, tvb, offset, 20, FALSE);
+ offset += 20;
+
+ proto_tree_add_item(tree, hf_bittorrent_peer_id, tvb, offset, 20, FALSE);
+ if(decode_client_information) {
+ for(i = 0; peer_id[i].id[0] != '\0'; ++i)
+ {
+ if(tvb_memeql(tvb, offset, peer_id[i].id, strlen(peer_id[i].id)) == 0) {
+ /* The version number is 4 numeric characters for the
+ client ids beginning with '-' and 3 characters for the
+ rest. */
+ version = tvb_get_string(tvb, offset + strlen(peer_id[i].id),
+ (peer_id[i].id[0] == '-') ? 4 : 3);
+ proto_tree_add_text(tree, tvb, offset, 20, "Client is %s v%s",
+ peer_id[i].name,
+ format_text(version, (peer_id[i].id[0] == '-') ? 4 : 3));
+ g_free(version);
+ break;
+ }
+ }
+ }
+ offset += 20;
}
static void dissect_bittorrent_tcp_pdu (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- proto_item *ti;
-
- if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "BitTorrent");
- }
-
- if (check_col(pinfo->cinfo, COL_INFO)) {
- col_set_str(pinfo->cinfo, COL_INFO, "BitTorrent Peer-To-Peer connection");
- }
-
- ti = proto_tree_add_text(tree, tvb, 0, -1, "BitTorrent");
-
- tree = proto_item_add_subtree(ti, ett_bittorrent);
-
- if (tvb_get_guint8(tvb, 0) == 19) {
- dissect_bittorrent_welcome(tvb, pinfo, tree);
- } else {
- dissect_bittorrent_message(tvb, pinfo, tree);
- }
+ proto_item *ti;
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "BitTorrent");
+ }
+
+ if (check_col(pinfo->cinfo, COL_INFO)) {
+ col_set_str(pinfo->cinfo, COL_INFO, "BitTorrent Peer-To-Peer connection");
+ }
+
+ ti = proto_tree_add_text(tree, tvb, 0, -1, "BitTorrent");
+
+ tree = proto_item_add_subtree(ti, ett_bittorrent);
+
+ if (tvb_get_guint8(tvb, 0) == 19 &&
+ tvb_memeql(tvb, 1, "BitTorrent protocol", 19) == 0) {
+ dissect_bittorrent_welcome(tvb, pinfo, tree);
+ } else {
+ dissect_bittorrent_message(tvb, pinfo, tree);
+ }
}
static void dissect_bittorrent (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- tcp_dissect_pdus(tvb, pinfo, tree, bittorrent_desegment, 4, get_bittorrent_pdu_length, dissect_bittorrent_tcp_pdu);
+ tcp_dissect_pdus(tvb, pinfo, tree, bittorrent_desegment, BITTORRENT_HEADER_LENGTH,
+ get_bittorrent_pdu_length, dissect_bittorrent_tcp_pdu);
}
-static const guint8 bittorrent_magic[20] = {
- 19,
- 'B', 'i', 't', 'T', 'o', 'r', 'r', 'e', 'n', 't',
- ' ', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l'
-};
-
static gboolean test_bittorrent_packet (tvbuff_t *tvb, packet_info *pinfo,
- proto_tree *tree)
+ proto_tree *tree)
{
- conversation_t *conversation;
+ conversation_t *conversation;
- if (tvb_memeql(tvb, 0, bittorrent_magic, sizeof bittorrent_magic) == -1) {
- return FALSE;
- }
+ if (tvb_bytes_exist(tvb, 0, 20) &&
+ tvb_get_guint8(tvb, 0) == 19 &&
+ tvb_memeql(tvb, 1, "BitTorrent protocol", 19) == 0) {
+ conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
- conversation = conversation_new (pinfo->fd->num, &pinfo->src, &pinfo->dst, pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
+ conversation_set_dissector(conversation, dissector_handle);
- conversation_set_dissector(conversation, bittorrent_handle);
-
- dissect_bittorrent(tvb, pinfo, tree);
-
- return TRUE;
-}
+ dissect_bittorrent(tvb, pinfo, tree);
+ return TRUE;
+ }
+ return FALSE;
+}
void
proto_register_bittorrent(void)
{
-
- static hf_register_info hf[] = {
- { &hf_bittorrent_field_length,
- { "Field Length", "bittorrent.length", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_prot_name_len,
- { "Protocol Name Length", "bittorrent.protocol.name.length", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_prot_name,
- { "Protocol Name", "bittorrent.protocol.name", FT_STRING, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_reserved,
- { "Reserved Extension Bytes", "bittorrent.reserved", FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_sha1_hash,
- { "SHA1 Hash of info dictionary", "bittorrent.info_hash", FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_peer_id,
- { "Peer ID", "bittorrent.peer_id", FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_msg_len,
- { "Message Length", "bittorrent.msg.length", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_msg_type,
- { "Message Type", "bittorrent.msg.type", FT_UINT8, BASE_HEX, VALS(bittorrent_messages), 0x0, "", HFILL },
- },
- { &hf_bittorrent_bitfield_data,
- { "Bitfield data", "bittorrent.msg.bitfield", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_piece_index,
- { "Piece index", "bittorrent.piece.index", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_piece_begin,
- { "Begin offset of piece", "bittorrent.piece.begin", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_piece_data,
- { "Data in a piece", "bittorrent.piece.data", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL },
- },
- { &hf_bittorrent_piece_length,
- { "Piece Length", "bittorrent.piece.length", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL },
- },
+ static hf_register_info hf[] = {
+ { &hf_bittorrent_field_length,
+ { "Field Length", "bittorrent.length", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_prot_name_len,
+ { "Protocol Name Length", "bittorrent.protocol.name.length", FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_prot_name,
+ { "Protocol Name", "bittorrent.protocol.name", FT_STRING, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_reserved,
+ { "Reserved Extension Bytes", "bittorrent.reserved", FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_sha1_hash,
+ { "SHA1 Hash of info dictionary", "bittorrent.info_hash", FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_peer_id,
+ { "Peer ID", "bittorrent.peer_id", FT_BYTES, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_msg_len,
+ { "Message Length", "bittorrent.msg.length", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_msg_type,
+ { "Message Type", "bittorrent.msg.type", FT_UINT8, BASE_DEC, VALS(bittorrent_messages), 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_bitfield_data,
+ { "Bitfield data", "bittorrent.msg.bitfield", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_piece_index,
+ { "Piece index", "bittorrent.piece.index", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_piece_begin,
+ { "Begin offset of piece", "bittorrent.piece.begin", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_piece_data,
+ { "Data in a piece", "bittorrent.piece.data", FT_BYTES, BASE_HEX, NULL, 0x0, "", HFILL }
+ },
+ { &hf_bittorrent_piece_length,
+ { "Piece Length", "bittorrent.piece.length", FT_UINT32, BASE_HEX, NULL, 0x0, "", HFILL }
+ }
};
static gint *ett[] = {
&ett_bittorrent,
- &ett_bittorrent_msg,
+ &ett_bittorrent_msg,
+ &ett_peer_id
};
module_t *bittorrent_module;
@@ -297,13 +390,16 @@ proto_register_bittorrent(void)
"Whether the BitTorrent dissector should reassemble messages spanning multiple TCP segments."
" To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
&bittorrent_desegment);
+ prefs_register_bool_preference(bittorrent_module, "decode_client",
+ "Decode the peer_id of the handshake messages",
+ "Enabling this will tell which BitTorrent client that produced the handshake message",
+ &decode_client_information);
}
void
proto_reg_handoff_bittorrent(void)
{
- register_dissector("bittorrent", dissect_bittorrent, proto_bittorrent);
- bittorrent_handle = find_dissector("bittorrent");
- heur_dissector_add("tcp", test_bittorrent_packet, proto_bittorrent);
+ dissector_handle = create_dissector_handle(dissect_bittorrent, proto_bittorrent);
+ heur_dissector_add("tcp", test_bittorrent_packet, proto_bittorrent);
}