diff options
-rw-r--r-- | epan/dissectors/packet-ncp2222.inc | 2536 |
1 files changed, 1290 insertions, 1246 deletions
diff --git a/epan/dissectors/packet-ncp2222.inc b/epan/dissectors/packet-ncp2222.inc index 2ab326d9b6..e5cc9d4c4a 100644 --- a/epan/dissectors/packet-ncp2222.inc +++ b/epan/dissectors/packet-ncp2222.inc @@ -4785,6 +4785,1185 @@ dissect_ncp_request(tvbuff_t *tvb, packet_info *pinfo, } } +static void +dissect_nds_ping_reply(tvbuff_t *tvb, packet_info *pinfo _U_, + proto_tree *ncp_tree, ncp_req_hash_value *request_value) +{ + nw_uni_t reply_buffer; + guint8 ping_version; + guint32 nds_string_len; + guint32 nds_offset; + guint32 bvalue; + guint32 nds_flags; + nds_val pvalues[9]; + int i; + + strcpy(reply_buffer.buffer, ""); + + ping_version = tvb_get_guint8(tvb, 8); + proto_tree_add_item(ncp_tree, hf_ping_version, tvb, 8, 1, TRUE); + if (ping_version == 9) { + nds_string_len = tvb_get_ntohl(tvb, 9); + nds_offset = nds_string_len+16; + tvb_ensure_bytes_exist(tvb, 16, nds_string_len); + proto_tree_add_item(ncp_tree, hf_nds_tree_name, tvb, 16, nds_string_len, FALSE); + proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, FALSE); + proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, (nds_offset+4), 4, FALSE); + proto_tree_add_item(ncp_tree, hf_nds_reply_flags, tvb, (nds_offset+8), 4, TRUE); + } + else { + nds_offset = 12; + nds_flags = request_value->req_nds_flags; + bvalue = 0x00000001; + + for (i = 0 ; i < 32; i++ ) { + if (nds_flags & bvalue) + { + switch(bvalue) + { + case 0x00000001: /* Supported Fields */ + pvalues[0].vvalue = tvb_get_letohs(tvb, nds_offset); + pvalues[0].vtype = VTYPE_BITFIELD; + pvalues[0].vstring = ""; + pvalues[0].vdesc = "Ping (low) Supported Fields:"; + pvalues[0].vlength = 2; + pvalues[0].hfname= hf_nds_rflags; + pvalues[0].voffset = nds_offset; + pvalues[0].bit1 = "Supported Fields"; + pvalues[0].bit1hfname = hf_bit1pingflags1; + pvalues[0].bit2 = "Depth"; + pvalues[0].bit2hfname = hf_bit2pingflags1; + pvalues[0].bit3 = "Revision"; + pvalues[0].bit3hfname = hf_bit3pingflags1; + pvalues[0].bit4 = "Flags"; + pvalues[0].bit4hfname = hf_bit4pingflags1; + pvalues[0].bit5 = "Verification Flags"; + pvalues[0].bit5hfname = hf_bit5pingflags1; + pvalues[0].bit6 = "Letter Version"; + pvalues[0].bit6hfname = hf_bit6pingflags1; + pvalues[0].bit7 = "OS Version"; + pvalues[0].bit7hfname = hf_bit7pingflags1; + pvalues[0].bit8 = "License Flags"; + pvalues[0].bit8hfname = hf_bit8pingflags1; + pvalues[0].bit9 = "DS Time"; + pvalues[0].bit9hfname = hf_bit9pingflags1; + pvalues[0].bit10 = "Not Defined"; + pvalues[0].bit10hfname = hf_bit10pingflags1; + pvalues[0].bit11 = "Not Defined"; + pvalues[0].bit11hfname = hf_bit11pingflags1; + pvalues[0].bit12 = "Not Defined"; + pvalues[0].bit12hfname = hf_bit12pingflags1; + pvalues[0].bit13 = "Not Defined"; + pvalues[0].bit13hfname = hf_bit13pingflags1; + pvalues[0].bit14 = "Not Defined"; + pvalues[0].bit14hfname = hf_bit14pingflags1; + pvalues[0].bit15 = "Not Defined"; + pvalues[0].bit15hfname = hf_bit15pingflags1; + pvalues[0].bit16 = "Not Defined"; + pvalues[0].bit16hfname = hf_bit16pingflags1; + + process_bitfield(ncp_tree, tvb, &pvalues[0]); + nds_offset += 2; + + pvalues[0].vvalue = tvb_get_letohs(tvb, nds_offset); + pvalues[0].vtype = VTYPE_BITFIELD; + pvalues[0].vstring = ""; + pvalues[0].vdesc = "Ping (high) Supported Fields:"; + pvalues[0].vlength = 2; + pvalues[0].hfname= hf_nds_rflags; + pvalues[0].voffset = nds_offset; + pvalues[0].bit1 = "Sap Name"; + pvalues[0].bit1hfname = hf_bit1pingflags2; + pvalues[0].bit2 = "Tree Name"; + pvalues[0].bit2hfname = hf_bit2pingflags2; + pvalues[0].bit3 = "OS Name"; + pvalues[0].bit3hfname = hf_bit3pingflags2; + pvalues[0].bit4 = "Hardware Name"; + pvalues[0].bit4hfname = hf_bit4pingflags2; + pvalues[0].bit5 = "Vendor Name"; + pvalues[0].bit5hfname = hf_bit5pingflags2; + pvalues[0].bit6 = "Not Defined"; + pvalues[0].bit6hfname = hf_bit6pingflags2; + pvalues[0].bit7 = "Not Defined"; + pvalues[0].bit7hfname = hf_bit7pingflags2; + pvalues[0].bit8 = "Not Defined"; + pvalues[0].bit8hfname = hf_bit8pingflags2; + pvalues[0].bit9 = "Not Defined"; + pvalues[0].bit9hfname = hf_bit9pingflags2; + pvalues[0].bit10 = "Not Defined"; + pvalues[0].bit10hfname = hf_bit10pingflags2; + pvalues[0].bit11 = "Not Defined"; + pvalues[0].bit11hfname = hf_bit11pingflags2; + pvalues[0].bit12 = "Not Defined"; + pvalues[0].bit12hfname = hf_bit12pingflags2; + pvalues[0].bit13 = "Not Defined"; + pvalues[0].bit13hfname = hf_bit13pingflags2; + pvalues[0].bit14 = "Not Defined"; + pvalues[0].bit14hfname = hf_bit14pingflags2; + pvalues[0].bit15 = "Not Defined"; + pvalues[0].bit15hfname = hf_bit15pingflags2; + pvalues[0].bit16 = "Not Defined"; + pvalues[0].bit16hfname = hf_bit16pingflags2; + + process_bitfield(ncp_tree, tvb, &pvalues[0]); + nds_offset += 2; + break; + case 0x00000002: + proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, TRUE); + nds_offset += 4; + break; + case 0x00000004: + proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, nds_offset, 4, TRUE); + nds_offset += 4; + break; + case 0x00000008: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_BITFIELD; + pvalues[0].vstring = ""; + pvalues[0].vdesc = "Ping Flags:"; + pvalues[0].vlength = 4; + pvalues[0].hfname= hf_nds_rflags; + pvalues[0].voffset = nds_offset; + pvalues[0].bit1 = "Root Most Master Replica"; + pvalues[0].bit1hfname = hf_bit1pingpflags1; + pvalues[0].bit2 = "Time Synchronized"; + pvalues[0].bit2hfname = hf_bit2pingpflags1; + pvalues[0].bit3 = "Not Defined"; + pvalues[0].bit3hfname = hf_bit3pingpflags1; + pvalues[0].bit4 = "Not Defined"; + pvalues[0].bit4hfname = hf_bit4pingpflags1; + pvalues[0].bit5 = "Not Defined"; + pvalues[0].bit5hfname = hf_bit5pingpflags1; + pvalues[0].bit6 = "Not Defined"; + pvalues[0].bit6hfname = hf_bit6pingpflags1; + pvalues[0].bit7 = "Not Defined"; + pvalues[0].bit7hfname = hf_bit7pingpflags1; + pvalues[0].bit8 = "Not Defined"; + pvalues[0].bit8hfname = hf_bit8pingpflags1; + pvalues[0].bit9 = "Not Defined"; + pvalues[0].bit9hfname = hf_bit9pingpflags1; + pvalues[0].bit10 = "Not Defined"; + pvalues[0].bit10hfname = hf_bit10pingpflags1; + pvalues[0].bit11 = "Not Defined"; + pvalues[0].bit11hfname = hf_bit11pingpflags1; + pvalues[0].bit12 = "Not Defined"; + pvalues[0].bit12hfname = hf_bit12pingpflags1; + pvalues[0].bit13 = "Not Defined"; + pvalues[0].bit13hfname = hf_bit13pingpflags1; + pvalues[0].bit14 = "Not Defined"; + pvalues[0].bit14hfname = hf_bit14pingpflags1; + pvalues[0].bit15 = "Not Defined"; + pvalues[0].bit15hfname = hf_bit15pingpflags1; + pvalues[0].bit16 = "Not Defined"; + pvalues[0].bit16hfname = hf_bit16pingpflags1; + + process_bitfield(ncp_tree, tvb, &pvalues[0]); + nds_offset += 4; + break; + case 0x00000010: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_BITFIELD; + pvalues[0].vstring = ""; + pvalues[0].vdesc = "Verification Flags:"; + pvalues[0].vlength = 4; + pvalues[0].hfname= hf_nds_rflags; + pvalues[0].voffset = nds_offset; + pvalues[0].bit1 = "Checksum"; + pvalues[0].bit1hfname = hf_bit1pingvflags1; + pvalues[0].bit2 = "CRC32"; + pvalues[0].bit2hfname = hf_bit2pingvflags1; + pvalues[0].bit3 = "Not Defined"; + pvalues[0].bit3hfname = hf_bit3pingvflags1; + pvalues[0].bit4 = "Not Defined"; + pvalues[0].bit4hfname = hf_bit4pingvflags1; + pvalues[0].bit5 = "Not Defined"; + pvalues[0].bit5hfname = hf_bit5pingvflags1; + pvalues[0].bit6 = "Not Defined"; + pvalues[0].bit6hfname = hf_bit6pingvflags1; + pvalues[0].bit7 = "Not Defined"; + pvalues[0].bit7hfname = hf_bit7pingvflags1; + pvalues[0].bit8 = "Not Defined"; + pvalues[0].bit8hfname = hf_bit8pingvflags1; + pvalues[0].bit9 = "Not Defined"; + pvalues[0].bit9hfname = hf_bit9pingvflags1; + pvalues[0].bit10 = "Not Defined"; + pvalues[0].bit10hfname = hf_bit10pingvflags1; + pvalues[0].bit11 = "Not Defined"; + pvalues[0].bit11hfname = hf_bit11pingvflags1; + pvalues[0].bit12 = "Not Defined"; + pvalues[0].bit12hfname = hf_bit12pingvflags1; + pvalues[0].bit13 = "Not Defined"; + pvalues[0].bit13hfname = hf_bit13pingvflags1; + pvalues[0].bit14 = "Not Defined"; + pvalues[0].bit14hfname = hf_bit14pingvflags1; + pvalues[0].bit15 = "Not Defined"; + pvalues[0].bit15hfname = hf_bit15pingvflags1; + pvalues[0].bit16 = "Not Defined"; + pvalues[0].bit16hfname = hf_bit16pingvflags1; + + process_bitfield(ncp_tree, tvb, &pvalues[0]); + nds_offset += 4; + break; + case 0x00000020: + proto_tree_add_item(ncp_tree, hf_nds_letter_ver, tvb, nds_offset, 4, TRUE); + nds_offset += 4; + break; + case 0x00000040: + proto_tree_add_item(ncp_tree, hf_nds_os_ver, tvb, nds_offset, 4, TRUE); + nds_offset += 4; + break; + case 0x00000080: + proto_tree_add_item(ncp_tree, hf_nds_lic_flags, tvb, nds_offset, 4, TRUE); + nds_offset += 4; + break; + case 0x00000100: + proto_tree_add_item(ncp_tree, hf_nds_ds_time, tvb, nds_offset, 4, TRUE); + nds_offset += 4; + break; + case 0x00010000: + nds_string_len = tvb_get_letohl(tvb, nds_offset); + nds_offset += 4; + get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); + tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); + proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "SAP Name: %s", reply_buffer.buffer); + nds_offset += nds_string_len; + nds_offset += align_4(tvb, nds_offset); + nds_offset += 2; + break; + case 0x00020000: + nds_string_len = tvb_get_letohl(tvb, nds_offset); + nds_offset += 4; + get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); + tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); + proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "NDS Tree Name: %s", reply_buffer.buffer); + nds_offset += nds_string_len; + nds_offset += align_4(tvb, nds_offset); + break; + case 0x00040000: + nds_string_len = tvb_get_letohl(tvb, nds_offset); + nds_offset += 4; + get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); + tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); + proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "OS Name: %s", reply_buffer.buffer); + nds_offset += nds_string_len; + nds_offset += align_4(tvb, nds_offset); + break; + case 0x00080000: + nds_string_len = tvb_get_letohl(tvb, nds_offset); + nds_offset += 4; + get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); + tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); + proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "Hardware Name: %s", reply_buffer.buffer); + nds_offset += nds_string_len; + nds_offset += align_4(tvb, nds_offset); + break; + case 0x00100000: + nds_string_len = tvb_get_letohl(tvb, nds_offset); + nds_offset += 4; + get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); + tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); + proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "Vendor Name: %s", reply_buffer.buffer); + nds_offset += nds_string_len; + nds_offset += align_4(tvb, nds_offset); + break; + case 0x00000200: + /* Not Defined */ + case 0x00000400: + /* Not Defined */ + case 0x00000800: + /* Not Defined */ + case 0x00001000: + /* Not Defined */ + case 0x00002000: + /* Not Defined */ + case 0x00004000: + /* Not Defined */ + case 0x00008000: + /* Not Defined */ + case 0x00200000: + /* Not Defined */ + case 0x00400000: + /* Not Defined */ + case 0x00800000: + /* Not Defined */ + case 0x01000000: + /* Not Defined */ + case 0x02000000: + /* Not Defined */ + case 0x04000000: + /* Not Defined */ + case 0x08000000: + /* Not Defined */ + case 0x10000000: + /* Not Defined */ + case 0x20000000: + /* Not Defined */ + case 0x40000000: + /* Not Defined */ + case 0x80000000: + /* Not Defined */ + default: + break; + } + } + bvalue = bvalue*2; + } + } +} + +static void +dissect_nds_reply(tvbuff_t *tvb, packet_info *pinfo, + proto_tree *ncp_tree, guint32 nds_error_code, + const char *nds_error_string, ncp_req_hash_value *request_value, + conversation_t *conversation) +{ + guint32 nds_offset; + guint32 nds_reply_buffer; + guint32 nds_frag; + const char *verb_string; + nds_val pvalues[9]; + char string_buffer[9][1024]; + gboolean resolve_eid=FALSE; + guint32 global_eid=0; + gboolean add_eid = FALSE; + char global_object_name[256]; + ncp_req_eid_hash_value *request_eid_value = NULL; + int i; + + strcpy(global_object_name, ""); + + nds_offset = 8; + + nds_reply_buffer = tvb_get_letohl(tvb, nds_offset); + proto_tree_add_uint(ncp_tree, hf_ncp_fragment_size, tvb, nds_offset, + 4, nds_reply_buffer); + nds_offset += 4; + nds_frag = tvb_get_letohl(tvb, nds_offset); + proto_tree_add_uint(ncp_tree, hf_ncp_fragment_handle, tvb, nds_offset, + 4, nds_frag); + nds_offset += 4; + /* + * Is the possibly-reassembled reply large enough to have a completion + * code? (We can't check the fragment size as this might just be the + * last fragment.) + */ + if (tvb_reported_length_remaining(tvb, nds_offset) >= 4) + { + /* Yes - process the completion code. */ + expert_item = proto_tree_add_uint_format(ncp_tree, hf_nds_reply_error, tvb, nds_offset, + 4, nds_error_code, "NDS Completion Code: 0x%08x, %s", + nds_error_code, nds_error_string); + + if (nds_error_code != 0) { + expert_add_info_format(pinfo, expert_item, PI_RESPONSE_CODE, PI_ERROR, "NDS Error: 0x%08x %s", nds_error_code, nds_error_string); + } + } + if (request_value && nds_error_code == 0x00000000) + { + nds_offset = 20; + for (i = 0; i < 9; i++) { + pvalues[i].vtype = 0; + pvalues[i].vvalue = 0; + pvalues[i].vlength = 0; + pvalues[i].voffset = 0; + pvalues[i].hfname = 0; + pvalues[i].vdesc = ""; + string_buffer[i][0] = '\0'; + pvalues[i].vstring = string_buffer[i]; + pvalues[i].mvtype = 0; + } + verb_string = val_to_str(request_value->nds_request_verb, + ncp_nds_verb_vals, "Continuation Fragment"); + switch (request_value->nds_request_verb) + { + case 0x01: + if(request_value->nds_version < 2) + { + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vstring = (char *)match_strval(pvalues[0].vvalue, nds_tags); + if(pvalues[0].vstring == NULL) + { + pvalues[0].vstring = "No Tags Set"; + } + pvalues[0].vtype = VTYPE_STRING; + pvalues[0].vdesc = "Tag: %s"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_tag_string; + nds_offset = nds_offset+pvalues[0].vlength; + switch(pvalues[0].vvalue) + { + case NDS_TAG_NO_SUCH_ENTRY: + break; + case NDS_TAG_LOCAL_ENTRY: + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_UINT32; + pvalues[1].vdesc = "Entry ID: 0x%08x"; + add_eid = TRUE; + strcpy(global_object_name, request_value->object_name); + global_eid = pvalues[1].vvalue; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Referral Records: %u"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_referrals; + pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; + break; + case NDS_TAG_REMOTE_ENTRY: + nds_offset += 4; /* GUINT32 reserved field */ + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_UINT32; + pvalues[1].vdesc = "Entry ID: 0x%08x"; + add_eid = TRUE; + global_eid = pvalues[1].vvalue; + strcpy(global_object_name, request_value->object_name); + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Referral Records: %u"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_referrals; + pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; + break; + case NDS_TAG_ALIAS_ENTRY: + pvalues[1].vtype = VTYPE_STRING; + pvalues[1].vdesc = "Alias Name: %s"; + pvalues[1].mvtype = MVTYPE_ATTR_REQUEST; + pvalues[1].vvalue = 0; + pvalues[1].vlength = 256; + pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset); + if (pvalues[1].vlength == 0x00) + { + pvalues[1].vtype = VTYPE_NONE; + break; + } + pvalues[1].voffset = nds_offset+4; + nds_offset += 4; + get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring); + nds_offset += pvalues[1].vlength; + nds_offset += align_4(tvb, nds_offset); + pvalues[1].hfname= hf_nds_name; + break; + case NDS_TAG_REFERRAL_INFORMATION: + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_UINT32; + pvalues[1].vdesc = "Distance Object is From Root: 0x%08x"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Referral Records: %u"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_depth; + pvalues[2].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; + break; + case NDS_TAG_ENTRY_AND_REFERRALS: + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_UINT32; + pvalues[1].vdesc = "Result Flags: 0x%08x"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_result_flags; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_UINT32; + pvalues[2].vdesc = "Entry ID: 0x%08x"; + add_eid = TRUE; + global_eid = pvalues[2].vvalue; + strcpy(global_object_name, request_value->object_name); + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[2].vlength; + pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[3].vdesc = "Referral Records: %u"; + pvalues[3].vlength = 4; + pvalues[3].voffset = nds_offset; + pvalues[3].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; + pvalues[3].hfname = hf_nds_referrals; + break; + default: + break; + } + } + else + { + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "CRC: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_crc; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vstring = (char *)match_strval(pvalues[1].vvalue, nds_tags); + if(pvalues[1].vstring == NULL) + { + pvalues[1].vstring = "No Tags Set"; + } + pvalues[1].vtype = VTYPE_STRING; + pvalues[1].vdesc = "Tag: %s"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[1].hfname = hf_nds_tag_string; + switch(pvalues[1].vvalue) + { + case NDS_TAG_NO_SUCH_ENTRY: + break; + case NDS_TAG_LOCAL_ENTRY: + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_UINT32; + pvalues[2].vdesc = "Entry ID: 0x%08x"; + add_eid = TRUE; + global_eid = pvalues[2].vvalue; + strcpy(global_object_name, request_value->object_name); + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[2].vlength; + pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[3].vdesc = "Referral Records: %u"; + pvalues[3].vlength = 4; + pvalues[3].voffset = nds_offset; + pvalues[3].hfname = hf_nds_referrals; + pvalues[3].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; + break; + case NDS_TAG_REMOTE_ENTRY: + nds_offset += 4; /* GUINT32 reserved field */ + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + add_eid = TRUE; + global_eid = pvalues[2].vvalue; + strcpy(global_object_name, request_value->object_name); + pvalues[2].vtype = VTYPE_UINT32; + pvalues[2].vdesc = "Entry ID: 0x%08x"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[2].vlength; + pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[3].vdesc = "Referral Records: %u"; + pvalues[3].vlength = 4; + pvalues[3].voffset = nds_offset; + pvalues[3].hfname = hf_nds_referrals; + pvalues[3].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; + break; + case NDS_TAG_ALIAS_ENTRY: + pvalues[2].vtype = VTYPE_STRING; + pvalues[2].vdesc = "Alias Name: %s"; + pvalues[2].mvtype = MVTYPE_ATTR_REQUEST; + pvalues[2].vvalue = 0; + pvalues[2].vlength = 256; + pvalues[2].vlength = tvb_get_letohl(tvb, nds_offset); + if (pvalues[2].vlength == 0x00) + { + pvalues[2].vtype = VTYPE_NONE; + break; + } + pvalues[2].voffset = nds_offset+4; + nds_offset += 4; + get_string(tvb, pvalues[2].voffset, pvalues[2].vlength, pvalues[2].vstring); + nds_offset += pvalues[2].vlength; + nds_offset += align_4(tvb, nds_offset); + pvalues[2].hfname= hf_nds_name; + break; + case NDS_TAG_REFERRAL_INFORMATION: + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_UINT32; + pvalues[2].vdesc = "Distance Object is From Root: 0x%08x"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[2].vlength; + pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[3].vdesc = "Referral Records: %u"; + pvalues[3].vlength = 4; + pvalues[3].voffset = nds_offset; + pvalues[3].hfname = hf_nds_depth; + pvalues[3].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; + break; + case NDS_TAG_ENTRY_AND_REFERRALS: + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_UINT32; + pvalues[2].vdesc = "Result Flags: 0x%08x"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_result_flags; + nds_offset = nds_offset+pvalues[2].vlength; + pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[3].vtype = VTYPE_UINT32; + pvalues[3].vdesc = "Entry ID: 0x%08x"; + add_eid = TRUE; + strcpy(global_object_name, request_value->object_name); + global_eid = pvalues[3].vvalue; + pvalues[3].vlength = 4; + pvalues[3].voffset = nds_offset; + pvalues[3].hfname = hf_nds_eid; + nds_offset = nds_offset+pvalues[3].vlength; + pvalues[4].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[4].vdesc = "Referral Records: %u"; + pvalues[4].vlength = 4; + pvalues[4].voffset = nds_offset; + pvalues[4].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; + pvalues[4].hfname = hf_nds_referrals; + break; + default: + break; + } + + } + break; + case 0x02: + if(request_value->nds_version != 0x000000fe) + { + pvalues[0].vvalue = 1; + pvalues[0].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[0].vdesc = "Entry Information"; + pvalues[0].vlength = 0; + pvalues[0].voffset = nds_offset-4; + pvalues[0].hfname = hf_nds_name; + pvalues[0].mvtype = MVTYPE_LIST_PARTITIONS; + pvalues[0].vflags = request_value->req_nds_flags; + } + else + { + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "CRC: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_crc; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = 1; + pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[1].vdesc = "Entry Information"; + pvalues[1].vlength = 0; + pvalues[1].voffset = nds_offset-4; + pvalues[1].hfname = hf_nds_name; + pvalues[1].mvtype = MVTYPE_LIST_PARTITIONS; + pvalues[1].vflags = request_value->req_nds_flags; + } + break; + case 0x03: + if(request_value->nds_version != 0x000000fe) + { + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Iteration Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vstring = (char *)match_strval(pvalues[1].vvalue, nds_info_type); + if(pvalues[1].vstring == NULL) + { + pvalues[1].vstring = "No Info Type Set"; + } + pvalues[1].vtype = VTYPE_STRING; + pvalues[1].vdesc = "Info Type: %s"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_info_type; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Number of Attributes: %u"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_attr; + pvalues[2].mvtype = MVTYPE_ATTR_REPLY; + pvalues[2].vflags = request_value->req_nds_flags; + pvalues[2].nds_version = request_value->nds_version; + } + else + { + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "CRC: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_crc; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_UINT32; + pvalues[1].vdesc = "Iteration Handle: 0x%08x"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vstring = (char *)match_strval(pvalues[2].vvalue, nds_info_type); + if(pvalues[2].vstring == NULL) + { + pvalues[2].vstring = "No Info Type Set"; + } + pvalues[2].vtype = VTYPE_STRING; + pvalues[2].vdesc = "Info Type: %s"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_info_type; + nds_offset = nds_offset+pvalues[2].vlength; + pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[3].vdesc = "Number of Attributes: %u"; + pvalues[3].vlength = 4; + pvalues[3].voffset = nds_offset; + pvalues[3].hfname = hf_nds_attr; + pvalues[3].mvtype = MVTYPE_ATTR_REPLY; + pvalues[3].vflags = request_value->req_nds_flags; + pvalues[3].nds_version = request_value->nds_version; + } + break; + case 0x04: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + if (pvalues[0].vvalue == 0x00000000) + { + pvalues[0].vstring = "Did Not Match"; + } + else + { + pvalues[0].vstring = "Matched"; + } + pvalues[0].vtype = VTYPE_STRING; + pvalues[0].vdesc = "Compare Values Returned - %s"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].mvtype = 0; + pvalues[0].hfname= hf_nds_compare_results; + nds_offset += pvalues[0].vlength; + break; + case 0x05: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Iteration Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[1].vdesc = "Entry Information"; + pvalues[1].vlength = 0; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_name; + pvalues[1].mvtype = MVTYPE_LIST_PARTITIONS; + pvalues[1].vflags = request_value->req_nds_flags; + break; + case 0x06: + break; + case 0x07: + break; + case 0x08: + break; + case 0x09: + break; + case 0x0a: + break; + case 0x0b: + break; + case 0x0c: + break; + case 0x0d: + break; + case 0x0e: + break; + case 0x0f: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Iteration Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vstring = (char *)match_strval(pvalues[1].vvalue, class_def_type); + if(pvalues[1].vstring == NULL) + { + pvalues[1].vstring = "No Class Definition Type Set"; + } + pvalues[1].vtype = VTYPE_STRING; + pvalues[1].vdesc = "Class Definition Type: %s"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].mvtype = 0; + pvalues[1].hfname= hf_nds_class_def_type; + nds_offset = nds_offset + pvalues[1].vlength; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);; + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Class Definitions %u"; + pvalues[2].vlength = 0; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_classes; + pvalues[2].mvtype = MVTYPE_CLASS_NAMES; + pvalues[2].vflags = request_value->req_nds_flags; + break; + case 0x10: + break; + case 0x11: + break; + case 0x12: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Iteration Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[1].vdesc = "Classes: %u"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].mvtype = MVTYPE_READ_CLASS_REQ; + pvalues[1].hfname= hf_nds_classes; + break; + case 0x13: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Privileges: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_privileges; + nds_offset = nds_offset+pvalues[0].vlength; + break; + case 0x14: + break; + case 0x15: + break; + case 0x16: + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Iteration Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vtype = VTYPE_STRING; + pvalues[1].vdesc = "Server Distinguished Name: %s"; + pvalues[1].mvtype = MVTYPE_ATTR_REQUEST; + pvalues[1].vvalue = 0; + pvalues[1].vlength = 256; + pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset); + if (pvalues[1].vlength == 0x00) + { + pvalues[1].vtype = VTYPE_NONE; + break; + } + pvalues[1].voffset = nds_offset+4; + nds_offset += 4; + get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring); + nds_offset += pvalues[1].vlength; + nds_offset += align_4(tvb, nds_offset); + pvalues[1].hfname= hf_nds_name; + nds_offset += align_4(tvb, nds_offset); + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Replicas: %u"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_replicas; + pvalues[2].mvtype = MVTYPE_READ_REPLICAS; + pvalues[2].bit1 = "Output Flags"; + pvalues[2].bit2 = "Entry ID"; + pvalues[2].bit3 = "Replica State"; + pvalues[2].bit4 = "Modification Timestamp"; + pvalues[2].bit5 = "Purge Time"; + pvalues[2].bit6 = "Local Partition ID"; + pvalues[2].bit7 = "Distinguished Name"; + pvalues[2].bit8 = "Replica Type"; + pvalues[2].bit9 = "Partition Busy"; + pvalues[2].vflags = request_value->req_nds_flags; + break; + case 0x17: + break; + case 0x18: + break; + case 0x19: + break; + case 0x1a: + break; + case 0x1b: + pvalues[0].vvalue = tvb_get_ntohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "File Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_file_handle; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_UINT32; + pvalues[1].vdesc = "File Size: %u"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_file_size; + nds_offset = nds_offset+pvalues[1].vlength; + break; + case 0x1c: + break; + case 0x1d: + break; + case 0x1e: + break; + case 0x1f: + break; + case 0x20: + break; + case 0x21: + break; + case 0x22: + break; + case 0x23: + break; + case 0x24: + break; + case 0x25: + break; + case 0x26: + break; + case 0x27: + break; + case 0x28: + break; + case 0x29: + break; + case 0x2a: + break; + case 0x2b: + break; + case 0x2c: + break; + case 0x2d: + break; + case 0x2e: + break; + case 0x2f: + break; + case 0x30: + break; + case 0x31: + break; + case 0x32: + break; + case 0x33: + break; + case 0x34: + break; + case 0x35: + if(request_value->nds_version != 0x000000fe) + { + pvalues[0].vtype = VTYPE_STRING; + pvalues[0].vdesc = "Distinguished Name: %s"; + pvalues[0].mvtype = MVTYPE_ATTR_REQUEST; + pvalues[0].vvalue = 0; + pvalues[0].vlength = 256; + pvalues[0].vlength = tvb_get_letohl(tvb, nds_offset); + if (pvalues[0].vlength == 0x00) + { + pvalues[0].vtype = VTYPE_NONE; + break; + } + pvalues[0].voffset = nds_offset+4; + nds_offset += 4; + get_string(tvb, pvalues[0].voffset, pvalues[0].vlength, pvalues[0].vstring); + nds_offset += pvalues[0].vlength; + nds_offset += align_4(tvb, nds_offset); + pvalues[0].hfname= hf_nds_name; + pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[1].vdesc = "Referral Records: %u"; + pvalues[1].vlength = 4; + pvalues[1].voffset = nds_offset; + pvalues[1].hfname = hf_nds_referrals; + pvalues[1].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; + } + else + { + pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[0].vtype = VTYPE_UINT32; + pvalues[0].vdesc = "Iteration Handle: 0x%08x"; + pvalues[0].vlength = 4; + pvalues[0].voffset = nds_offset; + pvalues[0].hfname = hf_nds_iteration; + nds_offset = nds_offset+pvalues[0].vlength; + pvalues[1].vtype = VTYPE_STRING; + pvalues[1].vdesc = "Distinguished Name: %s"; + pvalues[1].mvtype = MVTYPE_ATTR_REQUEST; + pvalues[1].vvalue = 0; + pvalues[1].vlength = 256; + pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset); + if (pvalues[1].vlength == 0x00) + { + pvalues[1].vtype = VTYPE_NONE; + break; + } + pvalues[1].voffset = nds_offset+4; + nds_offset += 4; + get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring); + nds_offset += pvalues[1].vlength; + nds_offset += align_4(tvb, nds_offset); + pvalues[1].hfname= hf_nds_name; + pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); + pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; + pvalues[2].vdesc = "Referral Records: %u"; + pvalues[2].vlength = 4; + pvalues[2].voffset = nds_offset; + pvalues[2].hfname = hf_nds_referrals; + pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; + } + break; + case 0x36: + break; + case 0x37: + break; + case 0x38: + break; + case 0x39: + break; + case 0x3a: + break; + case 0x3b: + break; + case 0x3c: + break; + case 0x3d: + break; + case 0x3e: + break; + case 0x3f: + break; + case 0x40: + break; + case 0x41: + break; + case 0x42: + break; + case 0x43: + break; + case 0x44: + break; + case 0x45: + break; + case 0x46: + break; + case 0x47: + break; + case 0x48: + break; + case 0x49: + break; + case 0x4a: + break; + case 0x4b: + break; + case 0x4c: + break; + case 0x4d: + break; + default: + break; + } + if(request_value->nds_request_verb != 0) + { + proto_tree_add_uint_format(ncp_tree, + hf_ncp_nds_verb, tvb, 6, 0, + request_value->nds_request_verb, + "NDS Verb: %d, %s", + request_value->nds_request_verb, verb_string); + } + /* NDS Entry ID's (EID) is identified in the reply + * packet of an NDS resolve name. We need to store + * this EID and its associated name into our hash + * so that we can resolve the name for other NDS + * requests. */ + if (!pinfo->fd->flags.visited) { + if(add_eid) + { + request_eid_value = ncp_eid_hash_lookup(conversation, global_eid); + if (!request_eid_value) { + request_eid_value = ncp_eid_hash_insert(global_eid); + strcpy(request_eid_value->object_name, global_object_name); + } + } + } + /* For NDS requests with just an EID, resolve name + * from hash table. */ + if(resolve_eid) + { + request_eid_value = ncp_eid_hash_lookup(conversation, global_eid); + if (request_eid_value) { + strcpy(global_object_name, request_eid_value->object_name); + proto_tree_add_string_format(ncp_tree, + hf_nds_name, tvb, 6, 0, + global_object_name, + "NDS Name for EID - %s", + global_object_name); + } + } + for (i = 0; i < 9; i++) { + switch (pvalues[i].vtype) { + + case VTYPE_NONE: /* no value */ + break; + + case VTYPE_UINT8: + proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, + pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u", + pvalues[i].vtype); + break; + + case VTYPE_UINT16: + proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, + pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u", + pvalues[i].vtype); + break; + + case VTYPE_UINT32: + proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, + pvalues[i].vlength, pvalues[i].vvalue, pvalues[i].vdesc, + pvalues[i].vvalue); + break; + + case VTYPE_STRING: + proto_tree_add_string_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, + pvalues[i].vlength, pvalues[i].vstring, pvalues[i].vdesc, + pvalues[i].vstring); + break; + + case VTYPE_BITFIELD: + process_bitfield(ncp_tree, tvb, &pvalues[i]); + break; + + case VTYPE_MULTIVALUE_UINT32: + process_multivalues(ncp_tree, tvb, &pvalues[i]); + break; + + default: + proto_tree_add_uint_format(ncp_tree, hf_nds_p1type, tvb, pvalues[i].voffset, + pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u", + pvalues[i].vtype); + break; + } + } + } +} void dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, @@ -4793,41 +5972,24 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, { conversation_t *conversation = NULL; ncp_req_hash_value *request_value = NULL; - ncp_req_eid_hash_value *request_eid_value = NULL; const ncp_record *ncp_rec = NULL; int *req_cond_results; guint8 completion_code=0; guint length; ptvcursor_t *ptvc = NULL; const char *error_string; - guint32 nds_string_len = 0; - guint8 ping_version = 0; - guint32 nds_flags = 0; guint32 nds_offset = 0; - nw_uni_t reply_buffer; - const char *verb_string=""; guint32 nds_error_code = 0; guint32 nds_reply_buffer = 0; const char *nds_error_string = NULL; guint32 nds_frag=0; - nds_val pvalues[9]; - char string_buffer[9][1024]; - gboolean resolve_eid=FALSE; - guint32 global_eid=0; - gboolean add_eid = FALSE; - char global_object_name[256]; - int i; - guint32 bvalue=0; #ifdef FAKE_TREE_IS_VISIBLE - if (ncp_tree) { - PTREE_DATA(ncp_tree)->visible=1; - } + if (ncp_tree) { + PTREE_DATA(ncp_tree)->visible=1; + } #endif - strcpy(reply_buffer.buffer, ""); - strcpy(global_object_name, ""); - if (!pinfo->fd->flags.visited) { /* Find the conversation whence the request would have come. */ conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, @@ -4841,26 +6003,31 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, } p_add_proto_data(pinfo->fd, proto_ncp, (void*) request_value); } - /* else... we haven't seen an NCP Request for that conversation and sequence. */ - /* Create Service request packets do not contain nw_connection. The initial */ - /* value is set to 65535. The reply packet has the valid connection. So, we */ - /* can't find the request packet in our conversation list. To trap for this */ - /* we can just perform the search again with 65535 to see if we can locate */ - /* the proper request packet. */ - else { - conversation = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst, - PT_NCP, 65535, 65535, 0); - if (conversation != NULL) { - /* find the record telling us the request made that caused - this reply */ - request_value = ncp_hash_lookup(conversation, sequence); - if (request_value) { - ncp_rec = request_value->ncp_rec; - } - p_add_proto_data(pinfo->fd, proto_ncp, (void*) request_value); - } - /* else... we haven't seen an NCP Request for that conversation and sequence. */ - } + /* else... we haven't seen an NCP Request for that conversation + and sequence. + Create Service request packets do not contain nw_connection. + The initial value is set to 65535. The reply packet has the + valid connection. So, we can't find the request packet in + our conversation list. To trap for this we can just perform + the search again with 65535 to see if we can locate the + proper request packet. */ + else { + conversation = find_conversation(pinfo->fd->num, + &pinfo->src, &pinfo->dst, PT_NCP, 65535, 65535, 0); + if (conversation != NULL) { + /* find the record telling us the request made + that caused this reply */ + request_value = ncp_hash_lookup(conversation, + sequence); + if (request_value) { + ncp_rec = request_value->ncp_rec; + } + p_add_proto_data(pinfo->fd, proto_ncp, + (void*) request_value); + } + /* else... we haven't seen an NCP Request for that + conversation and sequence. */ + } } else { request_value = p_get_proto_data(pinfo->fd, proto_ncp); @@ -4869,6 +6036,13 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, } } + /* + * Tap the packet before the dissectors are called so we + * still get the tap listener called even if there is an + * exception. + */ + tap_queue_packet(ncp_tap->stat, pinfo, request_value); + if (check_col(pinfo->cinfo, COL_PROTOCOL)) { if (ncp_rec && ncp_rec->func==0x68 && (ncp_rec->subfunc==0x02 || ncp_rec->subfunc==0x01)) { @@ -4876,13 +6050,12 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, } } - /* A completion code of 0 always means OK. Non-zero means failure, + /* A completion code of 0 always means OK. Non-zero means failure, * but each non-zero value has a different meaning. And the same value * can have different meanings, depending on the ncp.func (and ncp.subfunc) * value. */ completion_code = tvb_get_guint8(tvb, 6); if (completion_code == 0) { - if(type == NCP_POSITIVE_ACK) { error_string = "Server Busy, Request Being Processed"; @@ -4939,7 +6112,7 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, nstime_delta(&ns, &pinfo->fd->abs_ts, &request_value->req_frame_time); proto_tree_add_time(ncp_tree, hf_ncp_req_frame_time, tvb, 0, 0, &ns); } - + /* Put the func (and maybe subfunc) from the request packet * in the proto tree, but hidden. That way filters on ncp.func * or ncp.subfunc will find both the requests and the replies. @@ -4954,1215 +6127,86 @@ dissect_ncp_reply(tvbuff_t *tvb, packet_info *pinfo, ncp_rec->subfunc, ncp_rec->subfunc); } } + } - expert_item = proto_tree_add_uint_format(ncp_tree, hf_ncp_completion_code, tvb, 6, 1, - completion_code, "Completion Code: %d (0x89%02x), %s", - completion_code, completion_code, error_string); - if (completion_code != 0 || type == NCP_POSITIVE_ACK) { - - expert_add_info_format(pinfo, expert_item, PI_RESPONSE_CODE, PI_ERROR, "Error: %d (0x89%02x) %s", completion_code, completion_code, error_string); - } - - proto_tree_add_item(ncp_tree, hf_ncp_connection_status, tvb, 7, 1, FALSE); - - /* - * Tap the packet before the dissectors are called so we - * still get the tap listener called even if there is an - * exception. - */ - tap_queue_packet(ncp_tap->stat, pinfo, request_value); - - /* - * Unless this is a successful reply, that's all there - * is to parse. - */ - if (type != NCP_SERVICE_REPLY || completion_code != 0) - return; - - /* Decode NDS Reply packets */ - if (ncp_rec) { - /* Dissect SSS Reply packets */ - if (ncp_rec->func == 0x5c && request_value) - { - dissect_sss_reply(tvb, pinfo, ncp_tree, ncp_rec->subfunc, request_value); - } - /* Dissect NMAS Reply packets */ - if (ncp_rec->func == 0x5e && request_value) - { - dissect_nmas_reply(tvb, pinfo, ncp_tree, ncp_rec->func, ncp_rec->subfunc, request_value); - } - if ((ncp_rec->func == 0x68 && ncp_rec->subfunc == 0x01) && completion_code == 0) { - ping_version = tvb_get_guint8(tvb, 8); - proto_tree_add_item(ncp_tree, hf_ping_version, tvb, 8, 1, TRUE); - if (ping_version == 9) { - nds_string_len = tvb_get_ntohl(tvb, 9); - nds_offset = nds_string_len+16; - tvb_ensure_bytes_exist(tvb, 16, nds_string_len); - proto_tree_add_item(ncp_tree, hf_nds_tree_name, tvb, 16, nds_string_len, FALSE); - proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, FALSE); - proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, (nds_offset+4), 4, FALSE); - proto_tree_add_item(ncp_tree, hf_nds_reply_flags, tvb, (nds_offset+8), 4, TRUE); - } - else { - nds_offset = 12; - nds_flags = request_value->req_nds_flags; - bvalue = 0x00000001; - - for (i = 0 ; i < 32; i++ ) { - if (nds_flags & bvalue) - { - switch(bvalue) - { - case 0x00000001: /* Supported Fields */ - pvalues[0].vvalue = tvb_get_letohs(tvb, nds_offset); - pvalues[0].vtype = VTYPE_BITFIELD; - pvalues[0].vstring = ""; - pvalues[0].vdesc = "Ping (low) Supported Fields:"; - pvalues[0].vlength = 2; - pvalues[0].hfname= hf_nds_rflags; - pvalues[0].voffset = nds_offset; - pvalues[0].bit1 = "Supported Fields"; - pvalues[0].bit1hfname = hf_bit1pingflags1; - pvalues[0].bit2 = "Depth"; - pvalues[0].bit2hfname = hf_bit2pingflags1; - pvalues[0].bit3 = "Revision"; - pvalues[0].bit3hfname = hf_bit3pingflags1; - pvalues[0].bit4 = "Flags"; - pvalues[0].bit4hfname = hf_bit4pingflags1; - pvalues[0].bit5 = "Verification Flags"; - pvalues[0].bit5hfname = hf_bit5pingflags1; - pvalues[0].bit6 = "Letter Version"; - pvalues[0].bit6hfname = hf_bit6pingflags1; - pvalues[0].bit7 = "OS Version"; - pvalues[0].bit7hfname = hf_bit7pingflags1; - pvalues[0].bit8 = "License Flags"; - pvalues[0].bit8hfname = hf_bit8pingflags1; - pvalues[0].bit9 = "DS Time"; - pvalues[0].bit9hfname = hf_bit9pingflags1; - pvalues[0].bit10 = "Not Defined"; - pvalues[0].bit10hfname = hf_bit10pingflags1; - pvalues[0].bit11 = "Not Defined"; - pvalues[0].bit11hfname = hf_bit11pingflags1; - pvalues[0].bit12 = "Not Defined"; - pvalues[0].bit12hfname = hf_bit12pingflags1; - pvalues[0].bit13 = "Not Defined"; - pvalues[0].bit13hfname = hf_bit13pingflags1; - pvalues[0].bit14 = "Not Defined"; - pvalues[0].bit14hfname = hf_bit14pingflags1; - pvalues[0].bit15 = "Not Defined"; - pvalues[0].bit15hfname = hf_bit15pingflags1; - pvalues[0].bit16 = "Not Defined"; - pvalues[0].bit16hfname = hf_bit16pingflags1; - - process_bitfield(ncp_tree, tvb, &pvalues[0]); - nds_offset += 2; - - pvalues[0].vvalue = tvb_get_letohs(tvb, nds_offset); - pvalues[0].vtype = VTYPE_BITFIELD; - pvalues[0].vstring = ""; - pvalues[0].vdesc = "Ping (high) Supported Fields:"; - pvalues[0].vlength = 2; - pvalues[0].hfname= hf_nds_rflags; - pvalues[0].voffset = nds_offset; - pvalues[0].bit1 = "Sap Name"; - pvalues[0].bit1hfname = hf_bit1pingflags2; - pvalues[0].bit2 = "Tree Name"; - pvalues[0].bit2hfname = hf_bit2pingflags2; - pvalues[0].bit3 = "OS Name"; - pvalues[0].bit3hfname = hf_bit3pingflags2; - pvalues[0].bit4 = "Hardware Name"; - pvalues[0].bit4hfname = hf_bit4pingflags2; - pvalues[0].bit5 = "Vendor Name"; - pvalues[0].bit5hfname = hf_bit5pingflags2; - pvalues[0].bit6 = "Not Defined"; - pvalues[0].bit6hfname = hf_bit6pingflags2; - pvalues[0].bit7 = "Not Defined"; - pvalues[0].bit7hfname = hf_bit7pingflags2; - pvalues[0].bit8 = "Not Defined"; - pvalues[0].bit8hfname = hf_bit8pingflags2; - pvalues[0].bit9 = "Not Defined"; - pvalues[0].bit9hfname = hf_bit9pingflags2; - pvalues[0].bit10 = "Not Defined"; - pvalues[0].bit10hfname = hf_bit10pingflags2; - pvalues[0].bit11 = "Not Defined"; - pvalues[0].bit11hfname = hf_bit11pingflags2; - pvalues[0].bit12 = "Not Defined"; - pvalues[0].bit12hfname = hf_bit12pingflags2; - pvalues[0].bit13 = "Not Defined"; - pvalues[0].bit13hfname = hf_bit13pingflags2; - pvalues[0].bit14 = "Not Defined"; - pvalues[0].bit14hfname = hf_bit14pingflags2; - pvalues[0].bit15 = "Not Defined"; - pvalues[0].bit15hfname = hf_bit15pingflags2; - pvalues[0].bit16 = "Not Defined"; - pvalues[0].bit16hfname = hf_bit16pingflags2; - - process_bitfield(ncp_tree, tvb, &pvalues[0]); - nds_offset += 2; - break; - case 0x00000002: - proto_tree_add_item(ncp_tree, hf_nds_reply_depth, tvb, nds_offset, 4, TRUE); - nds_offset += 4; - break; - case 0x00000004: - proto_tree_add_item(ncp_tree, hf_nds_reply_rev, tvb, nds_offset, 4, TRUE); - nds_offset += 4; - break; - case 0x00000008: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_BITFIELD; - pvalues[0].vstring = ""; - pvalues[0].vdesc = "Ping Flags:"; - pvalues[0].vlength = 4; - pvalues[0].hfname= hf_nds_rflags; - pvalues[0].voffset = nds_offset; - pvalues[0].bit1 = "Root Most Master Replica"; - pvalues[0].bit1hfname = hf_bit1pingpflags1; - pvalues[0].bit2 = "Time Synchronized"; - pvalues[0].bit2hfname = hf_bit2pingpflags1; - pvalues[0].bit3 = "Not Defined"; - pvalues[0].bit3hfname = hf_bit3pingpflags1; - pvalues[0].bit4 = "Not Defined"; - pvalues[0].bit4hfname = hf_bit4pingpflags1; - pvalues[0].bit5 = "Not Defined"; - pvalues[0].bit5hfname = hf_bit5pingpflags1; - pvalues[0].bit6 = "Not Defined"; - pvalues[0].bit6hfname = hf_bit6pingpflags1; - pvalues[0].bit7 = "Not Defined"; - pvalues[0].bit7hfname = hf_bit7pingpflags1; - pvalues[0].bit8 = "Not Defined"; - pvalues[0].bit8hfname = hf_bit8pingpflags1; - pvalues[0].bit9 = "Not Defined"; - pvalues[0].bit9hfname = hf_bit9pingpflags1; - pvalues[0].bit10 = "Not Defined"; - pvalues[0].bit10hfname = hf_bit10pingpflags1; - pvalues[0].bit11 = "Not Defined"; - pvalues[0].bit11hfname = hf_bit11pingpflags1; - pvalues[0].bit12 = "Not Defined"; - pvalues[0].bit12hfname = hf_bit12pingpflags1; - pvalues[0].bit13 = "Not Defined"; - pvalues[0].bit13hfname = hf_bit13pingpflags1; - pvalues[0].bit14 = "Not Defined"; - pvalues[0].bit14hfname = hf_bit14pingpflags1; - pvalues[0].bit15 = "Not Defined"; - pvalues[0].bit15hfname = hf_bit15pingpflags1; - pvalues[0].bit16 = "Not Defined"; - pvalues[0].bit16hfname = hf_bit16pingpflags1; - - process_bitfield(ncp_tree, tvb, &pvalues[0]); - nds_offset += 4; - break; - case 0x00000010: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_BITFIELD; - pvalues[0].vstring = ""; - pvalues[0].vdesc = "Verification Flags:"; - pvalues[0].vlength = 4; - pvalues[0].hfname= hf_nds_rflags; - pvalues[0].voffset = nds_offset; - pvalues[0].bit1 = "Checksum"; - pvalues[0].bit1hfname = hf_bit1pingvflags1; - pvalues[0].bit2 = "CRC32"; - pvalues[0].bit2hfname = hf_bit2pingvflags1; - pvalues[0].bit3 = "Not Defined"; - pvalues[0].bit3hfname = hf_bit3pingvflags1; - pvalues[0].bit4 = "Not Defined"; - pvalues[0].bit4hfname = hf_bit4pingvflags1; - pvalues[0].bit5 = "Not Defined"; - pvalues[0].bit5hfname = hf_bit5pingvflags1; - pvalues[0].bit6 = "Not Defined"; - pvalues[0].bit6hfname = hf_bit6pingvflags1; - pvalues[0].bit7 = "Not Defined"; - pvalues[0].bit7hfname = hf_bit7pingvflags1; - pvalues[0].bit8 = "Not Defined"; - pvalues[0].bit8hfname = hf_bit8pingvflags1; - pvalues[0].bit9 = "Not Defined"; - pvalues[0].bit9hfname = hf_bit9pingvflags1; - pvalues[0].bit10 = "Not Defined"; - pvalues[0].bit10hfname = hf_bit10pingvflags1; - pvalues[0].bit11 = "Not Defined"; - pvalues[0].bit11hfname = hf_bit11pingvflags1; - pvalues[0].bit12 = "Not Defined"; - pvalues[0].bit12hfname = hf_bit12pingvflags1; - pvalues[0].bit13 = "Not Defined"; - pvalues[0].bit13hfname = hf_bit13pingvflags1; - pvalues[0].bit14 = "Not Defined"; - pvalues[0].bit14hfname = hf_bit14pingvflags1; - pvalues[0].bit15 = "Not Defined"; - pvalues[0].bit15hfname = hf_bit15pingvflags1; - pvalues[0].bit16 = "Not Defined"; - pvalues[0].bit16hfname = hf_bit16pingvflags1; - - process_bitfield(ncp_tree, tvb, &pvalues[0]); - nds_offset += 4; - break; - case 0x00000020: - proto_tree_add_item(ncp_tree, hf_nds_letter_ver, tvb, nds_offset, 4, TRUE); - nds_offset += 4; - break; - case 0x00000040: - proto_tree_add_item(ncp_tree, hf_nds_os_ver, tvb, nds_offset, 4, TRUE); - nds_offset += 4; - break; - case 0x00000080: - proto_tree_add_item(ncp_tree, hf_nds_lic_flags, tvb, nds_offset, 4, TRUE); - nds_offset += 4; - break; - case 0x00000100: - proto_tree_add_item(ncp_tree, hf_nds_ds_time, tvb, nds_offset, 4, TRUE); - nds_offset += 4; - break; - case 0x00010000: - nds_string_len = tvb_get_letohl(tvb, nds_offset); - nds_offset += 4; - get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); - tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); - proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "SAP Name: %s", reply_buffer.buffer); - nds_offset += nds_string_len; - nds_offset += align_4(tvb, nds_offset); - nds_offset += 2; - break; - case 0x00020000: - nds_string_len = tvb_get_letohl(tvb, nds_offset); - nds_offset += 4; - get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); - tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); - proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "NDS Tree Name: %s", reply_buffer.buffer); - nds_offset += nds_string_len; - nds_offset += align_4(tvb, nds_offset); - break; - case 0x00040000: - nds_string_len = tvb_get_letohl(tvb, nds_offset); - nds_offset += 4; - get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); - tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); - proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "OS Name: %s", reply_buffer.buffer); - nds_offset += nds_string_len; - nds_offset += align_4(tvb, nds_offset); - break; - case 0x00080000: - nds_string_len = tvb_get_letohl(tvb, nds_offset); - nds_offset += 4; - get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); - tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); - proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "Hardware Name: %s", reply_buffer.buffer); - nds_offset += nds_string_len; - nds_offset += align_4(tvb, nds_offset); - break; - case 0x00100000: - nds_string_len = tvb_get_letohl(tvb, nds_offset); - nds_offset += 4; - get_string(tvb, nds_offset, nds_string_len, reply_buffer.buffer); - tvb_ensure_bytes_exist(tvb, nds_offset, nds_string_len); - proto_tree_add_text(ncp_tree, tvb, nds_offset, nds_string_len, "Vendor Name: %s", reply_buffer.buffer); - nds_offset += nds_string_len; - nds_offset += align_4(tvb, nds_offset); - break; - case 0x00000200: - /* Not Defined */ - case 0x00000400: - /* Not Defined */ - case 0x00000800: - /* Not Defined */ - case 0x00001000: - /* Not Defined */ - case 0x00002000: - /* Not Defined */ - case 0x00004000: - /* Not Defined */ - case 0x00008000: - /* Not Defined */ - case 0x00200000: - /* Not Defined */ - case 0x00400000: - /* Not Defined */ - case 0x00800000: - /* Not Defined */ - case 0x01000000: - /* Not Defined */ - case 0x02000000: - /* Not Defined */ - case 0x04000000: - /* Not Defined */ - case 0x08000000: - /* Not Defined */ - case 0x10000000: - /* Not Defined */ - case 0x20000000: - /* Not Defined */ - case 0x40000000: - /* Not Defined */ - case 0x80000000: - /* Not Defined */ - default: - break; - } - } - bvalue = bvalue*2; - } - } - } - if (ncp_rec->func == 0x68 && ncp_rec->subfunc == 0x02) - { - nds_offset = 8; - - nds_reply_buffer = tvb_get_letohl(tvb, nds_offset); - proto_tree_add_uint(ncp_tree, hf_ncp_fragment_size, tvb, nds_offset, - 4, nds_reply_buffer); - nds_offset += 4; - nds_frag = tvb_get_letohl(tvb, nds_offset); - proto_tree_add_uint(ncp_tree, hf_ncp_fragment_handle, tvb, nds_offset, - 4, nds_frag); - nds_offset += 4; - /* - * Is the possibly-reassembled reply large - * enough to have a completion code? (We - * can't check the fragment size as this - * might just be the last fragment.) - */ - if (tvb_reported_length_remaining(tvb, nds_offset) >= 4) - { - /* Yes - process the completion code. */ - expert_item = proto_tree_add_uint_format(ncp_tree, hf_nds_reply_error, tvb, nds_offset, - 4, nds_error_code, "NDS Completion Code: 0x%08x, %s", - nds_error_code, nds_error_string); - - if (nds_error_code != 0) { - expert_add_info_format(pinfo, expert_item, PI_RESPONSE_CODE, PI_ERROR, "NDS Error: 0x%08x %s", nds_error_code, nds_error_string); - } - } - if (request_value && nds_error_code == 0x00000000) - { - nds_offset = 20; - for (i = 0; i < 9; i++) { - pvalues[i].vtype = 0; - pvalues[i].vvalue = 0; - pvalues[i].vlength = 0; - pvalues[i].voffset = 0; - pvalues[i].hfname = 0; - pvalues[i].vdesc = ""; - string_buffer[i][0] = '\0'; - pvalues[i].vstring = string_buffer[i]; - pvalues[i].mvtype = 0; - } - verb_string = val_to_str(request_value->nds_request_verb, - ncp_nds_verb_vals, - "Continuation Fragment"); - switch (request_value->nds_request_verb) - { - case 0x01: - if(request_value->nds_version < 2) - { - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vstring = (char *)match_strval(pvalues[0].vvalue, nds_tags); - if(pvalues[0].vstring == NULL) - { - pvalues[0].vstring = "No Tags Set"; - } - pvalues[0].vtype = VTYPE_STRING; - pvalues[0].vdesc = "Tag: %s"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_tag_string; - nds_offset = nds_offset+pvalues[0].vlength; - switch(pvalues[0].vvalue) - { - case NDS_TAG_NO_SUCH_ENTRY: - break; - case NDS_TAG_LOCAL_ENTRY: - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_UINT32; - pvalues[1].vdesc = "Entry ID: 0x%08x"; - add_eid = TRUE; - strcpy(global_object_name, request_value->object_name); - global_eid = pvalues[1].vvalue; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Referral Records: %u"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_referrals; - pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; - break; - case NDS_TAG_REMOTE_ENTRY: - nds_offset += 4; /* GUINT32 reserved field */ - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_UINT32; - pvalues[1].vdesc = "Entry ID: 0x%08x"; - add_eid = TRUE; - global_eid = pvalues[1].vvalue; - strcpy(global_object_name, request_value->object_name); - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Referral Records: %u"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_referrals; - pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; - break; - case NDS_TAG_ALIAS_ENTRY: - pvalues[1].vtype = VTYPE_STRING; - pvalues[1].vdesc = "Alias Name: %s"; - pvalues[1].mvtype = MVTYPE_ATTR_REQUEST; - pvalues[1].vvalue = 0; - pvalues[1].vlength = 256; - pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset); - if (pvalues[1].vlength == 0x00) - { - pvalues[1].vtype = VTYPE_NONE; - break; - } - pvalues[1].voffset = nds_offset+4; - nds_offset += 4; - get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring); - nds_offset += pvalues[1].vlength; - nds_offset += align_4(tvb, nds_offset); - pvalues[1].hfname= hf_nds_name; - break; - case NDS_TAG_REFERRAL_INFORMATION: - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_UINT32; - pvalues[1].vdesc = "Distance Object is From Root: 0x%08x"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Referral Records: %u"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_depth; - pvalues[2].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; - break; - case NDS_TAG_ENTRY_AND_REFERRALS: - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_UINT32; - pvalues[1].vdesc = "Result Flags: 0x%08x"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_result_flags; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_UINT32; - pvalues[2].vdesc = "Entry ID: 0x%08x"; - add_eid = TRUE; - global_eid = pvalues[2].vvalue; - strcpy(global_object_name, request_value->object_name); - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[2].vlength; - pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[3].vdesc = "Referral Records: %u"; - pvalues[3].vlength = 4; - pvalues[3].voffset = nds_offset; - pvalues[3].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; - pvalues[3].hfname = hf_nds_referrals; - break; - default: - break; - } - } - else - { - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "CRC: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_crc; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vstring = (char *)match_strval(pvalues[1].vvalue, nds_tags); - if(pvalues[1].vstring == NULL) - { - pvalues[1].vstring = "No Tags Set"; - } - pvalues[1].vtype = VTYPE_STRING; - pvalues[1].vdesc = "Tag: %s"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[1].hfname = hf_nds_tag_string; - switch(pvalues[1].vvalue) - { - case NDS_TAG_NO_SUCH_ENTRY: - break; - case NDS_TAG_LOCAL_ENTRY: - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_UINT32; - pvalues[2].vdesc = "Entry ID: 0x%08x"; - add_eid = TRUE; - global_eid = pvalues[2].vvalue; - strcpy(global_object_name, request_value->object_name); - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[2].vlength; - pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[3].vdesc = "Referral Records: %u"; - pvalues[3].vlength = 4; - pvalues[3].voffset = nds_offset; - pvalues[3].hfname = hf_nds_referrals; - pvalues[3].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; - break; - case NDS_TAG_REMOTE_ENTRY: - nds_offset += 4; /* GUINT32 reserved field */ - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - add_eid = TRUE; - global_eid = pvalues[2].vvalue; - strcpy(global_object_name, request_value->object_name); - pvalues[2].vtype = VTYPE_UINT32; - pvalues[2].vdesc = "Entry ID: 0x%08x"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[2].vlength; - pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[3].vdesc = "Referral Records: %u"; - pvalues[3].vlength = 4; - pvalues[3].voffset = nds_offset; - pvalues[3].hfname = hf_nds_referrals; - pvalues[3].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; - break; - case NDS_TAG_ALIAS_ENTRY: - pvalues[2].vtype = VTYPE_STRING; - pvalues[2].vdesc = "Alias Name: %s"; - pvalues[2].mvtype = MVTYPE_ATTR_REQUEST; - pvalues[2].vvalue = 0; - pvalues[2].vlength = 256; - pvalues[2].vlength = tvb_get_letohl(tvb, nds_offset); - if (pvalues[2].vlength == 0x00) - { - pvalues[2].vtype = VTYPE_NONE; - break; - } - pvalues[2].voffset = nds_offset+4; - nds_offset += 4; - get_string(tvb, pvalues[2].voffset, pvalues[2].vlength, pvalues[2].vstring); - nds_offset += pvalues[2].vlength; - nds_offset += align_4(tvb, nds_offset); - pvalues[2].hfname= hf_nds_name; - break; - case NDS_TAG_REFERRAL_INFORMATION: - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_UINT32; - pvalues[2].vdesc = "Distance Object is From Root: 0x%08x"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[2].vlength; - pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[3].vdesc = "Referral Records: %u"; - pvalues[3].vlength = 4; - pvalues[3].voffset = nds_offset; - pvalues[3].hfname = hf_nds_depth; - pvalues[3].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; - break; - case NDS_TAG_ENTRY_AND_REFERRALS: - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_UINT32; - pvalues[2].vdesc = "Result Flags: 0x%08x"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_result_flags; - nds_offset = nds_offset+pvalues[2].vlength; - pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[3].vtype = VTYPE_UINT32; - pvalues[3].vdesc = "Entry ID: 0x%08x"; - add_eid = TRUE; - strcpy(global_object_name, request_value->object_name); - global_eid = pvalues[3].vvalue; - pvalues[3].vlength = 4; - pvalues[3].voffset = nds_offset; - pvalues[3].hfname = hf_nds_eid; - nds_offset = nds_offset+pvalues[3].vlength; - pvalues[4].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[4].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[4].vdesc = "Referral Records: %u"; - pvalues[4].vlength = 4; - pvalues[4].voffset = nds_offset; - pvalues[4].mvtype = MVTYPE_ADDR_REFERRAL_REPLY; - pvalues[4].hfname = hf_nds_referrals; - break; - default: - break; - } - - } - break; - case 0x02: - if(request_value->nds_version != 0x000000fe) - { - pvalues[0].vvalue = 1; - pvalues[0].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[0].vdesc = "Entry Information"; - pvalues[0].vlength = 0; - pvalues[0].voffset = nds_offset-4; - pvalues[0].hfname = hf_nds_name; - pvalues[0].mvtype = MVTYPE_LIST_PARTITIONS; - pvalues[0].vflags = request_value->req_nds_flags; - } - else - { - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "CRC: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_crc; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = 1; - pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[1].vdesc = "Entry Information"; - pvalues[1].vlength = 0; - pvalues[1].voffset = nds_offset-4; - pvalues[1].hfname = hf_nds_name; - pvalues[1].mvtype = MVTYPE_LIST_PARTITIONS; - pvalues[1].vflags = request_value->req_nds_flags; - } - break; - case 0x03: - if(request_value->nds_version != 0x000000fe) - { - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Iteration Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vstring = (char *)match_strval(pvalues[1].vvalue, nds_info_type); - if(pvalues[1].vstring == NULL) - { - pvalues[1].vstring = "No Info Type Set"; - } - pvalues[1].vtype = VTYPE_STRING; - pvalues[1].vdesc = "Info Type: %s"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_info_type; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Number of Attributes: %u"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_attr; - pvalues[2].mvtype = MVTYPE_ATTR_REPLY; - pvalues[2].vflags = request_value->req_nds_flags; - pvalues[2].nds_version = request_value->nds_version; - } - else - { - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "CRC: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_crc; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_UINT32; - pvalues[1].vdesc = "Iteration Handle: 0x%08x"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vstring = (char *)match_strval(pvalues[2].vvalue, nds_info_type); - if(pvalues[2].vstring == NULL) - { - pvalues[2].vstring = "No Info Type Set"; - } - pvalues[2].vtype = VTYPE_STRING; - pvalues[2].vdesc = "Info Type: %s"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_info_type; - nds_offset = nds_offset+pvalues[2].vlength; - pvalues[3].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[3].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[3].vdesc = "Number of Attributes: %u"; - pvalues[3].vlength = 4; - pvalues[3].voffset = nds_offset; - pvalues[3].hfname = hf_nds_attr; - pvalues[3].mvtype = MVTYPE_ATTR_REPLY; - pvalues[3].vflags = request_value->req_nds_flags; - pvalues[3].nds_version = request_value->nds_version; - } - break; - case 0x04: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - if (pvalues[0].vvalue == 0x00000000) - { - pvalues[0].vstring = "Did Not Match"; - } - else - { - pvalues[0].vstring = "Matched"; - } - pvalues[0].vtype = VTYPE_STRING; - pvalues[0].vdesc = "Compare Values Returned - %s"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].mvtype = 0; - pvalues[0].hfname= hf_nds_compare_results; - nds_offset += pvalues[0].vlength; - break; - case 0x05: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Iteration Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[1].vdesc = "Entry Information"; - pvalues[1].vlength = 0; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_name; - pvalues[1].mvtype = MVTYPE_LIST_PARTITIONS; - pvalues[1].vflags = request_value->req_nds_flags; - break; - case 0x06: - break; - case 0x07: - break; - case 0x08: - break; - case 0x09: - break; - case 0x0a: - break; - case 0x0b: - break; - case 0x0c: - break; - case 0x0d: - break; - case 0x0e: - break; - case 0x0f: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Iteration Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vstring = (char *)match_strval(pvalues[1].vvalue, class_def_type); - if(pvalues[1].vstring == NULL) - { - pvalues[1].vstring = "No Class Definition Type Set"; - } - pvalues[1].vtype = VTYPE_STRING; - pvalues[1].vdesc = "Class Definition Type: %s"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].mvtype = 0; - pvalues[1].hfname= hf_nds_class_def_type; - nds_offset = nds_offset + pvalues[1].vlength; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset);; - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Class Definitions %u"; - pvalues[2].vlength = 0; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_classes; - pvalues[2].mvtype = MVTYPE_CLASS_NAMES; - pvalues[2].vflags = request_value->req_nds_flags; - break; - case 0x10: - break; - case 0x11: - break; - case 0x12: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Iteration Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[1].vdesc = "Classes: %u"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].mvtype = MVTYPE_READ_CLASS_REQ; - pvalues[1].hfname= hf_nds_classes; - break; - case 0x13: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Privileges: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_privileges; - nds_offset = nds_offset+pvalues[0].vlength; - break; - case 0x14: - break; - case 0x15: - break; - case 0x16: - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Iteration Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vtype = VTYPE_STRING; - pvalues[1].vdesc = "Server Distinguished Name: %s"; - pvalues[1].mvtype = MVTYPE_ATTR_REQUEST; - pvalues[1].vvalue = 0; - pvalues[1].vlength = 256; - pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset); - if (pvalues[1].vlength == 0x00) - { - pvalues[1].vtype = VTYPE_NONE; - break; - } - pvalues[1].voffset = nds_offset+4; - nds_offset += 4; - get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring); - nds_offset += pvalues[1].vlength; - nds_offset += align_4(tvb, nds_offset); - pvalues[1].hfname= hf_nds_name; - nds_offset += align_4(tvb, nds_offset); - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Replicas: %u"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_replicas; - pvalues[2].mvtype = MVTYPE_READ_REPLICAS; - pvalues[2].bit1 = "Output Flags"; - pvalues[2].bit2 = "Entry ID"; - pvalues[2].bit3 = "Replica State"; - pvalues[2].bit4 = "Modification Timestamp"; - pvalues[2].bit5 = "Purge Time"; - pvalues[2].bit6 = "Local Partition ID"; - pvalues[2].bit7 = "Distinguished Name"; - pvalues[2].bit8 = "Replica Type"; - pvalues[2].bit9 = "Partition Busy"; - pvalues[2].vflags = request_value->req_nds_flags; - break; - case 0x17: - break; - case 0x18: - break; - case 0x19: - break; - case 0x1a: - break; - case 0x1b: - pvalues[0].vvalue = tvb_get_ntohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "File Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_file_handle; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_UINT32; - pvalues[1].vdesc = "File Size: %u"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_file_size; - nds_offset = nds_offset+pvalues[1].vlength; - break; - case 0x1c: - break; - case 0x1d: - break; - case 0x1e: - break; - case 0x1f: - break; - case 0x20: - break; - case 0x21: - break; - case 0x22: - break; - case 0x23: - break; - case 0x24: - break; - case 0x25: - break; - case 0x26: - break; - case 0x27: - break; - case 0x28: - break; - case 0x29: - break; - case 0x2a: - break; - case 0x2b: - break; - case 0x2c: - break; - case 0x2d: - break; - case 0x2e: - break; - case 0x2f: - break; - case 0x30: - break; - case 0x31: - break; - case 0x32: - break; - case 0x33: - break; - case 0x34: - break; - case 0x35: - if(request_value->nds_version != 0x000000fe) - { - pvalues[0].vtype = VTYPE_STRING; - pvalues[0].vdesc = "Distinguished Name: %s"; - pvalues[0].mvtype = MVTYPE_ATTR_REQUEST; - pvalues[0].vvalue = 0; - pvalues[0].vlength = 256; - pvalues[0].vlength = tvb_get_letohl(tvb, nds_offset); - if (pvalues[0].vlength == 0x00) - { - pvalues[0].vtype = VTYPE_NONE; - break; - } - pvalues[0].voffset = nds_offset+4; - nds_offset += 4; - get_string(tvb, pvalues[0].voffset, pvalues[0].vlength, pvalues[0].vstring); - nds_offset += pvalues[0].vlength; - nds_offset += align_4(tvb, nds_offset); - pvalues[0].hfname= hf_nds_name; - pvalues[1].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[1].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[1].vdesc = "Referral Records: %u"; - pvalues[1].vlength = 4; - pvalues[1].voffset = nds_offset; - pvalues[1].hfname = hf_nds_referrals; - pvalues[1].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; - } - else - { - pvalues[0].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[0].vtype = VTYPE_UINT32; - pvalues[0].vdesc = "Iteration Handle: 0x%08x"; - pvalues[0].vlength = 4; - pvalues[0].voffset = nds_offset; - pvalues[0].hfname = hf_nds_iteration; - nds_offset = nds_offset+pvalues[0].vlength; - pvalues[1].vtype = VTYPE_STRING; - pvalues[1].vdesc = "Distinguished Name: %s"; - pvalues[1].mvtype = MVTYPE_ATTR_REQUEST; - pvalues[1].vvalue = 0; - pvalues[1].vlength = 256; - pvalues[1].vlength = tvb_get_letohl(tvb, nds_offset); - if (pvalues[1].vlength == 0x00) - { - pvalues[1].vtype = VTYPE_NONE; - break; - } - pvalues[1].voffset = nds_offset+4; - nds_offset += 4; - get_string(tvb, pvalues[1].voffset, pvalues[1].vlength, pvalues[1].vstring); - nds_offset += pvalues[1].vlength; - nds_offset += align_4(tvb, nds_offset); - pvalues[1].hfname= hf_nds_name; - pvalues[2].vvalue = tvb_get_letohl(tvb, nds_offset); - pvalues[2].vtype = VTYPE_MULTIVALUE_UINT32; - pvalues[2].vdesc = "Referral Records: %u"; - pvalues[2].vlength = 4; - pvalues[2].voffset = nds_offset; - pvalues[2].hfname = hf_nds_referrals; - pvalues[2].mvtype = MVTYPE_LOC_ADDR_REFERRAL_REPLY; - } - break; - case 0x36: - break; - case 0x37: - break; - case 0x38: - break; - case 0x39: - break; - case 0x3a: - break; - case 0x3b: - break; - case 0x3c: - break; - case 0x3d: - break; - case 0x3e: - break; - case 0x3f: - break; - case 0x40: - break; - case 0x41: - break; - case 0x42: - break; - case 0x43: - break; - case 0x44: - break; - case 0x45: - break; - case 0x46: - break; - case 0x47: - break; - case 0x48: - break; - case 0x49: - break; - case 0x4a: - break; - case 0x4b: - break; - case 0x4c: - break; - case 0x4d: - break; - default: - break; - } - if(request_value->nds_request_verb != 0) - { - proto_tree_add_uint_format(ncp_tree, hf_ncp_nds_verb, tvb, 6, 0, - request_value->nds_request_verb, "NDS Verb: %d, %s", - request_value->nds_request_verb, verb_string); - } - /* NDS Entry ID's (EID) is identified in the reply packet of an NDS - * resolve name. We need to store this EID and it's associated - * name into our hash so that we can resolve the name for - * other NDS requests. */ - if (!pinfo->fd->flags.visited) { - if(add_eid) - { - request_eid_value = ncp_eid_hash_lookup(conversation, global_eid); - if (!request_eid_value) { - request_eid_value = ncp_eid_hash_insert(global_eid); - strcpy(request_eid_value->object_name, global_object_name); - } - } - } - /* For NDS requests with just an EID, resolve name from hash table. */ - if(resolve_eid) - { - request_eid_value = ncp_eid_hash_lookup(conversation, global_eid); - if (request_eid_value) { - strcpy(global_object_name, request_eid_value->object_name); - proto_tree_add_string_format(ncp_tree, hf_nds_name, tvb, 6, 0, - global_object_name, "NDS Name for EID - %s", - global_object_name); - } - } - for (i = 0; i < 9; i++) { - switch (pvalues[i].vtype) { - - case VTYPE_NONE: /* no value */ - break; - - case VTYPE_UINT8: - proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, - pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u", - pvalues[i].vtype); - break; - - case VTYPE_UINT16: - proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, - pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u", - pvalues[i].vtype); - break; - - case VTYPE_UINT32: - proto_tree_add_uint_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, - pvalues[i].vlength, pvalues[i].vvalue, pvalues[i].vdesc, - pvalues[i].vvalue); - break; - - case VTYPE_STRING: - proto_tree_add_string_format(ncp_tree, pvalues[i].hfname, tvb, pvalues[i].voffset, - pvalues[i].vlength, pvalues[i].vstring, pvalues[i].vdesc, - pvalues[i].vstring); - break; + expert_item = proto_tree_add_uint_format(ncp_tree, hf_ncp_completion_code, tvb, 6, 1, + completion_code, "Completion Code: %d (0x89%02x), %s", + completion_code, completion_code, error_string); + if (completion_code != 0 || type == NCP_POSITIVE_ACK) { + expert_add_info_format(pinfo, expert_item, + PI_RESPONSE_CODE, PI_ERROR, + "Error: %d (0x89%02x) %s", completion_code, + completion_code, error_string); + } - case VTYPE_BITFIELD: - process_bitfield(ncp_tree, tvb, &pvalues[i]); - break; + if (ncp_tree) { + proto_tree_add_item(ncp_tree, hf_ncp_connection_status, tvb, + 7, 1, FALSE); + } - case VTYPE_MULTIVALUE_UINT32: - process_multivalues(ncp_tree, tvb, &pvalues[i]); - break; + /* + * Unless this is a successful reply, that's all there + * is to parse. + */ + if (type != NCP_SERVICE_REPLY || completion_code != 0) + return; - default: - proto_tree_add_uint_format(ncp_tree, hf_nds_p1type, tvb, pvalues[i].voffset, - pvalues[i].vlength, pvalues[i].vtype, "NDS Parameter not defined %u", - pvalues[i].vtype); - break; - } - } - } - } + if (ncp_rec) { + /* Dissect SSS Reply packets */ + if (ncp_rec->func == 0x5c && request_value) + { + dissect_sss_reply(tvb, pinfo, ncp_tree, ncp_rec->subfunc, request_value); + } + /* Dissect NMAS Reply packets */ + if (ncp_rec->func == 0x5e && request_value) + { + dissect_nmas_reply(tvb, pinfo, ncp_tree, ncp_rec->func, ncp_rec->subfunc, request_value); + } + /* Dissect NDS Ping packets */ + if (ncp_rec->func == 0x68 && ncp_rec->subfunc == 0x01) + { + dissect_nds_ping_reply(tvb, pinfo, ncp_tree, + request_value); + } + /* Dissect NDS Reply packets */ + if (ncp_rec->func == 0x68 && ncp_rec->subfunc == 0x02) + { + dissect_nds_reply(tvb, pinfo, ncp_tree, nds_error_code, + nds_error_string, request_value, conversation); + } + } + length = tvb_length(tvb); + if (!ncp_rec && length > 8) { + expert_item = proto_tree_add_text(ncp_tree, tvb, 8, length - 8, + "No request record found. Parsing is impossible."); + expert_add_info_format(pinfo, expert_item, PI_SEQUENCE, PI_NOTE, "Original Request Packet not Found, Maybe normal at beginning of trace."); + } + else if (ncp_rec && ncp_rec->reply_ptvc) { + /* If a non-zero completion code was found, it is + * legal to not have any fields, even if the packet + * type is defined as having fields. + * + * XXX - we already know that the completion code is 0, + * as we checked it above. Is there any reason why we'd + * want to do a full dissection if the completion code + * isn't 0? */ + if (completion_code != 0 && tvb_length(tvb) == 8) { + return; } - length = tvb_length(tvb); - if (!ncp_rec && length > 8) { - expert_item = proto_tree_add_text(ncp_tree, tvb, 8, length - 8, - "No request record found. Parsing is impossible."); - expert_add_info_format(pinfo, expert_item, PI_SEQUENCE, PI_NOTE, "Original Request Packet not Found, Maybe normal at beginning of trace."); - } - else if (ncp_rec && ncp_rec->reply_ptvc) { - /* If a non-zero completion code was found, it is - * legal to not have any fields, even if the packet - * type is defined as having fields. */ - if (completion_code != 0 && tvb_length(tvb) == 8) { - return; - } - - /* Any request condition results? */ - if (request_value) { - req_cond_results = request_value->req_cond_results; - } - else { - req_cond_results = NULL; - } - - clear_repeat_vars(); - ptvc = ptvcursor_new(ncp_tree, tvb, 8); - process_ptvc_record(ptvc, ncp_rec->reply_ptvc, req_cond_results, - TRUE, ncp_rec); - ptvcursor_free(ptvc); - } - } + /* Any request condition results? */ + if (request_value) { + req_cond_results = request_value->req_cond_results; + } + else { + req_cond_results = NULL; + } + clear_repeat_vars(); + ptvc = ptvcursor_new(ncp_tree, tvb, 8); + process_ptvc_record(ptvc, ncp_rec->reply_ptvc, req_cond_results, + TRUE, ncp_rec); + ptvcursor_free(ptvc); + } } void |