diff options
author | gerald <gerald@f5534014-38df-0310-8fa8-9805f1628bb7> | 2002-09-22 15:46:42 +0000 |
---|---|---|
committer | gerald <gerald@f5534014-38df-0310-8fa8-9805f1628bb7> | 2002-09-22 15:46:42 +0000 |
commit | dc661cc1a0a8cd2862b05fd8c5cc416e50b60aaa (patch) | |
tree | 7674fc1373802e5ab5b6a0efafc4d0b7a9e1fd1c /packet-ncp.c | |
parent | 26e647a1ae673f97d01cefc9b0da321fe6b8aa1a (diff) |
From Greg Morris: More NDS decodes.
Fix a typo in get_string().
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@6313 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-ncp.c')
-rw-r--r-- | packet-ncp.c | 124 |
1 files changed, 84 insertions, 40 deletions
diff --git a/packet-ncp.c b/packet-ncp.c index 50c7eafc97..13c38e9534 100644 --- a/packet-ncp.c +++ b/packet-ncp.c @@ -5,7 +5,7 @@ * Modified to decode server op-lock * & NDS packets by Greg Morris <gmorris@novell.com> * - * $Id: packet-ncp.c,v 1.68 2002/08/28 21:00:23 jmayer Exp $ + * $Id: packet-ncp.c,v 1.69 2002/09/22 15:46:42 gerald Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -82,13 +82,15 @@ static int hf_ncp_slot = -1; static int hf_ncp_control_code = -1; static int hf_ncp_fragment_handle = -1; static int hf_lip_echo = -1; - +static int hf_ping_version = -1; gint ett_ncp = -1; +gint ett_nds = -1; static gint ett_ncp_system_flags = -1; /* desegmentation of NCP over TCP */ static gboolean ncp_desegment = TRUE; +static ncp_nds_true = FALSE; static dissector_handle_t data_handle; @@ -98,6 +100,7 @@ static dissector_handle_t data_handle; #define NCP_RQST_HDR_LENGTH 7 #define NCP_RPLY_HDR_LENGTH 8 + /* Hash functions */ gint ncp_equal (gconstpointer v, gconstpointer v2); guint ncp_hash (gconstpointer v); @@ -138,6 +141,10 @@ static const value_string ncp_ip_signature[] = { (c) 1996 by Steve Conner & Diane Conner Published by Annabooks, San Diego, California ISBN: 0-929392-31-0 + + And: + http:developer.novell.com + NCP documentation */ @@ -159,10 +166,10 @@ static value_string ncp_type_vals[] = { { NCP_SERVICE_REPLY, "Service reply" }, { NCP_WATCHDOG, "Watchdog" }, { NCP_DEALLOCATE_SLOT, "Destroy service connection" }, - { NCP_BROADCAST_SLOT, "Server Broadcast" }, + { NCP_BROADCAST_SLOT, "Server Broadcast" }, { NCP_BURST_MODE_XFER, "Burst mode transfer" }, { NCP_POSITIVE_ACK, "Request being processed" }, - { NCP_LIP_ECHO, "Large Internet Packet Echo" }, + { NCP_LIP_ECHO, "Large Internet Packet Echo" }, { 0, NULL } }; @@ -197,6 +204,7 @@ dissect_ncp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset; gint length_remaining; tvbuff_t *next_tvb; + guint32 testvar=0; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "NCP"); @@ -236,15 +244,16 @@ dissect_ncp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Record the offset where the NCP common header starts */ commhdr = hdr_offset; - header.type = tvb_get_ntohs(tvb, commhdr); + header.type = tvb_get_ntohs(tvb, commhdr); header.sequence = tvb_get_guint8(tvb, commhdr+2); header.conn_low = tvb_get_guint8(tvb, commhdr+3); header.conn_high = tvb_get_guint8(tvb, commhdr+5); if (check_col(pinfo->cinfo, COL_INFO)) { - col_add_fstr(pinfo->cinfo, COL_INFO, + col_add_fstr(pinfo->cinfo, COL_INFO, "%s", val_to_str(header.type, ncp_type_vals, "Unknown type (0x%04x)")); + } nw_connection = (header.conn_high << 16) + header.conn_low; @@ -272,19 +281,19 @@ dissect_ncp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, */ switch (header.type) { - case NCP_BROADCAST_SLOT: /* Server Broadcast */ - proto_tree_add_uint(ncp_tree, hf_ncp_seq, tvb, commhdr + 2, 1, header.sequence); + case NCP_BROADCAST_SLOT: /* Server Broadcast */ + proto_tree_add_uint(ncp_tree, hf_ncp_seq, tvb, commhdr + 2, 1, header.sequence); proto_tree_add_uint(ncp_tree, hf_ncp_connection,tvb, commhdr + 3, 3, nw_connection); proto_tree_add_item(ncp_tree, hf_ncp_task, tvb, commhdr + 4, 1, FALSE); proto_tree_add_item(ncp_tree, hf_ncp_oplock_flag, tvb, commhdr + 9, 1, FALSE); proto_tree_add_item(ncp_tree, hf_ncp_oplock_handle, tvb, commhdr + 10, 4, FALSE); - break; + break; - case NCP_LIP_ECHO: /* Lip Echo Packet */ - proto_tree_add_item(ncp_tree, hf_lip_echo, tvb, commhdr, 13, FALSE); - break; + case NCP_LIP_ECHO: /* Lip Echo Packet */ + proto_tree_add_item(ncp_tree, hf_lip_echo, tvb, commhdr, 2, FALSE); + break; - case NCP_BURST_MODE_XFER: /* Packet Burst Packet */ + case NCP_BURST_MODE_XFER: /* Packet Burst Packet */ /* * XXX - we should keep track of whether there's a burst * outstanding on a connection and, if not, treat the @@ -379,10 +388,20 @@ dissect_ncp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tvb, commhdr + 34, 2, FALSE); break; - case NCP_SERVICE_REQUEST: /* Server NCP Request */ - case NCP_SERVICE_REPLY: /* Server NCP Reply */ case NCP_ALLOCATE_SLOT: /* Allocate Slot Request */ - case NCP_WATCHDOG: /* Watchdog Packet */ + length_remaining = tvb_length_remaining(tvb, commhdr + 4); + if (length_remaining > 4) + { + testvar = tvb_get_ntohl(tvb, commhdr+4); + if( testvar == 0x4c495020) + { + proto_tree_add_item(ncp_tree, hf_lip_echo, tvb, commhdr+4, 13, FALSE); + break; + } + } + case NCP_SERVICE_REQUEST: /* Server NCP Request */ + case NCP_SERVICE_REPLY: /* Server NCP Reply */ + case NCP_WATCHDOG: /* Watchdog Packet */ case NCP_DEALLOCATE_SLOT: /* Deallocate Slot Request */ case NCP_POSITIVE_ACK: /* Positive Acknowledgement */ default: @@ -397,27 +416,49 @@ dissect_ncp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, */ switch (header.type) { - case NCP_ALLOCATE_SLOT: /* Allocate Slot Request */ - case NCP_SERVICE_REQUEST: /* Server NCP Request */ + case NCP_ALLOCATE_SLOT: /* Allocate Slot Request */ + length_remaining = tvb_length_remaining(tvb, commhdr + 4); + if (length_remaining > 4) + { + testvar = tvb_get_ntohl(tvb, commhdr+4); + if( testvar == 0x4c495020) + { + proto_tree_add_text(ncp_tree, tvb, commhdr, -1, + "Lip Echo Packet"); + /*break;*/ + } + } + case NCP_SERVICE_REQUEST: /* Server NCP Request */ case NCP_DEALLOCATE_SLOT: /* Deallocate Slot Request */ - case NCP_BROADCAST_SLOT: /* Server Broadcast Packet */ + case NCP_BROADCAST_SLOT: /* Server Broadcast Packet */ next_tvb = tvb_new_subset(tvb, hdr_offset, -1, -1); - if (tvb_get_guint8(tvb, commhdr+6) == 0x68) { - ncp_nds_verb = tvb_get_ntohl(tvb, commhdr+4); - if (tvb_get_guint8(tvb, commhdr+7) == 0x02) { /* NDS Packet to decode */ - dissect_nds_request(next_tvb, pinfo, nw_connection, - header.sequence, header.type, ncp_tree); - } else { - dissect_ncp_request(next_tvb, pinfo, nw_connection, - header.sequence, header.type, ncp_tree); - } - } else { - dissect_ncp_request(next_tvb, pinfo, nw_connection, - header.sequence, header.type, ncp_tree); - } + if (tvb_get_guint8(tvb, commhdr+6)==0x68) { + ncp_nds_verb = tvb_get_ntohl(tvb, commhdr+4); + if (tvb_get_guint8(tvb, commhdr+7)==0x02) { /* NDS Frag Packet to decode */ + dissect_nds_request(next_tvb, pinfo, nw_connection, + header.sequence, header.type, ncp_tree); + } + else + { + if(tvb_get_guint8(tvb, commhdr+7)==0x01) { /* NDS Ping */ + dissect_ping_req(next_tvb, pinfo, nw_connection, + header.sequence, header.type, ncp_tree); + } + else + { + dissect_ncp_request(next_tvb, pinfo, nw_connection, + header.sequence, header.type, ncp_tree); + } + } + } + else + { + dissect_ncp_request(next_tvb, pinfo, nw_connection, + header.sequence, header.type, ncp_tree); + } break; - case NCP_SERVICE_REPLY: /* Server NCP Reply */ + case NCP_SERVICE_REPLY: /* Server NCP Reply */ case NCP_POSITIVE_ACK: /* Positive Acknowledgement */ next_tvb = tvb_new_subset(tvb, hdr_offset, -1, -1); dissect_ncp_reply(next_tvb, pinfo, nw_connection, @@ -482,15 +523,13 @@ dissect_ncp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } } break; - - case NCP_LIP_ECHO: /* LIP Echo Packet */ - proto_tree_add_text(ncp_tree, tvb, commhdr, -1, - "Lip Echo Packet"); - break; - + case NCP_LIP_ECHO: /* LIP Echo Packet */ + proto_tree_add_text(ncp_tree, tvb, commhdr, -1, + "Lip Echo Packet"); + break; default: if (tree) { - proto_tree_add_text(ncp_tree, tvb, commhdr + 6, -1, + proto_tree_add_text(ncp_tree, tvb, commhdr + 6, -1, "%s packets not supported yet", val_to_str(header.type, ncp_type_vals, "Unknown type (0x%04x)")); @@ -524,6 +563,7 @@ get_ncp_pdu_len(tvbuff_t *tvb, int offset) * Get the length of the NCP-over-TCP packet. Strip off the "has * signature" flag. */ + return tvb_get_ntohl(tvb, offset + 4) & 0x7fffffff; } @@ -681,10 +721,12 @@ proto_register_ncp(void) { "Large Internet Packet Echo", "ncp.lip_echo", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }}, + }; static gint *ett[] = { &ett_ncp, &ett_ncp_system_flags, + &ett_nds, }; module_t *ncp_module; @@ -715,3 +757,5 @@ proto_reg_handoff_ncp(void) data_handle = find_dissector("data"); } + + |