/* packet-gmr1_common.h
 *
 * Headers for GMR-1 dissection in wireshark (common stuff).
 * Copyright (c) 2011 Sylvain Munaut <tnt@246tNt.com>
 *
 * References:
 *  [1] ETSI TS 101 376-4-8 V1.3.1 - GMR-1 04.008
 *  [2] ETSI TS 101 376-4-8 V2.2.1 - GMPRS-1 04.008
 *  [3] ETSI TS 101 376-4-8 V3.1.1 - GMR-1 3G 44.008
 *  [4] ETSI TS 100 940 V7.21.0 - GSM 04.08
 *  [5] ETSI TS 101 376-4-12 V3.2.1 - GMR-1 3G 44.060
 *  [6] ETSI TS 101 376-5-6 V1.3.1 - GMR-1 05.008
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef __PACKET_GMR1_COMMON_H__
#define __PACKET_GMR1_COMMON_H__

#include "packet-gsm_a_common.h"


/* Protocol descriptor (see [1] 11.2 & [4] 10.2) */
typedef enum {
	GMR1_PD_CC	= 0x03,
	GMR1_PD_MM	= 0x05,
	GMR1_PD_RR	= 0x06,
	GMR1_PD_GMM	= 0x08,
	GMR1_PD_SM	= 0x0a,
	GMR1_PD_DTRS	= 0x1e
} gmr1_pd_e;

#define GMR1_PD_EXT_MSK	0x0f
#define GMR1_PD_EXT_VAL	0x0e

extern const value_string gmr1_pd_vals[];
extern const value_string gmr1_pd_short_vals[];


/* Common IEs */
enum gmr1_ie_common_idx {
	GMR1_IE_COM_CM2,			/* [1] 11.5.1.6 */
	GMR1_IE_COM_SPARE_NIBBLE,		/* [1] 11.5.1.8 */
	NUM_GMR1_IE_COMMON /* Terminator */
};

extern int hf_gmr1_skip_ind;
extern int hf_gmr1_l3_pd;
extern int hf_gmr1_elem_id;
extern int hf_gmr1_len;


/* Message & IEs parsing */

typedef void (*gmr1_msg_func_t)(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, gint offset, gint len);

#define GMR1_IE_FUNC(fn_name)	\
	static guint16 \
	fn_name (tvbuff_t *tvb _U_, proto_tree *tree _U_, packet_info *pinfo _U_, guint32 offset _U_, guint len _U_, gchar *add_string _U_, int string_len _U_)

#define GMR1_MSG_FUNC(fn_name)	\
	static void \
	fn_name (tvbuff_t *tvb _U_, proto_tree *tree _U_, packet_info *pinfo _U_, gint offset, gint len)

#define GMR1_MSG_FUNC_BEGIN	\
	gint curr_offset;	\
	gint curr_len;		\
	gint consumed;		\
				\
	curr_offset = offset;	\
	curr_len = len;		\
	consumed = 0;

#define GMR1_MSG_FUNC_END


extern void
gmr1_get_msg_params(gmr1_pd_e pd, guint8 oct, const gchar **msg_str,
                    int *ett_tree, int *hf_idx, gmr1_msg_func_t *msg_func_p);


#endif /* __PACKET_GMR1_COMMON_H__ */
