2005-01-08 15:49:37 +00:00
/* packet-amr.c
2005-01-08 20:54:23 +00:00
* Routines for AMR dissection
2008-01-07 19:16:26 +00:00
* Copyright 2005 - 2008 , Anders Broman < anders . broman [ at ] ericsson . com >
2005-01-08 15:49:37 +00:00
*
2006-05-21 04:49:01 +00:00
* Wireshark - Network traffic analyzer
* By Gerald Combs < gerald @ wireshark . org >
2005-01-08 15:49:37 +00:00
* Copyright 1998 Gerald Combs
2011-04-04 17:49:32 +00:00
*
2018-02-12 11:23:27 +00:00
* SPDX - License - Identifier : GPL - 2.0 - or - later
2005-01-08 20:54:23 +00:00
*
2005-01-08 15:49:37 +00:00
* References :
2006-11-01 22:58:41 +00:00
* RFC 3267 http : //www.ietf.org/rfc/rfc3267.txt?number=3267
2014-10-30 14:58:58 +00:00
* RFC 4867 http : //www.rfc-editor.org/rfc/rfc4867.txt
2007-06-08 05:04:54 +00:00
* 3 GPP TS 26.101 for AMR - NB , 3 GPP TS 26.201 for AMR - WB
2005-01-08 15:49:37 +00:00
*/
2012-09-20 02:03:38 +00:00
# include "config.h"
2005-01-08 15:49:37 +00:00
# include <epan/packet.h>
2007-06-08 05:04:54 +00:00
# include <epan/expert.h>
2009-04-06 16:53:41 +00:00
# include <epan/oids.h>
2008-01-07 19:16:26 +00:00
# include <epan/asn1.h>
2005-09-19 19:11:50 +00:00
2005-01-08 15:49:37 +00:00
2013-12-15 23:44:12 +00:00
void proto_register_amr ( void ) ;
void proto_reg_handoff_amr ( void ) ;
2007-06-08 05:04:54 +00:00
# define AMR_NB_SID 8
# define AMR_WB_SID 9
2005-09-19 19:11:50 +00:00
# define AMR_NO_TRANS 15
2005-01-08 15:49:37 +00:00
2007-06-08 05:04:54 +00:00
# define AMR_NB 0
# define AMR_WB 1
2013-11-16 01:10:05 +00:00
static dissector_handle_t amr_handle ;
static dissector_handle_t amr_wb_handle ;
2005-01-08 15:49:37 +00:00
/* Initialize the protocol and registered fields */
2012-10-16 19:05:49 +00:00
static int proto_amr = - 1 ;
2017-11-07 01:30:43 +00:00
static int proto_amr_wb = - 1 ;
2012-10-16 19:05:49 +00:00
static int hf_amr_nb_cmr = - 1 ;
static int hf_amr_wb_cmr = - 1 ;
2014-09-11 00:04:22 +00:00
static int hf_amr_payload_decoded_as = - 1 ;
2012-10-16 19:05:49 +00:00
static int hf_amr_reserved = - 1 ;
static int hf_amr_toc_f = - 1 ;
static int hf_amr_nb_toc_ft = - 1 ;
static int hf_amr_wb_toc_ft = - 1 ;
static int hf_amr_toc_q = - 1 ;
2005-09-19 19:11:50 +00:00
2014-09-11 00:04:22 +00:00
static int hf_amr_speech_data = - 1 ;
static int hf_amr_frame_data = - 1 ;
2007-06-08 05:04:54 +00:00
static int hf_amr_nb_if1_ft = - 1 ;
static int hf_amr_wb_if1_ft = - 1 ;
2005-09-19 19:11:50 +00:00
static int hf_amr_if1_fqi = - 1 ;
2007-06-08 05:04:54 +00:00
static int hf_amr_nb_if1_mode_req = - 1 ;
static int hf_amr_wb_if1_mode_req = - 1 ;
2005-09-19 19:11:50 +00:00
static int hf_amr_if1_sti = - 1 ;
2007-06-08 05:04:54 +00:00
static int hf_amr_nb_if1_mode_ind = - 1 ;
static int hf_amr_wb_if1_mode_ind = - 1 ;
static int hf_amr_nb_if1_sti_mode_ind = - 1 ;
static int hf_amr_wb_if1_sti_mode_ind = - 1 ;
static int hf_amr_if2_sti = - 1 ;
static int hf_amr_nb_if2_sti_mode_ind = - 1 ;
static int hf_amr_wb_if2_sti_mode_ind = - 1 ;
2005-09-19 19:11:50 +00:00
2007-06-08 05:04:54 +00:00
static int hf_amr_nb_if2_ft = - 1 ;
static int hf_amr_wb_if2_ft = - 1 ;
2006-11-01 22:58:41 +00:00
2005-01-08 15:49:37 +00:00
/* Initialize the subtree pointers */
static int ett_amr = - 1 ;
static int ett_amr_toc = - 1 ;
2013-06-09 03:28:05 +00:00
static expert_field ei_amr_spare_bit_not0 = EI_INIT ;
static expert_field ei_amr_not_enough_data_for_frames = EI_INIT ;
static expert_field ei_amr_superfluous_data = EI_INIT ;
static expert_field ei_amr_padding_bits_not0 = EI_INIT ;
2014-09-11 00:04:22 +00:00
static expert_field ei_amr_padding_bits_correct = EI_INIT ;
static expert_field ei_amr_reserved = EI_INIT ;
2013-06-09 03:28:05 +00:00
2017-10-27 13:58:07 +00:00
/* The dynamic payload types which will be dissected as AMR */
# define AMR_DEFAULT_DYN_PT_RANGE "0"
static range_t * global_amr_dynamic_payload_types ;
static range_t * global_amr_wb_dynamic_payload_types ;
2012-10-16 19:05:49 +00:00
static gint amr_encoding_type = 0 ;
static gint pref_amr_mode = AMR_NB ;
2007-06-08 05:04:54 +00:00
2005-01-08 15:49:37 +00:00
/* Currently only octet aligned works */
2005-10-05 15:44:04 +00:00
/* static gboolean octet_aligned = TRUE; */
2005-01-08 15:49:37 +00:00
2005-09-19 19:11:50 +00:00
static const value_string amr_encoding_type_value [ ] = {
2012-10-16 19:05:49 +00:00
{ 0 , " RFC 3267 " } ,
{ 1 , " RFC 3267 bandwidth-efficient mode " } ,
{ 2 , " AMR IF 1 " } ,
{ 3 , " AMR IF 2 " } ,
{ 0 , NULL }
2005-09-19 19:11:50 +00:00
} ;
2007-06-08 05:04:54 +00:00
/* Table 1a of 3GPP TS 26.201*/
static const value_string amr_nb_codec_mode_vals [ ] = {
2012-10-16 19:05:49 +00:00
{ 0 , " AMR 4,75 kbit/s " } ,
{ 1 , " AMR 5,15 kbit/s " } ,
{ 2 , " AMR 5,90 kbit/s " } ,
{ 3 , " AMR 6,70 kbit/s (PDC-EFR) " } ,
{ 4 , " AMR 7,40 kbit/s (TDMA-EFR) " } ,
{ 5 , " AMR 7,95 kbit/s " } ,
{ 6 , " AMR 10,2 kbit/s " } ,
{ 7 , " AMR 12,2 kbit/s (GSM-EFR) " } ,
{ AMR_NB_SID , " AMR SID (Comfort Noise Frame) " } ,
{ 9 , " GSM-EFR SID " } ,
{ 10 , " TDMA-EFR SID " } ,
{ 11 , " PDC-EFR SID " } ,
{ 12 , " Illegal Frametype - for future use " } ,
{ 13 , " Illegal Frametype - for future use " } ,
{ 14 , " Illegal Frametype - for future use " } ,
{ AMR_NO_TRANS , " No Data (No transmission/No reception) " } ,
{ 0 , NULL }
2007-06-08 05:04:54 +00:00
} ;
2010-11-11 21:18:15 +00:00
static value_string_ext amr_nb_codec_mode_vals_ext = VALUE_STRING_EXT_INIT ( amr_nb_codec_mode_vals ) ;
2007-06-08 05:04:54 +00:00
static const value_string amr_wb_codec_mode_vals [ ] = {
2012-10-16 19:05:49 +00:00
{ 0 , " AMR-WB 6.60 kbit/s " } ,
{ 1 , " AMR-WB 8.85 kbit/s " } ,
{ 2 , " AMR-WB 12.65 kbit/s " } ,
{ 3 , " AMR-WB 14.25 kbit/s " } ,
{ 4 , " AMR-WB 15.85 kbit/s " } ,
{ 5 , " AMR-WB 18.25 kbit/s " } ,
{ 6 , " AMR-WB 19.85 kbit/s " } ,
{ 7 , " AMR-WB 23.05 kbit/s " } ,
{ 8 , " AMR-WB 23.85 kbit/s " } ,
{ AMR_WB_SID , " AMR-WB SID (Comfort Noise Frame) " } ,
{ 10 , " Illegal Frametype " } ,
{ 11 , " Illegal Frametype " } ,
{ 12 , " Illegal Frametype " } ,
{ 13 , " Illegal Frametype " } ,
{ 14 , " Speech lost " } ,
{ AMR_NO_TRANS , " No Data (No transmission/No reception) " } ,
{ 0 , NULL }
2005-09-19 19:11:50 +00:00
} ;
2010-11-11 21:18:15 +00:00
static value_string_ext amr_wb_codec_mode_vals_ext = VALUE_STRING_EXT_INIT ( amr_wb_codec_mode_vals ) ;
2007-06-08 05:04:54 +00:00
/* Ref 3GPP TS 26.101 table 1a for AMR-NB*/
2011-04-04 17:49:32 +00:00
/* From RFC3267 chapter 4.3.1
2007-06-08 05:04:54 +00:00
CMR ( 4 bits ) : Indicates a codec mode request sent to the speech
encoder at the site of the receiver of this payload . The value of
the CMR field is set to the frame type index of the corresponding
speech mode being requested . The frame type index may be 0 - 7 for
AMR , as defined in Table 1 a in [ 2 ] , or 0 - 8 for AMR - WB , as defined
2011-04-04 17:49:32 +00:00
in Table 1 a in [ 3 GPP TS 26.201 ] . CMR value 15 indicates that no
2007-06-08 05:04:54 +00:00
mode request is present , and other values are for future use .
*/
static const value_string amr_nb_codec_mode_request_vals [ ] = {
2012-10-16 19:05:49 +00:00
{ 0 , " AMR 4,75 kbit/s " } ,
{ 1 , " AMR 5,15 kbit/s " } ,
{ 2 , " AMR 5,90 kbit/s " } ,
{ 3 , " AMR 6,70 kbit/s (PDC-EFR) " } ,
{ 4 , " AMR 7,40 kbit/s (TDMA-EFR) " } ,
{ 5 , " AMR 7,95 kbit/s " } ,
{ 6 , " AMR 10,2 kbit/s " } ,
{ 7 , " AMR 12,2 kbit/s (GSM-EFR) " } ,
{ 8 , " Illegal Frametype - For future use " } ,
{ 9 , " Illegal Frametype - For future use " } ,
{ 10 , " Illegal Frametype - For future use " } ,
{ 11 , " Illegal Frametype - For future use " } ,
{ 12 , " Illegal Frametype - For future use " } ,
{ 13 , " Illegal Frametype - For future use " } ,
{ 14 , " Illegal Frametype - For future use " } ,
{ 15 , " No mode request " } ,
{ 0 , NULL }
2007-06-08 05:04:54 +00:00
} ;
2010-11-11 21:18:15 +00:00
static value_string_ext amr_nb_codec_mode_request_vals_ext = VALUE_STRING_EXT_INIT ( amr_nb_codec_mode_request_vals ) ;
2007-06-08 05:04:54 +00:00
/* Ref 3GPP TS 26.201 table 1a for AMR-WB*/
static const value_string amr_wb_codec_mode_request_vals [ ] = {
2012-10-16 19:05:49 +00:00
{ 0 , " AMR-WB 6.60 kbit/s " } ,
{ 1 , " AMR-WB 8.85 kbit/s " } ,
{ 2 , " AMR-WB 12.65 kbit/s " } ,
{ 3 , " AMR-WB 14.25 kbit/s " } ,
{ 4 , " AMR-WB 15.85 kbit/s " } ,
{ 5 , " AMR-WB 18.25 kbit/s " } ,
{ 6 , " AMR-WB 19.85 kbit/s " } ,
{ 7 , " AMR-WB 23.05 kbit/s " } ,
{ 8 , " AMR-WB 23.85 kbit/s " } ,
{ 9 , " Illegal Frametype - For future use " } ,
{ 10 , " Illegal Frametype - For future use " } ,
{ 11 , " Illegal Frametype - For future use " } ,
{ 12 , " Illegal Frametype - For future use " } ,
{ 13 , " Illegal Frametype - For future use " } ,
{ 14 , " Illegal Frametype - For future use " } ,
{ 15 , " No mode request " } ,
{ 0 , NULL }
2005-01-08 15:49:37 +00:00
} ;
2010-11-11 21:18:15 +00:00
static value_string_ext amr_wb_codec_mode_request_vals_ext = VALUE_STRING_EXT_INIT ( amr_wb_codec_mode_request_vals ) ;
2005-01-08 15:49:37 +00:00
static const true_false_string toc_f_bit_vals = {
2012-10-16 19:05:49 +00:00
" Followed by another speech frame " ,
" Last frame in this payload "
2005-01-08 15:49:37 +00:00
} ;
static const true_false_string toc_q_bit_vals = {
2012-10-16 19:05:49 +00:00
" Ok " ,
" Severely damaged frame "
2005-01-08 15:49:37 +00:00
} ;
2005-09-19 19:11:50 +00:00
static const true_false_string amr_sti_vals = {
2012-10-16 19:05:49 +00:00
" SID_UPDATE " ,
" SID_FIRST "
2005-09-19 19:11:50 +00:00
} ;
2007-06-08 05:04:54 +00:00
/* See 3GPP TS 26.101 chapter 4 for AMR-NB IF1 */
2015-11-10 04:01:28 +00:00
static int
dissect_amr_nb_if1 ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ ) {
2012-10-16 19:05:49 +00:00
int offset = 0 ;
guint8 octet ;
proto_item * ti ;
proto_tree_add_item ( tree , hf_amr_nb_if1_ft , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_amr_if1_fqi , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
octet = ( tvb_get_guint8 ( tvb , offset ) & 0xf0 ) > > 4 ;
if ( octet = = AMR_NB_SID ) {
ti = proto_tree_add_item ( tree , hf_amr_nb_if1_mode_req , tvb , offset + 1 , 1 , ENC_BIG_ENDIAN ) ;
if ( tvb_get_guint8 ( tvb , offset + 1 ) & 0x1f )
2013-06-09 03:28:05 +00:00
expert_add_info ( pinfo , ti , & ei_amr_spare_bit_not0 ) ;
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset + 2 , 5 , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
proto_tree_add_item ( tree , hf_amr_if1_sti , tvb , offset + 7 , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_amr_nb_if1_sti_mode_ind , tvb , offset + 7 , 1 , ENC_BIG_ENDIAN ) ;
2015-11-10 04:01:28 +00:00
return offset + 8 ;
2012-10-16 19:05:49 +00:00
}
proto_tree_add_item ( tree , hf_amr_nb_if1_mode_ind , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
ti = proto_tree_add_item ( tree , hf_amr_nb_if1_mode_req , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
if ( tvb_get_guint8 ( tvb , offset ) & 0x1f )
2013-06-09 03:28:05 +00:00
expert_add_info ( pinfo , ti , & ei_amr_spare_bit_not0 ) ;
2012-10-16 19:05:49 +00:00
offset + = 1 ;
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset , - 1 , ENC_NA ) ;
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2005-09-19 19:11:50 +00:00
}
2007-06-08 05:04:54 +00:00
/* See 3GPP TS 26.201 for AMR-WB */
2015-11-10 04:01:28 +00:00
static int
dissect_amr_wb_if1 ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ ) {
2012-10-16 19:05:49 +00:00
int offset = 0 ;
guint8 octet ;
proto_item * ti ;
proto_tree_add_item ( tree , hf_amr_wb_if1_ft , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
ti = proto_tree_add_item ( tree , hf_amr_if1_fqi , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
if ( tvb_get_guint8 ( tvb , offset ) & 0x03 )
2013-06-09 03:28:05 +00:00
expert_add_info ( pinfo , ti , & ei_amr_spare_bit_not0 ) ;
2012-10-16 19:05:49 +00:00
octet = ( tvb_get_guint8 ( tvb , offset ) & 0xf0 ) > > 4 ;
if ( octet = = AMR_WB_SID ) {
proto_tree_add_item ( tree , hf_amr_wb_if1_mode_req , tvb , offset + 1 , 1 , ENC_BIG_ENDIAN ) ;
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset + 2 , 4 , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
proto_tree_add_item ( tree , hf_amr_if1_sti , tvb , offset + 7 , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_amr_wb_if1_sti_mode_ind , tvb , offset + 7 , 1 , ENC_BIG_ENDIAN ) ;
2015-11-10 04:01:28 +00:00
return offset + 8 ;
2012-10-16 19:05:49 +00:00
}
offset + = 1 ;
proto_tree_add_item ( tree , hf_amr_wb_if1_mode_ind , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_amr_wb_if1_mode_req , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
offset + = 1 ;
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset , - 1 , ENC_NA ) ;
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2007-06-08 05:04:54 +00:00
}
2015-11-10 04:01:28 +00:00
static int
dissect_amr_nb_if2 ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ ) {
2012-10-16 19:05:49 +00:00
int offset = 0 ;
guint8 octet ;
proto_tree_add_item ( tree , hf_amr_nb_if2_ft , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
octet = tvb_get_guint8 ( tvb , offset ) & 0x0f ;
if ( octet = = AMR_NB_SID ) {
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset + 1 , 3 , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
proto_tree_add_item ( tree , hf_amr_if2_sti , tvb , offset + 4 , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_amr_nb_if2_sti_mode_ind , tvb , offset + 5 , 1 , ENC_BIG_ENDIAN ) ;
2015-11-10 04:01:28 +00:00
return offset + 6 ;
2012-10-16 19:05:49 +00:00
}
if ( octet = = AMR_NO_TRANS )
2015-11-10 04:01:28 +00:00
return 1 ;
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset + 1 , - 1 , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
col_append_fstr ( pinfo - > cinfo , COL_INFO , " %s " ,
val_to_str_ext ( octet , & amr_nb_codec_mode_request_vals_ext , " Unknown (%d) " ) ) ;
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2005-09-19 19:11:50 +00:00
}
2007-06-08 05:04:54 +00:00
2015-11-10 04:01:28 +00:00
static int
dissect_amr_wb_if2 ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ ) {
2012-10-16 19:05:49 +00:00
int offset = 0 ;
guint8 octet ;
proto_tree_add_item ( tree , hf_amr_wb_if2_ft , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
octet = ( tvb_get_guint8 ( tvb , offset ) & 0xf0 ) > > 4 ;
if ( octet = = AMR_WB_SID ) {
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset + 1 , 4 , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
proto_tree_add_item ( tree , hf_amr_if2_sti , tvb , offset + 5 , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( tree , hf_amr_wb_if2_sti_mode_ind , tvb , offset + 5 , 1 , ENC_BIG_ENDIAN ) ;
2015-11-10 04:01:28 +00:00
return offset + 6 ;
2012-10-16 19:05:49 +00:00
}
if ( octet = = AMR_NO_TRANS )
2015-11-10 04:01:28 +00:00
return 1 ;
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_speech_data , tvb , offset + 1 , - 1 , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
col_append_fstr ( pinfo - > cinfo , COL_INFO , " %s " ,
val_to_str_ext ( octet , & amr_wb_codec_mode_request_vals_ext , " Unknown (%d) " ) ) ;
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2007-06-08 05:04:54 +00:00
}
static void
Fix some warnings/errors of type
git/epan/dissectors/packet-a21.c:478:25: error: 'item' was marked unused but was used
[-Werror,-Wused-but-marked-unused]
proto_item_append_text(item, "%s", val_to_str_const(event_id, a21_event_vals, "Unknown"));
^
Added manual change id because file-jpeg.c forced the use of commit -n
Change-Id: Iffff53d6253758c8454d9583f0a11f317c8390cb
Fix warnings/errors of type:
git/epan/dissectors/packet-ax25-kiss.c:205:52: error: 'pseudo_header' was marked unused but was
used [-Werror,-Wused-but-marked-unused]
return capture_ax25( pd, l_offset, len, cpinfo, pseudo_header );
Fix checkhf warnings:
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_address_netswitch
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_address_subswitch
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_poll_reply_trailer
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_rdm_universe
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_tod_data_universe
Change-Id: Id1fa12afb97a8e9cd4ed0ea25351c3b2639c930e
Reviewed-on: https://code.wireshark.org/review/14667
Reviewed-by: Jörg Mayer <jmayer@loplof.de>
2016-03-28 11:37:24 +00:00
dissect_amr_be ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , gint amr_mode ) {
2012-10-16 19:05:49 +00:00
proto_item * item ;
int ft ;
int bit_offset = 0 ;
int bitcount ; /*bitcounter, MSB = bit 0, over bytes*/
int bits_used_for_frames = 0 ;
int bytes_needed_for_frames ;
guint8 f_bit , q_bit ;
/* Number of bits per frame for AMR-NB, see Table 1 RFC3267*/
/* Values taken for GSM-EFR SID, TDMA-EFR SID and PDC-EFR SID from 3GPP 26.101 Table A.1b */
/* Frame type 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
unsigned char Framebits_NB [ ] = { 95 , 103 , 118 , 134 , 148 , 159 , 204 , 244 , 39 , 43 , 38 , 37 , 0 , 0 , 0 , 0 } ;
/* Number of bits per frame for AMR-WB, see 3GPP TS 26.201 Table 2*/
/* Frame type 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
unsigned int Framebits_WB [ ] = { 132 , 177 , 253 , 285 , 317 , 365 , 397 , 461 , 477 , 40 , 0 , 0 , 0 , 0 , 0 , 0 , } ;
/* Chapter 4.3 */
bitcount = 3 ;
if ( amr_mode = = AMR_NB )
proto_tree_add_bits_item ( tree , hf_amr_nb_cmr , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
else
proto_tree_add_bits_item ( tree , hf_amr_wb_cmr , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
bit_offset + = 4 ;
/* In bandwidth-efficient mode, a ToC entry takes the following format:
*
* 0 1 2 3 4 5
* + - + - + - + - + - + - +
* | F | FT | Q |
* + - + - + - + - + - + - +
*
* F ( 1 bit ) : If set to 1 , indicates that this frame is followed by
* another speech frame in this payload ; if set to 0 , indicates that
* this frame is the last frame in this payload .
*
* FT ( 4 bits ) : Frame type index , indicating either the AMR or AMR - WB
* speech coding mode or comfort noise ( SID ) mode of the
* corresponding frame carried in this payload .
*/
do {
/* Check F bit */
bitcount + = 1 ;
f_bit = tvb_get_bits8 ( tvb , bit_offset , 1 ) ;
proto_tree_add_bits_item ( tree , hf_amr_toc_f , tvb , bit_offset , 1 , ENC_BIG_ENDIAN ) ;
bit_offset + = 1 ;
ft = tvb_get_bits8 ( tvb , bit_offset , 4 ) ;
if ( amr_mode = = AMR_NB )
item = proto_tree_add_bits_item ( tree , hf_amr_nb_toc_ft , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
else
item = proto_tree_add_bits_item ( tree , hf_amr_wb_toc_ft , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
bit_offset + = 4 ;
bitcount + = 4 ;
if ( amr_mode = = AMR_NB )
bits_used_for_frames + = Framebits_NB [ ft ] ;
else
bits_used_for_frames + = Framebits_WB [ ft ] ;
/* Check Q bit */
q_bit = tvb_get_bits8 ( tvb , bit_offset , 1 ) ;
proto_tree_add_bits_item ( tree , hf_amr_toc_q , tvb , bit_offset , 1 , ENC_BIG_ENDIAN ) ;
bit_offset + = 1 ;
bitcount + = 1 ;
if ( q_bit = = 1 )
proto_item_append_text ( item , " / Frame OK " ) ;
else
proto_item_append_text ( item , " / Frame damaged " ) ;
} while ( ( f_bit = = 1 ) & & ( tvb_reported_length_remaining ( tvb , bitcount / 8 ) > 2 ) ) ;
if ( bits_used_for_frames > 0 )
bytes_needed_for_frames = 1 + ( bitcount + bits_used_for_frames ) / 8 - bitcount / 8 ;
else
bytes_needed_for_frames = 0 ;
/* Check if we have enough data available for our frames */
if ( tvb_reported_length_remaining ( tvb , bitcount / 8 ) < bytes_needed_for_frames ) {
2014-09-11 00:04:22 +00:00
proto_tree_add_expert_format ( tree , pinfo , & ei_amr_not_enough_data_for_frames ,
tvb , bitcount / 8 , bytes_needed_for_frames ,
2013-07-03 02:59:31 +00:00
" Error: %d Bytes available, %d would be needed! " ,
2012-10-16 19:05:49 +00:00
tvb_reported_length_remaining ( tvb , bitcount / 8 ) ,
bytes_needed_for_frames ) ;
}
else {
2014-09-11 00:04:22 +00:00
proto_tree_add_item ( tree , hf_amr_frame_data , tvb , bitcount / 8 , bytes_needed_for_frames , ENC_NA ) ;
2012-10-16 19:05:49 +00:00
}
bitcount + = bits_used_for_frames ;
if ( tvb_reported_length_remaining ( tvb , ( bitcount + 8 ) / 8 ) > 0 ) {
2014-09-11 00:04:22 +00:00
proto_tree_add_expert_format ( tree , pinfo , & ei_amr_superfluous_data , tvb , bitcount / 8 , tvb_reported_length_remaining ( tvb , bitcount / 8 ) ,
2013-07-03 02:59:31 +00:00
" Error: %d Bytes remaining - should be 0! " , tvb_reported_length_remaining ( tvb , ( bitcount + 8 ) / 8 ) ) ;
2012-10-16 19:05:49 +00:00
/* Now check the paddings */
if ( bitcount % 8 ! = 0 ) {
if ( ( 1 < < ( 8 - ( bitcount % 8 ) - 1 ) ) & tvb_get_guint8 ( tvb , bitcount / 8 ) )
2014-09-11 00:04:22 +00:00
proto_tree_add_expert ( tree , pinfo , & ei_amr_padding_bits_correct , tvb , bitcount / 8 , 1 ) ;
2012-10-16 19:05:49 +00:00
else {
2013-07-03 02:59:31 +00:00
proto_tree_add_expert ( tree , pinfo , & ei_amr_padding_bits_not0 , tvb ,
bitcount / 8 , 1 ) ;
2012-10-16 19:05:49 +00:00
}
}
}
2006-11-01 22:58:41 +00:00
}
2012-10-16 19:05:49 +00:00
2005-01-08 15:49:37 +00:00
/* Code to actually dissect the packets */
static void
2010-03-16 09:12:24 +00:00
dissect_amr_common ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , gint amr_mode )
2005-01-08 15:49:37 +00:00
{
2012-10-16 19:05:49 +00:00
int offset = 0 ;
int bit_offset = 0 ;
guint8 octet ;
proto_item * item ;
gboolean first_time ;
2005-01-08 15:49:37 +00:00
/* Set up structures needed to add the protocol subtree and manage it */
2014-06-22 20:01:36 +00:00
proto_item * ti ;
2012-10-16 19:05:49 +00:00
proto_tree * amr_tree , * toc_tree ;
ti = proto_tree_add_item ( tree , proto_amr , tvb , 0 , - 1 , ENC_NA ) ;
amr_tree = proto_item_add_subtree ( ti , ett_amr ) ;
2014-09-11 00:04:22 +00:00
item = proto_tree_add_uint ( amr_tree , hf_amr_payload_decoded_as , tvb , offset , 4 , amr_encoding_type ) ;
proto_item_set_len ( item , tvb_reported_length ( tvb ) ) ;
PROTO_ITEM_SET_GENERATED ( item ) ;
2012-10-16 19:05:49 +00:00
switch ( amr_encoding_type ) {
case 0 : /* RFC 3267 Byte aligned */
break ;
case 1 : /* RFC 3267 Bandwidth-efficient */
dissect_amr_be ( tvb , pinfo , amr_tree , amr_mode ) ;
return ;
case 2 : /* AMR IF1 */
if ( amr_mode = = AMR_NB )
2015-11-10 04:01:28 +00:00
dissect_amr_nb_if1 ( tvb , pinfo , amr_tree , NULL ) ;
2012-10-16 19:05:49 +00:00
else
2015-11-10 04:01:28 +00:00
dissect_amr_wb_if1 ( tvb , pinfo , amr_tree , NULL ) ;
2012-10-16 19:05:49 +00:00
return ;
case 3 : /* AMR IF2 */
if ( amr_mode = = AMR_NB )
2015-11-10 04:01:28 +00:00
dissect_amr_nb_if2 ( tvb , pinfo , amr_tree , NULL ) ;
2012-10-16 19:05:49 +00:00
else
2015-11-10 04:01:28 +00:00
dissect_amr_wb_if2 ( tvb , pinfo , amr_tree , NULL ) ;
2012-10-16 19:05:49 +00:00
return ;
default :
break ;
}
if ( amr_mode = = AMR_NB )
proto_tree_add_bits_item ( amr_tree , hf_amr_nb_cmr , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
else
proto_tree_add_bits_item ( amr_tree , hf_amr_wb_cmr , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
bit_offset + = 4 ;
octet = tvb_get_guint8 ( tvb , offset ) & 0x0f ;
2014-09-11 00:04:22 +00:00
item = proto_tree_add_item ( amr_tree , hf_amr_reserved , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2012-10-16 19:05:49 +00:00
if ( octet ! = 0 ) {
2014-09-11 00:04:22 +00:00
expert_add_info ( pinfo , item , & ei_amr_reserved ) ;
2012-10-16 19:05:49 +00:00
PROTO_ITEM_SET_GENERATED ( item ) ;
return ;
}
offset + = 1 ;
bit_offset + = 4 ;
/*
* A ToC entry takes the following format in octet - aligned mode :
*
* 0 1 2 3 4 5 6 7
* + - + - + - + - + - + - + - + - +
* | F | FT | Q | P | P |
* + - + - + - + - + - + - + - + - +
*
* F ( 1 bit ) : see definition in Section 4.3 .2 .
*
* FT ( 4 bits unsigned integer ) : see definition in Section 4.3 .2 .
*
* Q ( 1 bit ) : see definition in Section 4.3 .2 .
*
* P bits : padding bits , MUST be set to zero .
*/
octet = tvb_get_guint8 ( tvb , offset ) ;
2014-06-22 20:01:36 +00:00
toc_tree = proto_tree_add_subtree ( amr_tree , tvb , offset , - 1 , ett_amr_toc , NULL , " Payload Table of Contents " ) ;
2012-10-16 19:05:49 +00:00
first_time = TRUE ;
while ( ( ( octet & 0x80 ) = = 0x80 ) | | ( first_time = = TRUE ) ) {
first_time = FALSE ;
octet = tvb_get_guint8 ( tvb , offset ) ;
proto_tree_add_bits_item ( toc_tree , hf_amr_toc_f , tvb , bit_offset , 1 , ENC_BIG_ENDIAN ) ;
bit_offset + = 1 ;
if ( amr_mode = = AMR_NB )
proto_tree_add_bits_item ( toc_tree , hf_amr_nb_toc_ft , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
else
proto_tree_add_bits_item ( toc_tree , hf_amr_wb_toc_ft , tvb , bit_offset , 4 , ENC_BIG_ENDIAN ) ;
bit_offset + = 4 ;
proto_tree_add_bits_item ( toc_tree , hf_amr_toc_q , tvb , bit_offset , 1 , ENC_BIG_ENDIAN ) ;
bit_offset + = 1 ;
2016-01-06 00:58:42 +00:00
/* 2 padding bits */
2012-10-16 19:05:49 +00:00
bit_offset + = 2 ;
offset + = 1 ;
}
2005-01-08 15:49:37 +00:00
}
2010-03-16 09:12:24 +00:00
/* Code to actually dissect the packets */
2015-11-10 04:01:28 +00:00
static int
dissect_amr ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2010-03-16 09:12:24 +00:00
{
/* Make entries in Protocol column and Info column on summary display */
2012-10-16 19:05:49 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , " AMR " ) ;
2010-03-16 09:12:24 +00:00
2012-10-16 19:05:49 +00:00
dissect_amr_common ( tvb , pinfo , tree , pref_amr_mode ) ;
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2010-03-16 09:12:24 +00:00
}
2015-11-10 04:01:28 +00:00
static int
dissect_amr_wb ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data _U_ )
2010-03-16 09:12:24 +00:00
{
/* Make entries in Protocol column and Info column on summary display */
2012-10-16 19:05:49 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , " AMR-WB " ) ;
dissect_amr_common ( tvb , pinfo , tree , AMR_WB ) ;
2015-11-10 04:01:28 +00:00
return tvb_captured_length ( tvb ) ;
2010-03-16 09:12:24 +00:00
}
2008-01-07 19:16:26 +00:00
typedef struct _amr_capability_t {
2012-10-16 19:05:49 +00:00
const gchar * id ;
const gchar * name ;
2016-01-14 01:02:42 +00:00
dissector_t content_pdu ;
2008-01-07 19:16:26 +00:00
} amr_capability_t ;
static amr_capability_t amr_capability_tab [ ] = {
2012-10-16 19:05:49 +00:00
/* ITU-T H.241 (05/2006), 8.3 H.264 capabilities */
{ " GenericCapability/0.0.8.245.1.1.1 " , " H.245 - GSM AMR Capability Identifier " , NULL } ,
{ " GenericCapability/0.0.8.245.1.1.1/collapsing/0 " , " maxAl-sduAudioFrames " , NULL } ,
{ " GenericCapability/0.0.8.245.1.1.1/collapsing/1 " , " bitRate " , NULL } ,
{ " GenericCapability/0.0.8.245.1.1.1/collapsing/2 " , " gsmAmrComfortNoise " , NULL } ,
{ " GenericCapability/0.0.8.245.1.1.1/collapsing/3 " , " gsmEfrComfortNoise " , NULL } ,
{ " GenericCapability/0.0.8.245.1.1.1/collapsing/4 " , " is-641ComfortNoise " , NULL } ,
{ " GenericCapability/0.0.8.245.1.1.1/collapsing/5 " , " pdcEFRComfortNoise " , NULL } ,
/* ITU-T Rec. G.722.2/Annex F (11/2002) */
{ " GenericCapability/0.0.7.7222.1.0/collapsing/0 " , " maxAl-sduFrames " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/1 " , " bitRate " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/2 " , " octetAlign " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/3 " , " modeSet " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/4 " , " modeChangePeriod " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/5 " , " modeChangeNeighbour " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/6 " , " crc " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/7 " , " robustSorting " , NULL } ,
{ " GenericCapability/0.0.7.7222.1.0/collapsing/8 " , " interleaving " , NULL } ,
{ NULL , NULL , NULL } ,
2011-04-04 17:49:32 +00:00
} ;
2008-01-07 19:16:26 +00:00
static amr_capability_t * find_cap ( const gchar * id ) {
2012-10-16 19:05:49 +00:00
amr_capability_t * ftr = NULL ;
amr_capability_t * f ;
for ( f = amr_capability_tab ; f - > id ; f + + ) {
if ( ! strcmp ( id , f - > id ) ) {
ftr = f ;
break ;
}
}
return ftr ;
2008-01-07 19:16:26 +00:00
}
2013-11-03 02:45:22 +00:00
static int
Fix some warnings/errors of type
git/epan/dissectors/packet-a21.c:478:25: error: 'item' was marked unused but was used
[-Werror,-Wused-but-marked-unused]
proto_item_append_text(item, "%s", val_to_str_const(event_id, a21_event_vals, "Unknown"));
^
Added manual change id because file-jpeg.c forced the use of commit -n
Change-Id: Iffff53d6253758c8454d9583f0a11f317c8390cb
Fix warnings/errors of type:
git/epan/dissectors/packet-ax25-kiss.c:205:52: error: 'pseudo_header' was marked unused but was
used [-Werror,-Wused-but-marked-unused]
return capture_ax25( pd, l_offset, len, cpinfo, pseudo_header );
Fix checkhf warnings:
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_address_netswitch
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_address_subswitch
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_poll_reply_trailer
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_rdm_universe
Unused entry: epan/dissectors/packet-artnet.c, hf_artnet_tod_data_universe
Change-Id: Id1fa12afb97a8e9cd4ed0ea25351c3b2639c930e
Reviewed-on: https://code.wireshark.org/review/14667
Reviewed-by: Jörg Mayer <jmayer@loplof.de>
2016-03-28 11:37:24 +00:00
dissect_amr_name ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data )
2008-01-07 19:16:26 +00:00
{
2013-12-11 23:03:01 +00:00
asn1_ctx_t * actx ;
2012-10-16 19:05:49 +00:00
2013-12-11 23:03:01 +00:00
/* Reject the packet if data is NULL */
if ( data = = NULL )
return 0 ;
actx = get_asn1_ctx ( data ) ;
2012-10-16 19:05:49 +00:00
DISSECTOR_ASSERT ( actx ! = NULL ) ;
2013-12-11 23:03:01 +00:00
2013-10-13 18:14:59 +00:00
if ( tree & & ( actx ! = NULL ) ) {
2012-10-16 19:05:49 +00:00
amr_capability_t * ftr ;
ftr = find_cap ( pinfo - > match_string ) ;
if ( ftr ) {
proto_item_append_text ( actx - > created_item , " - %s " , ftr - > name ) ;
proto_item_append_text ( proto_item_get_parent ( proto_tree_get_parent ( tree ) ) , " : %s " , ftr - > name ) ;
} else {
proto_item_append_text ( actx - > created_item , " - unknown(%s) " , pinfo - > match_string ) ;
}
}
2013-11-03 02:45:22 +00:00
2014-10-30 14:58:58 +00:00
return tvb_reported_length ( tvb ) ;
2008-01-07 19:16:26 +00:00
}
2005-01-08 15:49:37 +00:00
void
proto_register_amr ( void )
2011-04-04 17:49:32 +00:00
{
2012-10-16 19:05:49 +00:00
module_t * amr_module ;
2013-06-09 03:28:05 +00:00
expert_module_t * expert_amr ;
2012-10-16 19:05:49 +00:00
static hf_register_info hf [ ] = {
{ & hf_amr_nb_cmr ,
{ " CMR " , " amr.nb.cmr " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_request_vals_ext , 0x0 ,
" codec mode request " , HFILL }
} ,
{ & hf_amr_wb_cmr ,
{ " CMR " , " amr.wb.cmr " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_request_vals_ext , 0x0 ,
" codec mode request " , HFILL }
} ,
{ & hf_amr_reserved ,
{ " Reserved " , " amr.reserved " ,
FT_UINT8 , BASE_DEC , NULL , 0x0f ,
" Reserved bits " , HFILL }
} ,
2014-09-11 00:04:22 +00:00
{ & hf_amr_payload_decoded_as ,
{ " Payload decoded as " , " amr.payload_decoded_as " ,
FT_UINT32 , BASE_DEC , VALS ( amr_encoding_type_value ) , 0x0 ,
" Value of decoding preference " , HFILL }
} ,
2012-10-16 19:05:49 +00:00
{ & hf_amr_toc_f ,
{ " F bit " , " amr.toc.f " ,
FT_BOOLEAN , BASE_NONE , TFS ( & toc_f_bit_vals ) , 0x0 ,
NULL , HFILL }
} ,
{ & hf_amr_nb_toc_ft ,
{ " FT bits " , " amr.nb.toc.ft " ,
2013-05-16 05:08:16 +00:00
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_vals_ext , 0x0 ,
2012-10-16 19:05:49 +00:00
" Frame type index " , HFILL }
} ,
{ & hf_amr_wb_toc_ft ,
{ " FT bits " , " amr.wb.toc.ft " ,
2013-05-16 05:08:16 +00:00
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_vals_ext , 0x0 ,
2012-10-16 19:05:49 +00:00
" Frame type index " , HFILL }
} ,
{ & hf_amr_toc_q ,
{ " Q bit " , " amr.toc.q " ,
FT_BOOLEAN , BASE_NONE , TFS ( & toc_q_bit_vals ) , 0x0 ,
" Frame quality indicator bit " , HFILL }
} ,
2014-09-11 00:04:22 +00:00
{ & hf_amr_speech_data ,
{ " Speech data " , " amr.speech_data " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
{ & hf_amr_frame_data ,
{ " Frame Data " , " amr.frame_data " ,
FT_BYTES , BASE_NONE , NULL , 0x0 ,
NULL , HFILL }
} ,
2012-10-16 19:05:49 +00:00
{ & hf_amr_nb_if1_ft ,
{ " Frame Type " , " amr.nb.if1.ft " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_vals_ext , 0xf0 ,
NULL , HFILL }
} ,
{ & hf_amr_wb_if1_ft ,
{ " Frame Type " , " amr.wb.if1.ft " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_vals_ext , 0xf0 ,
NULL , HFILL }
} ,
{ & hf_amr_nb_if1_mode_req ,
{ " Mode Type request " , " amr.nb.if1.modereq " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_request_vals_ext , 0xe0 ,
NULL , HFILL }
} ,
{ & hf_amr_wb_if1_mode_req ,
{ " Mode Type request " , " amr.wb.if1.modereq " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_request_vals_ext , 0x0f ,
NULL , HFILL }
} ,
{ & hf_amr_if1_sti ,
{ " SID Type Indicator " , " amr.if1.sti " ,
FT_BOOLEAN , 8 , TFS ( & amr_sti_vals ) , 0x10 ,
NULL , HFILL }
} ,
{ & hf_amr_nb_if1_sti_mode_ind ,
{ " Mode Type indication " , " amr.nb.if1.stimodeind " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_vals_ext , 0x0e ,
NULL , HFILL }
} ,
{ & hf_amr_wb_if1_sti_mode_ind ,
{ " Mode Type indication " , " amr.wb.if1.stimodeind " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_vals_ext , 0x0f ,
NULL , HFILL }
} ,
{ & hf_amr_nb_if1_mode_ind ,
{ " Mode Type indication " , " amr.nb.if1.modeind " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_vals_ext , 0x07 ,
NULL , HFILL }
} ,
{ & hf_amr_wb_if1_mode_ind ,
{ " Mode Type indication " , " amr.wb.if1.modeind " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_vals_ext , 0xf0 ,
NULL , HFILL }
} ,
{ & hf_amr_nb_if2_ft ,
{ " Frame Type " , " amr.nb.if2.ft " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_vals_ext , 0x0f ,
NULL , HFILL }
} ,
{ & hf_amr_wb_if2_ft ,
{ " Frame Type " , " amr.wb.if2.ft " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_vals_ext , 0xf0 ,
NULL , HFILL }
} ,
{ & hf_amr_if2_sti ,
{ " SID Type Indicator " , " amr.if2.sti " ,
FT_BOOLEAN , 8 , TFS ( & amr_sti_vals ) , 0x80 ,
NULL , HFILL }
} ,
{ & hf_amr_nb_if2_sti_mode_ind ,
{ " Mode Type indication " , " amr.nb.if2.stimodeind " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_nb_codec_mode_vals_ext , 0x07 ,
NULL , HFILL }
} ,
{ & hf_amr_wb_if2_sti_mode_ind ,
{ " Mode Type indication " , " amr.wb.if2.stimodeind " ,
FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & amr_wb_codec_mode_vals_ext , 0x78 ,
NULL , HFILL }
} ,
{ & hf_amr_if1_fqi ,
{ " FQI " , " amr.fqi " ,
FT_BOOLEAN , 8 , TFS ( & toc_q_bit_vals ) , 0x08 ,
" Frame quality indicator bit " , HFILL }
} ,
} ;
2005-01-08 15:49:37 +00:00
/* Setup protocol subtree array */
2012-10-16 19:05:49 +00:00
static gint * ett [ ] = {
& ett_amr ,
& ett_amr_toc ,
} ;
2013-06-09 03:28:05 +00:00
static ei_register_info ei [ ] = {
{ & ei_amr_spare_bit_not0 , { " amr.spare_bit_not0 " , PI_PROTOCOL , PI_WARN , " Error:Spare bits not 0 " , EXPFILL } } ,
{ & ei_amr_not_enough_data_for_frames , { " amr.not_enough_data_for_frames " , PI_MALFORMED , PI_ERROR , " Not enough data for the frames according to TOC " , EXPFILL } } ,
{ & ei_amr_superfluous_data , { " amr.superfluous_data " , PI_MALFORMED , PI_ERROR , " Superfluous data remaining " , EXPFILL } } ,
{ & ei_amr_padding_bits_not0 , { " amr.padding_bits_not0 " , PI_MALFORMED , PI_ERROR , " Padding bits error - MUST be 0 " , EXPFILL } } ,
2014-09-11 00:04:22 +00:00
{ & ei_amr_padding_bits_correct , { " amr.padding_bits_correct " , PI_PROTOCOL , PI_NOTE , " Padding bits correct " , EXPFILL } } ,
{ & ei_amr_reserved , { " amr.reserved.not_zero " , PI_PROTOCOL , PI_WARN , " Reserved != 0, wrongly encoded or not octet aligned. Decoding as bandwidth-efficient mode " , EXPFILL } } ,
2013-06-09 03:28:05 +00:00
} ;
2012-11-29 20:15:37 +00:00
static const enum_val_t encoding_types [ ] = {
2012-10-16 19:05:49 +00:00
{ " RFC 3267 Byte aligned " , " RFC 3267 octet aligned " , 0 } ,
{ " RFC 3267 Bandwidth-efficient " , " RFC 3267 BW-efficient " , 1 } ,
{ " AMR IF1 " , " AMR IF1 " , 2 } ,
{ " AMR IF2 " , " AMR IF2 " , 3 } ,
{ NULL , NULL , - 1 }
} ;
2012-11-29 20:15:37 +00:00
static const enum_val_t modes [ ] = {
2012-10-16 19:05:49 +00:00
{ " AMR-NB " , " Narrowband AMR " , AMR_NB } ,
{ " AMR-WB " , " Wideband AMR " , AMR_WB } ,
{ NULL , NULL , - 1 }
} ;
2007-06-08 05:04:54 +00:00
2005-01-08 15:49:37 +00:00
/* Register the protocol name and description */
2012-10-16 19:05:49 +00:00
proto_amr = proto_register_protocol ( " Adaptive Multi-Rate " , " AMR " , " amr " ) ;
2017-11-07 01:30:43 +00:00
proto_amr_wb = proto_register_protocol_in_name_only ( " Adaptive Multi-Rate WB " , " AMR WB " , " amr_wb " , proto_amr , FT_PROTOCOL ) ;
2005-01-08 15:49:37 +00:00
/* Required function calls to register the header fields and subtrees used */
2012-10-16 19:05:49 +00:00
proto_register_field_array ( proto_amr , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
2013-06-09 03:28:05 +00:00
expert_amr = expert_register_protocol ( proto_amr ) ;
expert_register_field_array ( expert_amr , ei , array_length ( ei ) ) ;
2012-10-16 19:05:49 +00:00
/* Register a configuration option for port */
amr_module = prefs_register_protocol ( proto_amr , proto_reg_handoff_amr ) ;
2017-10-27 13:58:07 +00:00
prefs_register_range_preference ( amr_module , " dynamic.payload.type " ,
" AMR dynamic payload types " ,
" The dynamic payload types which will be interpreted as AMR "
" (default " AMR_DEFAULT_DYN_PT_RANGE " ) " ,
& global_amr_dynamic_payload_types , 127 ) ;
prefs_register_range_preference ( amr_module , " wb.dynamic.payload.type " ,
" AMR-WB dynamic payload types " ,
" The dynamic payload types which will be interpreted as AMR-WB "
" (default " AMR_DEFAULT_DYN_PT_RANGE " ) " ,
& global_amr_wb_dynamic_payload_types , 127 ) ;
2012-10-16 19:05:49 +00:00
prefs_register_enum_preference ( amr_module , " encoding.version " ,
" Type of AMR encoding of the payload " ,
" Type of AMR encoding of the payload " ,
& amr_encoding_type , encoding_types , FALSE ) ;
prefs_register_enum_preference ( amr_module , " mode " ,
" The AMR mode " ,
" The AMR mode " ,
& pref_amr_mode , modes , AMR_NB ) ;
2015-12-09 04:04:01 +00:00
amr_handle = register_dissector ( " amr " , dissect_amr , proto_amr ) ;
2017-11-07 01:30:43 +00:00
amr_wb_handle = register_dissector ( " amr-wb " , dissect_amr_wb , proto_amr_wb ) ;
2015-12-09 04:04:01 +00:00
register_dissector ( " amr_if1_nb " , dissect_amr_nb_if1 , proto_amr ) ;
register_dissector ( " amr_if1_wb " , dissect_amr_wb_if1 , proto_amr ) ;
register_dissector ( " amr_if2_nb " , dissect_amr_nb_if2 , proto_amr ) ;
register_dissector ( " amr_if2_wb " , dissect_amr_wb_if2 , proto_amr ) ;
2012-10-16 19:05:49 +00:00
oid_add_from_string ( " G.722.2 (AMR-WB) audio capability " , " 0.0.7.7222.1.0 " ) ;
}
2005-01-08 15:49:37 +00:00
2012-10-16 19:05:49 +00:00
/* Register the protocol with Wireshark */
void
proto_reg_handoff_amr ( void )
{
2017-10-27 13:58:07 +00:00
static range_t * amr_dynamic_payload_types ;
static range_t * amr_wb_dynamic_payload_types ;
static gboolean amr_prefs_initialized = FALSE ;
2012-10-16 19:05:49 +00:00
if ( ! amr_prefs_initialized ) {
dissector_handle_t amr_name_handle ;
amr_capability_t * ftr ;
dissector_add_string ( " rtp_dyn_payload_type " , " AMR " , amr_handle ) ;
dissector_add_string ( " rtp_dyn_payload_type " , " AMR-WB " , amr_wb_handle ) ;
/*
* Register H .245 Generic parameter name ( s )
*/
2015-12-09 03:49:44 +00:00
amr_name_handle = create_dissector_handle ( dissect_amr_name , proto_amr ) ;
2012-10-16 19:05:49 +00:00
for ( ftr = amr_capability_tab ; ftr - > id ; ftr + + ) {
if ( ftr - > name )
dissector_add_string ( " h245.gef.name " , ftr - > id , amr_name_handle ) ;
if ( ftr - > content_pdu )
dissector_add_string ( " h245.gef.content " , ftr - > id ,
2015-12-09 03:49:44 +00:00
create_dissector_handle ( ftr - > content_pdu , proto_amr ) ) ;
2012-10-16 19:05:49 +00:00
}
/* Activate the next line for testing with the randpkt tool
2016-10-05 20:33:54 +00:00
dissector_add_uint_with_preference ( " udp.port " , 55555 , amr_handle ) ;
2012-10-16 19:05:49 +00:00
*/
amr_prefs_initialized = TRUE ;
} else {
2017-10-27 13:58:07 +00:00
dissector_delete_uint_range ( " rtp.pt " , amr_dynamic_payload_types , amr_handle ) ;
dissector_delete_uint_range ( " rtp.pt " , amr_wb_dynamic_payload_types , amr_wb_handle ) ;
2012-10-16 19:05:49 +00:00
}
2017-10-27 13:58:07 +00:00
amr_dynamic_payload_types = range_copy ( wmem_epan_scope ( ) , global_amr_dynamic_payload_types ) ;
amr_wb_dynamic_payload_types = range_copy ( wmem_epan_scope ( ) , global_amr_wb_dynamic_payload_types ) ;
2012-10-16 19:05:49 +00:00
2017-10-27 13:58:07 +00:00
if ( ! value_is_in_range ( amr_dynamic_payload_types , 0 ) ) {
dissector_add_uint_range ( " rtp.pt " , amr_dynamic_payload_types , amr_handle ) ;
}
if ( ! value_is_in_range ( amr_wb_dynamic_payload_types , 0 ) ) {
dissector_add_uint_range ( " rtp.pt " , amr_wb_dynamic_payload_types , amr_wb_handle ) ;
2012-10-16 19:05:49 +00:00
}
2007-06-08 05:04:54 +00:00
}
2012-10-16 19:05:49 +00:00
/*
* Editor modelines - http : //www.wireshark.org/tools/modelines.html
*
* Local variables :
* c - basic - offset : 4
* tab - width : 8
* indent - tabs - mode : nil
* End :
*
* vi : set shiftwidth = 4 tabstop = 8 expandtab :
* : indentSize = 4 : tabSize = 8 : noTabs = true :
*/