2000-04-15 22:11:26 +00:00
|
|
|
/* packet-clnp.c
|
2008-07-15 16:33:15 +00:00
|
|
|
* Routines for ISO/OSI network protocol packet disassembly
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
2004-07-18 00:24:25 +00:00
|
|
|
* $Id$
|
2003-01-26 19:35:31 +00:00
|
|
|
* Laurent Deniel <laurent.deniel@free.fr>
|
2000-04-15 22:11:26 +00:00
|
|
|
* Ralf Schneider <Ralf.Schneider@t-online.de>
|
|
|
|
*
|
2006-05-21 04:49:01 +00:00
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
2000-04-15 22:11:26 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2012-06-28 22:56:06 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2000-04-15 22:11:26 +00:00
|
|
|
*/
|
|
|
|
|
2012-09-20 02:03:38 +00:00
|
|
|
#include "config.h"
|
2009-09-30 13:22:56 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
#include <glib.h>
|
2002-01-21 07:37:49 +00:00
|
|
|
#include <epan/packet.h>
|
2012-04-24 18:27:06 +00:00
|
|
|
#include <epan/prefs.h>
|
2005-02-09 23:38:00 +00:00
|
|
|
#include <epan/reassemble.h>
|
2000-04-15 22:11:26 +00:00
|
|
|
#include "packet-osi.h"
|
|
|
|
#include "packet-osi-options.h"
|
|
|
|
#include "packet-isis.h"
|
|
|
|
#include "packet-esis.h"
|
2005-09-17 00:02:31 +00:00
|
|
|
#include <epan/nlpid.h>
|
2004-09-29 00:52:45 +00:00
|
|
|
#include <epan/ipproto.h>
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2013-03-15 06:26:47 +00:00
|
|
|
void proto_register_clnp(void);
|
|
|
|
void proto_reg_handoff_clnp(void);
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
/* protocols and fields */
|
|
|
|
|
|
|
|
static int proto_clnp = -1;
|
|
|
|
static gint ett_clnp = -1;
|
2000-12-23 21:40:22 +00:00
|
|
|
static gint ett_clnp_type = -1;
|
2001-06-08 06:27:16 +00:00
|
|
|
static gint ett_clnp_segments = -1;
|
|
|
|
static gint ett_clnp_segment = -1;
|
2000-12-23 19:34:46 +00:00
|
|
|
static gint ett_clnp_disc_pdu = -1;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
static int hf_clnp_id = -1;
|
|
|
|
static int hf_clnp_length = -1;
|
|
|
|
static int hf_clnp_version = -1;
|
|
|
|
static int hf_clnp_ttl = -1;
|
|
|
|
static int hf_clnp_type = -1;
|
2012-09-23 00:12:14 +00:00
|
|
|
static int hf_clnp_cnf_segmentation = -1;
|
|
|
|
static int hf_clnp_cnf_more_segments = -1;
|
|
|
|
static int hf_clnp_cnf_report_error = -1;
|
|
|
|
static int hf_clnp_cnf_type = -1;
|
2000-04-15 22:11:26 +00:00
|
|
|
static int hf_clnp_pdu_length = -1;
|
|
|
|
static int hf_clnp_checksum = -1;
|
|
|
|
static int hf_clnp_dest_length = -1;
|
|
|
|
static int hf_clnp_dest = -1;
|
|
|
|
static int hf_clnp_src_length = -1;
|
|
|
|
static int hf_clnp_src = -1;
|
Handle the pseudo-trailer for the ATN extended checksums by passing in
the source and destination address lengths and data, and adding them in,
rather than by copying those fields to a fixed-size static buffer - that
gets rid of a global variable (global variables considered harmful), and
also means that we don't try to copy 24 bytes of length+address from
packets that don't *have* 24 bytes of length+address (which caused
exceptions to be thrown on some OSI captures I have).
Construct some LI #defines out of other LI #defines, to make it a bit
clearer why they have the values they do.
Support the "additional information related to the clearing of the
connection" variable part parameter of the COTP DR packet (which just
means giving it a name, as its contents are user-defined - some HP-UX
OSI stack appears to just stick in a string saying that it's said
stack).
Make the code that decodes the variable part of a DR packet look like
the code that decodes the variable part of most other packets.
For COTP CR packets, determine the class up front by checking whether
the length is > 2. (At some point we might want to associate a class
indication with the COTP connection, if we see the connection setup,
and, if we have that indication, use it in preference to the
heuristics.)
Make the code to handle various length indicator values in the ATN case
more like the code in the non-ATN case.
Dissect the variable part of COTP ER packets.
Fix tpyos (TDPU->TPDU, tdpu->tpdu) and typpoes (accross->across).
Clean up white space.
svn path=/trunk/; revision=46060
2012-11-17 22:12:37 +00:00
|
|
|
int hf_clnp_atntt = -1; /* as referenced in packet-osi-options.c */
|
|
|
|
int hf_clnp_atnsc = -1; /* as referenced in packet-osi-options.c */
|
2001-06-08 06:27:16 +00:00
|
|
|
static int hf_clnp_segments = -1;
|
|
|
|
static int hf_clnp_segment = -1;
|
2011-04-27 19:40:20 +00:00
|
|
|
static int hf_clnp_segment_overlap = -1;
|
2001-06-08 06:27:16 +00:00
|
|
|
static int hf_clnp_segment_overlap_conflict = -1;
|
2011-04-27 19:40:20 +00:00
|
|
|
static int hf_clnp_segment_multiple_tails = -1;
|
2001-06-08 06:27:16 +00:00
|
|
|
static int hf_clnp_segment_too_long_segment = -1;
|
2011-04-27 19:40:20 +00:00
|
|
|
static int hf_clnp_segment_error = -1;
|
|
|
|
static int hf_clnp_segment_count = -1;
|
|
|
|
static int hf_clnp_reassembled_in = -1;
|
|
|
|
static int hf_clnp_reassembled_length = -1;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2002-10-24 06:17:36 +00:00
|
|
|
static const fragment_items clnp_frag_items = {
|
2011-04-27 19:40:20 +00:00
|
|
|
&ett_clnp_segment,
|
|
|
|
&ett_clnp_segments,
|
|
|
|
&hf_clnp_segments,
|
|
|
|
&hf_clnp_segment,
|
|
|
|
&hf_clnp_segment_overlap,
|
|
|
|
&hf_clnp_segment_overlap_conflict,
|
|
|
|
&hf_clnp_segment_multiple_tails,
|
|
|
|
&hf_clnp_segment_too_long_segment,
|
|
|
|
&hf_clnp_segment_error,
|
|
|
|
&hf_clnp_segment_count,
|
|
|
|
&hf_clnp_reassembled_in,
|
|
|
|
&hf_clnp_reassembled_length,
|
2012-09-07 02:09:59 +00:00
|
|
|
/* Reassembled data field */
|
|
|
|
NULL,
|
2011-04-27 19:40:20 +00:00
|
|
|
"segments"
|
2002-06-07 10:11:41 +00:00
|
|
|
};
|
|
|
|
|
2003-01-20 05:42:37 +00:00
|
|
|
static dissector_handle_t clnp_handle;
|
2008-07-15 16:33:15 +00:00
|
|
|
static dissector_handle_t ositp_handle;
|
|
|
|
static dissector_handle_t ositp_inactive_handle;
|
2001-11-26 04:52:51 +00:00
|
|
|
static dissector_handle_t data_handle;
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
/*
|
|
|
|
* ISO 8473 OSI CLNP definition (see RFC994)
|
|
|
|
*
|
|
|
|
* _________________________________
|
|
|
|
* | Fixed Part |
|
|
|
|
* |_________________________________|
|
|
|
|
* | Address Part |
|
|
|
|
* |_________________________________|
|
|
|
|
* | Segmentation Part (optional) |
|
|
|
|
* |_________________________________|
|
|
|
|
* | Options Part (optional) |
|
|
|
|
* |_________________________________|
|
|
|
|
* | Data (optional) |
|
|
|
|
* |_________________________________|
|
|
|
|
*/
|
|
|
|
|
2011-04-27 19:40:20 +00:00
|
|
|
#define ISO8473_V1 0x01 /* CLNP version 1 */
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
/* Fixed part */
|
|
|
|
|
2011-04-27 19:40:20 +00:00
|
|
|
#define CNF_TYPE 0x1f
|
|
|
|
#define CNF_ERR_OK 0x20
|
|
|
|
#define CNF_MORE_SEGS 0x40
|
|
|
|
#define CNF_SEG_OK 0x80
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2011-04-27 19:40:20 +00:00
|
|
|
#define DT_NPDU 0x1C
|
|
|
|
#define MD_NPDU 0x1D
|
|
|
|
#define ER_NPDU 0x01
|
|
|
|
#define ERQ_NPDU 0x1E
|
|
|
|
#define ERP_NPDU 0x1F
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2000-12-23 23:06:50 +00:00
|
|
|
static const value_string npdu_type_abbrev_vals[] = {
|
2011-04-27 19:40:20 +00:00
|
|
|
{ DT_NPDU, "DT" },
|
|
|
|
{ MD_NPDU, "MD" },
|
|
|
|
{ ER_NPDU, "ER" },
|
|
|
|
{ ERQ_NPDU, "ERQ" },
|
|
|
|
{ ERP_NPDU, "ERP" },
|
|
|
|
{ 0, NULL }
|
2000-04-15 22:11:26 +00:00
|
|
|
};
|
|
|
|
|
2000-12-23 23:06:50 +00:00
|
|
|
static const value_string npdu_type_vals[] = {
|
2011-04-27 19:40:20 +00:00
|
|
|
{ DT_NPDU, "Data" },
|
|
|
|
{ MD_NPDU, "Multicast Data" },
|
|
|
|
{ ER_NPDU, "Error Report" },
|
|
|
|
{ ERQ_NPDU, "Echo Request" },
|
|
|
|
{ ERP_NPDU, "Echo Response" },
|
|
|
|
{ 0, NULL }
|
2000-12-23 23:06:50 +00:00
|
|
|
};
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
/* field position */
|
|
|
|
|
2011-04-27 19:40:20 +00:00
|
|
|
#define P_CLNP_PROTO_ID 0
|
|
|
|
#define P_CLNP_HDR_LEN 1
|
|
|
|
#define P_CLNP_VERS 2
|
|
|
|
#define P_CLNP_TTL 3
|
|
|
|
#define P_CLNP_TYPE 4
|
|
|
|
#define P_CLNP_SEGLEN 5
|
|
|
|
#define P_CLNP_CKSUM 7
|
|
|
|
#define P_CLNP_ADDRESS_PART 9
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
/* Segmentation part */
|
|
|
|
|
|
|
|
struct clnp_segment {
|
2011-04-27 19:40:20 +00:00
|
|
|
gushort cng_id; /* data unit identifier */
|
|
|
|
gushort cng_off; /* segment offset */
|
|
|
|
gushort cng_tot_len; /* total length */
|
2000-04-15 22:11:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* NSAP selector */
|
|
|
|
|
2011-04-27 19:40:20 +00:00
|
|
|
#define NSEL_NET 0x00
|
|
|
|
#define NSEL_NP 0x20
|
|
|
|
#define NSEL_TP 0x21
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
/* global variables */
|
|
|
|
|
2003-02-25 18:59:47 +00:00
|
|
|
/* List of dissectors to call for CLNP packets */
|
|
|
|
static heur_dissector_list_t clnp_heur_subdissector_list;
|
Add routines to:
register lists of "heuristic" dissectors, which are handed a
frame that may or may contain a payload for the protocol they
dissect, and that return FALSE if it's not or dissect the packet
and return TRUE if it is;
add a dissector to such a list;
go through such a list, calling each dissector until either a
dissector returns TRUE, in which case the routine returns TRUE,
or it runs out of entries in the list, in which case the routine
returns FALSE.
Have lists of heuristic dissectors for TCP and for COTP when used with
the Inactive Subset of CLNP, and add the GIOP and Yahoo Messenger
dissectors to the first list and the Sinec H1 dissector to the second
list.
Make the dissector name argument to "dissector_add()" and
"dissector_delete()" a "const char *" rarther than just a "char *".
Add "heur_dissector_add()", the routine to add a heuristic dissector to
a list of heuristic dissectors, to the set of routines we can export to
plugins through a table on platforms where dynamically-loaded code can't
call stuff in the main program, and initialize the element in the table
in question for "dissector_add()" (which we'd forgotten to do).
svn path=/trunk/; revision=1909
2000-05-05 09:32:36 +00:00
|
|
|
|
2001-06-08 06:27:16 +00:00
|
|
|
/*
|
|
|
|
* Reassembly of CLNP.
|
|
|
|
*/
|
2013-03-22 23:59:54 +00:00
|
|
|
static reassembly_table clnp_reassembly_table;
|
2001-06-08 06:27:16 +00:00
|
|
|
|
2000-08-06 15:54:42 +00:00
|
|
|
/* options */
|
|
|
|
static guint tp_nsap_selector = NSEL_TP;
|
|
|
|
static gboolean always_decode_transport = FALSE;
|
2005-09-28 22:15:38 +00:00
|
|
|
static gboolean clnp_reassemble = TRUE;
|
2012-11-16 14:18:27 +00:00
|
|
|
gboolean clnp_decode_atn_options = FALSE;
|
2000-08-06 15:54:42 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
/* function definitions */
|
|
|
|
|
|
|
|
/*
|
2002-08-28 21:04:11 +00:00
|
|
|
* CLNP part / main entry point
|
2006-09-08 06:58:40 +00:00
|
|
|
*/
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2012-04-24 18:27:06 +00:00
|
|
|
static void
|
|
|
|
dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
2000-04-15 22:11:26 +00:00
|
|
|
{
|
2012-04-24 18:27:06 +00:00
|
|
|
proto_tree *clnp_tree = NULL;
|
|
|
|
proto_item *ti;
|
|
|
|
guint8 cnf_proto_id;
|
|
|
|
guint8 cnf_hdr_len;
|
|
|
|
guint8 cnf_vers;
|
|
|
|
guint8 cnf_ttl;
|
|
|
|
guint8 cnf_type;
|
|
|
|
char flag_string[6+1];
|
|
|
|
const char *pdu_type_string;
|
|
|
|
proto_tree *type_tree;
|
|
|
|
guint16 segment_length;
|
|
|
|
guint16 du_id = 0;
|
|
|
|
guint16 segment_offset = 0;
|
|
|
|
guint16 cnf_cksum;
|
|
|
|
cksum_status_t cksum_status;
|
|
|
|
int offset;
|
|
|
|
guchar src_len, dst_len, nsel, opt_len = 0;
|
|
|
|
const guint8 *dst_addr, *src_addr;
|
|
|
|
guint next_length;
|
|
|
|
proto_tree *discpdu_tree;
|
|
|
|
gboolean save_in_error_pkt;
|
|
|
|
fragment_data *fd_head;
|
|
|
|
tvbuff_t *next_tvb;
|
|
|
|
gboolean update_col_info = TRUE;
|
|
|
|
gboolean save_fragmented;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2009-08-09 06:26:46 +00:00
|
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "CLNP");
|
2009-08-09 07:36:13 +00:00
|
|
|
col_clear(pinfo->cinfo, COL_INFO);
|
2000-04-15 22:11:26 +00:00
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
cnf_proto_id = tvb_get_guint8(tvb, P_CLNP_PROTO_ID);
|
|
|
|
if (cnf_proto_id == NLPID_NULL) {
|
2009-08-09 07:01:26 +00:00
|
|
|
col_set_str(pinfo->cinfo, COL_INFO, "Inactive subset");
|
2000-04-15 22:11:26 +00:00
|
|
|
if (tree) {
|
2011-10-21 02:10:19 +00:00
|
|
|
ti = proto_tree_add_item(tree, proto_clnp, tvb, P_CLNP_PROTO_ID, 1, ENC_NA);
|
2000-04-15 22:11:26 +00:00
|
|
|
clnp_tree = proto_item_add_subtree(ti, ett_clnp);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint_format(clnp_tree, hf_clnp_id, tvb, P_CLNP_PROTO_ID, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_proto_id,
|
|
|
|
"Inactive subset");
|
2002-08-28 21:04:11 +00:00
|
|
|
}
|
2009-08-16 12:36:22 +00:00
|
|
|
next_tvb = tvb_new_subset_remaining(tvb, 1);
|
2008-07-15 16:33:15 +00:00
|
|
|
if (call_dissector(ositp_inactive_handle, next_tvb, pinfo, tree) == 0)
|
|
|
|
call_dissector(data_handle,tvb, pinfo, tree);
|
2000-04-15 22:11:26 +00:00
|
|
|
return;
|
2002-08-28 21:04:11 +00:00
|
|
|
}
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
/* return if version not known */
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
cnf_vers = tvb_get_guint8(tvb, P_CLNP_VERS);
|
|
|
|
if (cnf_vers != ISO8473_V1) {
|
2001-11-26 04:52:51 +00:00
|
|
|
call_dissector(data_handle,tvb, pinfo, tree);
|
2000-04-15 22:11:26 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* fixed part decoding */
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
cnf_hdr_len = tvb_get_guint8(tvb, P_CLNP_HDR_LEN);
|
|
|
|
opt_len = cnf_hdr_len;
|
2012-11-16 14:18:27 +00:00
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (tree) {
|
2011-10-21 02:10:19 +00:00
|
|
|
ti = proto_tree_add_item(tree, proto_clnp, tvb, 0, cnf_hdr_len, ENC_NA);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
clnp_tree = proto_item_add_subtree(ti, ett_clnp);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint(clnp_tree, hf_clnp_id, tvb, P_CLNP_PROTO_ID, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_proto_id);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint(clnp_tree, hf_clnp_length, tvb, P_CLNP_HDR_LEN, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_hdr_len);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint(clnp_tree, hf_clnp_version, tvb, P_CLNP_VERS, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_vers);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
cnf_ttl = tvb_get_guint8(tvb, P_CLNP_TTL);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint_format(clnp_tree, hf_clnp_ttl, tvb, P_CLNP_TTL, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_ttl,
|
|
|
|
"Holding Time : %u (%u.%u secs)",
|
|
|
|
cnf_ttl, cnf_ttl / 2, (cnf_ttl % 2) * 5);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
cnf_type = tvb_get_guint8(tvb, P_CLNP_TYPE);
|
2000-12-23 23:06:50 +00:00
|
|
|
pdu_type_string = val_to_str(cnf_type & CNF_TYPE, npdu_type_abbrev_vals,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Unknown (0x%02x)");
|
2000-04-15 22:11:26 +00:00
|
|
|
flag_string[0] = '\0';
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (cnf_type & CNF_SEG_OK)
|
2008-03-01 17:23:39 +00:00
|
|
|
g_strlcat(flag_string, "S ", 7);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (cnf_type & CNF_MORE_SEGS)
|
2008-03-01 17:23:39 +00:00
|
|
|
g_strlcat(flag_string, "M ", 7);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (cnf_type & CNF_ERR_OK)
|
2008-03-01 17:23:39 +00:00
|
|
|
g_strlcat(flag_string, "E ", 7);
|
2000-04-15 22:11:26 +00:00
|
|
|
if (tree) {
|
2000-12-23 21:40:22 +00:00
|
|
|
ti = proto_tree_add_uint_format(clnp_tree, hf_clnp_type, tvb, P_CLNP_TYPE, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_type,
|
|
|
|
"PDU Type : 0x%02x (%s%s)",
|
|
|
|
cnf_type,
|
|
|
|
flag_string,
|
|
|
|
pdu_type_string);
|
2000-12-23 21:40:22 +00:00
|
|
|
type_tree = proto_item_add_subtree(ti, ett_clnp_type);
|
2012-09-23 00:12:14 +00:00
|
|
|
proto_tree_add_item(type_tree, hf_clnp_cnf_segmentation, tvb, P_CLNP_TYPE, 1, ENC_NA);
|
|
|
|
proto_tree_add_item(type_tree, hf_clnp_cnf_more_segments, tvb, P_CLNP_TYPE, 1, ENC_NA);
|
|
|
|
proto_tree_add_item(type_tree, hf_clnp_cnf_report_error, tvb, P_CLNP_TYPE, 1, ENC_NA);
|
|
|
|
proto_tree_add_item(type_tree, hf_clnp_cnf_type, tvb, P_CLNP_TYPE, 1, ENC_NA);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* If we don't have the full header - i.e., not enough to see the
|
|
|
|
segmentation part and determine whether this datagram is segmented
|
|
|
|
or not - set the Info column now; we'll get an exception before
|
|
|
|
we set it otherwise. */
|
|
|
|
|
2007-11-08 22:40:20 +00:00
|
|
|
if (tvb_length(tvb) < cnf_hdr_len) {
|
2011-09-26 09:01:17 +00:00
|
|
|
col_add_fstr(pinfo->cinfo, COL_INFO, "%s NPDU %s", pdu_type_string, flag_string);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
segment_length = tvb_get_ntohs(tvb, P_CLNP_SEGLEN);
|
2001-06-08 06:27:16 +00:00
|
|
|
cnf_cksum = tvb_get_ntohs(tvb, P_CLNP_CKSUM);
|
|
|
|
cksum_status = calc_checksum(tvb, 0, cnf_hdr_len, cnf_cksum);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (tree) {
|
|
|
|
proto_tree_add_uint(clnp_tree, hf_clnp_pdu_length, tvb, P_CLNP_SEGLEN, 2,
|
2011-04-27 19:40:20 +00:00
|
|
|
segment_length);
|
2001-06-08 06:27:16 +00:00
|
|
|
switch (cksum_status) {
|
2001-06-05 09:06:19 +00:00
|
|
|
|
|
|
|
default:
|
2011-04-27 19:40:20 +00:00
|
|
|
/*
|
|
|
|
* No checksum present, or not enough of the header present to
|
|
|
|
* checksum it.
|
|
|
|
*/
|
|
|
|
proto_tree_add_uint_format(clnp_tree, hf_clnp_checksum, tvb,
|
|
|
|
P_CLNP_CKSUM, 2,
|
|
|
|
cnf_cksum,
|
|
|
|
"Checksum : 0x%04x",
|
|
|
|
cnf_cksum);
|
|
|
|
break;
|
2001-06-05 09:06:19 +00:00
|
|
|
|
|
|
|
case CKSUM_OK:
|
2011-04-27 19:40:20 +00:00
|
|
|
/*
|
|
|
|
* Checksum is correct.
|
|
|
|
*/
|
|
|
|
proto_tree_add_uint_format(clnp_tree, hf_clnp_checksum, tvb,
|
|
|
|
P_CLNP_CKSUM, 2,
|
|
|
|
cnf_cksum,
|
|
|
|
"Checksum : 0x%04x (correct)",
|
|
|
|
cnf_cksum);
|
|
|
|
break;
|
2001-06-05 09:06:19 +00:00
|
|
|
|
|
|
|
case CKSUM_NOT_OK:
|
2011-04-27 19:40:20 +00:00
|
|
|
/*
|
|
|
|
* Checksum is not correct.
|
|
|
|
*/
|
|
|
|
proto_tree_add_uint_format(clnp_tree, hf_clnp_checksum, tvb,
|
|
|
|
P_CLNP_CKSUM, 2,
|
|
|
|
cnf_cksum,
|
|
|
|
"Checksum : 0x%04x (incorrect)",
|
|
|
|
cnf_cksum);
|
|
|
|
break;
|
2001-06-05 09:06:19 +00:00
|
|
|
}
|
2012-11-16 14:18:27 +00:00
|
|
|
opt_len -= 9; /* Fixed part of Header */
|
2000-04-15 22:11:26 +00:00
|
|
|
} /* tree */
|
|
|
|
|
|
|
|
/* address part */
|
2002-08-28 21:04:11 +00:00
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
offset = P_CLNP_ADDRESS_PART;
|
|
|
|
dst_len = tvb_get_guint8(tvb, offset);
|
|
|
|
dst_addr = tvb_get_ptr(tvb, offset + 1, dst_len);
|
|
|
|
nsel = tvb_get_guint8(tvb, offset + dst_len);
|
|
|
|
src_len = tvb_get_guint8(tvb, offset + dst_len + 1);
|
|
|
|
src_addr = tvb_get_ptr(tvb, offset + dst_len + 2, src_len);
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
if (tree) {
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint(clnp_tree, hf_clnp_dest_length, tvb, offset, 1,
|
2011-04-27 19:40:20 +00:00
|
|
|
dst_len);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_bytes_format(clnp_tree, hf_clnp_dest, tvb, offset + 1 , dst_len,
|
2011-04-27 19:40:20 +00:00
|
|
|
dst_addr,
|
|
|
|
" DA : %s",
|
|
|
|
print_nsap_net(dst_addr, dst_len));
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_uint(clnp_tree, hf_clnp_src_length, tvb,
|
2011-04-27 19:40:20 +00:00
|
|
|
offset + 1 + dst_len, 1, src_len);
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_bytes_format(clnp_tree, hf_clnp_src, tvb,
|
2011-04-27 19:40:20 +00:00
|
|
|
offset + dst_len + 2, src_len,
|
|
|
|
src_addr,
|
|
|
|
" SA : %s",
|
|
|
|
print_nsap_net(src_addr, src_len));
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
opt_len -= dst_len + src_len +2;
|
|
|
|
}
|
|
|
|
|
2001-03-15 06:41:13 +00:00
|
|
|
SET_ADDRESS(&pinfo->net_src, AT_OSI, src_len, src_addr);
|
|
|
|
SET_ADDRESS(&pinfo->src, AT_OSI, src_len, src_addr);
|
|
|
|
SET_ADDRESS(&pinfo->net_dst, AT_OSI, dst_len, dst_addr);
|
|
|
|
SET_ADDRESS(&pinfo->dst, AT_OSI, dst_len, dst_addr);
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
/* Segmentation Part */
|
|
|
|
|
|
|
|
offset += dst_len + src_len + 2;
|
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (cnf_type & CNF_SEG_OK) {
|
2011-04-27 19:40:20 +00:00
|
|
|
#if 0
|
|
|
|
struct clnp_segment seg; /* XXX - not used */
|
|
|
|
tvb_memcpy(tvb, (guint8 *)&seg, offset, sizeof(seg)); /* XXX - not used */
|
|
|
|
#endif
|
2002-08-28 21:04:11 +00:00
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
segment_offset = tvb_get_ntohs(tvb, offset + 2);
|
2001-06-08 06:27:16 +00:00
|
|
|
du_id = tvb_get_ntohs(tvb, offset);
|
2000-04-15 22:11:26 +00:00
|
|
|
if (tree) {
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_text(clnp_tree, tvb, offset, 2,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Data unit identifier: %06u",
|
|
|
|
du_id);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
proto_tree_add_text(clnp_tree, tvb, offset + 2 , 2,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Segment offset : %6u",
|
|
|
|
segment_offset);
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
proto_tree_add_text(clnp_tree, tvb, offset + 4 , 2,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Total length : %6u",
|
|
|
|
tvb_get_ntohs(tvb, offset + 4));
|
2000-04-15 22:11:26 +00:00
|
|
|
}
|
2002-08-28 21:04:11 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
offset += 6;
|
|
|
|
opt_len -= 6;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tree) {
|
|
|
|
/* To do : decode options */
|
2011-04-27 19:40:20 +00:00
|
|
|
#if 0
|
2002-08-28 21:04:11 +00:00
|
|
|
proto_tree_add_text(clnp_tree, tvb, offset,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_hdr_len - offset,
|
|
|
|
"Options/Data: <not shown>");
|
|
|
|
#endif
|
2000-04-15 22:11:26 +00:00
|
|
|
/* QUICK HACK Option Len:= PDU_Hd_length-( FixedPart+AddresPart+SegmentPart )*/
|
|
|
|
|
2002-04-30 23:56:58 +00:00
|
|
|
dissect_osi_options( opt_len,
|
2002-08-28 21:04:11 +00:00
|
|
|
tvb, offset, clnp_tree );
|
2000-04-15 22:11:26 +00:00
|
|
|
}
|
|
|
|
|
2012-10-18 20:57:02 +00:00
|
|
|
offset += opt_len;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2003-03-04 06:47:10 +00:00
|
|
|
/* If clnp_reassemble is on, this is a segment, we have all the
|
2002-01-20 01:04:18 +00:00
|
|
|
* data in the segment, and the checksum is valid, then just add the
|
|
|
|
* segment to the hashtable.
|
2001-06-08 06:27:16 +00:00
|
|
|
*/
|
Use the "fragmented" field of the "packet_info" structure in
"dissect_frame()" to indicate whether a ReportedBoundsError was due to
the packet being malformed (i.e., the packet was shorter than it's
supposed to be, so the dissector went past the end trying to extract
fields that were supposed to be there) or due to it not being
reassembled (i.e., the packet was fragmented, and we didn't reassemble
it, but just treated the first fragment as the entire packet, so the
dissector went past the end trying to extract fields that were partially
or completely in fragments after that). Mark the latter as being
unreasembled rather than malformed.
Properly initialize, save, and restore that field, and properly set it,
so that works.
svn path=/trunk/; revision=4555
2002-01-17 06:29:20 +00:00
|
|
|
save_fragmented = pinfo->fragmented;
|
2001-06-08 06:27:16 +00:00
|
|
|
if (clnp_reassemble && (cnf_type & CNF_SEG_OK) &&
|
2011-04-27 19:40:20 +00:00
|
|
|
((cnf_type & CNF_MORE_SEGS) || segment_offset != 0) &&
|
|
|
|
tvb_bytes_exist(tvb, offset, segment_length - cnf_hdr_len) &&
|
|
|
|
segment_length > cnf_hdr_len &&
|
|
|
|
cksum_status != CKSUM_NOT_OK) {
|
2013-03-22 23:59:54 +00:00
|
|
|
fd_head = fragment_add_check(&clnp_reassembly_table,
|
|
|
|
tvb, offset, pinfo, du_id, NULL,
|
|
|
|
segment_offset, segment_length - cnf_hdr_len,
|
2011-04-27 19:40:20 +00:00
|
|
|
cnf_type & CNF_MORE_SEGS);
|
2003-04-20 11:36:16 +00:00
|
|
|
|
2003-08-28 04:19:29 +00:00
|
|
|
next_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled CLNP",
|
2011-04-27 19:40:20 +00:00
|
|
|
fd_head, &clnp_frag_items, &update_col_info, clnp_tree);
|
2001-06-08 06:27:16 +00:00
|
|
|
} else {
|
|
|
|
/* If this is the first segment, dissect its contents, otherwise
|
|
|
|
just show it as a segment.
|
|
|
|
|
|
|
|
XXX - if we eventually don't save the reassembled contents of all
|
|
|
|
segmented datagrams, we may want to always reassemble. */
|
|
|
|
if ((cnf_type & CNF_SEG_OK) && segment_offset != 0) {
|
|
|
|
/* Not the first segment - don't dissect it. */
|
|
|
|
next_tvb = NULL;
|
|
|
|
} else {
|
|
|
|
/* First segment, or not segmented. Dissect what we have here. */
|
|
|
|
|
|
|
|
/* Get a tvbuff for the payload. */
|
2009-08-16 12:36:22 +00:00
|
|
|
next_tvb = tvb_new_subset_remaining(tvb, offset);
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If this is the first segment, but not the only segment,
|
|
|
|
* tell the next protocol that.
|
|
|
|
*/
|
|
|
|
if ((cnf_type & (CNF_SEG_OK|CNF_MORE_SEGS)) == (CNF_SEG_OK|CNF_MORE_SEGS))
|
|
|
|
pinfo->fragmented = TRUE;
|
|
|
|
else
|
|
|
|
pinfo->fragmented = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (next_tvb == NULL) {
|
|
|
|
/* Just show this as a segment. */
|
2011-09-26 09:01:17 +00:00
|
|
|
col_add_fstr(pinfo->cinfo, COL_INFO, "Fragmented %s NPDU %s(off=%u)",
|
|
|
|
pdu_type_string, flag_string, segment_offset);
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
/* As we haven't reassembled anything, we haven't changed "pi", so
|
|
|
|
we don't have to restore it. */
|
2009-08-16 12:36:22 +00:00
|
|
|
call_dissector(data_handle, tvb_new_subset_remaining(tvb, offset), pinfo,
|
2002-05-30 01:56:55 +00:00
|
|
|
tree);
|
Use the "fragmented" field of the "packet_info" structure in
"dissect_frame()" to indicate whether a ReportedBoundsError was due to
the packet being malformed (i.e., the packet was shorter than it's
supposed to be, so the dissector went past the end trying to extract
fields that were supposed to be there) or due to it not being
reassembled (i.e., the packet was fragmented, and we didn't reassemble
it, but just treated the first fragment as the entire packet, so the
dissector went past the end trying to extract fields that were partially
or completely in fragments after that). Mark the latter as being
unreasembled rather than malformed.
Properly initialize, save, and restore that field, and properly set it,
so that works.
svn path=/trunk/; revision=4555
2002-01-17 06:29:20 +00:00
|
|
|
pinfo->fragmented = save_fragmented;
|
2000-04-15 22:11:26 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
if (tvb_offset_exists(tvb, offset)) {
|
|
|
|
switch (cnf_type & CNF_TYPE) {
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
case DT_NPDU:
|
|
|
|
case MD_NPDU:
|
|
|
|
/* Continue with COTP if any data.
|
|
|
|
XXX - if this isn't the first Derived PDU of a segmented Initial
|
|
|
|
PDU, skip that? */
|
2006-09-08 06:58:40 +00:00
|
|
|
|
2010-11-04 11:25:40 +00:00
|
|
|
if (nsel == (guchar)tp_nsap_selector || always_decode_transport) {
|
2008-07-15 16:33:15 +00:00
|
|
|
if (call_dissector(ositp_handle, next_tvb, pinfo, tree) != 0) {
|
Use the "fragmented" field of the "packet_info" structure in
"dissect_frame()" to indicate whether a ReportedBoundsError was due to
the packet being malformed (i.e., the packet was shorter than it's
supposed to be, so the dissector went past the end trying to extract
fields that were supposed to be there) or due to it not being
reassembled (i.e., the packet was fragmented, and we didn't reassemble
it, but just treated the first fragment as the entire packet, so the
dissector went past the end trying to extract fields that were partially
or completely in fragments after that). Mark the latter as being
unreasembled rather than malformed.
Properly initialize, save, and restore that field, and properly set it,
so that works.
svn path=/trunk/; revision=4555
2002-01-17 06:29:20 +00:00
|
|
|
pinfo->fragmented = save_fragmented;
|
2011-04-27 19:40:20 +00:00
|
|
|
return; /* yes, it appears to be COTP or CLTP */
|
Use the "fragmented" field of the "packet_info" structure in
"dissect_frame()" to indicate whether a ReportedBoundsError was due to
the packet being malformed (i.e., the packet was shorter than it's
supposed to be, so the dissector went past the end trying to extract
fields that were supposed to be there) or due to it not being
reassembled (i.e., the packet was fragmented, and we didn't reassemble
it, but just treated the first fragment as the entire packet, so the
dissector went past the end trying to extract fields that were partially
or completely in fragments after that). Mark the latter as being
unreasembled rather than malformed.
Properly initialize, save, and restore that field, and properly set it,
so that works.
svn path=/trunk/; revision=4555
2002-01-17 06:29:20 +00:00
|
|
|
}
|
2000-04-15 22:11:26 +00:00
|
|
|
}
|
2003-02-25 18:59:47 +00:00
|
|
|
if (dissector_try_heuristic(clnp_heur_subdissector_list, next_tvb,
|
2012-09-11 08:26:48 +00:00
|
|
|
pinfo, tree, NULL)) {
|
2003-02-25 18:59:47 +00:00
|
|
|
pinfo->fragmented = save_fragmented;
|
2011-04-27 19:40:20 +00:00
|
|
|
return; /* yes, it appears to be one of the protocols in the heuristic list */
|
2003-02-25 18:59:47 +00:00
|
|
|
}
|
2005-10-17 20:05:18 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ER_NPDU:
|
|
|
|
/* The payload is the header and "none, some, or all of the data
|
|
|
|
part of the discarded PDU", i.e. it's like an ICMP error;
|
2011-04-27 19:40:20 +00:00
|
|
|
dissect it as a CLNP PDU. */
|
2011-09-26 09:01:17 +00:00
|
|
|
|
2012-04-24 18:27:06 +00:00
|
|
|
col_add_fstr(pinfo->cinfo, COL_INFO, "%s NPDU %s", pdu_type_string, flag_string);
|
2009-10-09 07:24:33 +00:00
|
|
|
next_length = tvb_length_remaining(tvb, offset);
|
|
|
|
if (next_length != 0) {
|
2003-01-20 05:42:37 +00:00
|
|
|
/* We have payload; dissect it. */
|
|
|
|
ti = proto_tree_add_text(clnp_tree, tvb, offset, next_length,
|
|
|
|
"Discarded PDU");
|
|
|
|
discpdu_tree = proto_item_add_subtree(ti, ett_clnp_disc_pdu);
|
2001-05-27 04:14:53 +00:00
|
|
|
|
Have a flag in the "packet_info" structure, which indicates whether the
stuff currently being dissected is part of a packet included in an error
packet (e.g., an ICMP Unreachable packet). Have the TCP dissector not
bother doing reassembly if the TCP segment is part of an error packet,
rather than an actual TCP transmission; other dissectors might want to
treat those packets specially as well.
Add to the "tcpinfo" structure a flag indicating whether the URG flag
was set, rather than having the zero or non-zero value of the urgent
pointer indicate that. (Yes, at least as I read RFC 793, a zero urgent
pointer value isn't useful, as it means "the stuff before this segment
is urgent", but it's certainly possible to put onto the wire a TCP
segment with URG set and a zero urgent pointer.)
Don't dissect the TCP header by grabbing the entire header with
"tvb_memcpy()" and then pulling stuff out of it - extract stuff with
individual tvbuff calls, and put stuff into the protocol tree and the
Info column as we extract it, so that we can dissect a partial header.
This lets us, for example, get the source and destination ports from the
TCP header of the part of a TCP segment included in a minimum-length
ICMPv4 error packet.
svn path=/trunk/; revision=3986
2001-10-01 08:29:37 +00:00
|
|
|
/* Save the current value of the "we're inside an error packet"
|
|
|
|
flag, and set that flag; subdissectors may treat packets
|
|
|
|
that are the payload of error packets differently from
|
|
|
|
"real" packets. */
|
2011-11-08 18:39:11 +00:00
|
|
|
save_in_error_pkt = pinfo->flags.in_error_pkt;
|
|
|
|
pinfo->flags.in_error_pkt = TRUE;
|
Have a flag in the "packet_info" structure, which indicates whether the
stuff currently being dissected is part of a packet included in an error
packet (e.g., an ICMP Unreachable packet). Have the TCP dissector not
bother doing reassembly if the TCP segment is part of an error packet,
rather than an actual TCP transmission; other dissectors might want to
treat those packets specially as well.
Add to the "tcpinfo" structure a flag indicating whether the URG flag
was set, rather than having the zero or non-zero value of the urgent
pointer indicate that. (Yes, at least as I read RFC 793, a zero urgent
pointer value isn't useful, as it means "the stuff before this segment
is urgent", but it's certainly possible to put onto the wire a TCP
segment with URG set and a zero urgent pointer.)
Don't dissect the TCP header by grabbing the entire header with
"tvb_memcpy()" and then pulling stuff out of it - extract stuff with
individual tvbuff calls, and put stuff into the protocol tree and the
Info column as we extract it, so that we can dissect a partial header.
This lets us, for example, get the source and destination ports from the
TCP header of the part of a TCP segment included in a minimum-length
ICMPv4 error packet.
svn path=/trunk/; revision=3986
2001-10-01 08:29:37 +00:00
|
|
|
|
2003-01-20 05:42:37 +00:00
|
|
|
call_dissector(clnp_handle, next_tvb, pinfo, discpdu_tree);
|
2001-05-27 04:14:53 +00:00
|
|
|
|
Have a flag in the "packet_info" structure, which indicates whether the
stuff currently being dissected is part of a packet included in an error
packet (e.g., an ICMP Unreachable packet). Have the TCP dissector not
bother doing reassembly if the TCP segment is part of an error packet,
rather than an actual TCP transmission; other dissectors might want to
treat those packets specially as well.
Add to the "tcpinfo" structure a flag indicating whether the URG flag
was set, rather than having the zero or non-zero value of the urgent
pointer indicate that. (Yes, at least as I read RFC 793, a zero urgent
pointer value isn't useful, as it means "the stuff before this segment
is urgent", but it's certainly possible to put onto the wire a TCP
segment with URG set and a zero urgent pointer.)
Don't dissect the TCP header by grabbing the entire header with
"tvb_memcpy()" and then pulling stuff out of it - extract stuff with
individual tvbuff calls, and put stuff into the protocol tree and the
Info column as we extract it, so that we can dissect a partial header.
This lets us, for example, get the source and destination ports from the
TCP header of the part of a TCP segment included in a minimum-length
ICMPv4 error packet.
svn path=/trunk/; revision=3986
2001-10-01 08:29:37 +00:00
|
|
|
/* Restore the "we're inside an error packet" flag. */
|
2011-11-08 18:39:11 +00:00
|
|
|
pinfo->flags.in_error_pkt = save_in_error_pkt;
|
2000-12-23 19:34:46 +00:00
|
|
|
}
|
Use the "fragmented" field of the "packet_info" structure in
"dissect_frame()" to indicate whether a ReportedBoundsError was due to
the packet being malformed (i.e., the packet was shorter than it's
supposed to be, so the dissector went past the end trying to extract
fields that were supposed to be there) or due to it not being
reassembled (i.e., the packet was fragmented, and we didn't reassemble
it, but just treated the first fragment as the entire packet, so the
dissector went past the end trying to extract fields that were partially
or completely in fragments after that). Mark the latter as being
unreasembled rather than malformed.
Properly initialize, save, and restore that field, and properly set it,
so that works.
svn path=/trunk/; revision=4555
2002-01-17 06:29:20 +00:00
|
|
|
pinfo->fragmented = save_fragmented;
|
2011-04-27 19:40:20 +00:00
|
|
|
return; /* we're done with this PDU */
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
case ERQ_NPDU:
|
|
|
|
case ERP_NPDU:
|
|
|
|
/* XXX - dissect this */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2011-09-26 09:01:17 +00:00
|
|
|
col_add_fstr(pinfo->cinfo, COL_INFO, "%s NPDU %s", pdu_type_string, flag_string);
|
2001-11-26 04:52:51 +00:00
|
|
|
call_dissector(data_handle,next_tvb, pinfo, tree);
|
Use the "fragmented" field of the "packet_info" structure in
"dissect_frame()" to indicate whether a ReportedBoundsError was due to
the packet being malformed (i.e., the packet was shorter than it's
supposed to be, so the dissector went past the end trying to extract
fields that were supposed to be there) or due to it not being
reassembled (i.e., the packet was fragmented, and we didn't reassemble
it, but just treated the first fragment as the entire packet, so the
dissector went past the end trying to extract fields that were partially
or completely in fragments after that). Mark the latter as being
unreasembled rather than malformed.
Properly initialize, save, and restore that field, and properly set it,
so that works.
svn path=/trunk/; revision=4555
2002-01-17 06:29:20 +00:00
|
|
|
pinfo->fragmented = save_fragmented;
|
2000-04-15 22:11:26 +00:00
|
|
|
} /* dissect_clnp */
|
|
|
|
|
2001-06-08 06:27:16 +00:00
|
|
|
static void
|
|
|
|
clnp_reassemble_init(void)
|
|
|
|
{
|
2013-03-22 23:59:54 +00:00
|
|
|
reassembly_table_init(&clnp_reassembly_table,
|
|
|
|
&addresses_reassembly_table_functions);
|
2003-05-28 22:58:46 +00:00
|
|
|
}
|
|
|
|
|
2012-04-24 18:27:06 +00:00
|
|
|
void
|
|
|
|
proto_register_clnp(void)
|
2000-04-15 22:11:26 +00:00
|
|
|
{
|
|
|
|
static hf_register_info hf[] = {
|
|
|
|
{ &hf_clnp_id,
|
2002-08-28 21:04:11 +00:00
|
|
|
{ "Network Layer Protocol Identifier", "clnp.nlpi", FT_UINT8, BASE_HEX,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
VALS(nlpid_vals), 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_length,
|
2011-04-27 19:40:20 +00:00
|
|
|
{ "HDR Length", "clnp.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_version,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "Version", "clnp.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_ttl,
|
2011-04-27 19:40:20 +00:00
|
|
|
{ "Holding Time", "clnp.ttl", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_type,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "PDU Type", "clnp.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2012-09-23 00:12:14 +00:00
|
|
|
{ &hf_clnp_cnf_segmentation,
|
|
|
|
{ "Segmentation permitted", "clnp.cnf.segmentation", FT_BOOLEAN, 8, TFS(&tfs_yes_no), CNF_SEG_OK, NULL, HFILL }},
|
|
|
|
|
|
|
|
{ &hf_clnp_cnf_more_segments,
|
|
|
|
{ "More segments", "clnp.cnf.more_segments", FT_BOOLEAN, 8, TFS(&tfs_yes_no), CNF_MORE_SEGS, NULL, HFILL }},
|
|
|
|
|
|
|
|
{ &hf_clnp_cnf_report_error,
|
|
|
|
{ "Report error if PDU discarded", "clnp.cnf.report_error", FT_BOOLEAN, 8, TFS(&tfs_yes_no), CNF_ERR_OK, NULL, HFILL }},
|
|
|
|
|
|
|
|
{ &hf_clnp_cnf_type,
|
|
|
|
{ "Type", "clnp.cnf.type", FT_UINT8, BASE_DEC, VALS(npdu_type_vals), CNF_TYPE, NULL, HFILL }},
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_clnp_pdu_length,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "PDU length", "clnp.pdu.len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_checksum,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "Checksum", "clnp.checksum", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_dest_length,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "DAL", "clnp.dsap.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_dest,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "DA", "clnp.dsap", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_src_length,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "SAL", "clnp.ssap.len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_src,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "SA", "clnp.ssap", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
2012-11-16 14:18:27 +00:00
|
|
|
{ &hf_clnp_atntt,
|
|
|
|
{ "ATN traffic type", "clnp.atn.tt", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
|
|
|
|
|
|
|
{ &hf_clnp_atnsc,
|
|
|
|
{ "ATN security classification", "clnp.atn.sc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
|
|
|
|
|
|
|
{ &hf_clnp_segment_overlap,
|
2001-06-08 06:27:16 +00:00
|
|
|
{ "Segment overlap", "clnp.segment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Segment overlaps with other segments", HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_segment_overlap_conflict,
|
|
|
|
{ "Conflicting data in segment overlap", "clnp.segment.overlap.conflict", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Overlapping segments contained conflicting data", HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_segment_multiple_tails,
|
|
|
|
{ "Multiple tail segments found", "clnp.segment.multipletails", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Several tails were found when reassembling the packet", HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_segment_too_long_segment,
|
|
|
|
{ "Segment too long", "clnp.segment.toolongsegment", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Segment contained data past end of packet", HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_segment_error,
|
2002-12-19 11:22:38 +00:00
|
|
|
{ "Reassembly error", "clnp.segment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"Reassembly error due to illegal segments", HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
2011-01-30 21:01:07 +00:00
|
|
|
{ &hf_clnp_segment_count,
|
|
|
|
{ "Segment count", "clnp.segment.count", FT_UINT32, BASE_DEC, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
NULL, HFILL }},
|
2011-01-30 21:01:07 +00:00
|
|
|
|
2001-06-08 06:27:16 +00:00
|
|
|
{ &hf_clnp_segment,
|
2002-12-19 11:22:38 +00:00
|
|
|
{ "CLNP Segment", "clnp.segment", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
NULL, HFILL }},
|
2001-06-08 06:27:16 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_segments,
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
{ "CLNP Segments", "clnp.segments", FT_NONE, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
NULL, HFILL }},
|
2003-04-20 08:06:01 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_reassembled_in,
|
|
|
|
{ "Reassembled CLNP in frame", "clnp.reassembled_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"This CLNP packet is reassembled in this frame", HFILL }},
|
2010-02-02 16:01:52 +00:00
|
|
|
|
|
|
|
{ &hf_clnp_reassembled_length,
|
2010-02-03 08:47:15 +00:00
|
|
|
{ "Reassembled CLNP length", "clnp.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x0,
|
2011-04-27 19:40:20 +00:00
|
|
|
"The total length of the reassembled payload", HFILL }}
|
2000-04-15 22:11:26 +00:00
|
|
|
};
|
|
|
|
static gint *ett[] = {
|
|
|
|
&ett_clnp,
|
2000-12-23 21:40:22 +00:00
|
|
|
&ett_clnp_type,
|
2001-06-08 06:27:16 +00:00
|
|
|
&ett_clnp_segments,
|
|
|
|
&ett_clnp_segment,
|
2000-12-23 19:34:46 +00:00
|
|
|
&ett_clnp_disc_pdu,
|
2000-04-15 22:11:26 +00:00
|
|
|
};
|
|
|
|
|
2000-08-06 15:54:42 +00:00
|
|
|
module_t *clnp_module;
|
|
|
|
|
2001-01-03 06:56:03 +00:00
|
|
|
proto_clnp = proto_register_protocol(PROTO_STRING_CLNP, "CLNP", "clnp");
|
2000-04-15 22:11:26 +00:00
|
|
|
proto_register_field_array(proto_clnp, hf, array_length(hf));
|
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
2003-01-05 02:50:23 +00:00
|
|
|
register_dissector("clnp", dissect_clnp, proto_clnp);
|
2005-10-17 20:05:18 +00:00
|
|
|
register_heur_dissector_list("clnp", &clnp_heur_subdissector_list);
|
2003-04-15 21:33:26 +00:00
|
|
|
register_init_routine(clnp_reassemble_init);
|
2000-08-06 15:54:42 +00:00
|
|
|
|
2006-09-08 06:58:40 +00:00
|
|
|
clnp_module = prefs_register_protocol(proto_clnp, NULL);
|
2000-08-06 15:54:42 +00:00
|
|
|
prefs_register_uint_preference(clnp_module, "tp_nsap_selector",
|
2011-04-27 19:40:20 +00:00
|
|
|
"NSAP selector for Transport Protocol (last byte in hex)",
|
|
|
|
"NSAP selector for Transport Protocol (last byte in hex)",
|
|
|
|
16, &tp_nsap_selector);
|
2000-08-06 15:54:42 +00:00
|
|
|
prefs_register_bool_preference(clnp_module, "always_decode_transport",
|
2011-04-27 19:40:20 +00:00
|
|
|
"Always try to decode NSDU as transport PDUs",
|
|
|
|
"Always try to decode NSDU as transport PDUs",
|
|
|
|
&always_decode_transport);
|
2001-06-08 06:27:16 +00:00
|
|
|
prefs_register_bool_preference(clnp_module, "reassemble",
|
2011-04-27 19:40:20 +00:00
|
|
|
"Reassemble segmented CLNP datagrams",
|
|
|
|
"Whether segmented CLNP datagrams should be reassembled",
|
|
|
|
&clnp_reassemble);
|
2012-11-16 14:18:27 +00:00
|
|
|
prefs_register_bool_preference(clnp_module, "decode_atn_options",
|
|
|
|
"Decode ATN security label",
|
|
|
|
"Whether ATN security label should be decoded",
|
|
|
|
&clnp_decode_atn_options);
|
2000-04-15 22:11:26 +00:00
|
|
|
}
|
|
|
|
|
2006-09-08 06:58:40 +00:00
|
|
|
void
|
|
|
|
proto_reg_handoff_clnp(void)
|
|
|
|
{
|
2008-07-15 16:33:15 +00:00
|
|
|
ositp_handle = find_dissector("ositp");
|
|
|
|
ositp_inactive_handle = find_dissector("ositp_inactive");
|
2006-09-08 06:58:40 +00:00
|
|
|
data_handle = find_dissector("data");
|
|
|
|
|
|
|
|
clnp_handle = create_dissector_handle(dissect_clnp, proto_clnp);
|
2010-12-20 05:35:29 +00:00
|
|
|
dissector_add_uint("osinl", NLPID_ISO8473_CLNP, clnp_handle);
|
|
|
|
dissector_add_uint("osinl", NLPID_NULL, clnp_handle); /* Inactive subset */
|
|
|
|
dissector_add_uint("x.25.spi", NLPID_ISO8473_CLNP, clnp_handle);
|
2006-09-08 06:58:40 +00:00
|
|
|
}
|