aboutsummaryrefslogtreecommitdiffstats
path: root/packet-ncp.c
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2002-09-22 15:46:42 +0000
committerGerald Combs <gerald@wireshark.org>2002-09-22 15:46:42 +0000
commitc9cdfff342078d6ef252982737cec3b2f75f1066 (patch)
tree7674fc1373802e5ab5b6a0efafc4d0b7a9e1fd1c /packet-ncp.c
parent972849fff175402e63ba6431cf2315b253c543f4 (diff)
From Greg Morris: More NDS decodes.
Fix a typo in get_string(). svn path=/trunk/; revision=6313
Diffstat (limited to 'packet-ncp.c')
-rw-r--r--packet-ncp.c124
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");
}
+
+