MCPC_dissect/protocol_tree.c

117 lines
4.2 KiB
C

#include "protocol_constants.h"
#include "protocol_tree.h"
#include "protocol_tree_internal.h"
#include "protocol.h"
void tree_server_slp(proto_tree *packet_tree, tvbuff_t *tvb, packet_info *pinfo _U_, const void *data, guint length){
uint32_t varint;
int8_t varlen;
varlen=VarIntToUint(data, &varint, length);//PacketID
if(varlen>0){
proto_item_append_text(proto_tree_get_parent(proto_tree_get_parent_tree(packet_tree)), ", PID: 0x%X", varint);
proto_tree_add_uint(packet_tree, hf_protocol_packetid_sb_slp, tvb, 0, varlen, varint);
}
}
void tree_client_slp(proto_tree *packet_tree, tvbuff_t *tvb, packet_info *pinfo _U_, const void *data, guint length){
guint readed;
uint32_t varint;
int8_t varlen;
readed=varlen=VarIntToUint(data, &varint, length);//PacketID
if(varlen>0){
proto_item_append_text(proto_tree_get_parent(proto_tree_get_parent_tree(packet_tree)), ", PID: 0x%X", varint);
proto_tree_add_uint(packet_tree, hf_protocol_packetid_cb_slp, tvb, 0, varlen, varint);
switch(varint){
case 0x00:
varlen=VarIntToUint(data+readed, &varint, length-readed);//String length
proto_tree_add_uint(packet_tree, hf_string_length, tvb, readed, varlen, varint);
readed+=varlen;
gchar *addr=wmem_alloc(pinfo->pool, varint+1);
memcpy(addr, data+readed, varint);
addr[varint]=0x00;
readed+=varint;
proto_item_set_text(
proto_tree_add_item(packet_tree, hf_server_address, tvb, readed-varint, varint+2, FALSE),
"Response: %s:%hu", addr, g_ntohs(*(uint16_t*)(data+readed)));
break;
}
}
}
void tree_server_login(proto_tree *packet_tree, tvbuff_t *tvb, packet_info *pinfo, const void *data, guint length){
guint readed;
uint32_t varint;
int8_t varlen;
readed=varlen=VarIntToUint(data, &varint, length);//PacketID
if(varlen>0){
proto_item_append_text(proto_tree_get_parent(proto_tree_get_parent_tree(packet_tree)), ", PID: 0x%X", varint);
proto_tree_add_uint(packet_tree, hf_protocol_packetid_sb_login, tvb, 0, varlen, varint);
switch(varint){
case PID_SB_LOGIN_START:
STR_TO_TREE(hf_player_name);
break;
}
}
}
void tree_client_login(proto_tree *packet_tree, tvbuff_t *tvb, packet_info *pinfo, const void *data, guint length){
guint readed;
uint32_t varint;
int8_t varlen;
readed=varlen=VarIntToUint(data, &varint, length);//PacketID
if(varlen>0){
proto_item_append_text(proto_tree_get_parent(proto_tree_get_parent_tree(packet_tree)), ", PID: 0x%X", varint);
proto_tree_add_uint(packet_tree, hf_protocol_packetid_cb_login, tvb, 0, varlen, varint);
switch(varint){
case PID_CB_LOGIN_SUCCESS:
varlen=VarIntToUint(data+readed, &varint, length);//String length
STR_TO_TREE(hf_uuid);
STR_TO_TREE(hf_player_name);
break;
case PID_CB_LOGIN_SET_COMPRESSION:
varlen=VarIntToUint(data+readed, &varint, length);//Threshold
proto_tree_add_int(packet_tree, hf_compression_trxld, tvb, readed, varlen, (int32_t)varint);
break;
}
}
}
void tree_server_handshake(proto_tree *packet_tree, tvbuff_t *tvb, packet_info *pinfo _U_, const void *data, guint length){
guint readed;
uint32_t varint;
int8_t varlen;
readed=varlen=VarIntToUint(data, &varint, length);//PacketID
if(varlen>0){
proto_item_append_text(proto_tree_get_parent(proto_tree_get_parent_tree(packet_tree)), ", PID: 0x%X", varint);
proto_tree_add_uint(packet_tree, hf_protocol_packetid_sb_hs, tvb, 0, varlen, varint);
switch(varint){
case 0x00:
varlen=VarIntToUint(data+readed, &varint, length-readed);//Protocol version
proto_tree_add_uint(packet_tree, hf_protocol_version, tvb, readed, varlen, varint);
readed+=varlen;
varlen=VarIntToUint(data+readed, &varint, length-readed);//String length
proto_tree_add_uint(packet_tree, hf_string_length, tvb, readed, varlen, varint);
readed+=varlen;
gchar *addr=wmem_alloc(pinfo->pool, varint+1);
memcpy(addr, data+readed, varint);
addr[varint]=0x00;
readed+=varint;
proto_item_set_text(
proto_tree_add_item(packet_tree, hf_server_address, tvb, readed-varint, varint+2, FALSE),
"Address: %s:%hu", addr, be16toh(*(uint16_t*)(data+readed)));
readed+=2;//Skip short
varlen=VarIntToUint(data+readed, &varint, length-readed);//Next State
proto_tree_add_uint(packet_tree, hf_hs_next_state, tvb, readed, varlen, varint);
break;
}
}
return;
}