Don't guard col_set_str (COL_PROTOCOL) with col_check
[obnox/wireshark/wip.git] / epan / dissectors / packet-lge_monitor.c
1 /* packet-lge_monitor.c
2  * Routines for LGE Monitor packet dissection
3  * Copyright 2006, Anders Broman <anders.broman[at]ericsson.com>
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  * 
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  * 
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  * 
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24  *
25  * LGE Monitor is a trace tool from Nortel.
26  */
27
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35
36 #include <glib.h>
37
38 #include <epan/packet.h>
39 #include <epan/proto.h>
40
41 #include "prefs.h"
42
43
44 /* Initialize the protocol and registered fields */
45 static int proto_lge_monitor            = -1;
46
47 static int hf_lge_monitor_dir = -1;
48 static int hf_lge_monitor_prot = -1;
49 static int hf_lge_monitor_length = -1;
50
51 /* Initialize the subtree pointers */
52 static int ett_lge_monitor = -1;
53
54
55 static guint LGEMonitorUDPPort = 0;
56 static dissector_handle_t mtp3_handle, m3ua_handle, sccp_handle, sctp_handle;
57
58 static const value_string lge_monitor_dir_vals[] = {
59         { 0x00, "TX(Transmit Message Signaling Unit)" },
60         { 0x01, "RX(Receive Message Signaling Unit)" },
61         { 0,    NULL }
62 };
63
64 static const value_string lge_monitor_prot_vals[] = {
65         { 0x00, "MTP-3(Message Transfer Part 3)" },
66         { 0x01, "SCCP(Signaling Connection Control Part)"},
67         { 0x02, "SCTP(Stream Control Transmission Protocol)"},
68         { 0x03, "M3UA(MTP-3 User Adaptation)"},
69         { 0,    NULL }
70 };
71
72 #define LGEMON_PROTO_HEADER_LENGTH 12
73
74 /* Code to actually dissect the packets */
75 static void
76 dissect_lge_monitor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
77 {
78         int offset = 0;
79         guint32 lge_monitor_proto_id;
80         tvbuff_t* next_tvb = NULL;
81
82 /* Set up structures needed to add the protocol subtree and manage it */
83         proto_item *ti;
84         proto_tree *lge_monitor_tree;
85
86 /* Make entries in Protocol column and Info column on summary display */
87         col_set_str(pinfo->cinfo, COL_PROTOCOL, "LGE Monitor");
88
89         ti = proto_tree_add_item(tree, proto_lge_monitor, tvb, 0, LGEMON_PROTO_HEADER_LENGTH, FALSE);
90         lge_monitor_tree = proto_item_add_subtree(ti, ett_lge_monitor);
91
92         proto_tree_add_text(lge_monitor_tree, tvb, offset, LGEMON_PROTO_HEADER_LENGTH, "LGE Monitor PDU");
93         proto_tree_add_item(lge_monitor_tree, hf_lge_monitor_dir, tvb, offset, 4, FALSE);
94         offset = offset +4;
95         lge_monitor_proto_id = tvb_get_ntohl(tvb,offset);
96         proto_tree_add_item(lge_monitor_tree, hf_lge_monitor_prot, tvb, offset, 4, FALSE);
97         offset = offset +4;
98         proto_tree_add_item(lge_monitor_tree, hf_lge_monitor_length, tvb, offset, 4, FALSE);
99         offset = offset +4;
100
101         next_tvb = tvb_new_subset(tvb, offset, -1, -1);
102
103         switch (lge_monitor_proto_id){
104         case 0: /* MTP3 */
105                 call_dissector(mtp3_handle, next_tvb, pinfo, tree);
106                 break;
107         case 1: /* SCCP */
108                 call_dissector(sccp_handle, next_tvb, pinfo, tree);
109                 break;
110         case 2: /* SCTP */
111                 call_dissector(sctp_handle, next_tvb, pinfo, tree);
112                 return;
113         case 3: /* M3UA */
114                 call_dissector(m3ua_handle, next_tvb, pinfo, tree);
115                 return;
116         default:
117                 proto_tree_add_text(lge_monitor_tree, tvb, offset, -1, "LGE Monitor data");
118                 break;
119         }
120         return;
121 }
122
123
124 void
125 proto_reg_handoff_lge_monitor(void)
126 {
127         static dissector_handle_t lge_monitor_handle;
128         static guint saved_udp_port;
129         static gboolean lge_monitor_prefs_initialized = FALSE;
130
131         if (!lge_monitor_prefs_initialized) {
132                 lge_monitor_handle = create_dissector_handle(dissect_lge_monitor, proto_lge_monitor);
133                 dissector_add_handle("udp.port", lge_monitor_handle);  /* for 'decode-as' */
134                 mtp3_handle  = find_dissector("mtp3");
135                 m3ua_handle  = find_dissector("m3ua");
136                 sccp_handle  = find_dissector("sccp");
137                 sctp_handle  = find_dissector("sctp");
138                 lge_monitor_prefs_initialized = TRUE;
139           }
140         else {
141                 if (saved_udp_port != 0) {
142                         dissector_delete("udp.port", saved_udp_port, lge_monitor_handle);
143                 }
144         }
145
146         if (LGEMonitorUDPPort != 0) {
147                 dissector_add("udp.port", LGEMonitorUDPPort, lge_monitor_handle);
148         }
149         saved_udp_port = LGEMonitorUDPPort;
150 }
151
152 void
153 proto_register_lge_monitor(void)
154 {                 
155
156         module_t *lge_monitor_module;
157
158 /* Setup list of header fields  */
159         static hf_register_info hf[] = {
160                 { &hf_lge_monitor_dir,
161                         { "Direction",           "lge_monitor.dir",
162                         FT_UINT32, BASE_DEC, VALS(lge_monitor_dir_vals), 0x0,          
163                         NULL, HFILL }
164                 },
165                 { &hf_lge_monitor_prot,
166                         { "Protocol Identifier",           "lge_monitor.prot",
167                         FT_UINT32, BASE_DEC, VALS(lge_monitor_prot_vals), 0x0,          
168                         NULL, HFILL }
169                 },
170                 { &hf_lge_monitor_length,
171                         { "Payload Length",           "lge_monitor.length",
172                         FT_UINT32, BASE_DEC, NULL, 0x0,          
173                         NULL, HFILL }
174                 },
175         };
176
177 /* Setup protocol subtree array */
178         static gint *ett[] = {
179                 &ett_lge_monitor,
180         };
181
182 /* Register the protocol name and description */
183         proto_lge_monitor = proto_register_protocol("LGE Monitor","LGE_Monitor", "lge_monitor");
184
185 /* Required function calls to register the header fields and subtrees used */
186         proto_register_field_array(proto_lge_monitor, hf, array_length(hf));
187         proto_register_subtree_array(ett, array_length(ett));
188         /* Register a configuration option for port */
189
190         
191         lge_monitor_module = prefs_register_protocol(proto_lge_monitor, proto_reg_handoff_lge_monitor);
192
193         prefs_register_uint_preference(lge_monitor_module, "udp.port",
194                                                                    "LGE Monitor UDP Port",
195                                                                    "Set UDP port for LGE Monitor messages",
196                                                                    10,
197                                                                    &LGEMonitorUDPPort);
198
199 }
200
201