blob: 9eb631b1451191700ec68b7c4c48a232b0c2ffe8 [file] [log] [blame]
Harald Welte2d112ad2009-06-10 05:42:52 +08001Index: wireshark/epan/dissectors/packet-rsl.c
2===================================================================
Harald Weltec9b484f2009-07-12 20:46:43 +02003--- wireshark.orig/epan/dissectors/packet-rsl.c 2009-07-11 10:11:27.000000000 +0200
4+++ wireshark/epan/dissectors/packet-rsl.c 2009-07-12 13:42:03.000000000 +0200
Harald Welte2d112ad2009-06-10 05:42:52 +08005@@ -2,6 +2,7 @@
6 * Routines for Radio Signalling Link (RSL) dissection.
7 *
8 * Copyright 2007, Anders Broman <anders.broman@ericsson.com>
9+ * Copyright 2009, Harald Welte <laforge@gnumonks.org>
10 *
Harald Weltec9b484f2009-07-12 20:46:43 +020011 * $Id: packet-rsl.c 29056 2009-07-10 20:00:54Z tuexen $
Harald Welte2d112ad2009-06-10 05:42:52 +080012 *
Harald Welte9e20bc52009-06-26 15:04:00 +020013@@ -44,6 +45,8 @@
14 #include <epan/lapd_sapi.h>
15
16 #include "packet-gsm_a_common.h"
17+#include "packet-rtp.h"
18+#include "packet-rtcp.h"
19
20 /* Initialize the protocol and registered fields */
21 static int proto_rsl = -1;
22@@ -116,6 +119,14 @@
Harald Welte2d112ad2009-06-10 05:42:52 +080023 static int hf_rsl_rtd = -1;
24 static int hf_rsl_delay_ind = -1;
25 static int hf_rsl_tfo = -1;
Harald Weltec9b484f2009-07-12 20:46:43 +020026+static int hf_rsl_speech_mode = -1;
27+static int hf_rsl_conn_stat = -1;
28+static int hf_rsl_conn_id = -1;
29+static int hf_rsl_rtp_payload = -1;
Harald Welte2d112ad2009-06-10 05:42:52 +080030+static int hf_rsl_local_port = -1;
31+static int hf_rsl_remote_port = -1;
32+static int hf_rsl_local_ip = -1;
33+static int hf_rsl_remote_ip = -1;
34
35 /* Initialize the subtree pointers */
36 static int ett_rsl = -1;
Harald Welte9e20bc52009-06-26 15:04:00 +020037@@ -173,6 +184,15 @@
Harald Welte2d112ad2009-06-10 05:42:52 +080038 static int ett_ie_meas_res_no = -1;
39 static int ett_ie_message_id = -1;
40 static int ett_ie_sys_info_type = -1;
Harald Weltec9b484f2009-07-12 20:46:43 +020041+static int ett_ie_speech_mode = -1;
42+static int ett_ie_conn_stat = -1;
43+static int ett_ie_conn_id = -1;
Harald Welte2d112ad2009-06-10 05:42:52 +080044+static int ett_ie_remote_ip = -1;
45+static int ett_ie_remote_port = -1;
46+static int ett_ie_local_port = -1;
47+static int ett_ie_local_ip = -1;
Harald Weltec9b484f2009-07-12 20:46:43 +020048+static int ett_ie_rtp_payload = -1;
Harald Welte2d112ad2009-06-10 05:42:52 +080049+
50
51 proto_tree *top_tree;
52 dissector_handle_t gsm_a_ccch_handle;
Harald Welte9e20bc52009-06-26 15:04:00 +020053@@ -208,8 +228,11 @@
Harald Welte2d112ad2009-06-10 05:42:52 +080054 { 0x06, "Common Channel Management messages" },
55 { 0x08, "TRX Management messages" },
56 { 0x16, "Location Services messages" },
57+ { 0x3f, "ip.access Vendor Specific messages" },
58 { 0, NULL }
59 };
60+#define RSL_MSGDISC_IPACCESS 0x3f
61+
62 /*
63 * 9.2 MESSAGE TYPE
64 */
Harald Weltec9b484f2009-07-12 20:46:43 +020065@@ -276,6 +299,35 @@
Harald Welte2d112ad2009-06-10 05:42:52 +080066 /* 0 1 - - - - - - Location Services messages: */
Harald Welte9e20bc52009-06-26 15:04:00 +020067 #define RSL_MSG_LOC_INF 65 /* 8.7.1 */
Harald Welte2d112ad2009-06-10 05:42:52 +080068
69+/* Vendor-Specific messages of ip.access nanoBTS. There is no public documentation
70+ * about those extensions, all information in this dissector is based on lawful
71+ * protocol reverse enginering by Harald Welte <laforge@gnumonks.org> */
72+#define RSL_MSG_TYPE_IPAC_BIND 0x70
73+#define RSL_MSG_TYPE_IPAC_BIND_ACK 0x71
74+#define RSL_MSG_TYPE_IPAC_BIND_NACK 0x72
75+#define RSL_MSG_TYPE_IPAC_CONNECT 0x73
76+#define RSL_MSG_TYPE_IPAC_CONNECT_ACK 0x74
77+#define RSL_MSG_TYPE_IPAC_CONNECT_NACK 0x75
78+#define RSL_MSG_TYPE_IPAC_DISC_IND 0x76
Harald Welte8dc1a682009-07-01 11:22:01 +020079+
Harald Weltec9b484f2009-07-12 20:46:43 +020080+#define RSL_IE_IPAC_SRTP_CONFIG 0xe0
81+#define RSL_IE_IPAC_PROXY_UDP 0xe1
82+#define RSL_IE_IPAC_BSCMPL_TOUT 0xe2
Harald Welte2d112ad2009-06-10 05:42:52 +080083+#define RSL_IE_IPAC_REMOTE_IP 0xf0
84+#define RSL_IE_IPAC_REMOTE_PORT 0xf1
Harald Weltec9b484f2009-07-12 20:46:43 +020085+#define RSL_IE_IPAC_RTP_PAYLOAD 0xf2
Harald Welte2d112ad2009-06-10 05:42:52 +080086+#define RSL_IE_IPAC_LOCAL_PORT 0xf3
Harald Weltec9b484f2009-07-12 20:46:43 +020087+#define RSL_IE_IPAC_SPEECH_MODE 0xf4
Harald Welte2d112ad2009-06-10 05:42:52 +080088+#define RSL_IE_IPAC_LOCAL_IP 0xf5
Harald Weltec9b484f2009-07-12 20:46:43 +020089+#define RSL_IE_IPAC_CONN_STAT 0xf6
90+#define RSL_IE_IPAC_HO_C_PARMS 0xf7
91+#define RSL_IE_IPAC_CONN_ID 0xf8
92+#define RSL_IE_IPAC_RTP_CSD_FMT 0xf9
93+#define RSL_IE_IPAC_RTP_JIT_BUF 0xfa
94+#define RSL_IE_IPAC_RTP_COMPR 0xfb
95+#define RSL_IE_IPAC_RTP_PAYLOAD2 0xfc
96+#define RSL_IE_IPAC_RTP_MPLEX 0xfd
97+#define RSL_IE_IPAC_RTP_MPLEX_ID 0xfe
Harald Welte9e20bc52009-06-26 15:04:00 +020098
99 static const value_string rsl_msg_type_vals[] = {
100 /* 0 0 0 0 - - - - Radio Link Layer Management messages: */
Harald Weltec9b484f2009-07-12 20:46:43 +0200101@@ -338,6 +390,14 @@
Harald Welte9e20bc52009-06-26 15:04:00 +0200102 { 0x3f, "TFO MODification REQuest" }, /* 8.4.31 */
103 /* 0 1 - - - - - - Location Services messages: */
104 { 0x41, "Location Information" }, /* 8.7.1 */
105+ /* ip.access */
106+ { 0x70, "ip.access BIND" },
107+ { 0x71, "ip.access BIND ACK" },
108+ { 0x72, "ip.access BIND NACK" },
109+ { 0x73, "ip.access CONNECT" },
110+ { 0x74, "ip.access CONNECT ACK" },
111+ { 0x75, "ip.access CONNECT NACK" },
112+ { 0x76, "ip.access DISCONNECT INDication" },
113 { 0, NULL }
114 };
115
Harald Weltec9b484f2009-07-12 20:46:43 +0200116@@ -477,6 +537,24 @@
Harald Welte9e20bc52009-06-26 15:04:00 +0200117 Not used
118
119 */
Harald Weltec9b484f2009-07-12 20:46:43 +0200120+ { 0xe0, "SRTP Configuration" },
121+ { 0xe1, "BSC Proxy UDP Port" },
122+ { 0xe2, "BSC Multiplex Timeout" },
Harald Welte9e20bc52009-06-26 15:04:00 +0200123+ { 0xf0, "Remote IP Address" },
124+ { 0xf1, "Remote RTP Port" },
Harald Weltec9b484f2009-07-12 20:46:43 +0200125+ { 0xf2, "RTP Payload Type" },
Harald Welte9e20bc52009-06-26 15:04:00 +0200126+ { 0xf3, "Local RTP Port" },
Harald Weltec9b484f2009-07-12 20:46:43 +0200127+ { 0xf4, "Speech Mode" },
Harald Welte9e20bc52009-06-26 15:04:00 +0200128+ { 0xf5, "Local IP Address" },
Harald Weltec9b484f2009-07-12 20:46:43 +0200129+ { 0xf6, "Connection Statistics" },
130+ { 0xf7, "Handover C Parameters" },
131+ { 0xf8, "Connection Identifier" },
132+ { 0xf9, "RTP CSD Format" },
133+ { 0xfa, "RTP Jitter Buffer" },
134+ { 0xfb, "RTP Compression" },
135+ { 0xfc, "RTP Payload Type 2" },
136+ { 0xfd, "RTP Multiplex" },
137+ { 0xfe, "RTP Multiplex Identifier" },
Harald Welte9e20bc52009-06-26 15:04:00 +0200138 { 0, NULL }
139 };
140
Harald Weltec9b484f2009-07-12 20:46:43 +0200141@@ -513,6 +591,95 @@
Harald Welte9e20bc52009-06-26 15:04:00 +0200142 { 0, NULL }
143 };
144
145+/* From openbsc/include/openbsc/tlv.h */
146+enum tlv_type {
147+ TLV_TYPE_FIXED,
148+ TLV_TYPE_T,
149+ TLV_TYPE_TV,
150+ TLV_TYPE_TLV,
151+ TLV_TYPE_TL16V,
152+};
153+
154+struct tlv_def {
155+ enum tlv_type type;
156+ u_int8_t fixed_len;
157+};
158+
159+struct tlv_definition {
160+ struct tlv_def def[0xff];
161+};
162+
163+static const struct tlv_definition rsl_att_tlvdef = {
164+ .def = {
165+ [RSL_IE_CH_NO] = { TLV_TYPE_TV, 0 },
166+ [RSL_IE_LINK_ID] = { TLV_TYPE_TV, 0 },
167+ [RSL_IE_ACT_TYPE] = { TLV_TYPE_TV, 0 },
168+ [RSL_IE_BS_POW] = { TLV_TYPE_TV, 0 },
169+ [RSL_IE_CH_ID] = { TLV_TYPE_TLV, 0 },
170+ [RSL_IE_CH_MODE] = { TLV_TYPE_TLV, 0 },
171+ [RSL_IE_ENC_INF] = { TLV_TYPE_TLV, 0 },
172+ [RSL_IE_FRAME_NO] = { TLV_TYPE_FIXED, 2 },
173+ [RSL_IE_HO_REF] = { TLV_TYPE_TV, 0 },
174+ [RSL_IE_L1_INF] = { TLV_TYPE_FIXED, 2 },
175+ [RSL_IE_L3_INF] = { TLV_TYPE_TL16V, 0 },
176+ [RSL_IE_MS_ID] = { TLV_TYPE_TLV, 0 },
177+ [RSL_IE_MS_POW] = { TLV_TYPE_TV, 0 },
178+ [RSL_IE_PAGING_GRP] = { TLV_TYPE_TV, 0 },
179+ [RSL_IE_PAGING_LOAD] = { TLV_TYPE_FIXED, 2 },
180+ [RSL_IE_PHY_CTX] = { TLV_TYPE_TLV, 0 },
181+ [RSL_IE_ACCESS_DELAY] = { TLV_TYPE_TV, 0 },
182+ [RSL_IE_RACH_LOAD] = { TLV_TYPE_TLV, 0 },
183+ [RSL_IE_REQ_REF] = { TLV_TYPE_FIXED, 3 },
184+ [RSL_IE_REL_MODE] = { TLV_TYPE_TV, 0 },
185+ [RSL_IE_RESOURCE_INF] = { TLV_TYPE_TLV, 0 },
186+ [RSL_IE_RLM_CAUSE] = { TLV_TYPE_TLV, 0 },
187+ [RSL_IE_STARTING_TIME] = { TLV_TYPE_FIXED, 2 },
188+ [RSL_IE_TIMING_ADV] = { TLV_TYPE_TV, 0 },
189+ [RSL_IE_UPLINK_MEAS] = { TLV_TYPE_TLV, 0 },
190+ [RSL_IE_CAUSE] = { TLV_TYPE_TLV, 0 },
191+ [RSL_IE_MEAS_RES_NO] = { TLV_TYPE_TV, 0 },
192+ [RSL_IE_MESSAGE_ID] = { TLV_TYPE_TV, 0 },
193+ [RSL_IE_SYS_INFO_TYPE] = { TLV_TYPE_TV, 0 },
194+ //[RSL_IE_MS_POWER_PARAM] = { TLV_TYPE_TLV, 0 },
195+ //[RSL_IE_BS_POWER_PARAM] = { TLV_TYPE_TLV, 0 },
196+ //[RSL_IE_PREPROC_CONFIG] = { TLV_TYPE_TLV, 0 },
197+ //[RSL_IE_PREPROC_MEAS_RES] = { TLV_TYPE_TLV, 0 },
198+ //[RSL_IE_IMM_ASS_INFO] = { TLV_TYPE_TLV, 0 },
199+ //[RSL_IE_SMSCB_INFO] = { TLV_TYPE_FIXED, 23 },
200+ //[RSL_IE_MS_TIMING_OFFSET] = { TLV_TYPE_TV, 0 },
201+ [RSL_IE_ERR_MSG] = { TLV_TYPE_TLV, 0 },
202+ [RSL_IE_FULL_BCCH_INF] = { TLV_TYPE_TLV, 0 },
203+ [RSL_IE_CH_NEEDED] = { TLV_TYPE_TV, 0 },
204+ [RSL_IE_CB_CMD_TYPE] = { TLV_TYPE_TV, 0 },
205+ [RSL_IE_SMSCB_MESS] = { TLV_TYPE_TLV, 0 },
206+ [RSL_IE_FULL_IMM_ASS_INF] = { TLV_TYPE_TLV, 0 },
207+ //[RSL_IE_SACCH_INFO] = { TLV_TYPE_TLV, 0 },
208+ [RSL_IE_CBCH_LOAD_INF] = { TLV_TYPE_TV, 0 },
209+ [RSL_IE_SMSCB_CH_IND] = { TLV_TYPE_TV, 0 },
210+ [RSL_IE_GRP_CALL_REF] = { TLV_TYPE_TLV, 0 },
211+ [RSL_IE_CH_DESC] = { TLV_TYPE_TLV, 0 },
212+ [RSL_IE_NCH_DRX_INF] = { TLV_TYPE_TLV, 0 },
213+ [RSL_IE_CMD_IND] = { TLV_TYPE_TLV, 0 },
214+ [RSL_IE_EMLPP_PRIO] = { TLV_TYPE_TV, 0 },
215+ [RSL_IE_UIC] = { TLV_TYPE_TLV, 0 },
216+ [RSL_IE_MAIN_CH_REF] = { TLV_TYPE_TV, 0 },
217+ [RSL_IE_MULTIRATE_CONF] = { TLV_TYPE_TLV, 0 },
218+ [RSL_IE_MULTIRATE_CNTRL] = { TLV_TYPE_TV, 0 },
219+ [RSL_IE_SUP_CODEC_TYPES] = { TLV_TYPE_TLV, 0 },
220+ [RSL_IE_CODEC_CONF] = { TLV_TYPE_TLV, 0 },
221+ [RSL_IE_RTD] = { TLV_TYPE_TV, 0 },
222+ [RSL_IE_TFO_STATUS] = { TLV_TYPE_TV, 0 },
223+ [RSL_IE_LLP_APDU] = { TLV_TYPE_TLV, 0 },
224+ [RSL_IE_IPAC_REMOTE_IP] = { TLV_TYPE_FIXED, 4 },
225+ [RSL_IE_IPAC_REMOTE_PORT] = { TLV_TYPE_FIXED, 2 },
226+ [RSL_IE_IPAC_LOCAL_IP] = { TLV_TYPE_FIXED, 4 },
227+ [RSL_IE_IPAC_LOCAL_PORT] = { TLV_TYPE_FIXED, 2 },
Harald Weltec9b484f2009-07-12 20:46:43 +0200228+ [RSL_IE_IPAC_SPEECH_MODE] = { TLV_TYPE_TV, 0 },
229+ [RSL_IE_IPAC_CONN_ID] = { TLV_TYPE_FIXED, 2 },
230+ [RSL_IE_IPAC_RTP_PAYLOAD2] = { TLV_TYPE_TV, 0 },
Harald Welte9e20bc52009-06-26 15:04:00 +0200231+ },
232+};
233+
234 /* 9.3.1 Channel number 9.3.1 M TV 2 */
235 static int
236 dissect_rsl_ie_ch_no(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
Harald Weltec9b484f2009-07-12 20:46:43 +0200237@@ -2043,7 +2210,6 @@
Harald Welte9e20bc52009-06-26 15:04:00 +0200238 proto_item_set_len(ti, length+2);
239
240 proto_tree_add_item(ie_tree, hf_rsl_ie_length, tvb, offset, 1, FALSE);
241- offset++;
242
243 /* Received Message */
244 offset = dissct_rsl_msg(tvb, pinfo, ie_tree, offset);
Harald Weltec9b484f2009-07-12 20:46:43 +0200245@@ -2907,13 +3073,405 @@
Harald Welte9e20bc52009-06-26 15:04:00 +0200246 return ie_offset + length;
247 }
248
249+#if 0
Harald Welte2d112ad2009-06-10 05:42:52 +0800250+static int
251+dissect_rsl_ipac_ie_f8(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
252+{
253+ proto_item *ti;
254+ proto_tree *ie_tree;
255+ guint8 ie_id;
256+
257+ if (is_mandatory == FALSE) {
258+ ie_id = tvb_get_guint8(tvb, offset);
259+ if (ie_id != 0xf8)
260+ return offset;
261+ }
262+
263+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xf8 IE");
264+ ie_tree = proto_item_add_subtree(ti, ett_ie_f8);
265+
266+ /* Element identifier */
267+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
268+ offset++;
269+ /* Fixed Length */
270+ proto_item_set_len(ti, 3);
271+
272+ proto_tree_add_item(ie_tree, hf_rsl_f8, tvb, offset, 2, FALSE);
273+ offset += 2;
274+
275+ return offset;
276+}
277+
278+static int
279+dissect_rsl_ipac_ie_local_port(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
280+{
281+ proto_item *ti;
282+ proto_tree *ie_tree;
283+ guint8 ie_id;
284+
285+ if (is_mandatory == FALSE) {
286+ ie_id = tvb_get_guint8(tvb, offset);
287+ if (ie_id != RSL_IE_IPAC_LOCAL_PORT)
288+ return offset;
289+ }
290+
291+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Local RTP Port IE");
292+ ie_tree = proto_item_add_subtree(ti, ett_ie_local_port);
293+
294+ /* Element identifier */
295+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
296+ offset++;
297+ /* Fixed Length */
298+ proto_item_set_len(ti, 3);
299+
300+ proto_tree_add_item(ie_tree, hf_rsl_local_port, tvb, offset, 2, FALSE);
301+ offset += 2;
302+
303+ return offset;
304+}
305+
306+static int
307+dissect_rsl_ipac_ie_remote_port(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
308+{
309+ proto_item *ti;
310+ proto_tree *ie_tree;
311+ guint8 ie_id;
312+
313+ if (is_mandatory == FALSE) {
314+ ie_id = tvb_get_guint8(tvb, offset);
315+ if (ie_id != RSL_IE_IPAC_REMOTE_PORT)
316+ return offset;
317+ }
318+
319+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Remote RTP Port IE");
320+ ie_tree = proto_item_add_subtree(ti, ett_ie_remote_port);
321+
322+ /* Element identifier */
323+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
324+ offset++;
325+ /* Fixed Length */
326+ proto_item_set_len(ti, 3);
327+
328+ proto_tree_add_uint(ie_tree, hf_rsl_remote_port, tvb, offset, 2, FALSE);
329+ offset += 2;
330+
331+ return offset;
332+}
333+
334+static int
335+dissect_rsl_ipac_ie_local_ip(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
336+{
337+ proto_item *ti;
338+ proto_tree *ie_tree;
339+ guint8 ie_id;
340+ guint32 ip;
341+
342+ if (is_mandatory == FALSE) {
343+ ie_id = tvb_get_guint8(tvb, offset);
344+ if (ie_id != RSL_IE_IPAC_LOCAL_IP)
345+ return offset;
346+ }
347+
348+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Local IP Address IE");
349+ ie_tree = proto_item_add_subtree(ti, ett_ie_local_ip);
350+
351+ /* Element identifier */
352+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
353+ offset++;
354+ /* Fixed Length */
355+ proto_item_set_len(ti, 5);
356+
357+ ip = tvb_get_ipv4(tvb, offset);
358+ proto_tree_add_ipv4(ie_tree, hf_rsl_local_ip, tvb, offset, 4, ip);
359+ offset += 4;
360+
361+ return offset;
362+}
363+
364+static int
365+dissect_rsl_ipac_ie_remote_ip(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
366+{
367+ proto_item *ti;
368+ proto_tree *ie_tree;
369+ guint8 ie_id;
370+ guint32 ip;
371+
372+ if (is_mandatory == FALSE) {
373+ ie_id = tvb_get_guint8(tvb, offset);
374+ if (ie_id != RSL_IE_IPAC_REMOTE_IP)
375+ return offset;
376+ }
377+
378+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Remote IP Address IE");
379+ ie_tree = proto_item_add_subtree(ti, ett_ie_remote_ip);
380+
381+ /* Element identifier */
382+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
383+ offset++;
384+ /* Fixed Length */
385+ proto_item_set_len(ti, 5);
386+
387+ ip = tvb_get_ipv4(tvb, offset);
388+ proto_tree_add_ipv4(ie_tree, hf_rsl_remote_ip, tvb, offset, 4, ip);
389+ offset += 4;
390+
391+ return offset;
392+}
393+
394+static int
395+dissect_rsl_ipac_ie_f6(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
396+{
397+ proto_item *ti;
398+ proto_tree *ie_tree;
399+ guint8 length;
400+ guint8 ie_id;
401+
402+ if (is_mandatory == FALSE) {
403+ ie_id = tvb_get_guint8(tvb, offset);
404+ if (ie_id != 0xf6)
405+ return offset;
406+ }
407+
408+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xf6 IE");
409+ ie_tree = proto_item_add_subtree(ti, ett_ie_f6);
410+
411+ /* Element identifier */
412+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
413+ offset++;
414+
415+ /* Length */
416+ length = tvb_get_guint8(tvb, offset);
417+ offset++;
418+ proto_item_set_len(ti, length+2);
419+
420+ proto_tree_add_bytes(ie_tree, hf_rsl_f6, tvb, offset, length,
421+ tvb_get_ptr(tvb, offset, length));
422+ offset += length;
423+
424+ return offset;
425+}
426+
427+static int
428+dissect_rsl_ipac_ie_f4(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
429+{
430+ proto_item *ti;
431+ proto_tree *ie_tree;
432+ guint8 ie_id;
433+
434+ if (is_mandatory == FALSE) {
435+ ie_id = tvb_get_guint8(tvb, offset);
436+ if (ie_id != 0xf4)
437+ return offset;
438+ }
439+
440+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xf4 IE");
441+ ie_tree = proto_item_add_subtree(ti, ett_ie_f4);
442+
443+ /* Element identifier */
444+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
445+ offset++;
446+ /* Fixed Length */
447+ proto_item_set_len(ti, 2);
448+ proto_tree_add_item(ie_tree, hf_rsl_f4, tvb, offset, 1, FALSE);
449+ offset++;
450+
451+ return offset;
452+}
453+
454+static int
455+dissect_rsl_ipac_ie_fc(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset, gboolean is_mandatory)
456+{
457+ proto_item *ti;
458+ proto_tree *ie_tree;
459+ guint8 ie_id;
460+
461+ if (is_mandatory == FALSE) {
462+ ie_id = tvb_get_guint8(tvb, offset);
463+ if (ie_id != 0xfc)
464+ return offset;
465+ }
466+
467+ ti = proto_tree_add_text(tree, tvb, offset, 0, "Unknown 0xfc IE");
468+ ie_tree = proto_item_add_subtree(ti, ett_ie_fc);
469+
470+ /* Element identifier */
471+ proto_tree_add_item(ie_tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
472+ offset++;
473+ /* Fixed Length */
474+ proto_item_set_len(ti, 2);
475+ proto_tree_add_item(ie_tree, hf_rsl_fc, tvb, offset, 1, FALSE);
476+ offset++;
477+
478+ return offset;
479+}
Harald Welte9e20bc52009-06-26 15:04:00 +0200480+#endif
Harald Welte2d112ad2009-06-10 05:42:52 +0800481+
482+static int
483+dissct_rsl_ipaccess_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
484+{
485+ guint8 msg_type;
Harald Welte9e20bc52009-06-26 15:04:00 +0200486+ guint32 local_addr = 0;
487+ guint16 local_port = 0;
488+ address src_addr;
Harald Welte2d112ad2009-06-10 05:42:52 +0800489+
490+ msg_type = tvb_get_guint8(tvb, offset)&0x7f;
491+ offset++;
492+
493+ switch (msg_type) {
494+ case RSL_MSG_TYPE_IPAC_BIND:
Harald Welte9e20bc52009-06-26 15:04:00 +0200495+ case RSL_MSG_TYPE_IPAC_BIND_ACK:
496+ case RSL_MSG_TYPE_IPAC_BIND_NACK:
497+ case RSL_MSG_TYPE_IPAC_CONNECT:
498+ case RSL_MSG_TYPE_IPAC_CONNECT_ACK:
499+ case RSL_MSG_TYPE_IPAC_CONNECT_NACK:
500+ case RSL_MSG_TYPE_IPAC_DISC_IND:
Harald Welte2d112ad2009-06-10 05:42:52 +0800501+ /* Channel number 9.3.1 M TV 2 */
502+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
503+ break;
Harald Welte9e20bc52009-06-26 15:04:00 +0200504+#if 0
Harald Welte2d112ad2009-06-10 05:42:52 +0800505+ /* Channel number 9.3.1 M TV 2 */
506+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
507+ offset = dissect_rsl_ipac_ie_f8(tvb, pinfo, tree, offset, TRUE);
508+ offset = dissect_rsl_ipac_ie_local_port(tvb, pinfo, tree, offset, TRUE);
509+ offset = dissect_rsl_ipac_ie_local_ip(tvb, pinfo, tree, offset, TRUE);
510+ offset = dissect_rsl_ipac_ie_fc(tvb, pinfo, tree, offset, TRUE);
511+ break;
Harald Welte2d112ad2009-06-10 05:42:52 +0800512+ /* Channel number 9.3.1 M TV 2 */
513+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
514+ break;
Harald Welte2d112ad2009-06-10 05:42:52 +0800515+ /* Channel number 9.3.1 M TV 2 */
516+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
517+ offset = dissect_rsl_ipac_ie_remote_ip(tvb, pinfo, tree, offset, TRUE);
518+ offset = dissect_rsl_ipac_ie_remote_port(tvb, pinfo, tree, offset, TRUE);
519+ offset = dissect_rsl_ipac_ie_f4(tvb, pinfo, tree, offset, TRUE);
520+ offset = dissect_rsl_ipac_ie_fc(tvb, pinfo, tree, offset, TRUE);
521+ break;
Harald Welte2d112ad2009-06-10 05:42:52 +0800522+ /* Channel number 9.3.1 M TV 2 */
523+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
524+ offset = dissect_rsl_ipac_ie_f8(tvb, pinfo, tree, offset, TRUE);
525+ break;
Harald Welte2d112ad2009-06-10 05:42:52 +0800526+ /* Channel number 9.3.1 M TV 2 */
527+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
528+ break;
Harald Welte2d112ad2009-06-10 05:42:52 +0800529+ /* Channel number 9.3.1 M TV 2 */
530+ offset = dissect_rsl_ie_ch_no(tvb, pinfo, tree, offset, TRUE);
531+ offset = dissect_rsl_ipac_ie_f8(tvb, pinfo, tree, offset, TRUE);
532+ offset = dissect_rsl_ipac_ie_f6(tvb, pinfo, tree, offset, TRUE);
533+ /* Cause 9.3.26 M TLV >=3 */
534+ offset = dissect_rsl_ie_cause(tvb, pinfo, tree, offset, TRUE);
535+ break;
Harald Welte9e20bc52009-06-26 15:04:00 +0200536+#endif
537+ }
538+ /* parse remaining TLV attributes */
539+ while (tvb_reported_length_remaining(tvb, offset) != 0) {
540+ guint8 tag;
541+ unsigned int len, hlen, len_len;
542+ const struct tlv_def *tdef;
543+ proto_item *ti;
544+ proto_tree *ie_tree;
545+
546+ tag = tvb_get_guint8(tvb, offset);
547+ tdef = &rsl_att_tlvdef.def[tag];
548+
549+ switch (tdef->type) {
550+ case TLV_TYPE_FIXED:
551+ hlen = 1;
552+ len_len = 0;
553+ len = tdef->fixed_len;
554+ break;
555+ case TLV_TYPE_T:
556+ hlen = 1;
557+ len_len = 0;
558+ len = 0;
559+ break;
560+ case TLV_TYPE_TV:
561+ hlen = 1;
562+ len_len = 0;
563+ len = 1;
564+ break;
565+ case TLV_TYPE_TLV:
566+ hlen = 2;
567+ len_len = 1;
568+ len = tvb_get_guint8(tvb, offset+1);
569+ break;
570+ case TLV_TYPE_TL16V:
571+ hlen = 3;
572+ len_len = 2;
573+ len = tvb_get_guint8(tvb, offset+1) << 8 |
574+ tvb_get_guint8(tvb, offset+2);
575+ break;
576+ }
577+
578+ ti = proto_tree_add_item(tree, hf_rsl_ie_id, tvb, offset, 1, FALSE);
579+ ie_tree = proto_item_add_subtree(ti, ett_ie_local_port);
580+ offset += hlen;
581+
582+ switch (tag) {
583+ case RSL_IE_CH_NO:
584+ break;
585+ case RSL_IE_IPAC_REMOTE_IP:
Harald Welte8dc1a682009-07-01 11:22:01 +0200586+ proto_tree_add_item(ie_tree, hf_rsl_remote_ip, tvb,
Harald Weltec9b484f2009-07-12 20:46:43 +0200587+ offset, len, TRUE);
Harald Welte9e20bc52009-06-26 15:04:00 +0200588+ break;
589+ case RSL_IE_IPAC_REMOTE_PORT:
Harald Welte8dc1a682009-07-01 11:22:01 +0200590+ proto_tree_add_item(ie_tree, hf_rsl_remote_port, tvb,
Harald Weltec9b484f2009-07-12 20:46:43 +0200591+ offset, len, TRUE);
Harald Welte9e20bc52009-06-26 15:04:00 +0200592+ break;
593+ case RSL_IE_IPAC_LOCAL_IP:
Harald Welte8dc1a682009-07-01 11:22:01 +0200594+ proto_tree_add_item(ie_tree, hf_rsl_local_ip, tvb,
Harald Weltec9b484f2009-07-12 20:46:43 +0200595+ offset, len, TRUE);
Harald Welte9e20bc52009-06-26 15:04:00 +0200596+ local_addr = tvb_get_ipv4(tvb, offset);
597+ break;
598+ case RSL_IE_IPAC_LOCAL_PORT:
Harald Welte8dc1a682009-07-01 11:22:01 +0200599+ proto_tree_add_item(ie_tree, hf_rsl_local_port, tvb,
Harald Weltec9b484f2009-07-12 20:46:43 +0200600+ offset, len, TRUE);
Harald Welte9e20bc52009-06-26 15:04:00 +0200601+ local_port = tvb_get_ntohs(tvb, offset);
602+ break;
Harald Weltec9b484f2009-07-12 20:46:43 +0200603+ case RSL_IE_IPAC_SPEECH_MODE:
604+ proto_tree_add_item(ie_tree, hf_rsl_speech_mode, tvb,
605+ offset, len, TRUE);
606+ break;
607+ case RSL_IE_IPAC_RTP_PAYLOAD:
608+ case RSL_IE_IPAC_RTP_PAYLOAD2:
609+ proto_tree_add_item(ie_tree, hf_rsl_rtp_payload, tvb,
610+ offset, len, TRUE);
611+ break;
612+ case RSL_IE_IPAC_CONN_ID:
613+ proto_tree_add_item(ie_tree, hf_rsl_conn_id, tvb,
614+ offset, len, TRUE);
615+ break;
Harald Welte9e20bc52009-06-26 15:04:00 +0200616+ }
617+ offset += len;
Harald Welte2d112ad2009-06-10 05:42:52 +0800618+ }
619+
Harald Welte9e20bc52009-06-26 15:04:00 +0200620+ switch (msg_type) {
621+ case RSL_MSG_TYPE_IPAC_BIND_ACK:
Harald Welte8dc1a682009-07-01 11:22:01 +0200622+ /* Notify the RTP and RTCP dissectors about a new RTP stream */
Harald Welte9e20bc52009-06-26 15:04:00 +0200623+ src_addr.type = AT_IPv4;
624+ src_addr.len = 4;
625+ src_addr.data = (guint8 *)&local_addr;
Harald Welte8dc1a682009-07-01 11:22:01 +0200626+ rtp_add_address(pinfo, &src_addr, local_port, 0,
Harald Welte63aba292009-07-04 04:11:21 +0200627+ "GSM A-bis/IP", pinfo->fd->num, 0, NULL);
Harald Welte8dc1a682009-07-01 11:22:01 +0200628+ rtcp_add_address(pinfo, &src_addr, local_port+1, 0,
629+ "GSM A-bis/IP", pinfo->fd->num);
Harald Welte9e20bc52009-06-26 15:04:00 +0200630+ break;
631+ }
Harald Welte2d112ad2009-06-10 05:42:52 +0800632+ return offset;
633+}
634+
635 static int
636 dissct_rsl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
637 {
638- guint8 msg_type;
639+ guint8 msg_disc, msg_type;
640
641+ msg_disc = tvb_get_guint8(tvb, offset++) >> 1;
642 msg_type = tvb_get_guint8(tvb,offset)&0x7f;
643 proto_tree_add_item(tree, hf_rsl_msg_type, tvb, offset, 1, FALSE);
644+
645+ if (msg_disc == RSL_MSGDISC_IPACCESS) {
646+ offset = dissct_rsl_ipaccess_msg(tvb, pinfo, tree, offset);
647+ return offset;
648+ }
649 offset++;
650
651 switch (msg_type){
Harald Weltec9b484f2009-07-12 20:46:43 +0200652@@ -3517,7 +4075,6 @@
Harald Welte2d112ad2009-06-10 05:42:52 +0800653 /* 9.1 Message discriminator */
654 proto_tree_add_item(rsl_tree, hf_rsl_msg_dsc, tvb, offset, 1, FALSE);
655 proto_tree_add_item(rsl_tree, hf_rsl_T_bit, tvb, offset, 1, FALSE);
656- offset++;
657
658 offset = dissct_rsl_msg(tvb, pinfo, rsl_tree, offset);
659
Harald Weltec9b484f2009-07-12 20:46:43 +0200660@@ -3883,6 +4440,42 @@
Harald Welte2d112ad2009-06-10 05:42:52 +0800661 FT_UINT8, BASE_DEC, VALS(rsl_emlpp_prio_vals), 0x03,
Harald Welte63aba292009-07-04 04:11:21 +0200662 NULL, HFILL }
Harald Welte2d112ad2009-06-10 05:42:52 +0800663 },
Harald Weltec9b484f2009-07-12 20:46:43 +0200664+ { &hf_rsl_speech_mode,
665+ { "ip.access Speech Mode", "rsl.ipacc.speech_mode",
666+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }
Harald Welte2d112ad2009-06-10 05:42:52 +0800667+ },
Harald Weltec9b484f2009-07-12 20:46:43 +0200668+ { &hf_rsl_conn_stat,
669+ { "ip.access Connection Statistics","rsl.ipacc.conn_stat",
670+ FT_BYTES, BASE_HEX, NULL, 0x0, NULL, HFILL }
Harald Welte2d112ad2009-06-10 05:42:52 +0800671+ },
Harald Weltec9b484f2009-07-12 20:46:43 +0200672+ { &hf_rsl_conn_id,
673+ { "ip.access Connection ID", "rsl.ipacc.conn_id",
674+ FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }
Harald Welte2d112ad2009-06-10 05:42:52 +0800675+ },
Harald Weltec9b484f2009-07-12 20:46:43 +0200676+ { &hf_rsl_rtp_payload,
677+ { "ip.access RTP Payload Type", "rsl.ipacc.rtp_payload",
678+ FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }
Harald Welte2d112ad2009-06-10 05:42:52 +0800679+ },
680+ { &hf_rsl_local_port,
681+ { "ip.access Local RTP Port", "rsl.ipacc.local_port",
682+ FT_UINT16, BASE_DEC, NULL, 0x0,
683+ "ip.access Local RTP Port", HFILL },
684+ },
685+ { &hf_rsl_remote_port,
686+ { "ip.access Remote RTP Port", "rsl.ipacc.remote_port",
687+ FT_UINT16, BASE_DEC, NULL, 0x0,
688+ "ip.access Remote RTP Port", HFILL },
689+ },
690+ { &hf_rsl_local_ip,
691+ { "ip.access Local IP Address", "rsl.ipacc.local_ip",
692+ FT_IPv4, BASE_NONE, NULL, 0x0,
693+ "ip.access Local IP Address", HFILL },
694+ },
695+ { &hf_rsl_remote_ip,
696+ { "ip.access Remote IP Address", "rsl.ipacc.remote_ip",
697+ FT_IPv4, BASE_NONE, NULL, 0x0,
698+ "ip.access Remote IP Address", HFILL },
699+ },
700 };
701 static gint *ett[] = {
702 &ett_rsl,
Harald Weltec9b484f2009-07-12 20:46:43 +0200703@@ -3941,6 +4534,14 @@
Harald Welte2d112ad2009-06-10 05:42:52 +0800704 &ett_ie_meas_res_no,
705 &ett_ie_message_id,
706 &ett_ie_sys_info_type,
Harald Weltec9b484f2009-07-12 20:46:43 +0200707+ &ett_ie_speech_mode,
708+ &ett_ie_conn_stat,
709+ &ett_ie_conn_id,
Harald Welte2d112ad2009-06-10 05:42:52 +0800710+ &ett_ie_remote_ip,
711+ &ett_ie_remote_port,
712+ &ett_ie_local_port,
713+ &ett_ie_local_ip,
Harald Weltec9b484f2009-07-12 20:46:43 +0200714+ &ett_ie_rtp_payload,
Harald Welte2d112ad2009-06-10 05:42:52 +0800715 };
716
717 /* Register the protocol name and description */