updates to the ctdb dissector to follow the latest protocol

svn path=/trunk/; revision=21646
This commit is contained in:
Ronnie Sahlberg 2007-05-02 13:32:07 +00:00
parent cd06093bcc
commit 46602a91ae
1 changed files with 180 additions and 59 deletions

View File

@ -62,6 +62,12 @@ static int hf_ctdb_request_in = -1;
static int hf_ctdb_response_in = -1; static int hf_ctdb_response_in = -1;
static int hf_ctdb_time = -1; static int hf_ctdb_time = -1;
static int hf_ctdb_xid = -1; static int hf_ctdb_xid = -1;
static int hf_ctdb_generation = -1;
static int hf_ctdb_hopcount = -1;
static int hf_ctdb_rsn = -1;
static int hf_ctdb_ctrl_opcode = -1;
static int hf_ctdb_srvid = -1;
static int hf_ctdb_ctrl_flags = -1;
/* Initialize the subtree pointers */ /* Initialize the subtree pointers */
static gint ett_ctdb = -1; static gint ett_ctdb = -1;
@ -79,23 +85,73 @@ typedef struct _ctdb_trans_t {
#define CTDB_REQ_CALL 0 #define CTDB_REQ_CALL 0
#define CTDB_REPLY_CALL 1 #define CTDB_REPLY_CALL 1
#define CTDB_REPLY_REDIRECT 2 #define CTDB_REQ_DMASTER 2
#define CTDB_REQ_DMASTER 3 #define CTDB_REPLY_DMASTER 3
#define CTDB_REPLY_DMASTER 4 #define CTDB_REPLY_ERROR 4
#define CTDB_REPLY_ERROR 5 #define CTDB_REQ_MESSAGE 5
#define CTDB_REQ_MESSAGE 6 #define CTDB_REQ_FINISHED 6
#define CTDB_REQ_CONTROL 7
#define CTDB_REPLY_CONTROL 8
static const value_string ctdb_opcodes[] = { static const value_string ctdb_opcodes[] = {
{CTDB_REQ_CALL, "CTDB_REQ_CALL"}, {CTDB_REQ_CALL, "CTDB_REQ_CALL"},
{CTDB_REPLY_CALL, "CTDB_REPLY_CALL"}, {CTDB_REPLY_CALL, "CTDB_REPLY_CALL"},
{CTDB_REPLY_REDIRECT, "CTDB_REPLY_REDIRECT"},
{CTDB_REQ_DMASTER, "CTDB_REQ_DMASTER"}, {CTDB_REQ_DMASTER, "CTDB_REQ_DMASTER"},
{CTDB_REPLY_DMASTER, "CTDB_REPLY_DMASTER"}, {CTDB_REPLY_DMASTER, "CTDB_REPLY_DMASTER"},
{CTDB_REPLY_ERROR, "CTDB_REPLY_ERROR"}, {CTDB_REPLY_ERROR, "CTDB_REPLY_ERROR"},
{CTDB_REQ_MESSAGE, "CTDB_REQ_MESSAGE"}, {CTDB_REQ_MESSAGE, "CTDB_REQ_MESSAGE"},
{CTDB_REQ_FINISHED, "CTDB_REQ_FINISHED"},
{CTDB_REQ_CONTROL, "CTDB_REQ_CONTROL"},
{CTDB_REPLY_CONTROL, "CTDB_REPLY_CONTROL"},
{0,NULL} {0,NULL}
}; };
#define CTDB_CONTROL_PROCESS_EXISTS 0
#define CTDB_CONTROL_STATUS 1
#define CTDB_CONTROL_CONFIG 2
#define CTDB_CONTROL_PING 3
#define CTDB_CONTROL_GETDBPATH 4
#define CTDB_CONTROL_GETVNNMAP 5
#define CTDB_CONTROL_SETVNNMAP 6
#define CTDB_CONTROL_GET_DEBUG 7
#define CTDB_CONTROL_SET_DEBUG 8
#define CTDB_CONTROL_GET_DBMAP 9
#define CTDB_CONTROL_GET_NODEMAP 10
#define CTDB_CONTROL_SET_DMASTER 11
#define CTDB_CONTROL_CLEAR_DB 12
#define CTDB_CONTROL_PULL_DB 13
#define CTDB_CONTROL_PUSH_DB 14
#define CTDB_CONTROL_GET_RECMODE 15
#define CTDB_CONTROL_SET_RECMODE 16
#define CTDB_CONTROL_STATUS_RESET 17
#define CTDB_CONTROL_DB_ATTACH 18
#define CTDB_CONTROL_SET_CALL 19
#define CTDB_CONTROL_WRITE_RECORD 20
static const value_string ctrl_opcode_vals[] = {
{CTDB_CONTROL_PROCESS_EXISTS,"CTDB_CONTROL_PROCESS_EXISTS"},
{CTDB_CONTROL_STATUS, "CTDB_CONTROL_STATUS"},
{CTDB_CONTROL_CONFIG, "CTDB_CONTROL_CONFIG"},
{CTDB_CONTROL_PING, "CTDB_CONTROL_PING"},
{CTDB_CONTROL_GETDBPATH, "CTDB_CONTROL_GETDBPATH"},
{CTDB_CONTROL_GETVNNMAP, "CTDB_CONTROL_GETVNNMAP"},
{CTDB_CONTROL_SETVNNMAP, "CTDB_CONTROL_SETVNNMAP"},
{CTDB_CONTROL_GET_DEBUG, "CTDB_CONTROL_GET_DEBUG"},
{CTDB_CONTROL_SET_DEBUG, "CTDB_CONTROL_SET_DEBUG"},
{CTDB_CONTROL_GET_DBMAP, "CTDB_CONTROL_GET_DBMAP"},
{CTDB_CONTROL_GET_NODEMAP, "CTDB_CONTROL_GET_NODEMAP"},
{CTDB_CONTROL_SET_DMASTER, "CTDB_CONTROL_SET_DMASTER"},
{CTDB_CONTROL_CLEAR_DB, "CTDB_CONTROL_CLEAR_DB"},
{CTDB_CONTROL_PULL_DB, "CTDB_CONTROL_PULL_DB"},
{CTDB_CONTROL_PUSH_DB, "CTDB_CONTROL_PUSH_DB"},
{CTDB_CONTROL_GET_RECMODE, "CTDB_CONTROL_GET_RECMODE"},
{CTDB_CONTROL_SET_RECMODE, "CTDB_CONTROL_SET_RECMODE"},
{CTDB_CONTROL_STATUS_RESET, "CTDB_CONTROL_STATUS_RESET"},
{CTDB_CONTROL_DB_ATTACH, "CTDB_CONTROL_DB_ATTACH"},
{CTDB_CONTROL_SET_CALL, "CTDB_CONTROL_SET_CALL"},
{CTDB_CONTROL_WRITE_RECORD, "CTDB_CONTROL_WRITE_RECORD"},
{0, NULL}
};
static void static void
ctdb_display_trans(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, ctdb_trans_t *ctdb_trans) ctdb_display_trans(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, ctdb_trans_t *ctdb_trans)
{ {
@ -166,26 +222,12 @@ dissect_ctdb_key(proto_tree *tree, tvbuff_t *tvb, int offset, guint32 keylen, gu
static int static int
dissect_ctdb_reply_call(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int endianess) dissect_ctdb_reply_call(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, int endianess)
{ {
uint32_t datalen;
/* status */ /* status */
proto_tree_add_item(tree, hf_ctdb_status, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_status, tvb, offset, 4, endianess);
offset+=4; offset+=4;
/* datalen */
proto_tree_add_item(tree, hf_ctdb_datalen, tvb, offset, 4, endianess);
offset+=4;
/* data */
return offset;
}
static int
dissect_ctdb_reply_dmaster(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint32 reqid, guint32 dst, int endianess)
{
guint32 datalen;
emem_tree_key_t tkey[3];
ctdb_trans_t *ctdb_trans;
/* datalen */ /* datalen */
proto_tree_add_item(tree, hf_ctdb_datalen, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_datalen, tvb, offset, 4, endianess);
if(endianess){ if(endianess){
@ -199,6 +241,50 @@ dissect_ctdb_reply_dmaster(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, pr
proto_tree_add_item(tree, hf_ctdb_data, tvb, offset, datalen, endianess); proto_tree_add_item(tree, hf_ctdb_data, tvb, offset, datalen, endianess);
offset+=datalen; offset+=datalen;
return offset;
}
static int
dissect_ctdb_reply_dmaster(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint32 reqid, guint32 dst, int endianess)
{
guint32 datalen, keylen;
emem_tree_key_t tkey[3];
ctdb_trans_t *ctdb_trans;
/* dbid */
proto_tree_add_item(tree, hf_ctdb_dbid, tvb, offset, 4, endianess);
offset+=4;
/* rsn */
proto_tree_add_item(tree, hf_ctdb_rsn, tvb, offset, 8, endianess);
offset+=8;
/* keylen */
proto_tree_add_item(tree, hf_ctdb_keylen, tvb, offset, 4, endianess);
if(endianess){
keylen=tvb_get_letohl(tvb, offset);
} else {
keylen=tvb_get_ntohl(tvb, offset);
}
offset+=4;
/* datalen */
proto_tree_add_item(tree, hf_ctdb_datalen, tvb, offset, 4, endianess);
if(endianess){
datalen=tvb_get_letohl(tvb, offset);
} else {
datalen=tvb_get_ntohl(tvb, offset);
}
offset+=4;
/* key */
offset=dissect_ctdb_key(tree, tvb, offset, keylen, NULL, endianess);
/* data */
proto_tree_add_item(tree, hf_ctdb_data, tvb, offset, datalen, endianess);
offset+=datalen;
tkey[0].length=1; tkey[0].length=1;
tkey[0].key=&reqid; tkey[0].key=&reqid;
tkey[1].length=1; tkey[1].length=1;
@ -225,6 +311,10 @@ dissect_ctdb_req_dmaster(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, prot
proto_tree_add_item(tree, hf_ctdb_dbid, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_dbid, tvb, offset, 4, endianess);
offset+=4; offset+=4;
/* rsn */
proto_tree_add_item(tree, hf_ctdb_rsn, tvb, offset, 8, endianess);
offset+=8;
/* dmaster */ /* dmaster */
proto_tree_add_item(tree, hf_ctdb_dmaster, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_dmaster, tvb, offset, 4, endianess);
if(endianess){ if(endianess){
@ -274,6 +364,40 @@ dissect_ctdb_req_dmaster(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, prot
return offset; return offset;
} }
static int
dissect_ctdb_req_control(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint32 reqid _U_, int endianess)
{
uint32_t datalen;
/* ctrl opcode */
proto_tree_add_item(tree, hf_ctdb_ctrl_opcode, tvb, offset, 4, endianess);
offset+=4;
/* srvid */
proto_tree_add_item(tree, hf_ctdb_srvid, tvb, offset, 8, endianess);
offset+=8;
/* ctrl flags */
proto_tree_add_item(tree, hf_ctdb_ctrl_flags, tvb, offset, 4, endianess);
offset+=4;
/* datalen */
proto_tree_add_item(tree, hf_ctdb_datalen, tvb, offset, 4, endianess);
if(endianess){
datalen=tvb_get_letohl(tvb, offset);
} else {
datalen=tvb_get_ntohl(tvb, offset);
}
offset+=4;
/* data */
proto_tree_add_item(tree, hf_ctdb_data, tvb, offset, datalen, endianess);
offset+=datalen;
return offset;
}
static const true_false_string flags_immediate_tfs={ static const true_false_string flags_immediate_tfs={
"DMASTER for the record must IMMEDIATELY be migrated to the caller", "DMASTER for the record must IMMEDIATELY be migrated to the caller",
"Dmaster migration is not required" "Dmaster migration is not required"
@ -308,6 +432,10 @@ dissect_ctdb_req_call(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree
proto_tree_add_item(tree, hf_ctdb_callid, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_callid, tvb, offset, 4, endianess);
offset+=4; offset+=4;
/* hopcount */
proto_tree_add_item(tree, hf_ctdb_hopcount, tvb, offset, 4, endianess);
offset+=4;
/* keylen */ /* keylen */
proto_tree_add_item(tree, hf_ctdb_keylen, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_keylen, tvb, offset, 4, endianess);
if(endianess){ if(endianess){
@ -367,39 +495,6 @@ dissect_ctdb_req_call(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree
return offset; return offset;
} }
static int
dissect_ctdb_redirect(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, guint32 reqid, guint32 dst, int endianess)
{
guint32 dmaster;
emem_tree_key_t tkey[3];
ctdb_trans_t *ctdb_trans;
/* dmaster */
proto_tree_add_item(tree, hf_ctdb_dmaster, tvb, offset, 4, endianess);
if(endianess){
dmaster=tvb_get_letohl(tvb, offset);
} else {
dmaster=tvb_get_ntohl(tvb, offset);
}
if(check_col(pinfo->cinfo, COL_INFO)){
col_append_fstr(pinfo->cinfo, COL_INFO, " Dmaster:%d", dmaster);
}
offset+=4;
tkey[0].length=1;
tkey[0].key=&reqid;
tkey[1].length=1;
tkey[1].key=&dst;
tkey[2].length=0;
ctdb_trans=se_tree_lookup32_array(ctdb_transactions, &tkey[0]);
if(ctdb_trans){
ctdb_display_trans(pinfo, tree, tvb, ctdb_trans);
}
return offset;
}
static gboolean static gboolean
dissect_ctdb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) dissect_ctdb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
{ {
@ -451,6 +546,10 @@ dissect_ctdb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
proto_tree_add_item(tree, hf_ctdb_version, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_version, tvb, offset, 4, endianess);
offset+=4; offset+=4;
/* generation */
proto_tree_add_item(tree, hf_ctdb_generation, tvb, offset, 4, endianess);
offset+=4;
/* opcode */ /* opcode */
proto_tree_add_item(tree, hf_ctdb_opcode, tvb, offset, 4, endianess); proto_tree_add_item(tree, hf_ctdb_opcode, tvb, offset, 4, endianess);
if(endianess){ if(endianess){
@ -503,9 +602,6 @@ dissect_ctdb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
case CTDB_REPLY_DMASTER: case CTDB_REPLY_DMASTER:
offset=dissect_ctdb_reply_dmaster(tvb, offset, pinfo, tree, reqid, dst, endianess); offset=dissect_ctdb_reply_dmaster(tvb, offset, pinfo, tree, reqid, dst, endianess);
break; break;
case CTDB_REPLY_REDIRECT:
offset=dissect_ctdb_redirect(tvb, offset, pinfo, tree, reqid, dst, endianess);
break;
case CTDB_REQ_DMASTER: case CTDB_REQ_DMASTER:
offset=dissect_ctdb_req_dmaster(tvb, offset, pinfo, tree, reqid, endianess); offset=dissect_ctdb_req_dmaster(tvb, offset, pinfo, tree, reqid, endianess);
break; break;
@ -513,6 +609,13 @@ dissect_ctdb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
break; break;
case CTDB_REQ_MESSAGE: case CTDB_REQ_MESSAGE:
break; break;
case CTDB_REQ_FINISHED:
break;
case CTDB_REQ_CONTROL:
offset=dissect_ctdb_req_control(tvb, offset, pinfo, tree, reqid, endianess);
break;
case CTDB_REPLY_CONTROL:
break;
}; };
return TRUE; return TRUE;
@ -568,6 +671,9 @@ proto_register_ctdb(void)
{ &hf_ctdb_dmaster, { { &hf_ctdb_dmaster, {
"Dmaster", "ctdb.dmaster", FT_UINT32, BASE_DEC, "Dmaster", "ctdb.dmaster", FT_UINT32, BASE_DEC,
NULL, 0x0, "", HFILL }}, NULL, 0x0, "", HFILL }},
{ &hf_ctdb_generation, {
"Generation", "ctdb.generation", FT_UINT32, BASE_DEC,
NULL, 0x0, "", HFILL }},
{ &hf_ctdb_key, { { &hf_ctdb_key, {
"Key", "ctdb.key", FT_BYTES, BASE_HEX, "Key", "ctdb.key", FT_BYTES, BASE_HEX,
NULL, 0x0, "", HFILL }}, NULL, 0x0, "", HFILL }},
@ -589,6 +695,21 @@ proto_register_ctdb(void)
{ &hf_ctdb_xid, { { &hf_ctdb_xid, {
"xid", "ctdb.xid", FT_UINT32, BASE_HEX, "xid", "ctdb.xid", FT_UINT32, BASE_HEX,
NULL, 0x0, "", HFILL }}, NULL, 0x0, "", HFILL }},
{ &hf_ctdb_hopcount, {
"Hopcount", "ctdb.hopcount", FT_UINT32, BASE_DEC,
NULL, 0x0, "", HFILL }},
{ &hf_ctdb_rsn, {
"RSN", "ctdb.rsn", FT_UINT64, BASE_HEX,
NULL, 0x0, "", HFILL }},
{ &hf_ctdb_ctrl_opcode, {
"CTRL Opcode", "ctdb.ctrl_opcode", FT_UINT32, BASE_DEC,
VALS(ctrl_opcode_vals), 0x0, "", HFILL }},
{ &hf_ctdb_srvid, {
"SrvId", "ctdb.srvid", FT_UINT64, BASE_HEX,
NULL, 0x0, "", HFILL }},
{ &hf_ctdb_ctrl_flags, {
"CTRL Flags", "ctdb.ctrl_flags", FT_UINT32, BASE_HEX,
NULL, 0x0, "", HFILL }},
}; };
/* Setup protocol subtree array */ /* Setup protocol subtree array */