Ralf Schneider's changes to enhance to OSI CLNP, CLTP, and ISIS support

and to add OSI ESIS support.

svn path=/trunk/; revision=1865
This commit is contained in:
Guy Harris 2000-04-15 22:11:26 +00:00
parent 26ca4597f6
commit c9d4dd080d
19 changed files with 3254 additions and 2000 deletions

View File

@ -294,6 +294,11 @@ Graham Bloice <graham.bloice@trihedral.com> {
add version/copyright/etc. information to Win32 executables
}
Ralf Schneider <ralf.schneider@alcatel.se> {
Enhancements to OSI CLNP, CLTP, and ISIS support
OSI ESIS support
}
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to
give his permission to use his version of snprintf.c.

View File

@ -1,7 +1,7 @@
# Makefile.am
# Automake file for Ethereal
#
# $Id: Makefile.am,v 1.184 2000/04/15 04:10:27 guy Exp $
# $Id: Makefile.am,v 1.185 2000/04/15 22:11:07 guy Exp $
#
# Ethereal - Network traffic analyzer
# By Gerald Combs <gerald@zing.org>
@ -58,11 +58,15 @@ DISSECTOR_SOURCES = \
packet-cgmp.h \
packet-clip.c \
packet-clip.h \
packet-clnp.c \
packet-clnp.h \
packet-data.c \
packet-ddtp.c \
packet-ddtp.h \
packet-dns.c \
packet-dns.h \
packet-esis.h \
packet-esis.c \
packet-eth.c \
packet-eth.h \
packet-ethertype.c \
@ -140,6 +144,8 @@ DISSECTOR_SOURCES = \
packet-null.h \
packet-osi.c \
packet-osi.h \
packet-osi-options.c \
packet-osi-options.h \
packet-ospf.c \
packet-ospf.h \
packet-pim.c \

View File

@ -840,6 +840,7 @@ B<http://ethereal.zing.org>.
Andreas Sikkema <andreas.sikkema@philips.com>
Mark Muhlestein <mmm@netapp.com>
Graham Bloice <graham.bloice@trihedral.com>
Ralf Schneider <ralf.schneider@alcatel.se>
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to give his
permission to use his version of snprintf.c.

View File

@ -2,7 +2,7 @@
* Definitions of OSI NLPIDs (Network Layer Protocol IDs)
* Laurent Deniel <deniel@worldnet.fr>
*
* $Id: nlpid.h,v 1.3 2000/01/30 05:50:02 guy Exp $
* $Id: nlpid.h,v 1.4 2000/04/15 22:11:07 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -36,7 +36,7 @@
#define NLPID_ISO8473_CLNP 0x81 /* X.233 */
#define NLPID_ISO9542_ESIS 0x82
#define NLPID_ISO10589_ISIS 0x83
#define NLPID_ISO10747 0x85
#define NLPID_ISO10747_IDRP 0x85
#define NLPID_ISO9542X25_ESIS 0x8a
#define NLPID_ISO10030 0x8c
#define NLPID_ISO11577 0x8d /* X.273 */

1777
packet-clnp.c Normal file

File diff suppressed because it is too large Load Diff

41
packet-clnp.h Normal file
View File

@ -0,0 +1,41 @@
/* packet-clnp.h
* Defines and such for CLNP (and COTP) protocol decode.
*
* $Id: packet-clnp.h,v 1.1 2000/04/15 22:11:08 guy Exp $
* Ralf Schneider <Ralf.Schneider@t-online.de>
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*/
#ifndef _PACKET_CLNP_H
#define _PACKET_CLNP_H
/*
* published API functions
*/
extern
void dissect_clnp( const u_char *, int, frame_data *, proto_tree * );
extern
void dissect_cotp(const u_char *, int, frame_data *, proto_tree *);
#endif /* _PACKET_CLNP_H */

438
packet-esis.c Normal file
View File

@ -0,0 +1,438 @@
/* packet-esis.c
* Routines for ISO/OSI End System to Intermediate System
* Routeing Exchange Protocol ISO 9542.
*
* $Id: packet-esis.c,v 1.1 2000/04/15 22:11:08 guy Exp $
* Ralf Schneider <Ralf.Schneider@t-online.de>
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include "packet.h"
#include "nlpid.h"
#include "packet-osi.h"
#include "packet-osi-options.h"
#include "packet-esis.h"
/* esis base header */
static int proto_esis = -1;
static int hf_esis_nlpi = -1;
static int hf_esis_length = -1;
static int hf_esis_version = -1;
static int hf_esis_reserved = -1;
static int hf_esis_type = -1;
static int hf_esis_holdtime = -1;
static int hf_esis_checksum = -1;
static gint ett_esis = -1;
static gint ett_esis_area_addr = -1;
static const value_string esis_vals[] = {
{ ESIS_ESH_PDU, "ES HELLO"},
{ ESIS_ISH_PDU, "IS HELLO"},
{ ESIS_RD_PDU, "RD REQUEST"},
{ 0, NULL} };
/* internal prototypes */
void esis_dissect_esh_pdu( u_char len, const u_char *pd, int offset,
frame_data *fd, proto_tree *treepd);
void esis_dissect_ish_pdu( u_char len, const u_char *pd, int offset,
frame_data *fd, proto_tree *tree);
void esis_dissect_redirect_pdu( u_char len, const u_char *pd, int offset,
frame_data *fd, proto_tree *tree);
/* ################## Descriptions ###########################################*/
/* Parameters for the ESH PDU
* Source Address Parameter:
*
* Octet: Length: Parameter Type:
* 10 1 Number of Source Adresses ( NSAPs served by this Network
* 11 1 Source Address Length Indicator ( SAL ) # Entity )
* 12-m-1 variable Source Address ( NSAP )
* m Options, dissected in osi.c
*
*
* Parameter for the ISH PDU:
* Network Entity Title Parameter:
*
* Octet: Length: Parameter Type:
* 10 1 Network Entity Title Length Indicator ( NETL )
* 11-m-1 variable Network Entity Title ( NET )
* m Options, dissected in osi.c
*
*
* Parameter for the RD PDU:
* When re-directed to an IS:
*
* Octet: Length: Parameter Type:
* 10 1 Destination Address Length Indicator ( DAL )
* 11>m-1 variable Destination Address ( DA )
* m 1 Subnetwork Address Length Indicator ( BSNPAL )
* m+1>n-1 variable Subnetwork Address ( BSNPA )
* n 1 Network Entity Title Length Indicator ( NETL )
* n+1>p-1 variable Network Entity Title ( NET )
* p Options, dissected in osi.c
*
*
* Parameter for the RD PDU:
* When re-directed to an ES:
*
* Octet: Length: Parameter Type:
* 10 1 Destination Address Length Indicator ( DAL )
* 11>m-1 variable Destination Address ( DA )
* m 1 Subnetwork Address Length Indicator ( BSNPAL )
* m+1>n-1 variable Subnetwork Address ( BSNPA )
* n 1 Network Entity Title Length Indicator ( NETL ) == 0
* n+1 Options, dissected in osi.c
*
*/
/* ############################ Tool Functions ############################## */
/* ############################## Dissection Functions ###################### */
/*
* Name: dissect_esis_unknown()
*
* Description:
* There was some error in the protocol and we are in unknown space
* here. Add a tree item to cover the error and go on. Note
* that we make sure we don't go off the end of the bleedin packet here!
*
* This is just a copy of isis.c and isis.h, so I keep the stuff also
* and adapt the names to cover possible protocol errors! Ive really no
* idea wether I need this or not.
*
* Input
* int offset : Current offset into packet data.
* int len : length of to dump.
* proto_tree * : tree of display data. May be NULL.
* frame_data * fd : frame data
* char * : format text
*
* Output:
* void (may modify proto tree)
*/
void
esis_dissect_unknown(int offset,guint length,proto_tree *tree,frame_data *fd,
char *fmat, ...){
va_list ap;
if ( !IS_DATA_IN_FRAME(offset) ) {
/*
* big oops They were off the end of the packet already.
* Just ignore this one.
*/
return;
}
if ( !BYTES_ARE_IN_FRAME(offset, length) ) {
/*
* length will take us past eop. Truncate length.
*/
length = END_OF_FRAME;
}
va_start(ap, fmat);
proto_tree_add_text(tree, offset, length, fmat, ap);
va_end(ap);
}
void
esis_dissect_esh_pdu( u_char len, const u_char *pd, int offset,
frame_data *fd, proto_tree *tree) {
proto_tree *esis_area_tree;
int no_sa = 0;
int sal = 0;
proto_item *ti;
if (tree) {
offset += ESIS_HDR_FIXED_LENGTH;
no_sa = pd[offset];
len -= 1;
ti = proto_tree_add_text( tree, offset++, END_OF_FRAME,
"Number of Source Addresses (SA, Format: NSAP) : %u", no_sa );
esis_area_tree = proto_item_add_subtree( ti, ett_esis_area_addr );
while ( no_sa-- > 0 ) {
sal = (int) pd[offset++];
proto_tree_add_text(esis_area_tree, offset, 1, "SAL: %2u Octets", sal);
proto_tree_add_text(esis_area_tree, offset + 1, sal,
" SA: %s", print_nsap_net( &pd[offset], sal ) );
offset += sal;
len -= ( sal + 1 );
}
dissect_osi_options( PDU_TYPE_ESIS_ESH, len, pd, offset, fd, tree );
}
} /* esis_dissect_esh_pdu */ ;
void
esis_dissect_ish_pdu( u_char len, const u_char *pd, int offset,
frame_data *fd, proto_tree *tree) {
int netl = 0;
if (tree) {
offset += ESIS_HDR_FIXED_LENGTH;
netl = (int) pd[ offset ];
proto_tree_add_text( tree, offset, netl + 1,
"### Network Entity Titel Section ###");
proto_tree_add_text( tree, offset++, 1, "NETL: %2u Octets", netl);
proto_tree_add_text( tree, offset, netl,
" NET: %s", print_nsap_net( &pd[offset], netl ) );
offset += netl;
len -= ( netl + 1 );
dissect_osi_options( PDU_TYPE_ESIS_ISH, len, pd, offset, fd, tree );
}
};
void
esis_dissect_redirect_pdu( u_char len, const u_char *pd, int offset,
frame_data *fd, proto_tree *tree) {
int tmpl = 0;
if (tree) {
offset += ESIS_HDR_FIXED_LENGTH;
tmpl = (int) pd[ offset ];
proto_tree_add_text( tree, offset, tmpl + 1,
"### Destination Address Section ###" );
proto_tree_add_text( tree, offset++, 1, "DAL: %2u Octets", tmpl);
proto_tree_add_text( tree, offset, tmpl,
" DA : %s", print_nsap_net( &pd[offset], tmpl ) );
offset += tmpl;
len -= ( tmpl + 1 );
tmpl = (int) pd[ offset ];
proto_tree_add_text( tree, offset, tmpl + 1,
"### Subnetwork Address Section ###");
proto_tree_add_text( tree, offset++, 1, "BSNPAL: %2u Octets", tmpl);
proto_tree_add_text( tree, offset, tmpl,
" BSNPA: %s", print_system_id( &pd[offset], tmpl ) );
offset += tmpl;
len -= ( tmpl + 1 );
tmpl = (int) pd[ offset ];
if ( 0 == tmpl ) {
proto_tree_add_text( tree, offset, 1,
"### No Network Entity Title Section ###" );
offset++;
len--;
}
else {
proto_tree_add_text( tree, offset, 1,
"### Network Entity Title Section ###" );
proto_tree_add_text( tree, offset++, 1, "NETL: %2u Octets", tmpl );
proto_tree_add_text( tree, offset, tmpl,
" NET: %s", print_nsap_net( &pd[offset], tmpl ) );
offset += tmpl;
len -= ( tmpl + 1 );
}
dissect_osi_options( PDU_TYPE_ESIS_RD, len, pd, offset, fd, tree );
}
}
/*
* Name: dissect_esis()
*
* Description:
* Main entry area for esis de-mangling. This will build the
* main esis tree data and call the sub-protocols as needed.
*
* Input:
* u_char * : packet data
* int : offset into packet where we are (packet_data[offset]== start
* of what we care about)
* frame_data * : frame data (whole packet with extra info)
* proto_tree * : tree of display data. May be NULL.
*
* Output:
* void, but we will add to the proto_tree if it is not NULL.
*/
void
dissect_esis(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
char *pdu_type_string = NULL;
char *pdu_type_format_string = "PDU Type : %s (R:%s%s%s)";
esis_hdr_t *ehdr;
proto_item *ti;
proto_tree *esis_tree = NULL;
int variable_len = 0;
u_int tmp_uint = 0;
if (check_col(fd, COL_PROTOCOL))
col_add_str(fd, COL_PROTOCOL, "ESIS");
if (!BYTES_ARE_IN_FRAME(offset, sizeof(*ehdr))) {
esis_dissect_unknown(offset, sizeof(*ehdr), tree, fd,
"Not enough capture data for header (%d vs %d)",
sizeof(*ehdr), END_OF_FRAME);
return;
}
ehdr = (esis_hdr_t *) &pd[offset];
if (ehdr->esis_version != ESIS_REQUIRED_VERSION){
esis_dissect_unknown(offset, END_OF_FRAME, tree, fd,
"Unknown ESIS version (%d vs %d)",
ehdr->esis_version, ESIS_REQUIRED_VERSION );
return;
}
if (tree) {
ti = proto_tree_add_item(tree, proto_esis, offset, END_OF_FRAME, NULL );
esis_tree = proto_item_add_subtree(ti, ett_esis);
proto_tree_add_item( esis_tree, hf_esis_nlpi, offset, 1, ehdr->esis_nlpi );
proto_tree_add_item( esis_tree, hf_esis_length,
offset + 1, 1, ehdr->esis_length );
proto_tree_add_item( esis_tree, hf_esis_version, offset + 2, 1,
ehdr->esis_version );
proto_tree_add_item( esis_tree, hf_esis_reserved, offset + 3, 1,
ehdr->esis_reserved );
pdu_type_string = val_to_str(ehdr->esis_type&OSI_PDU_TYPE_MASK,
esis_vals, "Unknown (0x%x)");
proto_tree_add_uint_format( esis_tree, hf_esis_type, offset + 4, 1,
ehdr->esis_type,
pdu_type_format_string,
pdu_type_string,
(ehdr->esis_type&BIT_8) ? "1" : "0",
(ehdr->esis_type&BIT_7) ? "1" : "0",
(ehdr->esis_type&BIT_6) ? "1" : "0");
tmp_uint = pntohs( ehdr->esis_holdtime );
proto_tree_add_uint_format(esis_tree, hf_esis_holdtime, offset + 5, 2,
tmp_uint, "Holding Time : %u seconds",
tmp_uint );
tmp_uint = pntohs( ehdr->esis_checksum );
proto_tree_add_uint_format( esis_tree, hf_esis_checksum, offset + 7, 2,
tmp_uint, "Checksum : 0x%x ( %s )",
tmp_uint, calc_checksum( &pd[offset],
ehdr->esis_length ,
tmp_uint ) );
}
/*
* Let us make sure we use the same names for all our decodes
* here. First, dump the name into info column, and THEN
* dispatch the sub-type.
*/
if (check_col(fd, COL_INFO)) {
col_add_str(fd, COL_INFO,
val_to_str( ehdr->esis_type&OSI_PDU_TYPE_MASK, esis_vals,
"Unknown (0x%x)" ) );
}
variable_len = ehdr->esis_length - ESIS_HDR_FIXED_LENGTH;
switch (ehdr->esis_type) {
case ESIS_ESH_PDU:
esis_dissect_esh_pdu( variable_len, pd, offset, fd, esis_tree);
break;
case ESIS_ISH_PDU:
esis_dissect_ish_pdu( variable_len, pd, offset, fd, esis_tree);
break;
case ESIS_RD_PDU:
esis_dissect_redirect_pdu( variable_len, pd, offset, fd,
esis_tree);
break;
default:
esis_dissect_unknown(offset, END_OF_FRAME, tree, fd,
"unknown esis packet type" );
}
} /* dissect_esis */
/*
* Name: proto_register_esisesis()
*
* Description:
* main register for esis protocol set. We register some display
* formats and the protocol module variables.
*
* NOTE: this procedure to autolinked by the makefile process that
* builds register.c
*
* Input:
* void
*
* Output:
* void
*/
void
proto_register_esis(void) {
static hf_register_info hf[] = {
{ &hf_esis_nlpi,
{ "Network Layer Protocol Identifier", "esis.nlpi",
FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, "" }},
{ &hf_esis_length,
{ "PDU Length ", "esis.length", FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
{ &hf_esis_version,
{ "Version (==1) ", "esis.ver", FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
{ &hf_esis_reserved,
{ "Reserved(==0) ", "esis.res", FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
{ &hf_esis_type,
{ "PDU Type ", "esis.type", FT_UINT8, BASE_DEC, VALS(esis_vals),
0xff, "" }},
{ &hf_esis_holdtime,
{ "Holding Time ", "esis.htime", FT_UINT16, BASE_DEC, NULL, 0x0, " s"}},
{ &hf_esis_checksum,
{ "Checksum ", "esis.chksum", FT_UINT16, BASE_HEX, NULL, 0x0, "" }}
};
/*
*
*
*/
static gint *ett[] = {
&ett_esis,
&ett_esis_area_addr,
};
proto_esis = proto_register_protocol( PROTO_STRING_ESIS, "esis");
proto_register_field_array(proto_esis, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
};

69
packet-esis.h Normal file
View File

@ -0,0 +1,69 @@
/* packet-esis.h
* Defines and such for ESIS protocol decode.
*
* $Id: packet-esis.h,v 1.1 2000/04/15 22:11:09 guy Exp $
* Ralf Schneider <Ralf.Schneider@t-online.de>
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*/
#ifndef _PACKET_ESIS_H
#define _PACKET_ESIS_H
/* The version we support is 1 */
#define ESIS_REQUIRED_VERSION 1
/* ESIS PDU types */
#define ESIS_ESH_PDU 02
#define ESIS_ISH_PDU 04
#define ESIS_RD_PDU 06
/* The length of the fixed part */
#define ESIS_HDR_FIXED_LENGTH 9
/* Inline Defines for masking */
#define esis_type esis_type_reserved&OSI_PDU_TYPE_MASK
#define esis_r8 esis_type_reserved&BIT_8
#define esis_r7 esis_type_reserved&BIT_7
#define esis_r6 esis_type_reserved&BIT_6
/* The fixed part (9 octets) of the ESIS protocol header */
typedef struct {
guint8 esis_nlpi; /* Network Layer Protocol Identifier == 0x82 */
guint8 esis_length; /* Header ( PDU too, NoData ) length in octets */
guint8 esis_version; /* ISIS version, must be 0x01 */
guint8 esis_reserved; /* reserved byte, must be 0 */
guint8 esis_type_reserved; /* packet type & MS-Bits (8-6) reserved */
guint8 esis_holdtime[2]; /* Maximum time (sec) this PDU is valid */
guint8 esis_checksum[2]; /* Computed on whole PDU Header, 0 means ignore */
} esis_hdr_t;
/*
* published API functions
*/
extern void dissect_esis(const u_char *pd, int offset, frame_data *fd,
proto_tree *tree);
extern void proto_register_esis(void);
extern void esis_dissect_unknown(int offset,guint length, proto_tree *tree,
frame_data *fd, char *fmat, ...);
#endif /* _PACKET_ESIS_H */

View File

@ -1,7 +1,7 @@
/* packet-isis-clv.c
* Common CLV decode routines.
*
* $Id: packet-isis-clv.c,v 1.2 1999/12/15 22:52:04 guy Exp $
* $Id: packet-isis-clv.c,v 1.3 2000/04/15 22:11:09 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@ -47,6 +47,7 @@
#include <string.h>
#include <glib.h>
#include "packet.h"
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
@ -93,7 +94,8 @@ isis_dissect_area_address_clv(const u_char *pd, int offset,
* Lets turn the area address into "standard" 0000.0000.etc
* format string.
*/
sbuf = isis_address_to_string ( pd, offset + 1, mylen );
/* sbuf = isis_address_to_string ( pd, offset + 1, mylen );*/
sbuf = print_nsap_net( pd + offset + 1, mylen );
/* and spit it out */
if ( tree ) {
proto_tree_add_text ( tree, offset, mylen + 1,

View File

@ -1,7 +1,7 @@
/* packet-isis-hello.c
* Routines for decoding isis hello packets and their CLVs
*
* $Id: packet-isis-hello.c,v 1.5 2000/03/28 06:12:15 guy Exp $
* $Id: packet-isis-hello.c,v 1.6 2000/04/15 22:11:09 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@ -38,28 +38,29 @@
#include <string.h>
#include <glib.h>
#include "packet.h"
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
#include "packet-isis-hello.h"
/* hello packets */
static int proto_isis_hello = -1;
static int hf_isis_hello_circuit_reserved = -1;
static int hf_isis_hello_source_id = -1;
static int hf_isis_hello_holding_timer = -1;
static int hf_isis_hello_pdu_length = -1;
static int hf_isis_hello_priority_reserved = -1;
static int hf_isis_hello_lan_id = -1;
static int hf_isis_hello_local_circuit_id = -1;
static int hf_isis_hello_clv_ipv4_int_addr = -1;
static int proto_isis_hello = -1;
static int hf_isis_hello_circuit_reserved = -1;
static int hf_isis_hello_source_id = -1;
static int hf_isis_hello_holding_timer = -1;
static int hf_isis_hello_pdu_length = -1;
static int hf_isis_hello_priority_reserved = -1;
static int hf_isis_hello_lan_id = -1;
static int hf_isis_hello_local_circuit_id = -1;
static int hf_isis_hello_clv_ipv4_int_addr = -1;
static gint ett_isis_hello = -1;
static gint ett_isis_hello_clv_area_addr = -1;
static gint ett_isis_hello_clv_is_neighbors = -1;
static gint ett_isis_hello_clv_padding = -1;
static gint ett_isis_hello_clv_unknown = -1;
static gint ett_isis_hello_clv_nlpid = -1;
static gint ett_isis_hello_clv_auth = -1;
static gint ett_isis_hello = -1;
static gint ett_isis_hello_clv_area_addr = -1;
static gint ett_isis_hello_clv_is_neighbors = -1;
static gint ett_isis_hello_clv_padding = -1;
static gint ett_isis_hello_clv_unknown = -1;
static gint ett_isis_hello_clv_nlpid = -1;
static gint ett_isis_hello_clv_auth = -1;
static gint ett_isis_hello_clv_ipv4_int_addr = -1;
static const value_string isis_hello_circuit_type_vals[] = {
@ -360,9 +361,7 @@ dissect_hello_is_neighbors_clv(const u_char *pd, int offset,
*/
if ( tree ) {
proto_tree_add_text ( tree, offset, 6,
"IS Neighbor: %02x%02x.%02x%02x.%02x%02x",
pd[offset], pd[offset+1], pd[offset+2],
pd[offset+3], pd[offset+4], pd[offset+5] );
"IS Neighbor: %s", print_system_id( pd + offset, 6 ) );
}
offset += 6;
length -= 6;
@ -443,7 +442,7 @@ isis_dissect_isis_hello(int hello_type, int header_length,
proto_tree_add_uint_format(hello_tree,
hf_isis_hello_circuit_reserved,
offset, 1, ihp->isis_hello_circuit_reserved,
"Circuit type: %s, reserved(0x%02x == 0)",
"Circuit type : %s, reserved(0x%02x == 0)",
val_to_str(ihp->isis_hello_circuit,
isis_hello_circuit_type_vals,
"Unknown (0x%x)"),
@ -451,40 +450,25 @@ isis_dissect_isis_hello(int hello_type, int header_length,
);
proto_tree_add_string_format(hello_tree, hf_isis_hello_lan_id,
offset + 1, 6, ihp->isis_hello_source_id,
"Lan ID: %02x%02x.%02x%02x.%02x%02x",
ihp->isis_hello_lan_id[0],
ihp->isis_hello_lan_id[1],
ihp->isis_hello_lan_id[2],
ihp->isis_hello_lan_id[3],
ihp->isis_hello_lan_id[4],
ihp->isis_hello_lan_id[5]);
offset + 1, 6, ihp->isis_hello_source_id,
"SystemID{ Sender of PDU } : %s",
print_system_id( pd + offset + 1, 6 ) );
proto_tree_add_item(hello_tree, hf_isis_hello_holding_timer,
offset + 7, 2,pntohs(&ihp->isis_hello_holding_timer[0]));
offset + 7, 2,pntohs(&ihp->isis_hello_holding_timer[0]));
proto_tree_add_item(hello_tree, hf_isis_hello_pdu_length,
offset + 9, 2,pntohs(&ihp->isis_hello_pdu_length[0]));
proto_tree_add_uint_format(hello_tree,
hf_isis_hello_priority_reserved,
offset + 11, 1, ihp->isis_hello_priority_reserved,
"Priority: %d, reserved(0x%02x == 0)",
ihp->isis_hello_priority,
ihp->isis_hello_preserved );
offset + 9, 2,pntohs(&ihp->isis_hello_pdu_length[0]));
proto_tree_add_uint_format(hello_tree, hf_isis_hello_priority_reserved,
offset + 11, 1, ihp->isis_hello_priority_reserved,
"Priority : %d, reserved(0x%02x == 0)",
ihp->isis_hello_priority, ihp->isis_hello_preserved );
if (hello_type == ISIS_TYPE_PTP_HELLO) {
proto_tree_add_item(hello_tree,
hf_isis_hello_local_circuit_id,
offset + 12, 1, ihp->isis_hello_lan_id[0] );
proto_tree_add_item(hello_tree, hf_isis_hello_local_circuit_id,
offset + 12, 1, ihp->isis_hello_lan_id[0] );
} else {
proto_tree_add_string_format(hello_tree,
hf_isis_hello_lan_id, offset + 12, 7,
ihp->isis_hello_lan_id,
"Lan ID: %02x%02x.%02x%02x.%02x%02x-%02d",
ihp->isis_hello_lan_id[0],
ihp->isis_hello_lan_id[1],
ihp->isis_hello_lan_id[2],
ihp->isis_hello_lan_id[3],
ihp->isis_hello_lan_id[4],
ihp->isis_hello_lan_id[5],
ihp->isis_hello_lan_id[6]);
proto_tree_add_string_format(hello_tree, hf_isis_hello_lan_id,
offset + 12, 7, ihp->isis_hello_lan_id,
"SystemID{ Designated IS } : %s",
print_system_id( pd + offset + 12, 7 ) );
}
}
@ -531,34 +515,35 @@ void
proto_register_isis_hello(void) {
static hf_register_info hf[] = {
{ &hf_isis_hello_circuit_reserved,
{ "Circuit type", "isis_hello.circuite_type",
{ "Circuit type ", "isis_hello.circuite_type",
FT_UINT8, BASE_HEX, NULL, 0x0, "" }},
{ &hf_isis_hello_source_id,
{ "Source ID", "isis_hello.source_id",
{ "SystemID{ Sender of PDU } ", "isis_hello.source_id",
FT_ETHER, BASE_HEX, NULL, 0x0, "" }},
{ &hf_isis_hello_holding_timer,
{ "Holding timer", "isis_hello.holding_timer",
{ "Holding timer ", "isis_hello.holding_timer",
FT_UINT16, BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_hello_pdu_length,
{ "PDU length", "isis_hello.pdu_length",
{ "PDU length ", "isis_hello.pdu_length",
FT_UINT16, BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_hello_priority_reserved,
{ "Priority", "isis_hello.priority",FT_UINT8, BASE_DEC, NULL,
ISIS_HELLO_P_RESERVED_MASK, "" }},
{ "Priority ", "isis_hello.priority",FT_UINT8, BASE_DEC, NULL,
ISIS_HELLO_P_RESERVED_MASK, "" }},
{ &hf_isis_hello_lan_id,
{ "LAN ID", "isis_hello.lan_id", FT_STRING, BASE_DEC, NULL, 0x0, "" }},
{ "SystemID{ Designated IS } ", "isis_hello.lan_id", FT_STRING, BASE_DEC, NULL,
0x0, "" }},
{ &hf_isis_hello_local_circuit_id,
{ "Local circuit ID", "isis_hello.local_circuit_id", FT_UINT8,
{ "Local circuit ID ", "isis_hello.local_circuit_id", FT_UINT8,
BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_hello_clv_ipv4_int_addr,
{ "IPv4 interface address", "isis_hello.clv_ipv4_int_addr", FT_IPv4,
{ "IPv4 interface address ", "isis_hello.clv_ipv4_int_addr", FT_IPv4,
BASE_NONE, NULL, 0x0, "" }},
};
@ -573,7 +558,7 @@ proto_register_isis_hello(void) {
&ett_isis_hello_clv_ipv4_int_addr,
};
proto_isis_hello = proto_register_protocol("ISIS hello", "isis_hello");
proto_isis_hello = proto_register_protocol("ISIS HELLO", "isis_hello");
proto_register_field_array(proto_isis_hello, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}

View File

@ -1,7 +1,7 @@
/* packet-isis-lsp.c
* Routines for decoding isis lsp packets and their CLVs
*
* $Id: packet-isis-lsp.c,v 1.4 2000/03/20 22:52:42 gram Exp $
* $Id: packet-isis-lsp.c,v 1.5 2000/04/15 22:11:09 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@ -43,6 +43,7 @@
#endif
#include "packet.h"
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
#include "packet-isis-lsp.h"
@ -515,17 +516,12 @@ dissect_lsp_eis_neighbors_clv_inner(const u_char *pd, int offset,
if ( tree ) {
if ( is_eis ) {
ti = proto_tree_add_text ( tree, offset, 11,
"ES Neighbor: %02x%02x.%02x%02x.%02x%02x",
pd[offset+4], pd[offset+5],
pd[offset+6], pd[offset+7],
pd[offset+8], pd[offset+9] );
"ES Neighbor: %s",
print_system_id( pd + offset + 4, 6 ) );
} else {
ti = proto_tree_add_text ( tree, offset, 11,
"IS Neighbor: %02x%02x.%02x%02x.%02x%02x-%02x",
pd[offset+4], pd[offset+5],
pd[offset+6], pd[offset+7],
pd[offset+8], pd[offset+9],
pd[offset+10] );
"IS Neighbor: %s",
print_system_id( pd + offset + 4, 6 ) );
}
ntree = proto_item_add_subtree(ti,
ett_isis_lsp_clv_is_neighbors);
@ -648,9 +644,8 @@ dissect_lsp_partition_dis_clv(const u_char *pd, int offset,
*/
if ( tree ) {
proto_tree_add_text ( tree, offset+4, 6,
"Partition designated L2 IS: %02x%02x.%02x%02x.%02x%02x",
pd[offset], pd[offset+1], pd[offset+2],
pd[offset+3], pd[offset+4], pd[offset+5]);
"Partition designated L2 IS: %s",
print_system_id( pd + offset, 6 ) );
}
length -= 6;
offset += 6;
@ -720,7 +715,7 @@ dissect_lsp_prefix_neighbors_clv(const u_char *pd, int offset,
* Lets turn the area address into "standard" 0000.0000.etc
* format string.
*/
sbuf = isis_address_to_string ( pd, offset + 1, mylen );
sbuf = print_area( pd + offset + 1, mylen );
/* and spit it out */
if ( tree ) {
proto_tree_add_text ( tree, offset, mylen + 1,
@ -750,13 +745,8 @@ void
isis_lsp_decode_lsp_id(char *tstr, proto_tree *tree, int offset,
isis_lsp_id_t *id ) {
proto_tree_add_text(tree, offset, 8,
"%s: %02x%02x.%02x%02x.%02x%02x.%02x-%02x", tstr,
id->source_id[0],
id->source_id[1],
id->source_id[2],
id->source_id[3],
id->source_id[4],
id->source_id[5],
"%s: %s.%02x-%02x", tstr,
print_system_id( id->source_id, 6 ),
id->psuodonode_id,
id->lsp_number );
}
@ -923,7 +913,7 @@ proto_register_isis_lsp(void) {
&ett_isis_lsp_clv_ip_reachability,
};
proto_isis_lsp = proto_register_protocol("ISIS lsp", "ISIS-lsp");
proto_isis_lsp = proto_register_protocol( PROTO_STRING_LSP, "isis_lsp");
proto_register_field_array(proto_isis_lsp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}

View File

@ -1,7 +1,7 @@
/* packet-isis-snp.c
* Routines for decoding isis complete & partial SNP and their payload
*
* $Id: packet-isis-snp.c,v 1.2 2000/01/24 03:33:32 guy Exp $
* $Id: packet-isis-snp.c,v 1.3 2000/04/15 22:11:10 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@ -38,6 +38,7 @@
#include <string.h>
#include <glib.h>
#include "packet.h"
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
#include "packet-isis-lsp.h"
@ -196,16 +197,16 @@ dissect_snp_lsp_entries(const u_char *pd, int offset, guint length,
return;
}
proto_tree_add_text(tree, offset, 2, "Remaining life: %d",
proto_tree_add_text(tree, offset, 2, "Remaining life : %d",
pntohs(&ps->isis_snp_remaining_lifetime));
isis_lsp_decode_lsp_id( "LSP ID", tree, offset + 2,
isis_lsp_decode_lsp_id( "LSP ID ", tree, offset + 2,
&ps->isis_snp_lsp_id );
proto_tree_add_text(tree, offset+10, 4,
"LSP Sequence Number: 0x%04x",
"LSP Sequence Number : 0x%04x",
pntohl(&ps->isis_snp_sequence_number));
proto_tree_add_text(tree, offset+14, 2,
"LSP checksum: 0x%02x",
pntohl(&ps->isis_snp_checksum));
"LSP checksum : 0x%02x",
pntohs(&ps->isis_snp_checksum));
length -= sizeof ( isis_snp_t );
offset += sizeof ( isis_snp_t );
ps++;
@ -258,18 +259,12 @@ isis_dissect_isis_csnp(int type, int header_length, const u_char *pd,
proto_tree_add_item(csnp_tree, hf_isis_csnp_pdu_length,
offset, 2, pntohs(&ilp->isis_csnp_pdu_length));
proto_tree_add_text(csnp_tree, offset + 2, 7,
"Source id: %02x%02x.%02x%02x.%02x%02x.%02x",
ilp->isis_csnp_source_id[0],
ilp->isis_csnp_source_id[1],
ilp->isis_csnp_source_id[2],
ilp->isis_csnp_source_id[3],
ilp->isis_csnp_source_id[4],
ilp->isis_csnp_source_id[5],
ilp->isis_csnp_source_id[6] );
isis_lsp_decode_lsp_id( "Start LSP id", csnp_tree, offset + 9,
&ilp->isis_csnp_start_lsp_id );
isis_lsp_decode_lsp_id( "End LSP id", csnp_tree, offset + 17,
"Source id : %s",
print_system_id( pd + offset + 2, 7 ) );
isis_lsp_decode_lsp_id( "Start LSP id ", csnp_tree, offset + 9,
&ilp->isis_csnp_start_lsp_id );
isis_lsp_decode_lsp_id( "End LSP id ", csnp_tree, offset + 17,
&ilp->isis_csnp_end_lsp_id );
}
offset += hlen;
@ -332,14 +327,8 @@ isis_dissect_isis_psnp(int type, int header_length, const u_char *pd,
proto_tree_add_item(psnp_tree, hf_isis_psnp_pdu_length,
offset, 2, pntohs(&ilp->isis_psnp_pdu_length));
proto_tree_add_text(psnp_tree, offset + 2, 7,
"Source id: %02x%02x.%02x%02x.%02x%02x.%02x",
ilp->isis_psnp_source_id[0],
ilp->isis_psnp_source_id[1],
ilp->isis_psnp_source_id[2],
ilp->isis_psnp_source_id[3],
ilp->isis_psnp_source_id[4],
ilp->isis_psnp_source_id[5],
ilp->isis_psnp_source_id[6] );
"Source id: %s",
print_system_id( pd + offset + 2, 7 ) );
}
offset += hlen;
@ -441,7 +430,7 @@ proto_register_isis_csnp(void) {
&ett_isis_csnp_clv_unknown,
};
proto_isis_csnp = proto_register_protocol("ISIS csnp", "ISIS-csnp");
proto_isis_csnp = proto_register_protocol(PROTO_STRING_CSNP, "isis_csnp");
proto_register_field_array(proto_isis_csnp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}
@ -479,7 +468,7 @@ proto_register_isis_psnp(void) {
&ett_isis_psnp_clv_unknown,
};
proto_isis_psnp = proto_register_protocol("ISIS psnp", "ISIS-psnp");
proto_isis_psnp = proto_register_protocol(PROTO_STRING_PSNP, "isis_psnp");
proto_register_field_array(proto_isis_psnp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}

View File

@ -2,7 +2,7 @@
* Routines for ISO/OSI network and transport protocol packet disassembly, core
* bits.
*
* $Id: packet-isis.c,v 1.6 2000/04/13 08:14:35 guy Exp $
* $Id: packet-isis.c,v 1.7 2000/04/15 22:11:11 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@ -40,37 +40,38 @@
#include <glib.h>
#include "packet.h"
#include "nlpid.h"
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-lsp.h"
#include "packet-isis-hello.h"
#include "packet-isis-snp.h"
/* isis base header */
static int proto_isis = -1;
static int proto_isis = -1;
static int hf_isis_irpd = -1;
static int hf_isis_header_length = -1;
static int hf_isis_version = -1;
static int hf_isis_reserved = -1;
static int hf_isis_type = -1;
static int hf_isis_version2 = -1;
static int hf_isis_eco = -1;
static int hf_isis_user_eco = -1;
static int hf_isis_irpd = -1;
static int hf_isis_header_length = -1;
static int hf_isis_version = -1;
static int hf_isis_system_id_length = -1;
static int hf_isis_type = -1;
static int hf_isis_version2 = -1;
static int hf_isis_reserved = -1;
static int hf_isis_max_area_adr = -1;
static gint ett_isis = -1;
static gint ett_isis = -1;
static const value_string isis_vals[] = {
{ ISIS_TYPE_L1_HELLO, "L1 HELLO"},
{ ISIS_TYPE_L2_HELLO, "L2 HELLO"},
{ ISIS_TYPE_PTP_HELLO, "P2P HELLO"},
{ ISIS_TYPE_L1_LSP, "L1 LSP"},
{ ISIS_TYPE_L2_LSP, "L2 LSP"},
{ ISIS_TYPE_L1_CSNP, "L1 CSNP"},
{ ISIS_TYPE_L2_CSNP, "L2 CSNP"},
{ ISIS_TYPE_L1_PSNP, "L1 PSNP"},
{ ISIS_TYPE_L2_PSNP, "L2 PSNP"},
{ 0, NULL} };
{ ISIS_TYPE_L1_HELLO, "L1 HELLO"},
{ ISIS_TYPE_L2_HELLO, "L2 HELLO"},
{ ISIS_TYPE_PTP_HELLO, "P2P HELLO"},
{ ISIS_TYPE_L1_LSP, "L1 LSP"},
{ ISIS_TYPE_L2_LSP, "L2 LSP"},
{ ISIS_TYPE_L1_CSNP, "L1 CSNP"},
{ ISIS_TYPE_L2_CSNP, "L2 CSNP"},
{ ISIS_TYPE_L1_PSNP, "L1 PSNP"},
{ ISIS_TYPE_L2_PSNP, "L2 PSNP"},
{ 0, NULL} };
/*
* Name: dissect_isis_unknown()
@ -113,47 +114,6 @@ isis_dissect_unknown(int offset,guint length,proto_tree *tree,frame_data *fd,
proto_tree_add_text(tree, offset, length, fmat, ap);
va_end(ap);
}
/*
* Name: isis_address_to_string()
*
* Description:
* Function for taking a byte string and turn it into a "0000.0000...."
* format ISIS address.
*
* Input:
* u_char * : Packet data
* unt offset : Current offset into packet data.
* int len : length of to dump.
*
* Output:
* static char * : print string
*/
char
*isis_address_to_string ( const u_char *pd, int offset, int len ) {
static char sbuf[768];
char *s;
sbuf[0] = 0;
s = sbuf;
while ( len > 0 ) {
/* special case: len is 1, put ending on it */
if ( len == 1 ) {
s += sprintf ( s, "%02x", pd[offset++] );
len--;
} else {
/* general case, just add 2 bytes */
s+= sprintf ( s, "%02x%02x", pd[offset++],
pd[offset++] );
len -= 2;
}
if ( len > 0 ) {
s += sprintf ( s, "." );
}
}
return sbuf;
}
/*
* Name: dissect_isis()
*
@ -208,22 +168,22 @@ dissect_isis(const u_char *pd, int offset, frame_data *fd,
offset + 1, 1, ihdr->isis_header_length );
proto_tree_add_item(isis_tree, hf_isis_version,
offset + 2, 1, ihdr->isis_version );
proto_tree_add_item(isis_tree, hf_isis_reserved,
offset + 3, 1, ihdr->isis_reserved );
proto_tree_add_item(isis_tree, hf_isis_system_id_length,
offset + 3, 1, ihdr->isis_system_id_len );
proto_tree_add_uint_format(isis_tree, hf_isis_type,
offset + 4, 1, ihdr->isis_type,
"Type: %s (R:%s%s%s)",
"Type : %s (R:%s%s%s)",
val_to_str(ihdr->isis_type & ISIS_TYPE_MASK, isis_vals,
"Unknown (0x%x)"),
"Unknown (0x%x)"),
(ihdr->isis_type & ISIS_R8_MASK) ? "1" : "0",
(ihdr->isis_type & ISIS_R7_MASK) ? "1" : "0",
(ihdr->isis_type & ISIS_R6_MASK) ? "1" : "0");
proto_tree_add_item(isis_tree, hf_isis_version2,
offset + 5, 1, ihdr->isis_version2 );
proto_tree_add_item(isis_tree, hf_isis_eco,
offset + 6, 1, ihdr->isis_eco );
proto_tree_add_item(isis_tree, hf_isis_user_eco,
offset + 7, 1, ihdr->isis_user_eco );
proto_tree_add_item(isis_tree, hf_isis_reserved,
offset + 6, 1, ihdr->isis_reserved );
proto_tree_add_item(isis_tree, hf_isis_max_area_adr,
offset + 7, 1, ihdr->isis_max_area_adr );
}
@ -304,49 +264,48 @@ dissect_isis(const u_char *pd, int offset, frame_data *fd,
*/
void
proto_register_isis(void) {
static hf_register_info hf[] = {
{ &hf_isis_irpd,
{ "Intradomain Routing Protocol Discriminator", "isis.irpd",
FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, "" }},
static hf_register_info hf[] = {
{ &hf_isis_irpd,
{ "Intra Domain Routing Protocol Discriminator", "isis.irpd",
FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, "" }},
{ &hf_isis_header_length,
{ "HDR Length", "isis.hdr_len", FT_UINT8, BASE_DEC,
NULL, 0x0, "" }},
{ &hf_isis_header_length,
{ "PDU Header Length ", "isis.len", FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_version,
{ "Version (==1)", "isis.version", FT_UINT8,
BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_version,
{ "Version (==1) ", "isis.version", FT_UINT8,
BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_reserved,
{ "Reserved(==0)", "isis.reserved",
FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_system_id_length,
{ "System ID Length ", "isis.sysid_len",
FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
{ &hf_isis_type,
{ "Type code", "isis.type", FT_UINT8, BASE_DEC,
VALS(isis_vals), 0xff, "" }},
{ &hf_isis_type,
{ "PDU Type :", "isis.type", FT_UINT8, BASE_DEC,
VALS(isis_vals), 0xff, "" }},
{ &hf_isis_version2,
{ "Version2(==1)", "isis.version2", FT_UINT8, BASE_DEC, NULL,
0x0, "" }},
{ &hf_isis_version2,
{ "Version2 (==1) ", "isis.version2", FT_UINT8, BASE_DEC, NULL,
0x0, "" }},
{ &hf_isis_eco,
{ "ECO (==0)", "isis.eco",FT_UINT8, BASE_DEC, NULL,
0x0, "" }},
{ &hf_isis_reserved,
{ "Reserved (==0) ", "isis.reserved", FT_UINT8, BASE_DEC, NULL,
0x0, "" }},
{ &hf_isis_user_eco,
{ "User ECO (==0)", "isis.user_eco", FT_UINT8, BASE_DEC, NULL,
0x0, "" }},
{ &hf_isis_max_area_adr,
{ "Max.AREAs: (0==3) ", "isis.max_area_adr", FT_UINT8, BASE_DEC, NULL,
0x0, "" }},
};
/*
* Note, we pull in the unknown CLV handler here, since it
* is used by all ISIS packet types.
*/
static gint *ett[] = {
&ett_isis,
};
};
/*
* Note, we pull in the unknown CLV handler here, since it
* is used by all ISIS packet types.
*/
static gint *ett[] = {
&ett_isis,
};
proto_isis = proto_register_protocol("clnp ISIS", "isis");
proto_register_field_array(proto_isis, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
proto_isis = proto_register_protocol(PROTO_STRING_ISIS, "isis");
proto_register_field_array(proto_isis, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
}

View File

@ -1,7 +1,7 @@
/* packet-isis.h
* Defines and such for core isis protcol decode.
*
* $Id: packet-isis.h,v 1.2 2000/01/13 06:07:52 guy Exp $
* $Id: packet-isis.h,v 1.3 2000/04/15 22:11:11 guy Exp $
* Stuart Stanley <stuarts@mxmail.net>
*
* Ethereal - Network traffic analyzer
@ -37,48 +37,50 @@
/*
* ISIS type field values
*/
#define ISIS_TYPE_L1_HELLO 15
#define ISIS_TYPE_L2_HELLO 16
#define ISIS_TYPE_PTP_HELLO 17
#define ISIS_TYPE_L1_LSP 18
#define ISIS_TYPE_L2_LSP 20
#define ISIS_TYPE_L1_CSNP 24
#define ISIS_TYPE_L2_CSNP 25
#define ISIS_TYPE_L1_PSNP 26
#define ISIS_TYPE_L2_PSNP 27
#define ISIS_TYPE_L1_HELLO 15
#define ISIS_TYPE_L2_HELLO 16
#define ISIS_TYPE_PTP_HELLO 17
#define ISIS_TYPE_L1_LSP 18
#define ISIS_TYPE_L2_LSP 20
#define ISIS_TYPE_L1_CSNP 24
#define ISIS_TYPE_L2_CSNP 25
#define ISIS_TYPE_L1_PSNP 26
#define ISIS_TYPE_L2_PSNP 27
#define ISIS_TYPE_MASK 0x1f
#define ISIS_R8_MASK 0x80
#define ISIS_R7_MASK 0x40
#define ISIS_R6_MASK 0x20
/*
* The common first 8 octets of the ISIS protocol header.
*/
typedef struct {
guint8 isis_irpd; /* Intradomain Routing Protocol Descriminator. Must be 0x83 */
guint8 isis_header_length; /* header length in octets */
guint8 isis_version; /* isis version, must be 0x01 */
guint8 isis_reserved; /* res byte, must be 0 */
guint8 isis_type_reserved; /* packet type & reserved */
#define ISIS_TYPE_MASK 0x1f
#define ISIS_R8_MASK 0x80
#define ISIS_R7_MASK 0x40
#define ISIS_R6_MASK 0x20
guint8 isis_version2; /* another version(?!), must be 0x01 */
guint8 isis_eco; /* ECO, must be 0 */
guint8 isis_user_eco; /* user ECO, must be 0 */
} isis_hdr_t;
guint8 isis_irpd; /* Intradomain Routing Protocol Descriminator: 0x83 */
guint8 isis_header_length; /* header length in octets */
guint8 isis_version; /* isis version, must be 0x01 */
guint8 isis_system_id_len; /* length of the system ID fields */
guint8 isis_type_reserved; /* packet type & reserved */
guint8 isis_version2; /* another version(?!), must be 0x01 */
guint8 isis_reserved; /* reserved, must be 0 */
guint8 isis_max_area_adr; /* Maximum Number of AREA Addresses permitted */
} isis_hdr_t; /* for this AREA. Value of 0 allows 3 Addresses */
#define isis_type isis_type_reserved&ISIS_TYPE_MASK
#define isis_r8 isis_type_reserved&ISIS_R8_MASK
#define isis_r7 isis_type_reserved&ISIS_R7_MASK
#define isis_r6 isis_type_reserved&ISIS_R6_MASK
#define isis_r8 isis_type_reserved&ISIS_R8_MASK
#define isis_r7 isis_type_reserved&ISIS_R7_MASK
#define isis_r6 isis_type_reserved&ISIS_R6_MASK
/*
* published API functions
*/
extern char *isis_address_to_string ( const u_char *pd, int offset, int len );
extern void dissect_isis(const u_char *pd, int offset, frame_data *fd,
proto_tree *tree);
extern void dissect_isis( const u_char *pd, int offset, frame_data *fd,
proto_tree *tree);
extern void proto_register_isis(void);
extern void isis_dissect_unknown(int offset,guint length,proto_tree *tree,frame_data *fd,
char *fmat, ...);
extern void isis_dissect_unknown( int offset, guint length, proto_tree *tree,
frame_data *fd, char *fmat, ...);
#endif /* _PACKET_ISIS_H */

466
packet-osi-options.c Normal file
View File

@ -0,0 +1,466 @@
/* packet-osi-options.c
* Routines for the decode of ISO/OSI option part
* Covers:
* ISO 8473 CLNP (ConnectionLess Mode Network Service Protocol)
* ISO 10589 ISIS (Intradomain Routeing Information Exchange Protocol)
* ISO 9542 ESIS (End System To Intermediate System Routeing Exchange Protocol)
*
* $Id: packet-osi-options.c,v 1.1 2000/04/15 22:11:11 guy Exp $
* Ralf Schneider <Ralf.Schneider@t-online.de>
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include "packet.h"
#include "nlpid.h"
#include "packet-osi.h"
#include "packet-isis.h"
#include "packet-isis-clv.h"
#include "packet-isis-hello.h"
#include "packet-isis-lsp.h"
#include "packet-isis-snp.h"
#include "packet-esis.h"
#include "packet-clnp.h"
#include "packet-osi-options.h"
#define OSI_OPT_SECURITY 0xc5
#define OSI_OPT_QOS_MAINTANANCE 0xc3
#define OSI_OPT_PRIORITY 0xcd
#define OSI_OPT_ADDRESS_MASK 0xe1
#define OSI_OPT_SNPA_MASK 0xe2
#define OSI_OPT_ES_CONFIG_TIMER 0xc6
#define OSI_OPT_MAX_PRIORITY 0x0e
#define OSI_OPT_PADDING 0xcc
#define OSI_OPT_SOURCE_ROUTING 0xc8
#define OSI_OPT_RECORD_OF_ROUTE 0xcb
#define OSI_OPT_REASON_OF_DISCARD 0xc1
#define OSI_OPT_SEC_MASK 0xc0
#define OSI_OPT_SEC_RESERVED 0x00
#define OSI_OPT_SEC_SRC_ADR_SPEC 0x40
#define OSI_OPT_SEC_DST_ADR_SPEC 0x80
#define OSI_OPT_SEC_GLOBAL_UNIQUE 0xc0
#define OSI_OPT_QOS_MASK 0xc0
#define OSI_OPT_QOS_RESERVED 0x00
#define OSI_OPT_QOS_SRC_ADR_SPEC 0x40
#define OSI_OPT_QOS_DST_ADR_SPEC 0x80
#define OSI_OPT_QOS_GLOBAL_UNIQUE 0xc0
#define OSI_OPT_QOS_SUB_MASK 0x3f
#define OSI_OPT_QOS_SUB_RSVD 0x20
#define OSI_OPT_QOS_SUB_SEQ_VS_TRS 0x10
#define OSI_OPT_QOS_SUB_CONG_EXPED 0x08
#define OSI_OPT_QOS_SUB_TSD_VS_COST 0x04
#define OSI_OPT_QOS_SUB_RESERR_TRS 0x02
#define OSI_OPT_QOS_SUB_RESERR_COST 0x01
#define OSI_OPT_RFD_GENERAL 0x00
#define OSI_OPT_RFD_ADDRESS 0x80
#define OSI_OPT_RFD_SOURCE_ROUTEING 0x90
#define OSI_OPT_RFD_LIFETIME 0xa0
#define OSI_OPT_RFD_PDU_DISCARDED 0xb0
#define OSI_OPT_RFD_REASSEMBLY 0xc0
#define OSI_OPT_RFD_MASK 0xf0
#define OSI_OPT_RFD_SUB_MASK 0x0f
static gint ott_osi_options = -1;
static gint ott_osi_qos = -1;
static gint ott_osi_route = -1;
static gint ott_osi_redirect = -1;
static const value_string osi_opt_sec_vals[] = {
{ OSI_OPT_SEC_RESERVED, "Reserved"},
{ OSI_OPT_SEC_SRC_ADR_SPEC, "Source Address Specific"},
{ OSI_OPT_SEC_DST_ADR_SPEC, "Destination Address Specific"},
{ OSI_OPT_SEC_GLOBAL_UNIQUE, "Globally Unique"},
{ 0, NULL} };
static const value_string osi_opt_qos_vals[] = {
{ OSI_OPT_QOS_RESERVED, "Reserved"},
{ OSI_OPT_QOS_SRC_ADR_SPEC, "Source Address Specific"},
{ OSI_OPT_QOS_DST_ADR_SPEC, "Destination Address Specific"},
{ OSI_OPT_QOS_GLOBAL_UNIQUE, "Globally Unique"},
{ 0, NULL} };
static const value_string osi_opt_qos_sub_vals[] = {
{ 0x20, " xx10 0000 Reserved"},
{ 0x10, " xx01 0000 Sequencing versus transit delay"},
{ 0x08, " xx00 1000 Congestion experienced"},
{ 0x04, " xx00 0100 Transit delay versus cost"},
{ 0x02, " xx00 0010 Residual error probability versus transit delay"},
{ 0x01, " xx00 0001 Residual error probability versus cost"},
{ 0, NULL} };
static const value_string osi_opt_rfd_general[] = {
{ 0x00, "Reason not specified"},
{ 0x01, "Protocol procedure error"},
{ 0x02, "Incorrect checksum"},
{ 0x03, "PDU discarded due to congestion"},
{ 0x04, "Header syntax error ( cannot be parsed )"},
{ 0x05, "Segmentation needed but not permitted"},
{ 0x06, "Incomplete PDU received"},
{ 0x07, "Duplicate option"},
{ 0, NULL} };
static const value_string osi_opt_rfd_address[] = {
{ 0x00, "Destination Address unreachable"},
{ 0x01, "Destination Address unknown"},
{ 0, NULL} };
static const value_string osi_opt_rfd_src_route[] = {
{ 0x00, "Unspecified source routeing error"},
{ 0x01, "Syntax error in source routeing field"},
{ 0x02, "Unknown address in source routeing field"},
{ 0x03, "Path not acceptable"},
{ 0, NULL} };
static const value_string osi_opt_rfd_lifetime[] = {
{ 0x00, "Lifetime expired while data unit in transit"},
{ 0x01, "Lifetime expired during reassembly"},
{ 0, NULL} };
static const value_string osi_opt_rfd_discarded[] = {
{ 0x00, "Unsupported option not specified"},
{ 0x01, "Unsupported protocol version"},
{ 0x02, "Unsupported security option"},
{ 0x03, "Unsupported source routeing option"},
{ 0x04, "Unsupported recording of route option"},
{ 0, NULL} };
static const value_string osi_opt_rfd_reassembly[] = {
{ 0x00, "Reassembly interference"},
{ 0, NULL} };
void
dissect_option_qos( const u_char type, const u_char sub_type, u_char offset,
u_char len, const u_char *pd, proto_tree *tree ) {
u_char tmp_type = 0;
proto_item *ti;
proto_tree *osi_qos_tree = NULL;
ti = proto_tree_add_text( tree, offset, len,
"Quality of service maintenance: %s",
val_to_str( type, osi_opt_qos_vals, "Unknown (0x%x)") );
osi_qos_tree = proto_item_add_subtree( ti, ott_osi_qos );
if ( OSI_OPT_SEC_MASK == type ) { /* Analye BIT field to get all Values */
tmp_type = sub_type & OSI_OPT_QOS_SUB_RSVD;
if ( tmp_type ) {
proto_tree_add_text( osi_qos_tree, offset, len,
val_to_str( tmp_type, osi_opt_qos_sub_vals, "Unknown (0x%x)") );
}
tmp_type = sub_type & OSI_OPT_QOS_SUB_SEQ_VS_TRS;
if ( tmp_type ) {
proto_tree_add_text( osi_qos_tree, offset, len,
val_to_str( tmp_type, osi_opt_qos_sub_vals, "Unknown (0x%x)") );
}
tmp_type = sub_type &OSI_OPT_QOS_SUB_CONG_EXPED;
if ( tmp_type ) {
proto_tree_add_text( osi_qos_tree, offset, len,
val_to_str( tmp_type, osi_opt_qos_sub_vals, "Unknown (0x%x)") );
}
tmp_type = sub_type & OSI_OPT_QOS_SUB_TSD_VS_COST;
if ( tmp_type ) {
proto_tree_add_text( osi_qos_tree, offset, len,
val_to_str( tmp_type, osi_opt_qos_sub_vals, "Unknown (0x%x)") );
}
tmp_type = sub_type & OSI_OPT_QOS_SUB_RESERR_TRS;
if ( tmp_type ) {
proto_tree_add_text( osi_qos_tree, offset, len,
val_to_str( tmp_type, osi_opt_qos_sub_vals, "Unknown (0x%x)") );
}
tmp_type = sub_type & OSI_OPT_QOS_SUB_RESERR_COST;
if ( tmp_type ) {
proto_tree_add_text( osi_qos_tree, offset, len,
val_to_str( tmp_type, osi_opt_qos_sub_vals, "Unknown (0x%x)") );
}
}
};
void
dissect_option_route( u_char parm_type, u_char offset, u_char parm_len,
const u_char *pd, proto_tree *tree ) {
u_char next_hop = 0;
u_char this_hop = 0;
u_char netl = 0;
u_char last_hop = 0;
u_char cnt_hops = 0;
proto_item *ti;
proto_tree *osi_route_tree = NULL;
static const value_string osi_opt_route[] = {
{ 0x03, "No Network Entity Titles Recorded Yet"},
{ 0xff, "Recording Terminated !"},
{ 0, NULL} };
if ( parm_type == OSI_OPT_SOURCE_ROUTING ) {
next_hop = pd[offset + 1 ];
netl = pd[next_hop + 2 ];
this_hop = offset + 3; /* points to first netl */
ti = proto_tree_add_text( tree, offset + next_hop, netl,
"Source Routing: %s ( Next Hop Highlighted In Data Buffer )",
(pd[offset] == 0) ? "Partial Source Routeing" :
"Complete Source Routeing" );
}
else {
last_hop = pd[offset + 1 ]; /* points to the end of the list */
netl = pd[ last_hop ]; /* mis-used to highlight buffer */
ti = proto_tree_add_text( tree, offset + next_hop, netl,
"Record of Route: %s : %s",
(pd[offset] == 0) ? "Partial Source Routeing" :
"Complete Source Routeing" ,
val_to_str( last_hop, osi_opt_route, "Unknown (0x%x" ) );
if ( 255 == last_hop )
this_hop = parm_len + 1; /* recording terminated, nothing to show */
else
this_hop = offset + 3;
}
osi_route_tree = proto_item_add_subtree( ti, ott_osi_route );
while ( this_hop < parm_len ) {
netl = pd[this_hop + 1];
proto_tree_add_text( osi_route_tree, offset + this_hop, netl,
"Hop #%3u NETL: %2u, NET: %s",
cnt_hops++,
netl,
print_nsap_net( &pd[this_hop + 1], netl ) );
this_hop += 1 + netl;
}
};
void
dissect_option_rfd( const u_char error, const u_char field, u_char offset,
u_char len, const u_char *pd, proto_tree *tree ) {
u_char error_class = 0;
char *format_string[] =
{ "Reason for discard {General} : %s, in field %u",
"Reason for discard {Address} : %s, in field %u",
"Reason for discard {Source Routeing}: %s, in field %u",
"Reason for discard {Lifetime} : %s, in field %u",
"Reason for discard {PDU discarded} : %s, in field %u",
"Reason for discard {Reassembly} : %s, in field %u"
};
error_class = error & OSI_OPT_RFD_MASK;
if ( OSI_OPT_RFD_GENERAL == error_class ) {
proto_tree_add_text( tree, offset + field, 1, format_string[0],
val_to_str( error & OSI_OPT_RFD_SUB_MASK,
osi_opt_rfd_general, "Unknown (0x%x)"), field );
}
else if ( OSI_OPT_RFD_ADDRESS == error_class ) {
proto_tree_add_text( tree, offset + field, 1, format_string[1],
val_to_str( error & OSI_OPT_RFD_SUB_MASK,
osi_opt_rfd_address, "Unknown (0x%x)"), field );
}
else if ( OSI_OPT_RFD_SOURCE_ROUTEING == error_class ) {
proto_tree_add_text( tree, offset + field, 1, format_string[2],
val_to_str( error & OSI_OPT_RFD_SUB_MASK,
osi_opt_rfd_src_route, "Unknown (0x%x)"), field );
}
else if ( OSI_OPT_RFD_LIFETIME == error_class ) {
proto_tree_add_text( tree, offset + field, 1, format_string[3],
val_to_str( error & OSI_OPT_RFD_SUB_MASK,
osi_opt_rfd_lifetime, "Unknown (0x%x)"), field );
}
else if ( OSI_OPT_RFD_PDU_DISCARDED == error_class ) {
proto_tree_add_text( tree, offset + field, 1, format_string[4],
val_to_str( error & OSI_OPT_RFD_SUB_MASK,
osi_opt_rfd_discarded, "Unknown (0x%x)"), field );
}
else if ( OSI_OPT_RFD_REASSEMBLY == error_class ) {
proto_tree_add_text( tree, offset + field, 1, format_string[5],
val_to_str( error & OSI_OPT_RFD_SUB_MASK,
osi_opt_rfd_reassembly, "Unknown (0x%x)"), field );
}
else {
proto_tree_add_text( tree, offset, len,
"Reason for discard: UNKNOWN Error Class" );
}
};
/* ############################## Dissection Functions ###################### */
/*
* Name: dissect_osi_options()
*
* Description:
* Main entry area for esis de-mangling. This will build the
* main esis tree data and call the sub-protocols as needed.
*
* Input:
* u_char : PDU type to check if option is allowed or not
* u_char : length of option section
* u_char * : packet data
* int : offset into packet where we are (packet_data[offset]== start
* of what we care about)
* frame_data * : frame data (whole packet with extra info)
* proto_tree * : tree of display data. May be NULL.
*
* Output:
* void, but we will add to the proto_tree if it is not NULL.
*/
void
dissect_osi_options( u_char pdu_type, u_char opt_len, const u_char *pd,
int offset, frame_data *fd, proto_tree *tree) {
proto_item *ti;
proto_tree *osi_option_tree = NULL;
u_char parm_len = 0;
u_char parm_type = 0;
if (tree) {
if ( 0 == opt_len ) {
proto_tree_add_text( tree, offset, 0,
"### No Options for this PDU ###" );
return;
}
if ( opt_len > END_OF_FRAME ) {
proto_tree_add_text( tree, offset, END_OF_FRAME,
"### Options go past the end of the captured data in this PDU ###" );
return;
}
ti = proto_tree_add_text( tree, offset, opt_len,
"### Option Section ###" );
osi_option_tree = proto_item_add_subtree( ti, ott_osi_options );
while ( 0 < opt_len ) {
parm_type = (int) pd[offset++];
parm_len = (int) pd[offset++];
switch ( parm_type ) {
case OSI_OPT_QOS_MAINTANANCE:
dissect_option_qos( pd[offset]&OSI_OPT_QOS_MASK,
pd[offset]&OSI_OPT_QOS_SUB_MASK,
offset, parm_len, pd, osi_option_tree );
break;
case OSI_OPT_SECURITY:
proto_tree_add_text( osi_option_tree, offset, parm_len,
"Security type: %s",
val_to_str( pd[offset]&OSI_OPT_SEC_MASK,
osi_opt_sec_vals, "Unknown (0x%x)") );
break;
case OSI_OPT_PRIORITY:
if ( OSI_OPT_MAX_PRIORITY >= pd[offset] ) {
proto_tree_add_text( osi_option_tree, offset, parm_len,
"Priority : %u", pd[offset] );
}
else {
proto_tree_add_text( osi_option_tree, offset, parm_len,
"Priority : %u ( Invalid )",
pd[offset] );
}
break;
case OSI_OPT_ADDRESS_MASK:
proto_tree_add_text( osi_option_tree, offset, parm_len,
"Address Mask: %s", print_area( &pd[offset], parm_len ) );
break;
case OSI_OPT_SNPA_MASK:
proto_tree_add_text( osi_option_tree, offset, parm_len,
"SNPA Mask : %s", print_system_id( &pd[offset], parm_len ));
break;
case OSI_OPT_ES_CONFIG_TIMER:
proto_tree_add_text( osi_option_tree, offset, parm_len,
"ESCT : %u seconds", pntohs( &pd[offset] ) );
break;
case OSI_OPT_PADDING:
proto_tree_add_text( osi_option_tree, offset, parm_len,
"Padding : %u Octets", parm_len ) ;
break;
case OSI_OPT_SOURCE_ROUTING:
case OSI_OPT_RECORD_OF_ROUTE:
dissect_option_route( parm_type,
offset, parm_len, pd, osi_option_tree );
break;
case OSI_OPT_REASON_OF_DISCARD:
dissect_option_rfd( pd[offset],
pd[offset + 1],
offset, parm_len, pd, osi_option_tree );
break;
}
opt_len -= parm_len + 2;
offset += parm_len;
}
}
}; /* dissect-osi-options */
/*
* Name: proto_register_osi_options()
*
* Description:
* main register for esis protocol set. We register some display
* formats and the protocol module variables.
*
* NOTE: this procedure to autolinked by the makefile process that
* builds register.c
*
* Input:
* void
*
* Output:
* void
*/
void
proto_register_osi_options(void) {
static gint *ott[] = {
&ott_osi_options,
&ott_osi_qos,
&ott_osi_route,
&ott_osi_redirect,
};
proto_register_subtree_array( ott, array_length(ott));
};

39
packet-osi-options.h Normal file
View File

@ -0,0 +1,39 @@
/* packet-osi-options.h
* Defines for OSI options part decode
*
* $Id: packet-osi-options.h,v 1.1 2000/04/15 22:11:12 guy Exp $
* Ralf Schneider <Ralf.Schneider@t-online.de>
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
* Copyright 1998 Gerald Combs
*
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*
*/
#ifndef _PACKET_OSI_OPTION_H
#define _PACKET_OSI_OPTIONS_H
/*
* published API functions
*/
extern void dissect_osi_options( u_char, u_char, const u_char *, int,
frame_data *, proto_tree *);
extern void proto_register_osi_options(void);
#endif /* _PACKET_OSI_OPTIONS_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/* packet-osi.h
*
* $Id: packet-osi.h,v 1.1 2000/02/15 21:02:48 gram Exp $
* $Id: packet-osi.h,v 1.2 2000/04/15 22:11:12 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -20,8 +20,92 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _PACKET_OSI_H
#define _PACKET_OSI_H
/* OSI Global defines, common for all OSI protocols */
#define MAX_NSAP_LEN 30
#define MAX_SYSTEMID_LEN 15
#define MAX_AREA_LEN 30
#define RFC1237_NSAP_LEN 20
#define RFC1237_FULLAREA_LEN 13
#define RFC1237_SYSTEMID_LEN 6
#define RFC1237_SELECTOR_LEN 1
#define RFC1237_IDI_LEN 2
#define RFC1237_AFI_LEN 1
#define RFC1237_DFI_LEN 1
#define RFC1237_ORG_LEN 3
#define RFC1237_AA_LEN 3
#define RFC1237_RSVD_LEN 2
#define RFC1237_RD_LEN 2
#define RFC1237_AREA_LEN 3
#define NSAP_IDI_ISODCC 0x39
#define NSAP_IDI_GOSIP2 0x47
#define PDU_TYPE_ESIS_ESH 100
#define PDU_TYPE_ESIS_ISH 101
#define PDU_TYPE_ESIS_RD 102
#define PDU_TYPE_ISIS_L1_HELLO 201
#define PDU_TYPE_ISIS_L2_HELLO 202
#define PDU_TYPE_ISIS_PTP_HELLO 203
#define PDU_TYPE_ISIS_L1_CSNP 204
#define PDU_TYPE_ISIS_L1_PSNP 205
#define PDU_TYPE_ISIS_L2_CSNP 206
#define PDU_TYPE_ISIS_L2_PSNP 207
#define PROTO_STRING_ISIS "ISO 10598 ISIS InTRA Domain Routeing Information Exchange Protocol"
#define PROTO_STRING_IDRP "ISO 10747 IDRP InTER Domain Routeing Information Exchange Protocol"
#define PROTO_STRING_ESIS "ISO 9542 ESIS Routeing Information Exchange Protocol"
#define PROTO_STRING_CLNP "ISO 8473 CLNP ConnectionLess Network Protocol"
#define PROTO_STRING_COTP "ISO 8073 COTP Connection-Oriented Transport Protocol"
#define PROTO_STRING_LSP "ISO 10598 ISIS Link State Protocol Data Unit"
#define PROTO_STRING_CSNP "ISO 10598 ISIS Complete Sequence Numbers Protocol Data Unit"
#define PROTO_STRING_PSNP "ISO 10598 ISIS Partial Sequence Numbers Protocol Data Unit"
#define OSI_PDU_TYPE_MASK 0x1f
#define BIS_PDU_TYPE MASK 0xff
#define BIT_1 0x01
#define BIT_2 0x02
#define BIT_3 0x04
#define BIT_4 0x08
#define BIT_5 0x10
#define BIT_6 0x20
#define BIT_7 0x40
#define BIT_8 0x80
#define BIT_9 0x0100
#define BIT_10 0x0200
#define BIT_11 0x0400
#define BIT_12 0x0800
#define BIT_13 0x1000
#define BIT_14 0x2000
#define BIT_15 0x4000
#define BIT_16 0x8000
/*
* published API functions
*/
extern void dissect_osi( const u_char *, int, frame_data *, proto_tree *);
extern gchar *print_nsap_net ( const u_char *, int );
extern gchar *print_area ( const u_char *, int );
extern gchar *print_system_id( const u_char *, int );
extern gchar *calc_checksum ( const u_char *, u_int, u_int );
#endif /* _PACKET_OSI_H */
void dissect_cotp(const u_char *, int, frame_data *, proto_tree *);
void dissect_osi(const u_char *, int, frame_data *, proto_tree *);

View File

@ -2,7 +2,7 @@
* Routines for x25 packet disassembly
* Olivier Abad <abad@daba.dhis.net>
*
* $Id: packet-x25.c,v 1.23 2000/04/13 18:18:53 gram Exp $
* $Id: packet-x25.c,v 1.24 2000/04/15 22:11:12 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@ -40,6 +40,7 @@
#include "packet.h"
#include "packet-ip.h"
#include "packet-osi.h"
#include "packet-clnp.h"
#include "nlpid.h"
#define FROM_DCE 0x80