2000-04-15 22:11:26 +00:00
|
|
|
/* packet-esis.c
|
2002-08-28 21:04:11 +00:00
|
|
|
* Routines for ISO/OSI End System to Intermediate System
|
2001-08-13 00:56:18 +00:00
|
|
|
* Routing Exchange Protocol ISO 9542.
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
2014-03-05 07:53:22 +00:00
|
|
|
* Ralf Schneider <Ralf.Schneider@t-online.de>
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
2006-05-21 04:49:01 +00:00
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
2000-04-15 22:11:26 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2012-06-28 22:56:06 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2001-12-03 04:00:26 +00:00
|
|
|
*/
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2012-09-20 02:03:38 +00:00
|
|
|
#include "config.h"
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2002-01-21 07:37:49 +00:00
|
|
|
#include <epan/packet.h>
|
2014-09-27 02:43:25 +00:00
|
|
|
#include <epan/expert.h>
|
2005-09-17 00:02:31 +00:00
|
|
|
#include <epan/nlpid.h>
|
2000-04-15 22:11:26 +00:00
|
|
|
#include "packet-osi.h"
|
|
|
|
#include "packet-osi-options.h"
|
2014-09-27 02:43:25 +00:00
|
|
|
|
|
|
|
/* 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
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2013-03-17 09:11:21 +00:00
|
|
|
void proto_register_esis(void);
|
|
|
|
void proto_reg_handoff_esis(void);
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
/* 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;
|
2016-07-21 14:21:25 +00:00
|
|
|
static int hf_esis_checksum_status = -1;
|
2013-08-06 01:11:55 +00:00
|
|
|
/* Generated from convert_proto_tree_add_text.pl */
|
|
|
|
static int hf_esis_dal = -1;
|
|
|
|
static int hf_esis_number_of_source_addresses = -1;
|
|
|
|
static int hf_esis_netl = -1;
|
|
|
|
static int hf_esis_sal = -1;
|
2015-05-24 19:11:26 +00:00
|
|
|
static int hf_esis_sa = -1;
|
2013-08-06 01:11:55 +00:00
|
|
|
static int hf_esis_bsnpal = -1;
|
2013-12-19 22:05:07 +00:00
|
|
|
static int hf_esis_net = -1;
|
|
|
|
static int hf_esis_da = -1;
|
|
|
|
static int hf_esis_bsnpa = -1;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
static gint ett_esis = -1;
|
|
|
|
static gint ett_esis_area_addr = -1;
|
2015-05-24 19:11:26 +00:00
|
|
|
static gint ett_esis_network = -1;
|
|
|
|
static gint ett_esis_dest_addr = -1;
|
|
|
|
static gint ett_esis_subnetwork = -1;
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2014-09-27 02:43:25 +00:00
|
|
|
static expert_field ei_esis_version = EI_INIT;
|
|
|
|
static expert_field ei_esis_length = EI_INIT;
|
|
|
|
static expert_field ei_esis_type = EI_INIT;
|
2016-07-21 14:21:25 +00:00
|
|
|
static expert_field ei_esis_checksum = EI_INIT;
|
2014-09-27 02:43:25 +00:00
|
|
|
|
2016-12-17 01:06:11 +00:00
|
|
|
static dissector_handle_t esis_handle;
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
static const value_string esis_vals[] = {
|
|
|
|
{ ESIS_ESH_PDU, "ES HELLO"},
|
|
|
|
{ ESIS_ISH_PDU, "IS HELLO"},
|
|
|
|
{ ESIS_RD_PDU, "RD REQUEST"},
|
|
|
|
{ 0, NULL} };
|
|
|
|
|
|
|
|
/* ################## Descriptions ###########################################*/
|
|
|
|
/* Parameters for the ESH PDU
|
|
|
|
* Source Address Parameter:
|
|
|
|
*
|
|
|
|
* Octet: Length: Parameter Type:
|
2011-01-21 00:19:03 +00:00
|
|
|
* 10 1 Number of Source Addresses ( NSAPs served by this Network
|
2000-04-15 22:11:26 +00:00
|
|
|
* 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 ############################## */
|
|
|
|
|
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
static void
|
2015-05-24 19:11:26 +00:00
|
|
|
esis_dissect_esh_pdu( guint8 len, tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) {
|
|
|
|
proto_tree *esis_area_tree;
|
|
|
|
int offset = 0;
|
2016-12-13 19:26:27 +00:00
|
|
|
guint no_sa, sal;
|
2002-08-28 21:04:11 +00:00
|
|
|
|
2015-05-24 19:11:26 +00:00
|
|
|
proto_item *ti;
|
2002-08-28 21:04:11 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
offset += ESIS_HDR_FIXED_LENGTH;
|
|
|
|
|
2016-12-13 19:26:27 +00:00
|
|
|
ti = proto_tree_add_item_ret_uint( tree, hf_esis_number_of_source_addresses, tvb, offset, 1, ENC_NA, &no_sa);
|
|
|
|
len--;
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
offset++;
|
2002-08-28 21:04:11 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
esis_area_tree = proto_item_add_subtree( ti, ett_esis_area_addr );
|
|
|
|
while ( no_sa-- > 0 ) {
|
2016-12-13 19:26:27 +00:00
|
|
|
proto_tree_add_item_ret_uint(esis_area_tree, hf_esis_sal, tvb, offset, 1, ENC_NA, &sal);
|
2012-04-26 16:47:37 +00:00
|
|
|
offset++;
|
2015-05-24 19:11:26 +00:00
|
|
|
proto_tree_add_string(esis_area_tree, hf_esis_sa, tvb, offset, sal, print_nsap_net(tvb, offset, sal ) );
|
2012-04-26 16:47:37 +00:00
|
|
|
offset += sal;
|
|
|
|
len -= ( sal + 1 );
|
2000-04-15 22:11:26 +00:00
|
|
|
}
|
2015-05-24 19:11:26 +00:00
|
|
|
dissect_osi_options( len, tvb, offset, tree, pinfo );
|
|
|
|
|
2003-12-21 05:51:34 +00:00
|
|
|
} /* esis_dissect_esh_pdu */
|
2000-04-15 22:11:26 +00:00
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
static void
|
2015-05-24 19:11:26 +00:00
|
|
|
esis_dissect_ish_pdu( guint8 len, tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) {
|
2002-08-28 21:04:11 +00:00
|
|
|
|
2015-05-24 19:11:26 +00:00
|
|
|
int offset = 0;
|
|
|
|
int netl = 0;
|
|
|
|
proto_tree* network_tree;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
offset += ESIS_HDR_FIXED_LENGTH;
|
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
netl = (int) tvb_get_guint8(tvb, offset);
|
2015-05-24 19:11:26 +00:00
|
|
|
network_tree = proto_tree_add_subtree( tree, tvb, offset, netl + 1, ett_esis_network, NULL,
|
2002-01-24 07:24:56 +00:00
|
|
|
"### Network Entity Title Section ###");
|
2016-12-13 19:26:27 +00:00
|
|
|
proto_tree_add_uint(network_tree, hf_esis_netl, tvb, offset++, 1, netl);
|
2015-05-24 19:11:26 +00:00
|
|
|
proto_tree_add_string(network_tree, hf_esis_net, tvb, offset, netl, print_nsap_net( tvb, offset, netl ) );
|
2000-04-15 22:11:26 +00:00
|
|
|
offset += netl;
|
|
|
|
len -= ( netl + 1 );
|
|
|
|
|
2015-05-24 19:11:26 +00:00
|
|
|
dissect_osi_options( len, tvb, offset, network_tree, pinfo );
|
2003-12-21 05:51:34 +00:00
|
|
|
}
|
2000-04-15 22:11:26 +00:00
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
static void
|
2015-05-24 19:11:26 +00:00
|
|
|
esis_dissect_redirect_pdu( guint8 len, tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo) {
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2015-05-24 19:11:26 +00:00
|
|
|
int offset = 0;
|
|
|
|
int tmpl = 0;
|
|
|
|
proto_tree *dest_tree, *subnet_tree, *network_tree;
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
offset += ESIS_HDR_FIXED_LENGTH;
|
|
|
|
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
tmpl = (int) tvb_get_guint8(tvb, offset);
|
2015-05-24 19:11:26 +00:00
|
|
|
dest_tree = proto_tree_add_subtree( tree, tvb, offset, tmpl + 1, ett_esis_dest_addr, NULL,
|
2000-04-15 22:11:26 +00:00
|
|
|
"### Destination Address Section ###" );
|
2016-12-13 19:26:27 +00:00
|
|
|
proto_tree_add_uint(dest_tree, hf_esis_dal, tvb, offset++, 1, tmpl);
|
2015-05-24 19:11:26 +00:00
|
|
|
proto_tree_add_string( dest_tree, hf_esis_da, tvb, offset, tmpl,
|
2015-02-24 19:16:48 +00:00
|
|
|
print_nsap_net( tvb, offset, tmpl ) );
|
2000-04-15 22:11:26 +00:00
|
|
|
offset += tmpl;
|
|
|
|
len -= ( tmpl + 1 );
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
tmpl = (int) tvb_get_guint8(tvb, offset);
|
2000-04-15 22:11:26 +00:00
|
|
|
|
2015-05-24 19:11:26 +00:00
|
|
|
subnet_tree = proto_tree_add_subtree( tree, tvb, offset, tmpl + 1, ett_esis_subnetwork, NULL,
|
2000-04-15 22:11:26 +00:00
|
|
|
"### Subnetwork Address Section ###");
|
2016-12-13 19:26:27 +00:00
|
|
|
proto_tree_add_uint(subnet_tree, hf_esis_bsnpal, tvb, offset++, 1, tmpl);
|
2015-05-24 19:11:26 +00:00
|
|
|
proto_tree_add_item(subnet_tree, hf_esis_bsnpa, tvb, offset, tmpl, ENC_NA);
|
2000-04-15 22:11:26 +00:00
|
|
|
offset += tmpl;
|
|
|
|
len -= ( tmpl + 1 );
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
tmpl = (int) tvb_get_guint8(tvb, offset);
|
2000-04-15 22:11:26 +00:00
|
|
|
|
|
|
|
if ( 0 == tmpl ) {
|
2015-05-24 19:11:26 +00:00
|
|
|
network_tree = proto_tree_add_subtree( tree, tvb, offset, 1, ett_esis_network, NULL,
|
2000-04-15 22:11:26 +00:00
|
|
|
"### No Network Entity Title Section ###" );
|
|
|
|
offset++;
|
|
|
|
len--;
|
|
|
|
}
|
|
|
|
else {
|
2015-05-24 19:11:26 +00:00
|
|
|
network_tree = proto_tree_add_subtree( tree, tvb, offset, 1, ett_esis_network, NULL,
|
2000-04-15 22:11:26 +00:00
|
|
|
"### Network Entity Title Section ###" );
|
2016-12-13 19:26:27 +00:00
|
|
|
proto_tree_add_uint(network_tree, hf_esis_netl, tvb, offset++, 1, tmpl);
|
2015-05-24 19:11:26 +00:00
|
|
|
proto_tree_add_string( network_tree, hf_esis_net, tvb, offset, tmpl,
|
2015-02-24 19:16:48 +00:00
|
|
|
print_nsap_net( tvb, offset, tmpl ) );
|
2000-04-15 22:11:26 +00:00
|
|
|
offset += tmpl;
|
|
|
|
len -= ( tmpl + 1 );
|
|
|
|
}
|
2015-05-24 19:11:26 +00:00
|
|
|
dissect_osi_options( len, tvb, offset, network_tree, pinfo );
|
2000-04-15 22:11:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Name: dissect_esis()
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
2000-04-15 22:11:26 +00:00
|
|
|
* Description:
|
|
|
|
* Main entry area for esis de-mangling. This will build the
|
|
|
|
* main esis tree data and call the sub-protocols as needed.
|
|
|
|
*
|
|
|
|
* Input:
|
2002-04-07 22:00:34 +00:00
|
|
|
* tvbuff * : tvbuff referring to packet data
|
|
|
|
* packet_info * : info for current packet
|
|
|
|
* proto_tree * : tree of display data. May be NULL.
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
|
|
|
* Output:
|
|
|
|
* void, but we will add to the proto_tree if it is not NULL.
|
|
|
|
*/
|
2015-11-23 03:59:08 +00:00
|
|
|
static int
|
|
|
|
dissect_esis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) {
|
2014-09-27 02:43:25 +00:00
|
|
|
guint8 version, length;
|
|
|
|
proto_item *ti, *type_item;
|
2012-04-26 16:47:37 +00:00
|
|
|
proto_tree *esis_tree = NULL;
|
2014-09-27 02:43:25 +00:00
|
|
|
guint8 variable_len, type;
|
2016-12-13 19:26:27 +00:00
|
|
|
guint16 checksum;
|
2012-04-26 16:47:37 +00:00
|
|
|
|
|
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ESIS");
|
|
|
|
col_clear(pinfo->cinfo, COL_INFO);
|
|
|
|
|
|
|
|
ti = proto_tree_add_item(tree, proto_esis, tvb, 0, -1, ENC_NA);
|
|
|
|
esis_tree = proto_item_add_subtree(ti, ett_esis);
|
|
|
|
|
2014-12-13 21:26:07 +00:00
|
|
|
proto_tree_add_item( esis_tree, hf_esis_nlpi, tvb, 0, 1, ENC_BIG_ENDIAN);
|
|
|
|
ti = proto_tree_add_item( esis_tree, hf_esis_length, tvb, 1, 1, ENC_BIG_ENDIAN );
|
2014-09-27 02:43:25 +00:00
|
|
|
length = tvb_get_guint8(tvb, 1);
|
|
|
|
if (length < ESIS_HDR_FIXED_LENGTH) {
|
|
|
|
expert_add_info_format(pinfo, ti, &ei_esis_length,
|
|
|
|
"Bogus ESIS length (%u, must be >= %u)",
|
|
|
|
length, ESIS_HDR_FIXED_LENGTH );
|
2012-04-26 16:47:37 +00:00
|
|
|
}
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
|
2014-09-27 02:43:25 +00:00
|
|
|
version = tvb_get_guint8(tvb, 2);
|
2014-12-13 21:26:07 +00:00
|
|
|
ti = proto_tree_add_item( esis_tree, hf_esis_version, tvb, 2, 1, ENC_BIG_ENDIAN);
|
2014-09-27 02:43:25 +00:00
|
|
|
if (version != ESIS_REQUIRED_VERSION){
|
|
|
|
expert_add_info_format(pinfo, ti, &ei_esis_version,
|
|
|
|
"Unknown ESIS version (%u vs %u)",
|
|
|
|
version, ESIS_REQUIRED_VERSION );
|
2012-04-26 16:47:37 +00:00
|
|
|
}
|
|
|
|
|
2014-12-13 21:26:07 +00:00
|
|
|
proto_tree_add_item( esis_tree, hf_esis_reserved, tvb, 3, 1, ENC_BIG_ENDIAN);
|
2014-09-27 02:43:25 +00:00
|
|
|
|
2014-12-13 21:26:07 +00:00
|
|
|
type_item = proto_tree_add_item( esis_tree, hf_esis_type, tvb, 4, 1, ENC_BIG_ENDIAN);
|
2014-09-27 02:43:25 +00:00
|
|
|
type = tvb_get_guint8(tvb, 4) & OSI_PDU_TYPE_MASK;
|
2012-04-26 16:47:37 +00:00
|
|
|
|
2016-12-13 19:26:27 +00:00
|
|
|
proto_tree_add_item(esis_tree, hf_esis_holdtime, tvb, 5, 2, ENC_BIG_ENDIAN);
|
2014-09-27 02:43:25 +00:00
|
|
|
|
|
|
|
checksum = tvb_get_ntohs(tvb, 7);
|
2016-07-11 03:47:28 +00:00
|
|
|
if (checksum == 0) {
|
|
|
|
/* No checksum present */
|
|
|
|
proto_tree_add_checksum(esis_tree, tvb, 7, hf_esis_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT);
|
|
|
|
} else {
|
|
|
|
guint32 c0 = 0, c1 = 0;
|
|
|
|
|
|
|
|
if (osi_calc_checksum(tvb, 0, length, &c0, &c1)) {
|
|
|
|
/* Successfully processed checksum, verify it */
|
2016-07-21 14:21:25 +00:00
|
|
|
proto_tree_add_checksum(esis_tree, tvb, 7, hf_esis_checksum, hf_esis_checksum_status, &ei_esis_checksum, pinfo, c0 | c1, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO);
|
2016-07-11 03:47:28 +00:00
|
|
|
} else {
|
2016-07-21 14:21:25 +00:00
|
|
|
proto_tree_add_checksum(esis_tree, tvb, 7, hf_esis_checksum, hf_esis_checksum_status, &ei_esis_checksum, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS);
|
2016-07-11 03:47:28 +00:00
|
|
|
}
|
2012-04-26 16:47:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2013-06-14 01:02:11 +00:00
|
|
|
col_add_str(pinfo->cinfo, COL_INFO,
|
2014-09-27 02:43:25 +00:00
|
|
|
val_to_str( type, esis_vals,
|
2012-04-26 16:47:37 +00:00
|
|
|
"Unknown (0x%x)" ) );
|
|
|
|
|
2014-09-27 02:43:25 +00:00
|
|
|
variable_len = length - ESIS_HDR_FIXED_LENGTH;
|
2012-04-26 16:47:37 +00:00
|
|
|
|
2014-09-27 02:43:25 +00:00
|
|
|
switch (type) {
|
2012-04-26 16:47:37 +00:00
|
|
|
case ESIS_ESH_PDU:
|
2015-05-24 19:11:26 +00:00
|
|
|
esis_dissect_esh_pdu( variable_len, tvb, esis_tree, pinfo);
|
2012-04-26 16:47:37 +00:00
|
|
|
break;
|
|
|
|
case ESIS_ISH_PDU:
|
2015-05-24 19:11:26 +00:00
|
|
|
esis_dissect_ish_pdu( variable_len, tvb, esis_tree, pinfo);
|
2012-04-26 16:47:37 +00:00
|
|
|
break;
|
|
|
|
case ESIS_RD_PDU:
|
2015-05-24 19:11:26 +00:00
|
|
|
esis_dissect_redirect_pdu( variable_len, tvb, esis_tree, pinfo);
|
2012-04-26 16:47:37 +00:00
|
|
|
break;
|
|
|
|
default:
|
2014-09-27 02:43:25 +00:00
|
|
|
expert_add_info(pinfo, type_item, &ei_esis_type);
|
2012-04-26 16:47:37 +00:00
|
|
|
}
|
2015-11-23 03:59:08 +00:00
|
|
|
return tvb_captured_length(tvb);
|
2000-04-15 22:11:26 +00:00
|
|
|
} /* dissect_esis */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
Tvbuffify the IP, ICMP, TCP, UDP, OSI CLNP, OSI COTP, OSI CLTP, and OSI
ESIS dissectors.
Register the IP dissector and have dissectors that call it directly
(rather than through a port table) call it through a handle.
Add a routine "tvb_set_reported_length()" which a dissector can use if
it was handed a tvbuff that contains more data than is actually in its
part of the packet - for example, handing a padded Ethernet frame to IP;
the routine sets the reported length of the tvbuff (and also adjusts the
actual length, as appropriate). Then use it in IP.
Given that, "ethertype()" can determine how much of the Ethernet frame
was actually part of an IP datagram (and can do the same for other
protocols under Ethernet that use "tvb_set_reported_length()"; have it
return the actual length, and have "dissect_eth()" and "dissect_vlan()"
use that to mark trailer data in Ethernet II frames as well as in 802.3
frames.
svn path=/trunk/; revision=2658
2000-11-18 10:38:33 +00:00
|
|
|
* Name: proto_register_esis()
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
|
|
|
* Description:
|
2012-04-26 16:47:37 +00:00
|
|
|
* main register for esis protocol set. We register some display
|
|
|
|
* formats and the protocol module variables.
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
2012-04-26 16:47:37 +00:00
|
|
|
* NOTE: this procedure to autolinked by the makefile process that
|
|
|
|
* builds register.c
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
2002-08-28 21:04:11 +00:00
|
|
|
* Input:
|
2012-04-26 16:47:37 +00:00
|
|
|
* void
|
2000-04-15 22:11:26 +00:00
|
|
|
*
|
|
|
|
* Output:
|
2012-04-26 16:47:37 +00:00
|
|
|
* void
|
2000-04-15 22:11:26 +00:00
|
|
|
*/
|
2002-08-28 21:04:11 +00:00
|
|
|
void
|
2000-04-15 22:11:26 +00:00
|
|
|
proto_register_esis(void) {
|
|
|
|
static hf_register_info hf[] = {
|
|
|
|
{ &hf_esis_nlpi,
|
2002-08-28 21:04:11 +00:00
|
|
|
{ "Network Layer Protocol Identifier", "esis.nlpi",
|
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
|
|
|
FT_UINT8, BASE_HEX, VALS(nlpid_vals), 0x0, NULL, HFILL }},
|
2012-04-26 16:47:37 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_esis_length,
|
2012-04-26 16:47:37 +00:00
|
|
|
{ "PDU Length", "esis.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_esis_version,
|
2014-09-27 02:43:25 +00:00
|
|
|
{ "Version", "esis.ver", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2012-04-26 16:47:37 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_esis_reserved,
|
2012-04-26 16:47:37 +00:00
|
|
|
{ "Reserved(==0)", "esis.res", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_esis_type,
|
2014-09-27 02:43:25 +00:00
|
|
|
{ "PDU Type", "esis.type", FT_UINT8, BASE_DEC, VALS(esis_vals), OSI_PDU_TYPE_MASK, NULL, HFILL }},
|
2012-04-26 16:47:37 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_esis_holdtime,
|
2016-12-13 19:26:27 +00:00
|
|
|
{ "Holding Time", "esis.htime", FT_UINT16, BASE_DEC|BASE_UNIT_STRING, &units_second_seconds, 0x0, NULL, HFILL }},
|
2012-04-26 16:47:37 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
{ &hf_esis_checksum,
|
2013-08-06 01:11:55 +00:00
|
|
|
{ "Checksum", "esis.chksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
|
|
|
|
|
2016-07-21 14:21:25 +00:00
|
|
|
{ &hf_esis_checksum_status,
|
|
|
|
{ "Checksum Status", "esis.chksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL }},
|
|
|
|
|
2013-08-06 01:11:55 +00:00
|
|
|
/* Generated from convert_proto_tree_add_text.pl */
|
|
|
|
{ &hf_esis_number_of_source_addresses, { "Number of Source Addresses (SA, Format: NSAP)", "esis.number_of_source_addresses", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
|
2016-12-13 19:26:27 +00:00
|
|
|
{ &hf_esis_sal, { "SAL", "esis.sal", FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, NULL, HFILL }},
|
2015-05-24 19:11:26 +00:00
|
|
|
{ &hf_esis_sa, { "SA", "esis.sa", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2016-12-13 19:26:27 +00:00
|
|
|
{ &hf_esis_netl, { "NETL", "esis.netl", FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, NULL, HFILL }},
|
|
|
|
{ &hf_esis_dal, { "DAL", "esis.dal", FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, NULL, HFILL }},
|
|
|
|
{ &hf_esis_bsnpal, { "BSNPAL", "esis.bsnpal", FT_UINT8, BASE_DEC|BASE_UNIT_STRING, &units_octet_octets, 0x0, NULL, HFILL }},
|
2013-12-19 22:05:07 +00:00
|
|
|
{ &hf_esis_net, { "NET", "esis.net", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
|
|
|
{ &hf_esis_da, { "DA", "esis.da", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2013-12-23 15:18:48 +00:00
|
|
|
{ &hf_esis_bsnpa, { "BSNPA", "esis.bsnpa", FT_SYSTEM_ID, BASE_NONE, NULL, 0x0, NULL, HFILL }},
|
2000-04-15 22:11:26 +00:00
|
|
|
};
|
2014-09-27 02:43:25 +00:00
|
|
|
|
2000-04-15 22:11:26 +00:00
|
|
|
static gint *ett[] = {
|
|
|
|
&ett_esis,
|
|
|
|
&ett_esis_area_addr,
|
2015-05-24 19:11:26 +00:00
|
|
|
&ett_esis_network,
|
|
|
|
&ett_esis_dest_addr,
|
|
|
|
&ett_esis_subnetwork
|
2000-04-15 22:11:26 +00:00
|
|
|
};
|
|
|
|
|
2014-09-27 02:43:25 +00:00
|
|
|
static ei_register_info ei[] = {
|
|
|
|
{ &ei_esis_version, { "esis.ver.unknown", PI_PROTOCOL, PI_WARN, "Unknown ESIS version", EXPFILL }},
|
|
|
|
{ &ei_esis_length, { "esis.length.invalid", PI_MALFORMED, PI_ERROR, "Bogus ESIS length", EXPFILL }},
|
|
|
|
{ &ei_esis_type, { "esis.type.unknown", PI_PROTOCOL, PI_WARN, "Unknown ESIS packet type", EXPFILL }},
|
2016-07-21 14:21:25 +00:00
|
|
|
{ &ei_esis_checksum, { "esis.bad_checksum", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }},
|
2014-09-27 02:43:25 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
expert_module_t* expert_esis;
|
|
|
|
|
2001-01-03 06:56:03 +00:00
|
|
|
proto_esis = proto_register_protocol( PROTO_STRING_ESIS, "ESIS", "esis");
|
2000-04-15 22:11:26 +00:00
|
|
|
proto_register_field_array(proto_esis, hf, array_length(hf));
|
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
2014-09-27 02:43:25 +00:00
|
|
|
expert_esis = expert_register_protocol(proto_esis);
|
|
|
|
expert_register_field_array(expert_esis, ei, array_length(ei));
|
2016-12-17 01:06:11 +00:00
|
|
|
esis_handle = register_dissector("esis", dissect_esis, proto_esis);
|
2003-12-21 05:51:34 +00:00
|
|
|
}
|
2000-04-17 01:36:31 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
proto_reg_handoff_esis(void)
|
|
|
|
{
|
2013-09-12 20:34:19 +00:00
|
|
|
dissector_add_uint("osinl.incl", NLPID_ISO9542_ESIS, esis_handle);
|
2000-04-17 01:36:31 +00:00
|
|
|
}
|
2014-09-28 23:25:09 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
|
|
*
|
|
|
|
* Local Variables:
|
|
|
|
* c-basic-offset: 2
|
|
|
|
* tab-width: 8
|
|
|
|
* indent-tabs-mode: nil
|
|
|
|
* End:
|
|
|
|
*
|
|
|
|
* ex: set shiftwidth=2 tabstop=8 expandtab:
|
|
|
|
* :indentSize=2:tabSize=8:noTabs=true:
|
|
|
|
*/
|