Ethereal-dev: [Ethereal-dev] Dissector for MATIP Type A Host-to-Host
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Geoffroy DU_BOUAYS_DE_COUESBOUC <Geoffroy.Du_bouays_de_couesbouc@xxxxxxxxxxx>
Date: Fri, 20 Jan 2006 11:30:30 +0100
Hello,
This is a dissector for MATIP traffic (Mapping of Airline Reservation,
Ticketing, and Messaging Traffic over IP) (RFC 2351).
I have a problem when the session open packet is the first of the frame. The
data are not associated the conversation. I dont understand why.
Best regards,
Geoffroy
/* packet-matip.c
* Routines for MATIP (Mapping of Airline Reservation, Ticketing, and Messaging
Traffic over IP)
* [ RFC 2351 ]
* The code below is only for MATIP format for Type A Host-to-Host
*
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@xxxxxxxxxxxx>
* Copyright 1999 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
#include "moduleinfo.h"
#include <gmodule.h>
#include <string.h>
#include <epan/packet.h>
#include <epan/conversation.h>
#ifndef ENABLE_STATIC
G_MODULE_EXPORT const gchar version[] = VERSION;
#endif
#define TCP_PORT_MATIP 350
#define MATIP_INIT_COUNT 10
/* the GMemChunk base structure */
static GMemChunk *matip_vals = NULL;
typedef struct _matip_entry_t
{
guint8 hdr_val;
guint8 h1_val;
guint8 h2_val;
}matip_entry_t;
void proto_reg_handoff_matip(void);
/* Define the matip proto */
static int proto_matip = -1;
/* Define headers in subtree for matip */
static int hf_matip_so_ver = -1;
static int hf_matip_so_length = -1;
static int hf_matip_so_cd = -1;
static int hf_matip_so_styp = -1;
static int hf_matip_so_rfu8 = -1;
static int hf_matip_so_mpx = -1;
static int hf_matip_so_hdr = -1;
static int hf_matip_so_h1 = -1;
static int hf_matip_so_h2 = -1;
static int hf_matip_so_rfu16 = -1;
static int hf_matip_so_flow_id = -1;
static int hf_matip_oc_ver = -1;
static int hf_matip_oc_length = -1;
static int hf_matip_oc_cause = -1;
static int hf_matip_sc_ver = -1;
static int hf_matip_sc_length = -1;
static int hf_matip_sc_close_cause = -1;
static int hf_matip_dp_ver = -1;
static int hf_matip_dp_length = -1;
static int hf_matip_dp_h1 = -1;
static int hf_matip_dp_h2 = -1;
static int hf_matip_dp_flow_id = -1;
static int hf_matip_ssq_ver = -1;
static int hf_matip_ssq_length = -1;
static int hf_matip_ssr_ver = -1;
static int hf_matip_ssr_length = -1;
/* Define the trees for matip */
static int ett_matip = -1;
/* Some useful information */
static const value_string packet_type_names[] = {
{254, "Session Open"},
{253, "Open Confirm"},
{252, "Session Close"},
{251, "Session Status Query"},
{250, "Session Status Response"},
{000, "Data Packet"},
{0, NULL}
};
static const value_string matip_oc_cause[] = {
{000, "[Connection accepted]"},
{001, "[Connection refused] No traffic type matching between sender &
recipient"},
{002, "[Connection refused] Information in so header incoherent"},
{132, "[Connection refused] Coding refused"},
{133, "[Connection refused] Unknown identifier"},
{0, NULL}
};
static const value_string matip_cd[] = {
{0, "(padded baudot)"},
{2, "(IPARS)"},
{4, "(ASCII)"},
{6, "(EBCDIC)"},
{0, NULL}
};
static void dissect_matip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static void dissect_matip_session_open(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree);
static void dissect_matip_open_confirm(tvbuff_t *tvb, packet_info
*pinfo,proto_tree *tree);
static void dissect_matip_session_close(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree);
static void dissect_matip_data_packet(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree);
static void dissect_matip_ss_query(tvbuff_t *tvb, packet_info *pinfo, proto_tree
*tree);
static void dissect_matip_ss_response(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree);
static void matip_dissector_init( void);
/*******************************************************************************************
* dissect_matip - The dissector for the Mapping of Airline Traffic over
Internet Protocol *
*******************************************************************************************/
static void dissect_matip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, "MATIP");
switch (pkt_type){
case 254 :
dissect_matip_session_open(tvb, pinfo, tree);
break;
case 253 :
dissect_matip_open_confirm(tvb, pinfo, tree);
break;
case 252 :
dissect_matip_session_close(tvb, pinfo, tree);
break;
case 251 :
dissect_matip_ss_query(tvb, pinfo, tree);
break;
case 250 :
dissect_matip_ss_response(tvb, pinfo, tree);
break;
case 000 :
dissect_matip_data_packet(tvb, pinfo, tree);
break;
default :
proto_tree_add_text(tree, tvb, 1, 1, "Unknown MATIP type : %d",
pkt_type);
break;
}
}
static void dissect_matip_session_open(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree)
{
guint16 length;
guint8 cd,mpx,hdr,mpx_hdr,styp,version,h1,h2;
gchar *cdtypename;
conversation_t *conv = NULL;
matip_entry_t *data_matip = NULL;
proto_tree *ti = NULL;
proto_tree *matip_tree = NULL;
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
mpx_hdr = tvb_get_guint8(tvb, 7);
mpx = (mpx_hdr & 0xc0);
mpx = mpx/64;
hdr = (mpx_hdr & 0x30);
hdr = hdr/16;
h1 = tvb_get_guint8(tvb, 8);
h2 = tvb_get_guint8(tvb, 9);
if (conv == NULL){
/* create the conversation with the data pointer */
conv = conversation_new(pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
}
if (data_matip == NULL){
data_matip = g_mem_chunk_alloc(matip_vals);
data_matip->hdr_val = hdr;
data_matip->h1_val = h1;
data_matip->h2_val = h2;
conversation_add_proto_data(conv, proto_matip, data_matip);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_clear(pinfo->cinfo, COL_INFO);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", packettypename);
col_append_fstr(pinfo->cinfo, COL_INFO, ", H1=0x%x, H2=0x%x", h1, h2);
}
if (tree){
ti = proto_tree_add_item(tree, proto_matip, tvb, 0 , -1, FALSE);
proto_item_append_text(ti, ", %s", packettypename);
proto_item_append_text(ti, ", H1=0x%x, H2=0x%x", h1, h2);
matip_tree = proto_item_add_subtree(ti, ett_matip);
if (matip_tree){
version = tvb_get_guint8(tvb, 0);
if (version == 1){
proto_tree_add_item(matip_tree, hf_matip_so_ver, tvb, 0, 1, FALSE);
}
else proto_item_append_text(matip_tree, ", Unknow version %d: incorrect
packet", version);
proto_tree_add_item_hidden(matip_tree, hf_matip_session_open, tvb, 1,
1, FALSE);
proto_tree_add_text(matip_tree, tvb, 1, 1, "Packet type: %s",
packettypename);
length = tvb_get_ntohs(tvb, 2);
proto_tree_add_uint_format(matip_tree, hf_matip_so_length, tvb, 2, 2,
length, "Length: %d bytes", length);
cd = tvb_get_guint8(tvb, 4);
cd = (cd & 0x07);
cdtypename = val_to_str(cd, matip_cd, "Unknown coding");
proto_tree_add_uint_format(matip_tree, hf_matip_so_cd, tvb, 4, 1, cd,
"Coding (CD): %d %s", cd, cdtypename);
styp = tvb_get_guint8(tvb, 5);
styp = (styp & 0xf0);
styp = styp/16;
switch (styp){
case 2 :
proto_tree_add_uint_format(matip_tree, hf_matip_so_styp, tvb, 5,
1, styp, "Traffic subtype (STYP): %d, TYPE A HTH (IATA)", styp);
break;
case 8 :
proto_tree_add_uint_format(matip_tree, hf_matip_so_styp, tvb, 5,
1, styp, "Traffic subtype (STYP): %d, TYPE A HTH (SITA)", styp);
break;
default :
proto_tree_add_text(matip_tree, tvb, 5, 1, "Unknown MATIP subtype:
%d", styp);
break;
}
proto_tree_add_item(matip_tree, hf_matip_so_rfu8, tvb, 6, 1, FALSE);
proto_tree_add_uint(matip_tree, hf_matip_so_mpx, tvb, 7, 1, mpx);
proto_tree_add_uint(matip_tree, hf_matip_so_hdr, tvb, 7, 1, hdr);
proto_tree_add_item(matip_tree, hf_matip_so_h1, tvb, 8, 1, FALSE);
proto_tree_add_item(matip_tree, hf_matip_so_h2, tvb, 9, 1, FALSE);
proto_tree_add_item(matip_tree, hf_matip_so_rfu16, tvb, 10, 2, FALSE);
if (mpx == 1){
proto_tree_add_item(matip_tree, hf_matip_so_flow_id, tvb, 12, 1,
FALSE);
}
}
}
}
static void dissect_matip_open_confirm(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree)
{
guint16 length;
guint8 caus,version,h1=0,h2=0;
conversation_t *conv = NULL;
matip_entry_t *data_matip1 = NULL;
gchar *caustypename;
proto_tree *ti = NULL;
proto_tree *matip_tree = NULL;
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
/* look up the conversation */
conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conv != NULL){
/* check if we have any data for this conversation */
data_matip1=conversation_get_proto_data(conv, proto_matip);
}
if (data_matip1 != NULL){
h1 = data_matip1->h1_val;
h2 = data_matip1->h2_val;
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_clear(pinfo->cinfo, COL_INFO);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", packettypename);
col_append_fstr(pinfo->cinfo, COL_INFO, ", H1=0x%x, H2=0x%x", h1, h2);
}
if (tree){
ti = proto_tree_add_item(tree, proto_matip, tvb, 0 , -1, FALSE);
proto_item_append_text(ti, ", %s", packettypename);
proto_item_append_text(ti, ", H1=0x%x, H2=0x%x", h1, h2);
matip_tree = proto_item_add_subtree(ti, ett_matip);
if (matip_tree){
version = tvb_get_guint8(tvb, 0);
if (version == 1){
proto_tree_add_item(matip_tree, hf_matip_oc_ver, tvb, 0, 1, FALSE);
}
else proto_item_append_text(matip_tree, ", Unknow version %d: incorrect
packet", version);
proto_tree_add_item_hidden(matip_tree, hf_matip_open_confirm, tvb, 1,
1,FALSE);
proto_tree_add_text(matip_tree, tvb, 1, 1, "Packet type: %s",
packettypename);
length = tvb_get_ntohs(tvb, 2);
proto_tree_add_uint_format(matip_tree, hf_matip_so_length, tvb, 2, 2,
length, "Length: %d bytes", length);
caus = tvb_get_guint8(tvb, 4);
caustypename = val_to_str(caus, matip_oc_cause, "[Connection refused]
Unknown refused cause");
proto_tree_add_uint_format(matip_tree, hf_matip_oc_cause, tvb, 4, 1,
caus, "Connection state: %d %s", caus, caustypename);
}
}
}
static void dissect_matip_session_close(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree)
{
guint16 length;
guint8 cause_close,version,h1=0,h2=0;
conversation_t *conv = NULL;
matip_entry_t *data_matip1 = NULL;
proto_tree *ti = NULL;
proto_tree *matip_tree = NULL;
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
/* look up the conversation */
conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conv != NULL){
/* check if we have any data for this conversation */
data_matip1=conversation_get_proto_data(conv, proto_matip);
}
if (data_matip1 != NULL){
h1 = data_matip1->h1_val;
h2 = data_matip1->h2_val;
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_clear(pinfo->cinfo, COL_INFO);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", packettypename);
col_append_fstr(pinfo->cinfo, COL_INFO, ", H1=0x%x, H2=0x%x", h1, h2);
}
if (tree){
ti = proto_tree_add_item(tree, proto_matip, tvb, 0 , -1, FALSE);
proto_item_append_text(ti, ", %s", packettypename);
proto_item_append_text(ti, ", H1=0x%x, H2=0x%x", h1, h2);
matip_tree = proto_item_add_subtree(ti, ett_matip);
if (matip_tree){
version = tvb_get_guint8(tvb, 0);
if (version == 1){
proto_tree_add_item(matip_tree, hf_matip_sc_ver, tvb, 0, 1, FALSE);
}
else proto_item_append_text(matip_tree, ", Unknow version %d: incorrect
packet", version);
proto_tree_add_item_hidden(matip_tree, hf_matip_session_close, tvb, 1,
1,FALSE);
proto_tree_add_text(matip_tree, tvb, 1, 1, "Packet type: %s",
packettypename);
length = tvb_get_ntohs(tvb, 2);
proto_tree_add_uint_format(matip_tree, hf_matip_so_length, tvb, 2, 2,
length, "Length: %d bytes", length);
cause_close = tvb_get_guint8(tvb, 4);
if (cause_close == 0){
proto_tree_add_uint_format(matip_tree, hf_matip_sc_close_cause, tvb,
4, 1, cause_close, "Close cause : %d (Normal close)", cause_close);
}
else
proto_tree_add_text(matip_tree, tvb, 4, 1, "Unknown cause close");
}
}
}
static void dissect_matip_data_packet(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree)
{
guint16 length;
guint8 hdr=2,version,h1=0,h2=0;
conversation_t *conv = NULL;
matip_entry_t *data_matip1 = NULL;
proto_tree *ti = NULL;
proto_tree *matip_tree = NULL;
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
/* look up the conversation */
conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conv != NULL){
/* check if we have any data for this conversation */
data_matip1=conversation_get_proto_data(conv, proto_matip);
}
if (data_matip1 != NULL){
hdr = data_matip1->hdr_val;
h1 = data_matip1->h1_val;
h2 = data_matip1->h2_val;
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_clear(pinfo->cinfo, COL_INFO);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", packettypename);
col_append_fstr(pinfo->cinfo, COL_INFO, ", H1=0x%x, H2=0x%x", h1, h2);
}
if (tree){
ti = proto_tree_add_item(tree, proto_matip, tvb, 0 , -1, FALSE);
proto_item_append_text(ti, ", %s", packettypename);
proto_item_append_text(ti, ", H1=0x%x, H2=0x%x", h1, h2);
matip_tree = proto_item_add_subtree(ti, ett_matip);
if (matip_tree){
version = tvb_get_guint8(tvb, 0);
if (version == 1){
proto_tree_add_item(matip_tree, hf_matip_dp_ver, tvb, 0, 1, FALSE);
}
else proto_item_append_text(matip_tree, ", Unknow version %d: incorrect
packet", version);
proto_tree_add_item_hidden(matip_tree, hf_matip_data_packet, tvb, 1,
1,FALSE);
proto_tree_add_text(matip_tree, tvb, 1, 1, "Packet type: %s",
packettypename);
length = tvb_get_ntohs(tvb, 2);
proto_tree_add_uint_format(matip_tree, hf_matip_so_length, tvb, 2, 2,
length, "Length: %d bytes", length);
if (hdr == 0){
proto_tree_add_item(matip_tree, hf_matip_dp_h1, tvb, 4, 1, FALSE);
proto_tree_add_item(matip_tree, hf_matip_dp_h2, tvb, 5, 1, FALSE);
proto_tree_add_item(matip_tree, hf_matip_dp_flow_id, tvb, 6, 1,
FALSE);
if (length > 7){
proto_tree_add_text(matip_tree, tvb, 7, -1, "Data (%d bytes)",
tvb_reported_length_remaining(tvb, 7));
}
}
if (hdr == 1){
proto_tree_add_item(matip_tree, hf_matip_dp_flow_id, tvb, 4, 1,
FALSE);
if (length > 5){
proto_tree_add_text(matip_tree, tvb, 5, -1, "Data (%d bytes)",
tvb_reported_length_remaining(tvb, 5));
}
}
if (hdr > 1){
if (length > 4){
proto_tree_add_text(matip_tree, tvb, 4, -1, "Data (%d bytes)",
tvb_reported_length_remaining(tvb, 4));
}
}
}
}
}
static void dissect_matip_ss_query(tvbuff_t *tvb, packet_info *pinfo, proto_tree
*tree)
{
guint16 length;
guint8 version,h1=0,h2=0;
conversation_t *conv = NULL;
matip_entry_t *data_matip1 = NULL;
proto_tree *ti = NULL;
proto_tree *matip_tree = NULL;
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
/* look up the conversation */
conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conv != NULL){
/* check if we have any data for this conversation */
data_matip1=conversation_get_proto_data(conv, proto_matip);
}
if (data_matip1 != NULL){
h1 = data_matip1->h1_val;
h2 = data_matip1->h2_val;
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_clear(pinfo->cinfo, COL_INFO);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", packettypename);
col_append_fstr(pinfo->cinfo, COL_INFO, ", H1=0x%x, H2=0x%x", h1, h2);
}
if (tree){
ti = proto_tree_add_item(tree, proto_matip, tvb, 0 , -1, FALSE);
proto_item_append_text(ti, ", %s", packettypename);
proto_item_append_text(ti, ", H1=0x%x, H2=0x%x", h1, h2);
matip_tree = proto_item_add_subtree(ti, ett_matip);
if (matip_tree){
version = tvb_get_guint8(tvb, 0);
if (version == 1){
proto_tree_add_item(matip_tree, hf_matip_ssq_ver, tvb, 0, 1, FALSE);
}
else proto_item_append_text(matip_tree, ", Unknow version %d: incorrect
packet", version);
proto_tree_add_item_hidden(matip_tree, hf_matip_session_status_query,
tvb, 1, 1,FALSE);
proto_tree_add_text(matip_tree, tvb, 1, 1, "Packet type: %s",
packettypename);
length = tvb_get_ntohs(tvb, 2);
proto_tree_add_uint_format(matip_tree, hf_matip_ssq_length, tvb, 2, 2,
length, "Length: %d bytes", length);
}
}
}
static void dissect_matip_ss_response(tvbuff_t *tvb, packet_info *pinfo,
proto_tree *tree)
{
guint16 length;
guint8 version,h1=0,h2=0;
conversation_t *conv = NULL;
matip_entry_t *data_matip1 = NULL;
proto_tree *ti = NULL;
proto_tree *matip_tree = NULL;
guint pkt_type;
gchar *packettypename;
pkt_type = tvb_get_guint8(tvb, 1);
packettypename = val_to_str(pkt_type, packet_type_names, "Unknown Packet");
/* look up the conversation */
conv = find_conversation(pinfo->fd->num, &pinfo->src, &pinfo->dst,
pinfo->ptype, pinfo->srcport, pinfo->destport, 0);
if (conv != NULL){
/* check if we have any data for this conversation */
data_matip1 = conversation_get_proto_data(conv, proto_matip);
}
if (data_matip1 != NULL){
h1 = data_matip1->h1_val;
h2 = data_matip1->h2_val;
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_clear(pinfo->cinfo, COL_INFO);
}
if (check_col(pinfo->cinfo, COL_INFO)){
col_add_fstr(pinfo->cinfo, COL_INFO, "%s", packettypename);
col_append_fstr(pinfo->cinfo, COL_INFO, ", H1=0x%x, H2=0x%x", h1, h2);
}
if (tree){
ti = proto_tree_add_item(tree, proto_matip, tvb, 0 , -1, FALSE);
proto_item_append_text(ti, ", %s", packettypename);
proto_item_append_text(ti, ", H1=0x%x, H2=0x%x", h1, h2);
matip_tree = proto_item_add_subtree(ti, ett_matip);
if (matip_tree){
version = tvb_get_guint8(tvb, 0);
if (version == 1){
proto_tree_add_item(matip_tree, hf_matip_ssr_ver, tvb, 0, 1, FALSE);
}
else proto_item_append_text(matip_tree, ", Unknow version %d: incorrect
packet", version);
proto_tree_add_item_hidden(matip_tree,
hf_matip_session_status_response, tvb, 1, 1,FALSE);
proto_tree_add_text(matip_tree, tvb, 1, 1, "Packet type: %s",
packettypename);
length = tvb_get_ntohs(tvb, 2);
proto_tree_add_uint_format(matip_tree, hf_matip_ssr_length, tvb, 2, 2,
length, "Length: %d bytes", length);
}
}
}
static void matip_dissector_init( void)
{
/* destroy memory chunks if needed */
if ( matip_vals)
g_mem_chunk_destroy(matip_vals);
/* now create memory chunks */
matip_vals = g_mem_chunk_new( "matip_vals", sizeof( matip_entry_t),
MATIP_INIT_COUNT * sizeof( matip_entry_t), G_ALLOC_AND_FREE);
}
/* Register all the bits needed with the filtering engine */
void proto_register_matip(void)
{
static hf_register_info hf[] =
{
{ &hf_matip_so_ver,
{ "Version", "matip.so_ver", FT_UINT8, BASE_DEC, NULL, 0x0,
"The version of the MATIP packet", HFILL }},
{ &hf_matip_so_length,
{ "Length", "matip.so_length", FT_UINT16, BASE_DEC, NULL, 0x0,
"The length of the MATIP packet", HFILL }},
{ &hf_matip_so_cd,
{ "Coding (CD)", "matip.so_cd", FT_UINT8, BASE_DEC, NULL, 0x0,
"The type of coding", HFILL }},
{ &hf_matip_so_styp,
{ "Traffic subtype (STYP)", "matip.so_styp", FT_UINT8, BASE_DEC, NULL,
0x0,
"The traffic subtype", HFILL }},
{ &hf_matip_so_rfu8,
{ "RFU", "matip.so_rfu8", FT_UINT8, BASE_DEC, NULL, 0x0,
"Reserved for future use", HFILL }},
{ &hf_matip_so_mpx,
{ "Multiplexing (MPX)", "matip.so_mpx", FT_UINT8, BASE_DEC, NULL, 0x0,
"Specifies the multiplexing used in TCP sessions", HFILL }},
{ &hf_matip_so_hdr,
{ "Header (HDR)", "matip.so_hdr", FT_UINT8, BASE_DEC, NULL, 0x0,
"The airline's specific address", HFILL }},
{ &hf_matip_so_h1,
{ "H1", "matip.so_h1", FT_UINT8, BASE_HEX, NULL, 0x0,
"Identifier H1", HFILL }},
{ &hf_matip_so_h2,
{ "H2", "matip.so_h2", FT_UINT8, BASE_HEX, NULL, 0x0,
"Identifier H2", HFILL }},
{ &hf_matip_so_rfu16,
{ "RFU", "matip.so_rfu16", FT_UINT16, BASE_DEC, NULL, 0x0,
"Reserved for future use", HFILL }},
{ &hf_matip_so_flow_id,
{ "Flow ID", "matip.so_flow_id", FT_UINT8, BASE_DEC, NULL, 0x0,
"Identify the multiplexing used", HFILL }},
{ &hf_matip_oc_ver,
{ "Version", "matip.oc_ver", FT_UINT8, BASE_DEC, NULL, 0x0,
"The version of the MATIP packet", HFILL }},
{ &hf_matip_oc_length,
{ "Length", "matip.oc_length", FT_UINT16, BASE_DEC, NULL, 0x0,
"The length of the MATIP open confirm packet", HFILL }},
{ &hf_matip_oc_cause,
{ "Cause", "matip.oc_cause", FT_UINT8, BASE_DEC, NULL, 0x0,
"Acceptance or refusal cause of connection", HFILL }},
{ &hf_matip_sc_ver,
{ "Version", "matip.sc_ver", FT_UINT8, BASE_DEC, NULL, 0x0,
"The version of the MATIP packet", HFILL }},
{ &hf_matip_sc_length,
{ "Length", "matip.sc_length", FT_UINT16, BASE_DEC, NULL, 0x0,
"The length of the MATIP session close packet", HFILL }},
{ &hf_matip_sc_close_cause,
{ "Close cause", "matip.sc_close_cause", FT_UINT8, BASE_DEC, NULL,
0x0,
"Reason for session closure", HFILL }},
{ &hf_matip_dp_ver,
{ "Version", "matip.dp_ver", FT_UINT8, BASE_DEC, NULL, 0x0,
"The version of the MATIP packet", HFILL }},
{ &hf_matip_dp_length,
{ "Length", "matip.dp_length", FT_UINT16, BASE_DEC, NULL, 0x0,
"The length of the MATIP data packet", HFILL }},
{ &hf_matip_dp_h1,
{ "H1", "matip.dp_h1", FT_UINT8, BASE_HEX, NULL, 0x0,
"H1", HFILL }},
{ &hf_matip_dp_h2,
{ "H2", "matip.dp_h2", FT_UINT8, BASE_HEX, NULL, 0x0,
"H2", HFILL }},
{ &hf_matip_dp_flow_id,
{ "Flow ID", "matip.dp_flow_id", FT_UINT8, BASE_DEC, NULL, 0x0,
"ID", HFILL }},
{ &hf_matip_ssq_ver,
{ "Version", "matip.ssq_ver", FT_UINT8, BASE_DEC, NULL, 0x0,
"The version of the MATIP packet", HFILL }},
{ &hf_matip_ssq_length,
{ "Length", "matip.ssq_length", FT_UINT16, BASE_DEC, NULL, 0x0,
"The length of the MATIP session status query packet", HFILL }},
{ &hf_matip_ssr_ver,
{ "Version", "matip.ssr_ver", FT_UINT8, BASE_DEC, NULL, 0x0,
"The version of the MATIP packet", HFILL }},
{ &hf_matip_ssr_length,
{ "Length", "matip.ssr_length", FT_UINT16, BASE_DEC, NULL, 0x0,
"The length of the MATIP session status response packet", HFILL }},
};
static guint *ett[] =
{
&ett_matip
};
/* Register protocol */
proto_matip = proto_register_protocol("Mapping of Airline Traffic over
Internet Protocol", "MATIP", "matip");
proto_register_field_array(proto_matip, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
register_init_routine( &matip_dissector_init);
}
/* The registration hand-off routine */
void proto_reg_handoff_matip(void)
{
static int matip_initialized = FALSE;
static dissector_handle_t matip_handle;
if (!matip_initialized){
matip_handle = create_dissector_handle(dissect_matip, proto_matip);
dissector_add("tcp.port", TCP_PORT_MATIP, matip_handle);
matip_initialized = TRUE;
}
}
/* Start the functions we need for the plugin stuff */
#ifndef ENABLE_STATIC
G_MODULE_EXPORT void
plugin_register(void)
{
/* Register the new protocol, protocol fields, and subtrees */
if (proto_matip == -1)
{
/* Execute protocol initialization only once */
proto_register_matip();
}
}
G_MODULE_EXPORT void
plugin_reg_handoff(void)
{
proto_reg_handoff_matip();
}
#endif
/* End the functions we need for plugin stuff */
----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.
- Follow-Ups:
- Re: [Ethereal-dev] Dissector for MATIP Type A Host-to-Host
- From: Jaap Keuter
- Re: [Ethereal-dev] Dissector for MATIP Type A Host-to-Host
- Prev by Date: Re: [Ethereal-dev] Re: [Ethereal-cvs] rev 17057: /trunk/plugins/lua/: Makefile.am packet-lua.c plugin.c
- Next by Date: Re: [Ethereal-dev] Re: [Ethereal-cvs] rev 17057: /trunk/plugins/lua/: Makefile.am packet-lua.c plugin.c
- Previous by thread: Re: [Ethereal-dev] Re: [Ethereal-cvs] rev 17057: /trunk/plugins/lua/: Makefile.am packet-lua.c plugin.c
- Next by thread: Re: [Ethereal-dev] Dissector for MATIP Type A Host-to-Host
- Index(es):





