SMB Quota updates
[obnox/wireshark/wip.git] / packet-xot.c
1 /* packet-xot.c
2  * Routines for X25 over TCP dissection (RFC 1613)
3  *
4  * Copyright 2000, Paul Ionescu <paul@acorp.ro>
5  *
6  * $Id: packet-xot.c,v 1.9 2002/01/21 07:36:48 guy Exp $
7  *
8  * Ethereal - Network traffic analyzer
9  * By Gerald Combs <gerald@ethereal.com>
10  * Copyright 1998 Gerald Combs
11  * 
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  * 
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  * 
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  */
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <ctype.h>
34
35 #include <string.h>
36 #include <glib.h>
37 #include <epan/packet.h>
38
39 #define TCP_PORT_XOT 1998
40
41 static gint proto_xot = -1;
42 static gint hf_xot_version = -1;
43 static gint hf_xot_length = -1;
44
45 static gint ett_xot = -1;
46
47 static dissector_handle_t x25_handle;
48
49 static void dissect_xot(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
50 {
51   proto_item *ti;
52   proto_tree *xot_tree;
53   guint16 version,len;
54   tvbuff_t   *next_tvb; 
55     
56   if (check_col(pinfo->cinfo, COL_PROTOCOL))
57       col_set_str(pinfo->cinfo, COL_PROTOCOL, "XOT");
58   if (check_col(pinfo->cinfo, COL_INFO))
59       col_clear(pinfo->cinfo, COL_INFO);
60
61   version = tvb_get_ntohs(tvb,0);
62   len     = tvb_get_ntohs(tvb,2);
63
64   if (check_col(pinfo->cinfo, COL_INFO)) 
65      col_add_fstr(pinfo->cinfo, COL_INFO, "XOT Version = %u, size = %u",version,len );
66
67   if (tree) {
68         
69       ti = proto_tree_add_protocol_format(tree, proto_xot, tvb, 0, 4, "X.25 over TCP");
70       xot_tree = proto_item_add_subtree(ti, ett_xot);
71      
72       proto_tree_add_uint(xot_tree, hf_xot_version, tvb, 0, 2, version);
73       proto_tree_add_uint(xot_tree, hf_xot_length, tvb, 2, 2, len);
74
75   }
76   next_tvb =  tvb_new_subset(tvb,4, -1 , -1);
77   call_dissector(x25_handle,next_tvb,pinfo,tree);
78 }
79  
80 /* Register the protocol with Ethereal */
81 void 
82 proto_register_xot(void)
83 {
84         static hf_register_info hf[] = {
85                 { &hf_xot_version,
86                         { "Version", "xot.version", FT_UINT16, BASE_DEC,
87                         NULL, 0, "Version of X.25 over TCP protocol", HFILL }},
88
89                 { &hf_xot_length,
90                         { "Length", "xot.length", FT_UINT16, BASE_DEC,
91                         NULL, 0, "Length of X.25 over TCP packet", HFILL }}
92
93         };
94
95         static gint *ett[] = {
96                 &ett_xot,
97         };
98
99         proto_xot = proto_register_protocol("X.25 over TCP", "XOT", "xot");
100         proto_register_field_array(proto_xot, hf, array_length(hf));
101         proto_register_subtree_array(ett, array_length(ett));
102 };
103
104 void
105 proto_reg_handoff_xot(void)
106 {
107         dissector_handle_t xot_handle;
108
109         /*
110          * Get a handle for the X.25 dissector.
111          */
112         x25_handle = find_dissector("x.25");
113
114         xot_handle = create_dissector_handle(dissect_xot, proto_xot);
115         dissector_add("tcp.port", TCP_PORT_XOT, xot_handle);
116 }