forked from osmocom/wireshark
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:
parent
26ca4597f6
commit
c9d4dd080d
5
AUTHORS
5
AUTHORS
|
@ -294,6 +294,11 @@ Graham Bloice <graham.bloice@trihedral.com> {
|
||||||
add version/copyright/etc. information to Win32 executables
|
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
|
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to
|
||||||
give his permission to use his version of snprintf.c.
|
give his permission to use his version of snprintf.c.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile.am
|
# Makefile.am
|
||||||
# Automake file for Ethereal
|
# 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
|
# Ethereal - Network traffic analyzer
|
||||||
# By Gerald Combs <gerald@zing.org>
|
# By Gerald Combs <gerald@zing.org>
|
||||||
|
@ -58,11 +58,15 @@ DISSECTOR_SOURCES = \
|
||||||
packet-cgmp.h \
|
packet-cgmp.h \
|
||||||
packet-clip.c \
|
packet-clip.c \
|
||||||
packet-clip.h \
|
packet-clip.h \
|
||||||
|
packet-clnp.c \
|
||||||
|
packet-clnp.h \
|
||||||
packet-data.c \
|
packet-data.c \
|
||||||
packet-ddtp.c \
|
packet-ddtp.c \
|
||||||
packet-ddtp.h \
|
packet-ddtp.h \
|
||||||
packet-dns.c \
|
packet-dns.c \
|
||||||
packet-dns.h \
|
packet-dns.h \
|
||||||
|
packet-esis.h \
|
||||||
|
packet-esis.c \
|
||||||
packet-eth.c \
|
packet-eth.c \
|
||||||
packet-eth.h \
|
packet-eth.h \
|
||||||
packet-ethertype.c \
|
packet-ethertype.c \
|
||||||
|
@ -140,6 +144,8 @@ DISSECTOR_SOURCES = \
|
||||||
packet-null.h \
|
packet-null.h \
|
||||||
packet-osi.c \
|
packet-osi.c \
|
||||||
packet-osi.h \
|
packet-osi.h \
|
||||||
|
packet-osi-options.c \
|
||||||
|
packet-osi-options.h \
|
||||||
packet-ospf.c \
|
packet-ospf.c \
|
||||||
packet-ospf.h \
|
packet-ospf.h \
|
||||||
packet-pim.c \
|
packet-pim.c \
|
||||||
|
|
|
@ -840,6 +840,7 @@ B<http://ethereal.zing.org>.
|
||||||
Andreas Sikkema <andreas.sikkema@philips.com>
|
Andreas Sikkema <andreas.sikkema@philips.com>
|
||||||
Mark Muhlestein <mmm@netapp.com>
|
Mark Muhlestein <mmm@netapp.com>
|
||||||
Graham Bloice <graham.bloice@trihedral.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
|
Alain Magloire <alainm@rcsm.ece.mcgill.ca> was kind enough to give his
|
||||||
permission to use his version of snprintf.c.
|
permission to use his version of snprintf.c.
|
||||||
|
|
4
nlpid.h
4
nlpid.h
|
@ -2,7 +2,7 @@
|
||||||
* Definitions of OSI NLPIDs (Network Layer Protocol IDs)
|
* Definitions of OSI NLPIDs (Network Layer Protocol IDs)
|
||||||
* Laurent Deniel <deniel@worldnet.fr>
|
* 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
|
* Ethereal - Network traffic analyzer
|
||||||
* By Gerald Combs <gerald@zing.org>
|
* By Gerald Combs <gerald@zing.org>
|
||||||
|
@ -36,7 +36,7 @@
|
||||||
#define NLPID_ISO8473_CLNP 0x81 /* X.233 */
|
#define NLPID_ISO8473_CLNP 0x81 /* X.233 */
|
||||||
#define NLPID_ISO9542_ESIS 0x82
|
#define NLPID_ISO9542_ESIS 0x82
|
||||||
#define NLPID_ISO10589_ISIS 0x83
|
#define NLPID_ISO10589_ISIS 0x83
|
||||||
#define NLPID_ISO10747 0x85
|
#define NLPID_ISO10747_IDRP 0x85
|
||||||
#define NLPID_ISO9542X25_ESIS 0x8a
|
#define NLPID_ISO9542X25_ESIS 0x8a
|
||||||
#define NLPID_ISO10030 0x8c
|
#define NLPID_ISO10030 0x8c
|
||||||
#define NLPID_ISO11577 0x8d /* X.273 */
|
#define NLPID_ISO11577 0x8d /* X.273 */
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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 */
|
|
@ -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));
|
||||||
|
};
|
|
@ -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 */
|
|
@ -1,7 +1,7 @@
|
||||||
/* packet-isis-clv.c
|
/* packet-isis-clv.c
|
||||||
* Common CLV decode routines.
|
* 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>
|
* Stuart Stanley <stuarts@mxmail.net>
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
|
@ -47,6 +47,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
#include "packet-osi.h"
|
||||||
#include "packet-isis.h"
|
#include "packet-isis.h"
|
||||||
#include "packet-isis-clv.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
|
* Lets turn the area address into "standard" 0000.0000.etc
|
||||||
* format string.
|
* 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 */
|
/* and spit it out */
|
||||||
if ( tree ) {
|
if ( tree ) {
|
||||||
proto_tree_add_text ( tree, offset, mylen + 1,
|
proto_tree_add_text ( tree, offset, mylen + 1,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* packet-isis-hello.c
|
/* packet-isis-hello.c
|
||||||
* Routines for decoding isis hello packets and their CLVs
|
* 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>
|
* Stuart Stanley <stuarts@mxmail.net>
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
|
@ -38,28 +38,29 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
#include "packet-osi.h"
|
||||||
#include "packet-isis.h"
|
#include "packet-isis.h"
|
||||||
#include "packet-isis-clv.h"
|
#include "packet-isis-clv.h"
|
||||||
#include "packet-isis-hello.h"
|
#include "packet-isis-hello.h"
|
||||||
|
|
||||||
/* hello packets */
|
/* hello packets */
|
||||||
static int proto_isis_hello = -1;
|
static int proto_isis_hello = -1;
|
||||||
static int hf_isis_hello_circuit_reserved = -1;
|
static int hf_isis_hello_circuit_reserved = -1;
|
||||||
static int hf_isis_hello_source_id = -1;
|
static int hf_isis_hello_source_id = -1;
|
||||||
static int hf_isis_hello_holding_timer = -1;
|
static int hf_isis_hello_holding_timer = -1;
|
||||||
static int hf_isis_hello_pdu_length = -1;
|
static int hf_isis_hello_pdu_length = -1;
|
||||||
static int hf_isis_hello_priority_reserved = -1;
|
static int hf_isis_hello_priority_reserved = -1;
|
||||||
static int hf_isis_hello_lan_id = -1;
|
static int hf_isis_hello_lan_id = -1;
|
||||||
static int hf_isis_hello_local_circuit_id = -1;
|
static int hf_isis_hello_local_circuit_id = -1;
|
||||||
static int hf_isis_hello_clv_ipv4_int_addr = -1;
|
static int hf_isis_hello_clv_ipv4_int_addr = -1;
|
||||||
|
|
||||||
static gint ett_isis_hello = -1;
|
static gint ett_isis_hello = -1;
|
||||||
static gint ett_isis_hello_clv_area_addr = -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_is_neighbors = -1;
|
||||||
static gint ett_isis_hello_clv_padding = -1;
|
static gint ett_isis_hello_clv_padding = -1;
|
||||||
static gint ett_isis_hello_clv_unknown = -1;
|
static gint ett_isis_hello_clv_unknown = -1;
|
||||||
static gint ett_isis_hello_clv_nlpid = -1;
|
static gint ett_isis_hello_clv_nlpid = -1;
|
||||||
static gint ett_isis_hello_clv_auth = -1;
|
static gint ett_isis_hello_clv_auth = -1;
|
||||||
static gint ett_isis_hello_clv_ipv4_int_addr = -1;
|
static gint ett_isis_hello_clv_ipv4_int_addr = -1;
|
||||||
|
|
||||||
static const value_string isis_hello_circuit_type_vals[] = {
|
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 ) {
|
if ( tree ) {
|
||||||
proto_tree_add_text ( tree, offset, 6,
|
proto_tree_add_text ( tree, offset, 6,
|
||||||
"IS Neighbor: %02x%02x.%02x%02x.%02x%02x",
|
"IS Neighbor: %s", print_system_id( pd + offset, 6 ) );
|
||||||
pd[offset], pd[offset+1], pd[offset+2],
|
|
||||||
pd[offset+3], pd[offset+4], pd[offset+5] );
|
|
||||||
}
|
}
|
||||||
offset += 6;
|
offset += 6;
|
||||||
length -= 6;
|
length -= 6;
|
||||||
|
@ -443,7 +442,7 @@ isis_dissect_isis_hello(int hello_type, int header_length,
|
||||||
proto_tree_add_uint_format(hello_tree,
|
proto_tree_add_uint_format(hello_tree,
|
||||||
hf_isis_hello_circuit_reserved,
|
hf_isis_hello_circuit_reserved,
|
||||||
offset, 1, ihp->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,
|
val_to_str(ihp->isis_hello_circuit,
|
||||||
isis_hello_circuit_type_vals,
|
isis_hello_circuit_type_vals,
|
||||||
"Unknown (0x%x)"),
|
"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,
|
proto_tree_add_string_format(hello_tree, hf_isis_hello_lan_id,
|
||||||
offset + 1, 6, ihp->isis_hello_source_id,
|
offset + 1, 6, ihp->isis_hello_source_id,
|
||||||
"Lan ID: %02x%02x.%02x%02x.%02x%02x",
|
"SystemID{ Sender of PDU } : %s",
|
||||||
ihp->isis_hello_lan_id[0],
|
print_system_id( pd + offset + 1, 6 ) );
|
||||||
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]);
|
|
||||||
proto_tree_add_item(hello_tree, hf_isis_hello_holding_timer,
|
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,
|
proto_tree_add_item(hello_tree, hf_isis_hello_pdu_length,
|
||||||
offset + 9, 2,pntohs(&ihp->isis_hello_pdu_length[0]));
|
offset + 9, 2,pntohs(&ihp->isis_hello_pdu_length[0]));
|
||||||
proto_tree_add_uint_format(hello_tree,
|
proto_tree_add_uint_format(hello_tree, hf_isis_hello_priority_reserved,
|
||||||
hf_isis_hello_priority_reserved,
|
offset + 11, 1, ihp->isis_hello_priority_reserved,
|
||||||
offset + 11, 1, ihp->isis_hello_priority_reserved,
|
"Priority : %d, reserved(0x%02x == 0)",
|
||||||
"Priority: %d, reserved(0x%02x == 0)",
|
ihp->isis_hello_priority, ihp->isis_hello_preserved );
|
||||||
ihp->isis_hello_priority,
|
|
||||||
ihp->isis_hello_preserved );
|
|
||||||
if (hello_type == ISIS_TYPE_PTP_HELLO) {
|
if (hello_type == ISIS_TYPE_PTP_HELLO) {
|
||||||
proto_tree_add_item(hello_tree,
|
proto_tree_add_item(hello_tree, hf_isis_hello_local_circuit_id,
|
||||||
hf_isis_hello_local_circuit_id,
|
offset + 12, 1, ihp->isis_hello_lan_id[0] );
|
||||||
offset + 12, 1, ihp->isis_hello_lan_id[0] );
|
|
||||||
} else {
|
} else {
|
||||||
proto_tree_add_string_format(hello_tree,
|
proto_tree_add_string_format(hello_tree, hf_isis_hello_lan_id,
|
||||||
hf_isis_hello_lan_id, offset + 12, 7,
|
offset + 12, 7, ihp->isis_hello_lan_id,
|
||||||
ihp->isis_hello_lan_id,
|
"SystemID{ Designated IS } : %s",
|
||||||
"Lan ID: %02x%02x.%02x%02x.%02x%02x-%02d",
|
print_system_id( pd + offset + 12, 7 ) );
|
||||||
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]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -531,34 +515,35 @@ void
|
||||||
proto_register_isis_hello(void) {
|
proto_register_isis_hello(void) {
|
||||||
static hf_register_info hf[] = {
|
static hf_register_info hf[] = {
|
||||||
{ &hf_isis_hello_circuit_reserved,
|
{ &hf_isis_hello_circuit_reserved,
|
||||||
{ "Circuit type", "isis_hello.circuite_type",
|
{ "Circuit type ", "isis_hello.circuite_type",
|
||||||
FT_UINT8, BASE_HEX, NULL, 0x0, "" }},
|
FT_UINT8, BASE_HEX, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_hello_source_id,
|
{ &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, "" }},
|
FT_ETHER, BASE_HEX, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_hello_holding_timer,
|
{ &hf_isis_hello_holding_timer,
|
||||||
{ "Holding timer", "isis_hello.holding_timer",
|
{ "Holding timer ", "isis_hello.holding_timer",
|
||||||
FT_UINT16, BASE_DEC, NULL, 0x0, "" }},
|
FT_UINT16, BASE_DEC, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_hello_pdu_length,
|
{ &hf_isis_hello_pdu_length,
|
||||||
{ "PDU length", "isis_hello.pdu_length",
|
{ "PDU length ", "isis_hello.pdu_length",
|
||||||
FT_UINT16, BASE_DEC, NULL, 0x0, "" }},
|
FT_UINT16, BASE_DEC, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_hello_priority_reserved,
|
{ &hf_isis_hello_priority_reserved,
|
||||||
{ "Priority", "isis_hello.priority",FT_UINT8, BASE_DEC, NULL,
|
{ "Priority ", "isis_hello.priority",FT_UINT8, BASE_DEC, NULL,
|
||||||
ISIS_HELLO_P_RESERVED_MASK, "" }},
|
ISIS_HELLO_P_RESERVED_MASK, "" }},
|
||||||
|
|
||||||
{ &hf_isis_hello_lan_id,
|
{ &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,
|
{ &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, "" }},
|
BASE_DEC, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_hello_clv_ipv4_int_addr,
|
{ &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, "" }},
|
BASE_NONE, NULL, 0x0, "" }},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -573,7 +558,7 @@ proto_register_isis_hello(void) {
|
||||||
&ett_isis_hello_clv_ipv4_int_addr,
|
&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_field_array(proto_isis_hello, hf, array_length(hf));
|
||||||
proto_register_subtree_array(ett, array_length(ett));
|
proto_register_subtree_array(ett, array_length(ett));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* packet-isis-lsp.c
|
/* packet-isis-lsp.c
|
||||||
* Routines for decoding isis lsp packets and their CLVs
|
* 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>
|
* Stuart Stanley <stuarts@mxmail.net>
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
|
@ -43,6 +43,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
#include "packet-osi.h"
|
||||||
#include "packet-isis.h"
|
#include "packet-isis.h"
|
||||||
#include "packet-isis-clv.h"
|
#include "packet-isis-clv.h"
|
||||||
#include "packet-isis-lsp.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 ( tree ) {
|
||||||
if ( is_eis ) {
|
if ( is_eis ) {
|
||||||
ti = proto_tree_add_text ( tree, offset, 11,
|
ti = proto_tree_add_text ( tree, offset, 11,
|
||||||
"ES Neighbor: %02x%02x.%02x%02x.%02x%02x",
|
"ES Neighbor: %s",
|
||||||
pd[offset+4], pd[offset+5],
|
print_system_id( pd + offset + 4, 6 ) );
|
||||||
pd[offset+6], pd[offset+7],
|
|
||||||
pd[offset+8], pd[offset+9] );
|
|
||||||
} else {
|
} else {
|
||||||
ti = proto_tree_add_text ( tree, offset, 11,
|
ti = proto_tree_add_text ( tree, offset, 11,
|
||||||
"IS Neighbor: %02x%02x.%02x%02x.%02x%02x-%02x",
|
"IS Neighbor: %s",
|
||||||
pd[offset+4], pd[offset+5],
|
print_system_id( pd + offset + 4, 6 ) );
|
||||||
pd[offset+6], pd[offset+7],
|
|
||||||
pd[offset+8], pd[offset+9],
|
|
||||||
pd[offset+10] );
|
|
||||||
}
|
}
|
||||||
ntree = proto_item_add_subtree(ti,
|
ntree = proto_item_add_subtree(ti,
|
||||||
ett_isis_lsp_clv_is_neighbors);
|
ett_isis_lsp_clv_is_neighbors);
|
||||||
|
@ -648,9 +644,8 @@ dissect_lsp_partition_dis_clv(const u_char *pd, int offset,
|
||||||
*/
|
*/
|
||||||
if ( tree ) {
|
if ( tree ) {
|
||||||
proto_tree_add_text ( tree, offset+4, 6,
|
proto_tree_add_text ( tree, offset+4, 6,
|
||||||
"Partition designated L2 IS: %02x%02x.%02x%02x.%02x%02x",
|
"Partition designated L2 IS: %s",
|
||||||
pd[offset], pd[offset+1], pd[offset+2],
|
print_system_id( pd + offset, 6 ) );
|
||||||
pd[offset+3], pd[offset+4], pd[offset+5]);
|
|
||||||
}
|
}
|
||||||
length -= 6;
|
length -= 6;
|
||||||
offset += 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
|
* Lets turn the area address into "standard" 0000.0000.etc
|
||||||
* format string.
|
* format string.
|
||||||
*/
|
*/
|
||||||
sbuf = isis_address_to_string ( pd, offset + 1, mylen );
|
sbuf = print_area( pd + offset + 1, mylen );
|
||||||
/* and spit it out */
|
/* and spit it out */
|
||||||
if ( tree ) {
|
if ( tree ) {
|
||||||
proto_tree_add_text ( tree, offset, mylen + 1,
|
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_decode_lsp_id(char *tstr, proto_tree *tree, int offset,
|
||||||
isis_lsp_id_t *id ) {
|
isis_lsp_id_t *id ) {
|
||||||
proto_tree_add_text(tree, offset, 8,
|
proto_tree_add_text(tree, offset, 8,
|
||||||
"%s: %02x%02x.%02x%02x.%02x%02x.%02x-%02x", tstr,
|
"%s: %s.%02x-%02x", tstr,
|
||||||
id->source_id[0],
|
print_system_id( id->source_id, 6 ),
|
||||||
id->source_id[1],
|
|
||||||
id->source_id[2],
|
|
||||||
id->source_id[3],
|
|
||||||
id->source_id[4],
|
|
||||||
id->source_id[5],
|
|
||||||
id->psuodonode_id,
|
id->psuodonode_id,
|
||||||
id->lsp_number );
|
id->lsp_number );
|
||||||
}
|
}
|
||||||
|
@ -923,7 +913,7 @@ proto_register_isis_lsp(void) {
|
||||||
&ett_isis_lsp_clv_ip_reachability,
|
&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_field_array(proto_isis_lsp, hf, array_length(hf));
|
||||||
proto_register_subtree_array(ett, array_length(ett));
|
proto_register_subtree_array(ett, array_length(ett));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* packet-isis-snp.c
|
/* packet-isis-snp.c
|
||||||
* Routines for decoding isis complete & partial SNP and their payload
|
* 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>
|
* Stuart Stanley <stuarts@mxmail.net>
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
|
@ -38,6 +38,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
#include "packet-osi.h"
|
||||||
#include "packet-isis.h"
|
#include "packet-isis.h"
|
||||||
#include "packet-isis-clv.h"
|
#include "packet-isis-clv.h"
|
||||||
#include "packet-isis-lsp.h"
|
#include "packet-isis-lsp.h"
|
||||||
|
@ -196,16 +197,16 @@ dissect_snp_lsp_entries(const u_char *pd, int offset, guint length,
|
||||||
return;
|
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));
|
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 );
|
&ps->isis_snp_lsp_id );
|
||||||
proto_tree_add_text(tree, offset+10, 4,
|
proto_tree_add_text(tree, offset+10, 4,
|
||||||
"LSP Sequence Number: 0x%04x",
|
"LSP Sequence Number : 0x%04x",
|
||||||
pntohl(&ps->isis_snp_sequence_number));
|
pntohl(&ps->isis_snp_sequence_number));
|
||||||
proto_tree_add_text(tree, offset+14, 2,
|
proto_tree_add_text(tree, offset+14, 2,
|
||||||
"LSP checksum: 0x%02x",
|
"LSP checksum : 0x%02x",
|
||||||
pntohl(&ps->isis_snp_checksum));
|
pntohs(&ps->isis_snp_checksum));
|
||||||
length -= sizeof ( isis_snp_t );
|
length -= sizeof ( isis_snp_t );
|
||||||
offset += sizeof ( isis_snp_t );
|
offset += sizeof ( isis_snp_t );
|
||||||
ps++;
|
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,
|
proto_tree_add_item(csnp_tree, hf_isis_csnp_pdu_length,
|
||||||
offset, 2, pntohs(&ilp->isis_csnp_pdu_length));
|
offset, 2, pntohs(&ilp->isis_csnp_pdu_length));
|
||||||
proto_tree_add_text(csnp_tree, offset + 2, 7,
|
proto_tree_add_text(csnp_tree, offset + 2, 7,
|
||||||
"Source id: %02x%02x.%02x%02x.%02x%02x.%02x",
|
"Source id : %s",
|
||||||
ilp->isis_csnp_source_id[0],
|
print_system_id( pd + offset + 2, 7 ) );
|
||||||
ilp->isis_csnp_source_id[1],
|
isis_lsp_decode_lsp_id( "Start LSP id ", csnp_tree, offset + 9,
|
||||||
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,
|
|
||||||
&ilp->isis_csnp_start_lsp_id );
|
&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;
|
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,
|
proto_tree_add_item(psnp_tree, hf_isis_psnp_pdu_length,
|
||||||
offset, 2, pntohs(&ilp->isis_psnp_pdu_length));
|
offset, 2, pntohs(&ilp->isis_psnp_pdu_length));
|
||||||
proto_tree_add_text(psnp_tree, offset + 2, 7,
|
proto_tree_add_text(psnp_tree, offset + 2, 7,
|
||||||
"Source id: %02x%02x.%02x%02x.%02x%02x.%02x",
|
"Source id: %s",
|
||||||
ilp->isis_psnp_source_id[0],
|
print_system_id( pd + offset + 2, 7 ) );
|
||||||
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] );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += hlen;
|
offset += hlen;
|
||||||
|
@ -441,7 +430,7 @@ proto_register_isis_csnp(void) {
|
||||||
&ett_isis_csnp_clv_unknown,
|
&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_field_array(proto_isis_csnp, hf, array_length(hf));
|
||||||
proto_register_subtree_array(ett, array_length(ett));
|
proto_register_subtree_array(ett, array_length(ett));
|
||||||
}
|
}
|
||||||
|
@ -479,7 +468,7 @@ proto_register_isis_psnp(void) {
|
||||||
&ett_isis_psnp_clv_unknown,
|
&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_field_array(proto_isis_psnp, hf, array_length(hf));
|
||||||
proto_register_subtree_array(ett, array_length(ett));
|
proto_register_subtree_array(ett, array_length(ett));
|
||||||
}
|
}
|
||||||
|
|
173
packet-isis.c
173
packet-isis.c
|
@ -2,7 +2,7 @@
|
||||||
* Routines for ISO/OSI network and transport protocol packet disassembly, core
|
* Routines for ISO/OSI network and transport protocol packet disassembly, core
|
||||||
* bits.
|
* 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>
|
* Stuart Stanley <stuarts@mxmail.net>
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
|
@ -40,37 +40,38 @@
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "nlpid.h"
|
#include "nlpid.h"
|
||||||
|
#include "packet-osi.h"
|
||||||
#include "packet-isis.h"
|
#include "packet-isis.h"
|
||||||
#include "packet-isis-lsp.h"
|
#include "packet-isis-lsp.h"
|
||||||
#include "packet-isis-hello.h"
|
#include "packet-isis-hello.h"
|
||||||
#include "packet-isis-snp.h"
|
#include "packet-isis-snp.h"
|
||||||
|
|
||||||
|
|
||||||
/* isis base header */
|
/* isis base header */
|
||||||
static int proto_isis = -1;
|
static int proto_isis = -1;
|
||||||
|
|
||||||
static int hf_isis_irpd = -1;
|
static int hf_isis_irpd = -1;
|
||||||
static int hf_isis_header_length = -1;
|
static int hf_isis_header_length = -1;
|
||||||
static int hf_isis_version = -1;
|
static int hf_isis_version = -1;
|
||||||
static int hf_isis_reserved = -1;
|
static int hf_isis_system_id_length = -1;
|
||||||
static int hf_isis_type = -1;
|
static int hf_isis_type = -1;
|
||||||
static int hf_isis_version2 = -1;
|
static int hf_isis_version2 = -1;
|
||||||
static int hf_isis_eco = -1;
|
static int hf_isis_reserved = -1;
|
||||||
static int hf_isis_user_eco = -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[] = {
|
static const value_string isis_vals[] = {
|
||||||
{ ISIS_TYPE_L1_HELLO, "L1 HELLO"},
|
{ ISIS_TYPE_L1_HELLO, "L1 HELLO"},
|
||||||
{ ISIS_TYPE_L2_HELLO, "L2 HELLO"},
|
{ ISIS_TYPE_L2_HELLO, "L2 HELLO"},
|
||||||
{ ISIS_TYPE_PTP_HELLO, "P2P HELLO"},
|
{ ISIS_TYPE_PTP_HELLO, "P2P HELLO"},
|
||||||
{ ISIS_TYPE_L1_LSP, "L1 LSP"},
|
{ ISIS_TYPE_L1_LSP, "L1 LSP"},
|
||||||
{ ISIS_TYPE_L2_LSP, "L2 LSP"},
|
{ ISIS_TYPE_L2_LSP, "L2 LSP"},
|
||||||
{ ISIS_TYPE_L1_CSNP, "L1 CSNP"},
|
{ ISIS_TYPE_L1_CSNP, "L1 CSNP"},
|
||||||
{ ISIS_TYPE_L2_CSNP, "L2 CSNP"},
|
{ ISIS_TYPE_L2_CSNP, "L2 CSNP"},
|
||||||
{ ISIS_TYPE_L1_PSNP, "L1 PSNP"},
|
{ ISIS_TYPE_L1_PSNP, "L1 PSNP"},
|
||||||
{ ISIS_TYPE_L2_PSNP, "L2 PSNP"},
|
{ ISIS_TYPE_L2_PSNP, "L2 PSNP"},
|
||||||
{ 0, NULL} };
|
{ 0, NULL} };
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name: dissect_isis_unknown()
|
* 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);
|
proto_tree_add_text(tree, offset, length, fmat, ap);
|
||||||
va_end(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()
|
* 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 );
|
offset + 1, 1, ihdr->isis_header_length );
|
||||||
proto_tree_add_item(isis_tree, hf_isis_version,
|
proto_tree_add_item(isis_tree, hf_isis_version,
|
||||||
offset + 2, 1, ihdr->isis_version );
|
offset + 2, 1, ihdr->isis_version );
|
||||||
proto_tree_add_item(isis_tree, hf_isis_reserved,
|
proto_tree_add_item(isis_tree, hf_isis_system_id_length,
|
||||||
offset + 3, 1, ihdr->isis_reserved );
|
offset + 3, 1, ihdr->isis_system_id_len );
|
||||||
proto_tree_add_uint_format(isis_tree, hf_isis_type,
|
proto_tree_add_uint_format(isis_tree, hf_isis_type,
|
||||||
offset + 4, 1, ihdr->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,
|
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_R8_MASK) ? "1" : "0",
|
||||||
(ihdr->isis_type & ISIS_R7_MASK) ? "1" : "0",
|
(ihdr->isis_type & ISIS_R7_MASK) ? "1" : "0",
|
||||||
(ihdr->isis_type & ISIS_R6_MASK) ? "1" : "0");
|
(ihdr->isis_type & ISIS_R6_MASK) ? "1" : "0");
|
||||||
proto_tree_add_item(isis_tree, hf_isis_version2,
|
proto_tree_add_item(isis_tree, hf_isis_version2,
|
||||||
offset + 5, 1, ihdr->isis_version2 );
|
offset + 5, 1, ihdr->isis_version2 );
|
||||||
proto_tree_add_item(isis_tree, hf_isis_eco,
|
proto_tree_add_item(isis_tree, hf_isis_reserved,
|
||||||
offset + 6, 1, ihdr->isis_eco );
|
offset + 6, 1, ihdr->isis_reserved );
|
||||||
proto_tree_add_item(isis_tree, hf_isis_user_eco,
|
proto_tree_add_item(isis_tree, hf_isis_max_area_adr,
|
||||||
offset + 7, 1, ihdr->isis_user_eco );
|
offset + 7, 1, ihdr->isis_max_area_adr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -304,49 +264,48 @@ dissect_isis(const u_char *pd, int offset, frame_data *fd,
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
proto_register_isis(void) {
|
proto_register_isis(void) {
|
||||||
static hf_register_info hf[] = {
|
static hf_register_info hf[] = {
|
||||||
{ &hf_isis_irpd,
|
{ &hf_isis_irpd,
|
||||||
{ "Intradomain Routing Protocol Discriminator", "isis.irpd",
|
{ "Intra Domain Routing Protocol Discriminator", "isis.irpd",
|
||||||
FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, "" }},
|
FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_header_length,
|
{ &hf_isis_header_length,
|
||||||
{ "HDR Length", "isis.hdr_len", FT_UINT8, BASE_DEC,
|
{ "PDU Header Length ", "isis.len", FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
|
||||||
NULL, 0x0, "" }},
|
|
||||||
|
|
||||||
{ &hf_isis_version,
|
{ &hf_isis_version,
|
||||||
{ "Version (==1)", "isis.version", FT_UINT8,
|
{ "Version (==1) ", "isis.version", FT_UINT8,
|
||||||
BASE_DEC, NULL, 0x0, "" }},
|
BASE_DEC, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_reserved,
|
{ &hf_isis_system_id_length,
|
||||||
{ "Reserved(==0)", "isis.reserved",
|
{ "System ID Length ", "isis.sysid_len",
|
||||||
FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
|
FT_UINT8, BASE_DEC, NULL, 0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_type,
|
{ &hf_isis_type,
|
||||||
{ "Type code", "isis.type", FT_UINT8, BASE_DEC,
|
{ "PDU Type :", "isis.type", FT_UINT8, BASE_DEC,
|
||||||
VALS(isis_vals), 0xff, "" }},
|
VALS(isis_vals), 0xff, "" }},
|
||||||
|
|
||||||
{ &hf_isis_version2,
|
{ &hf_isis_version2,
|
||||||
{ "Version2(==1)", "isis.version2", FT_UINT8, BASE_DEC, NULL,
|
{ "Version2 (==1) ", "isis.version2", FT_UINT8, BASE_DEC, NULL,
|
||||||
0x0, "" }},
|
0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_eco,
|
{ &hf_isis_reserved,
|
||||||
{ "ECO (==0)", "isis.eco",FT_UINT8, BASE_DEC, NULL,
|
{ "Reserved (==0) ", "isis.reserved", FT_UINT8, BASE_DEC, NULL,
|
||||||
0x0, "" }},
|
0x0, "" }},
|
||||||
|
|
||||||
{ &hf_isis_user_eco,
|
{ &hf_isis_max_area_adr,
|
||||||
{ "User ECO (==0)", "isis.user_eco", FT_UINT8, BASE_DEC, NULL,
|
{ "Max.AREAs: (0==3) ", "isis.max_area_adr", FT_UINT8, BASE_DEC, NULL,
|
||||||
0x0, "" }},
|
0x0, "" }},
|
||||||
|
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
* Note, we pull in the unknown CLV handler here, since it
|
* Note, we pull in the unknown CLV handler here, since it
|
||||||
* is used by all ISIS packet types.
|
* is used by all ISIS packet types.
|
||||||
*/
|
*/
|
||||||
static gint *ett[] = {
|
static gint *ett[] = {
|
||||||
&ett_isis,
|
&ett_isis,
|
||||||
};
|
};
|
||||||
|
|
||||||
proto_isis = proto_register_protocol("clnp ISIS", "isis");
|
proto_isis = proto_register_protocol(PROTO_STRING_ISIS, "isis");
|
||||||
proto_register_field_array(proto_isis, hf, array_length(hf));
|
proto_register_field_array(proto_isis, hf, array_length(hf));
|
||||||
proto_register_subtree_array(ett, array_length(ett));
|
proto_register_subtree_array(ett, array_length(ett));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* packet-isis.h
|
/* packet-isis.h
|
||||||
* Defines and such for core isis protcol decode.
|
* 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>
|
* Stuart Stanley <stuarts@mxmail.net>
|
||||||
*
|
*
|
||||||
* Ethereal - Network traffic analyzer
|
* Ethereal - Network traffic analyzer
|
||||||
|
@ -37,48 +37,50 @@
|
||||||
/*
|
/*
|
||||||
* ISIS type field values
|
* ISIS type field values
|
||||||
*/
|
*/
|
||||||
#define ISIS_TYPE_L1_HELLO 15
|
#define ISIS_TYPE_L1_HELLO 15
|
||||||
#define ISIS_TYPE_L2_HELLO 16
|
#define ISIS_TYPE_L2_HELLO 16
|
||||||
#define ISIS_TYPE_PTP_HELLO 17
|
#define ISIS_TYPE_PTP_HELLO 17
|
||||||
#define ISIS_TYPE_L1_LSP 18
|
#define ISIS_TYPE_L1_LSP 18
|
||||||
#define ISIS_TYPE_L2_LSP 20
|
#define ISIS_TYPE_L2_LSP 20
|
||||||
#define ISIS_TYPE_L1_CSNP 24
|
#define ISIS_TYPE_L1_CSNP 24
|
||||||
#define ISIS_TYPE_L2_CSNP 25
|
#define ISIS_TYPE_L2_CSNP 25
|
||||||
#define ISIS_TYPE_L1_PSNP 26
|
#define ISIS_TYPE_L1_PSNP 26
|
||||||
#define ISIS_TYPE_L2_PSNP 27
|
#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.
|
* The common first 8 octets of the ISIS protocol header.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
guint8 isis_irpd; /* Intradomain Routing Protocol Descriminator. Must be 0x83 */
|
guint8 isis_irpd; /* Intradomain Routing Protocol Descriminator: 0x83 */
|
||||||
guint8 isis_header_length; /* header length in octets */
|
guint8 isis_header_length; /* header length in octets */
|
||||||
guint8 isis_version; /* isis version, must be 0x01 */
|
guint8 isis_version; /* isis version, must be 0x01 */
|
||||||
guint8 isis_reserved; /* res byte, must be 0 */
|
guint8 isis_system_id_len; /* length of the system ID fields */
|
||||||
guint8 isis_type_reserved; /* packet type & reserved */
|
guint8 isis_type_reserved; /* packet type & reserved */
|
||||||
#define ISIS_TYPE_MASK 0x1f
|
guint8 isis_version2; /* another version(?!), must be 0x01 */
|
||||||
#define ISIS_R8_MASK 0x80
|
guint8 isis_reserved; /* reserved, must be 0 */
|
||||||
#define ISIS_R7_MASK 0x40
|
guint8 isis_max_area_adr; /* Maximum Number of AREA Addresses permitted */
|
||||||
#define ISIS_R6_MASK 0x20
|
} isis_hdr_t; /* for this AREA. Value of 0 allows 3 Addresses */
|
||||||
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;
|
|
||||||
|
|
||||||
#define isis_type isis_type_reserved&ISIS_TYPE_MASK
|
#define isis_type isis_type_reserved&ISIS_TYPE_MASK
|
||||||
#define isis_r8 isis_type_reserved&ISIS_R8_MASK
|
#define isis_r8 isis_type_reserved&ISIS_R8_MASK
|
||||||
#define isis_r7 isis_type_reserved&ISIS_R7_MASK
|
#define isis_r7 isis_type_reserved&ISIS_R7_MASK
|
||||||
#define isis_r6 isis_type_reserved&ISIS_R6_MASK
|
#define isis_r6 isis_type_reserved&ISIS_R6_MASK
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* published API functions
|
* published API functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern char *isis_address_to_string ( const u_char *pd, int offset, int len );
|
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,
|
extern void dissect_isis( const u_char *pd, int offset, frame_data *fd,
|
||||||
proto_tree *tree);
|
proto_tree *tree);
|
||||||
extern void proto_register_isis(void);
|
extern void proto_register_isis(void);
|
||||||
extern void isis_dissect_unknown(int offset,guint length,proto_tree *tree,frame_data *fd,
|
extern void isis_dissect_unknown( int offset, guint length, proto_tree *tree,
|
||||||
char *fmat, ...);
|
frame_data *fd, char *fmat, ...);
|
||||||
|
|
||||||
#endif /* _PACKET_ISIS_H */
|
#endif /* _PACKET_ISIS_H */
|
||||||
|
|
|
@ -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));
|
||||||
|
};
|
||||||
|
|
|
@ -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 */
|
1886
packet-osi.c
1886
packet-osi.c
File diff suppressed because it is too large
Load Diff
90
packet-osi.h
90
packet-osi.h
|
@ -1,6 +1,6 @@
|
||||||
/* packet-osi.h
|
/* 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
|
* Ethereal - Network traffic analyzer
|
||||||
* By Gerald Combs <gerald@zing.org>
|
* By Gerald Combs <gerald@zing.org>
|
||||||
|
@ -20,8 +20,92 @@
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
* 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 *);
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Routines for x25 packet disassembly
|
* Routines for x25 packet disassembly
|
||||||
* Olivier Abad <abad@daba.dhis.net>
|
* 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
|
* Ethereal - Network traffic analyzer
|
||||||
* By Gerald Combs <gerald@zing.org>
|
* By Gerald Combs <gerald@zing.org>
|
||||||
|
@ -40,6 +40,7 @@
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
#include "packet-ip.h"
|
#include "packet-ip.h"
|
||||||
#include "packet-osi.h"
|
#include "packet-osi.h"
|
||||||
|
#include "packet-clnp.h"
|
||||||
#include "nlpid.h"
|
#include "nlpid.h"
|
||||||
|
|
||||||
#define FROM_DCE 0x80
|
#define FROM_DCE 0x80
|
||||||
|
|
Loading…
Reference in New Issue