diff options
Diffstat (limited to 'epan/dissectors/asn1/ansi_map/packet-ansi_map-template.c')
-rw-r--r-- | epan/dissectors/asn1/ansi_map/packet-ansi_map-template.c | 5510 |
1 files changed, 5510 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/ansi_map/packet-ansi_map-template.c b/epan/dissectors/asn1/ansi_map/packet-ansi_map-template.c new file mode 100644 index 0000000000..e32291d9bf --- /dev/null +++ b/epan/dissectors/asn1/ansi_map/packet-ansi_map-template.c @@ -0,0 +1,5510 @@ +/* packet-ansi_map.c + * Routines for ANSI 41 Mobile Application Part (IS41 MAP) dissection + * Specications from 3GPP2 (www.3gpp2.org) + * Based on the dissector by : + * Michael Lum <mlum [AT] telostech.com> + * In association with Telos Technology Inc. + * + * Copyright 2005 - 2009, Anders Broman <anders.broman@ericsson.com> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Credit to Tomas Kukosa for developing the asn2wrs compiler. + * + * Title 3GPP2 Other + * + * Cellular Radiotelecommunications Intersystem Operations + * 3GPP2 N.S0005-0 v 1.0 ANSI/TIA/EIA-41-D + * + * Network Support for MDN-Based Message Centers + * 3GPP2 N.S0024-0 v1.0 IS-841 + * + * Enhanced International Calling + * 3GPP2 N.S0027 IS-875 + * + * ANSI-41-D Miscellaneous Enhancements Revision 0 + * 3GPP2 N.S0015 PN-3590 (ANSI-41-E) + * + * Authentication Enhancements + * 3GPP2 N.S0014-0 v1.0 IS-778 + * + * Features In CDMA + * 3GPP2 N.S0010-0 v1.0 IS-735 + * + * OTASP and OTAPA + * 3GPP2 N.S0011-0 v1.0 IS-725-A + * + * Circuit Mode Services + * 3GPP2 N.S0008-0 v1.0 IS-737 + * XXX SecondInterMSCCircuitID not implemented, parameter ID conflicts with ISLP Information! + * + * IMSI + * 3GPP2 N.S0009-0 v1.0 IS-751 + * + * WIN Phase 1 + * 3GPP2 N.S0013-0 v1.0 IS-771 + * + * DCCH (Clarification of Audit Order with Forced + * Re-Registration in pre-TIA/EIA-136-A Implementation + * 3GPP2 A.S0017-B IS-730 + * + * UIM + * 3GPP2 N.S0003 + * + * WIN Phase 2 + * 3GPP2 N.S0004-0 v1.0 IS-848 + * + * TIA/EIA-41-D Pre-Paid Charging + * 3GPP2 N.S0018-0 v1.0 IS-826 + * + * User Selective Call Forwarding + * 3GPP2 N.S0021-0 v1.0 IS-838 + * + * + * Answer Hold + * 3GPP2 N.S0022-0 v1.0 IS-837 + * + */ + +#include "config.h" + +#include <epan/packet.h> +#include <epan/prefs.h> +#include <epan/expert.h> +#include <epan/tap.h> +#include <epan/stat_tap_ui.h> +#include <epan/asn1.h> + +#include "packet-ber.h" +#include "packet-ansi_map.h" +#include "packet-ansi_a.h" +#include "packet-gsm_map.h" +#include "packet-tcap.h" +#include "packet-ansi_tcap.h" + +#define PNAME "ANSI Mobile Application Part" +#define PSNAME "ANSI MAP" +#define PFNAME "ansi_map" + + +void proto_register_ansi_map(void); +void proto_reg_handoff_ansi_map(void); + +/* Preference settings */ +#define MAX_SSN 254 +static range_t *global_ssn_range; +#define ANSI_MAP_TID_ONLY 0 +#define ANSI_MAP_TID_AND_SOURCE 1 +#define ANSI_MAP_TID_SOURCE_AND_DEST 2 +static gint ansi_map_response_matching_type = ANSI_MAP_TID_AND_SOURCE; + +static dissector_handle_t ansi_map_handle=NULL; + +/* Initialize the protocol and registered fields */ +static int ansi_map_tap = -1; +static int proto_ansi_map = -1; + +static int hf_ansi_map_op_code_fam = -1; +static int hf_ansi_map_op_code = -1; + +static int hf_ansi_map_reservedBitH = -1; +static int hf_ansi_map_reservedBitHG = -1; +static int hf_ansi_map_reservedBitHGFE = -1; +static int hf_ansi_map_reservedBitFED = -1; +static int hf_ansi_map_reservedBitD = -1; +static int hf_ansi_map_reservedBitED = -1; + +static int hf_ansi_map_type_of_digits = -1; +static int hf_ansi_map_na = -1; +static int hf_ansi_map_pi = -1; +static int hf_ansi_map_navail = -1; +static int hf_ansi_map_si = -1; +static int hf_ansi_map_digits_enc = -1; +static int hf_ansi_map_np = -1; +static int hf_ansi_map_nr_digits = -1; +static int hf_ansi_map_bcd_digits = -1; +static int hf_ansi_map_ia5_digits = -1; +static int hf_ansi_map_subaddr_type = -1; +static int hf_ansi_map_subaddr_odd_even = -1; +static int hf_ansi_alertcode_cadence = -1; +static int hf_ansi_alertcode_pitch = -1; +static int hf_ansi_alertcode_alertaction = -1; +static int hf_ansi_map_announcementcode_tone = -1; +static int hf_ansi_map_announcementcode_class = -1; +static int hf_ansi_map_announcementcode_std_ann = -1; +static int hf_ansi_map_announcementcode_cust_ann = -1; +static int hf_ansi_map_authorizationperiod_period = -1; +static int hf_ansi_map_value = -1; +static int hf_ansi_map_msc_type = -1; +static int hf_ansi_map_handoffstate_pi = -1; +static int hf_ansi_map_tgn = -1; +static int hf_ansi_map_tmn = -1; +static int hf_ansi_map_messagewaitingnotificationcount_tom = -1; +static int hf_ansi_map_messagewaitingnotificationcount_no_mw = -1; +static int hf_ansi_map_messagewaitingnotificationtype_mwi = -1; +static int hf_ansi_map_messagewaitingnotificationtype_apt = -1; +static int hf_ansi_map_messagewaitingnotificationtype_pt = -1; + +static int hf_ansi_map_trans_cap_prof = -1; +static int hf_ansi_map_trans_cap_busy = -1; +static int hf_ansi_map_trans_cap_ann = -1; +static int hf_ansi_map_trans_cap_rui = -1; +static int hf_ansi_map_trans_cap_spini = -1; +static int hf_ansi_map_trans_cap_uzci = -1; +static int hf_ansi_map_trans_cap_ndss = -1; +static int hf_ansi_map_trans_cap_nami = -1; +static int hf_ansi_trans_cap_multerm = -1; +static int hf_ansi_map_terminationtriggers_busy = -1; +static int hf_ansi_map_terminationtriggers_rf = -1; +static int hf_ansi_map_terminationtriggers_npr = -1; +static int hf_ansi_map_terminationtriggers_na = -1; +static int hf_ansi_map_terminationtriggers_nr = -1; +static int hf_ansi_trans_cap_tl = -1; +static int hf_ansi_map_cdmaserviceoption = -1; +static int hf_ansi_trans_cap_waddr = -1; +static int hf_ansi_map_MarketID = -1; +static int hf_ansi_map_swno = -1; +static int hf_ansi_map_idno = -1; +static int hf_ansi_map_segcount = -1; +static int hf_ansi_map_sms_originationrestrictions_fmc = -1; +static int hf_ansi_map_sms_originationrestrictions_direct = -1; +static int hf_ansi_map_sms_originationrestrictions_default = -1; +static int hf_ansi_map_systemcapabilities_auth = -1; +static int hf_ansi_map_systemcapabilities_se = -1; +static int hf_ansi_map_systemcapabilities_vp = -1; +static int hf_ansi_map_systemcapabilities_cave = -1; +static int hf_ansi_map_systemcapabilities_ssd = -1; +static int hf_ansi_map_systemcapabilities_dp = -1; + +static int hf_ansi_map_mslocation_lat = -1; +static int hf_ansi_map_mslocation_long = -1; +static int hf_ansi_map_mslocation_res = -1; +static int hf_ansi_map_nampscallmode_namps = -1; +static int hf_ansi_map_nampscallmode_amps = -1; +static int hf_ansi_map_nampschanneldata_navca = -1; +static int hf_ansi_map_nampschanneldata_CCIndicator = -1; + +static int hf_ansi_map_callingfeaturesindicator_cfufa = -1; +static int hf_ansi_map_callingfeaturesindicator_cfbfa = -1; +static int hf_ansi_map_callingfeaturesindicator_cfnafa = -1; +static int hf_ansi_map_callingfeaturesindicator_cwfa = -1; +static int hf_ansi_map_callingfeaturesindicator_3wcfa = -1; +static int hf_ansi_map_callingfeaturesindicator_pcwfa =-1; +static int hf_ansi_map_callingfeaturesindicator_dpfa = -1; +static int hf_ansi_map_callingfeaturesindicator_ahfa = -1; +static int hf_ansi_map_callingfeaturesindicator_uscfvmfa = -1; +static int hf_ansi_map_callingfeaturesindicator_uscfmsfa = -1; +static int hf_ansi_map_callingfeaturesindicator_uscfnrfa = -1; +static int hf_ansi_map_callingfeaturesindicator_cpdsfa = -1; +static int hf_ansi_map_callingfeaturesindicator_ccsfa = -1; +static int hf_ansi_map_callingfeaturesindicator_epefa = -1; +static int hf_ansi_map_callingfeaturesindicator_cdfa = -1; +static int hf_ansi_map_callingfeaturesindicator_vpfa = -1; +static int hf_ansi_map_callingfeaturesindicator_ctfa = -1; +static int hf_ansi_map_callingfeaturesindicator_cnip1fa = -1; +static int hf_ansi_map_callingfeaturesindicator_cnip2fa = -1; +static int hf_ansi_map_callingfeaturesindicator_cnirfa = -1; +static int hf_ansi_map_callingfeaturesindicator_cniroverfa = -1; +static int hf_ansi_map_cdmacallmode_cdma = -1; +static int hf_ansi_map_cdmacallmode_amps = -1; +static int hf_ansi_map_cdmacallmode_namps = -1; +static int hf_ansi_map_cdmacallmode_cls1 = -1; +static int hf_ansi_map_cdmacallmode_cls2 = -1; +static int hf_ansi_map_cdmacallmode_cls3 = -1; +static int hf_ansi_map_cdmacallmode_cls4 = -1; +static int hf_ansi_map_cdmacallmode_cls5 = -1; +static int hf_ansi_map_cdmacallmode_cls6 = -1; +static int hf_ansi_map_cdmacallmode_cls7 = -1; +static int hf_ansi_map_cdmacallmode_cls8 = -1; +static int hf_ansi_map_cdmacallmode_cls9 = -1; +static int hf_ansi_map_cdmacallmode_cls10 = -1; +static int hf_ansi_map_cdmachanneldata_Frame_Offset = -1; +static int hf_ansi_map_cdmachanneldata_CDMA_ch_no = -1; +static int hf_ansi_map_cdmachanneldata_band_cls = -1; +static int hf_ansi_map_cdmachanneldata_lc_mask_b6 = -1; +static int hf_ansi_map_cdmachanneldata_lc_mask_b5 = -1; +static int hf_ansi_map_cdmachanneldata_lc_mask_b4 = -1; +static int hf_ansi_map_cdmachanneldata_lc_mask_b3 = -1; +static int hf_ansi_map_cdmachanneldata_lc_mask_b2 = -1; +static int hf_ansi_map_cdmachanneldata_lc_mask_b1 = -1; +static int hf_ansi_map_cdmachanneldata_np_ext = -1; +static int hf_ansi_map_cdmachanneldata_nominal_pwr = -1; +static int hf_ansi_map_cdmachanneldata_nr_preamble = -1; + +static int hf_ansi_map_cdmastationclassmark_pc = -1; +static int hf_ansi_map_cdmastationclassmark_dtx = -1; +static int hf_ansi_map_cdmastationclassmark_smi = -1; +static int hf_ansi_map_cdmastationclassmark_dmi = -1; +static int hf_ansi_map_channeldata_vmac = -1; +static int hf_ansi_map_channeldata_dtx = -1; +static int hf_ansi_map_channeldata_scc = -1; +static int hf_ansi_map_channeldata_chno = -1; +static int hf_ansi_map_ConfidentialityModes_vp = -1; +static int hf_ansi_map_controlchanneldata_dcc = -1; +static int hf_ansi_map_controlchanneldata_cmac = -1; +static int hf_ansi_map_controlchanneldata_chno = -1; +static int hf_ansi_map_controlchanneldata_sdcc1 = -1; +static int hf_ansi_map_controlchanneldata_sdcc2 = -1; +static int hf_ansi_map_ConfidentialityModes_se = -1; +static int hf_ansi_map_deniedauthorizationperiod_period = -1; +static int hf_ansi_map_ConfidentialityModes_dp = -1; + +static int hf_ansi_map_originationtriggers_all = -1; +static int hf_ansi_map_originationtriggers_local = -1; +static int hf_ansi_map_originationtriggers_ilata = -1; +static int hf_ansi_map_originationtriggers_olata = -1; +static int hf_ansi_map_originationtriggers_int = -1; +static int hf_ansi_map_originationtriggers_wz = -1; +static int hf_ansi_map_originationtriggers_unrec = -1; +static int hf_ansi_map_originationtriggers_rvtc = -1; +static int hf_ansi_map_originationtriggers_star = -1; +static int hf_ansi_map_originationtriggers_ds = -1; +static int hf_ansi_map_originationtriggers_pound = -1; +static int hf_ansi_map_originationtriggers_dp = -1; +static int hf_ansi_map_originationtriggers_pa = -1; +static int hf_ansi_map_originationtriggers_nodig = -1; +static int hf_ansi_map_originationtriggers_onedig = -1; +static int hf_ansi_map_originationtriggers_twodig = -1; +static int hf_ansi_map_originationtriggers_threedig = -1; +static int hf_ansi_map_originationtriggers_fourdig = -1; +static int hf_ansi_map_originationtriggers_fivedig = -1; +static int hf_ansi_map_originationtriggers_sixdig = -1; +static int hf_ansi_map_originationtriggers_sevendig = -1; +static int hf_ansi_map_originationtriggers_eightdig = -1; +static int hf_ansi_map_originationtriggers_ninedig = -1; +static int hf_ansi_map_originationtriggers_tendig = -1; +static int hf_ansi_map_originationtriggers_elevendig = -1; +static int hf_ansi_map_originationtriggers_twelvedig = -1; +static int hf_ansi_map_originationtriggers_thirteendig = -1; +static int hf_ansi_map_originationtriggers_fourteendig = -1; +static int hf_ansi_map_originationtriggers_fifteendig = -1; +static int hf_ansi_map_triggercapability_init = -1; +static int hf_ansi_map_triggercapability_kdigit = -1; +static int hf_ansi_map_triggercapability_all = -1; +static int hf_ansi_map_triggercapability_rvtc = -1; +static int hf_ansi_map_triggercapability_oaa = -1; +static int hf_ansi_map_triggercapability_oans = -1; +static int hf_ansi_map_triggercapability_odisc = -1; +static int hf_ansi_map_triggercapability_ona = -1; +static int hf_ansi_map_triggercapability_ct = -1; +static int hf_ansi_map_triggercapability_unrec =-1; +static int hf_ansi_map_triggercapability_pa = -1; +static int hf_ansi_map_triggercapability_at = -1; +static int hf_ansi_map_triggercapability_cgraa = -1; +static int hf_ansi_map_triggercapability_it = -1; +static int hf_ansi_map_triggercapability_cdraa = -1; +static int hf_ansi_map_triggercapability_obsy = -1; +static int hf_ansi_map_triggercapability_tra = -1; +static int hf_ansi_map_triggercapability_tbusy = -1; +static int hf_ansi_map_triggercapability_tna = -1; +static int hf_ansi_map_triggercapability_tans = -1; +static int hf_ansi_map_triggercapability_tdisc = -1; +static int hf_ansi_map_winoperationscapability_conn = -1; +static int hf_ansi_map_winoperationscapability_ccdir = -1; +static int hf_ansi_map_winoperationscapability_pos = -1; +static int hf_ansi_map_PACA_Level = -1; +static int hf_ansi_map_pacaindicator_pa = -1; + +static int hf_ansi_map_point_code = -1; +static int hf_ansi_map_SSN = -1; +static int hf_ansi_map_win_trigger_list = -1; + +#include "packet-ansi_map-hf.c" + +/* Initialize the subtree pointers */ +static gint ett_ansi_map = -1; +static gint ett_mintype = -1; +static gint ett_digitstype = -1; +static gint ett_billingid = -1; +static gint ett_sms_bearer_data = -1; +static gint ett_sms_teleserviceIdentifier = -1; +static gint ett_extendedmscid = -1; +static gint ett_extendedsystemmytypecode = -1; +static gint ett_handoffstate = -1; +static gint ett_mscid = -1; +static gint ett_cdmachanneldata = -1; +static gint ett_cdmastationclassmark = -1; +static gint ett_channeldata = -1; +static gint ett_confidentialitymodes = -1; +static gint ett_controlchanneldata = -1; +static gint ett_CDMA2000HandoffInvokeIOSData = -1; +static gint ett_CDMA2000HandoffResponseIOSData = -1; +static gint ett_originationtriggers = -1; +static gint ett_pacaindicator = -1; +static gint ett_callingpartyname = -1; +static gint ett_triggercapability = -1; +static gint ett_winoperationscapability = -1; +static gint ett_win_trigger_list = -1; +static gint ett_controlnetworkid = -1; +static gint ett_transactioncapability = -1; +static gint ett_cdmaserviceoption = -1; +static gint ett_systemcapabilities = -1; +static gint ett_sms_originationrestrictions = -1; + +#include "packet-ansi_map-ett.c" + +static expert_field ei_ansi_map_nr_not_used = EI_INIT; +static expert_field ei_ansi_map_unknown_invokeData_blob = EI_INIT; +static expert_field ei_ansi_map_no_data = EI_INIT; + +/* Global variables */ +static dissector_table_t is637_tele_id_dissector_table; /* IS-637 Teleservice ID */ +static dissector_table_t is683_dissector_table; /* IS-683-A (OTA) */ +static dissector_table_t is801_dissector_table; /* IS-801 (PLD) */ +static packet_info *g_pinfo; +static proto_tree *g_tree; +tvbuff_t *SMS_BearerData_tvb = NULL; +gint32 ansi_map_sms_tele_id = -1; +static gboolean is683_ota; +static gboolean is801_pld; +static gboolean ansi_map_is_invoke; +static guint32 OperationCode; +static guint8 ServiceIndicator; + + +struct ansi_map_invokedata_t { + guint32 opcode; + guint8 ServiceIndicator; +}; + +static void dissect_ansi_map_win_trigger_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_); + + +/* Transaction table */ +static GHashTable *TransactionId_table=NULL; + +static void +ansi_map_init(void) +{ + TransactionId_table = g_hash_table_new(g_str_hash, g_str_equal); +} + +static void +ansi_map_cleanup(void) +{ + /* Destroy any existing memory chunks / hashes. */ + g_hash_table_destroy(TransactionId_table); +} + +/* Store Invoke information needed for the corresponding reply */ +static void +update_saved_invokedata(packet_info *pinfo, struct ansi_tcap_private_t *p_private_tcap){ + struct ansi_map_invokedata_t *ansi_map_saved_invokedata; + address* src = &(pinfo->src); + address* dst = &(pinfo->dst); + guint8 *src_str; + guint8 *dst_str; + const char *buf = NULL; + + src_str = address_to_str(wmem_packet_scope(), src); + dst_str = address_to_str(wmem_packet_scope(), dst); + + /* Data from the TCAP dissector */ + if ((!pinfo->fd->flags.visited)&&(p_private_tcap->TransactionID_str)){ + /* Only do this once XXX I hope it's the right thing to do */ + /* The hash string needs to contain src and dest to distiguish differnt flows */ + switch(ansi_map_response_matching_type){ + case ANSI_MAP_TID_ONLY: + buf = wmem_strdup(wmem_packet_scope(), p_private_tcap->TransactionID_str); + break; + case ANSI_MAP_TID_AND_SOURCE: + buf = wmem_strdup_printf(wmem_packet_scope(), "%s%s",p_private_tcap->TransactionID_str,src_str); + break; + case ANSI_MAP_TID_SOURCE_AND_DEST: + default: + buf = wmem_strdup_printf(wmem_packet_scope(), "%s%s%s",p_private_tcap->TransactionID_str,src_str,dst_str); + break; + } + /* If the entry allready exists don't owervrite it */ + ansi_map_saved_invokedata = (struct ansi_map_invokedata_t *)g_hash_table_lookup(TransactionId_table,buf); + if(ansi_map_saved_invokedata) + return; + + ansi_map_saved_invokedata = wmem_new(wmem_file_scope(), struct ansi_map_invokedata_t); + ansi_map_saved_invokedata->opcode = p_private_tcap->d.OperationCode_private; + ansi_map_saved_invokedata->ServiceIndicator = ServiceIndicator; + + g_hash_table_insert(TransactionId_table, + wmem_strdup(wmem_file_scope(), buf), + ansi_map_saved_invokedata); + + /*g_warning("Invoke Hash string %s pkt: %u",buf,pinfo->num);*/ + } +} +/* value strings */ +const value_string ansi_map_opr_code_strings[] = { + { 1, "Handoff Measurement Request" }, + { 2, "Facilities Directive" }, + { 3, "Mobile On Channel" }, + { 4, "Handoff Back" }, + { 5, "Facilities Release" }, + { 6, "Qualification Request" }, + { 7, "Qualification Directive" }, + { 8, "Blocking" }, + { 9, "Unblocking" }, + { 10, "Reset Circuit" }, + { 11, "Trunk Test" }, + { 12, "Trunk Test Disconnect" }, + { 13, "Registration Notification" }, + { 14, "Registration Cancellation" }, + { 15, "Location Request" }, + { 16, "Routing Request" }, + { 17, "Feature Request" }, + { 18, "Reserved 18 (Service Profile Request, IS-41-C)" }, + { 19, "Reserved 19 (Service Profile Directive, IS-41-C)" }, + { 20, "Unreliable Roamer Data Directive" }, + { 21, "Reserved 21 (Call Data Request, IS-41-C)" }, + { 22, "MS Inactive" }, + { 23, "Transfer To Number Request" }, + { 24, "Redirection Request" }, + { 25, "Handoff To Third" }, + { 26, "Flash Request" }, + { 27, "Authentication Directive" }, + { 28, "Authentication Request" }, + { 29, "Base Station Challenge" }, + { 30, "Authentication Failure Report" }, + { 31, "Count Request" }, + { 32, "Inter System Page" }, + { 33, "Unsolicited Response" }, + { 34, "Bulk Deregistration" }, + { 35, "Handoff Measurement Request 2" }, + { 36, "Facilities Directive 2" }, + { 37, "Handoff Back 2" }, + { 38, "Handoff To Third 2" }, + { 39, "Authentication Directive Forward" }, + { 40, "Authentication Status Report" }, + { 41, "Reserved 41" }, + { 42, "Information Directive" }, + { 43, "Information Forward" }, + { 44, "Inter System Answer" }, + { 45, "Inter System Page 2" }, + { 46, "Inter System Setup" }, + { 47, "Origination Request" }, + { 48, "Random Variable Request" }, + { 49, "Redirection Directive" }, + { 50, "Remote User Interaction Directive" }, + { 51, "SMS Delivery Backward" }, + { 52, "SMS Delivery Forward" }, + { 53, "SMS Delivery Point to Point" }, + { 54, "SMS Notification" }, + { 55, "SMS Request" }, + { 56, "OTASP Request" }, + { 57, "Information Backward" }, + { 58, "Change Facilities" }, + { 59, "Change Service" }, + { 60, "Parameter Request" }, + { 61, "TMSI Directive" }, + { 62, "NumberPortabilityRequest" }, + { 63, "Service Request" }, + { 64, "Analyzed Information Request" }, + { 65, "Connection Failure Report" }, + { 66, "Connect Resource" }, + { 67, "Disconnect Resource" }, + { 68, "Facility Selected and Available" }, + { 69, "Instruction Request" }, + { 70, "Modify" }, + { 71, "Reset Timer" }, + { 72, "Search" }, + { 73, "Seize Resource" }, + { 74, "SRF Directive" }, + { 75, "T Busy" }, + { 76, "T NoAnswer" }, + { 77, "Release" }, + { 78, "SMS Delivery Point to Point Ack" }, + { 79, "Message Directive" }, + { 80, "Bulk Disconnection" }, + { 81, "Call Control Directive" }, + { 82, "O Answer" }, + { 83, "O Disconnect" }, + { 84, "Call Recovery Report" }, + { 85, "T Answer" }, + { 86, "T Disconnect" }, + { 87, "Unreliable Call Data" }, + { 88, "O CalledPartyBusy" }, + { 89, "O NoAnswer" }, + { 90, "Position Request" }, + { 91, "Position Request Forward" }, + { 92, "Call Termination Report" }, + { 93, "Geo Position Directive" }, + { 94, "Geo Position Request" }, + { 95, "Inter System Position Request" }, + { 96, "Inter System Position Request Forward" }, + { 97, "ACG Directive" }, + { 98, "Roamer Database Verification Request" }, + { 99, "Add Service" }, + { 100, "Drop Service" }, + { 101, "InterSystemSMSPage" }, + { 102, "LCSParameterRequest" }, + { 103, "Unknown ANSI-MAP PDU" }, + { 104, "Unknown ANSI-MAP PDU" }, + { 105, "Unknown ANSI-MAP PDU" }, + { 106, "PositionEventNotification" }, + { 107, "Unknown ANSI-MAP PDU" }, + { 108, "Unknown ANSI-MAP PDU" }, + { 109, "Unknown ANSI-MAP PDU" }, + { 110, "Unknown ANSI-MAP PDU" }, + { 111, "InterSystemSMSDelivery-PointToPoint" }, + { 112, "QualificationRequest2" }, + { 0, NULL }, +}; +static value_string_ext ansi_map_opr_code_strings_ext = VALUE_STRING_EXT_INIT(ansi_map_opr_code_strings); + +static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx); +static int dissect_returnData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx); +static int dissect_ansi_map_SystemMyTypeCode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_); + +static dgt_set_t Dgt_tbcd = { + { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e */ + '0','1','2','3','4','5','6','7','8','9','?','B','C','*','#','?' + } +}; + +/* Type of Digits (octet 1, bits A-H) */ +static const value_string ansi_map_type_of_digits_vals[] = { + { 0, "Not Used" }, + { 1, "Dialed Number or Called Party Number" }, + { 2, "Calling Party Number" }, + { 3, "Caller Interaction" }, + { 4, "Routing Number" }, + { 5, "Billing Number" }, + { 6, "Destination Number" }, + { 7, "LATA" }, + { 8, "Carrier" }, + { 0, NULL } +}; +/* Nature of Number (octet 2, bits A-H )*/ +static const true_false_string ansi_map_na_bool_val = { + "International", + "National" +}; +static const true_false_string ansi_map_pi_bool_val = { + "Presentation Restricted", + "Presentation Allowed" +}; +static const true_false_string ansi_map_navail_bool_val = { + "Number is not available", + "Number is available" +}; +#if 0 +static const true_false_string ansi_map_si_bool_val = { + "User provided, screening passed", + "User provided, not screened" +}; +#endif +static const value_string ansi_map_si_vals[] = { + { 0, "User provided, not screened"}, + { 1, "User provided, screening passed"}, + { 2, "User provided, screening failed"}, + { 3, "Network provided"}, + { 0, NULL } +}; +/* Encoding (octet 3, bits A-D) */ +static const value_string ansi_map_digits_enc_vals[] = { + { 0, "Not used"}, + { 1, "BCD"}, + { 2, "IA5"}, + { 3, "Octet string"}, + { 0, NULL } +}; +/* Numbering Plan (octet 3, bits E-H) */ +static const value_string ansi_map_np_vals[] = { + { 0, "Unknown or not applicable"}, + { 1, "ISDN Numbering"}, + { 2, "Telephony Numbering (ITU-T Rec. E.164,E.163)"}, + { 3, "Data Numbering (ITU-T Rec. X.121)"}, + { 4, "Telex Numbering (ITU-T Rec. F.69)"}, + { 5, "Maritime Mobile Numbering"}, + { 6, "Land Mobile Numbering (ITU-T Rec. E.212)"}, + { 7, "Private Numbering Plan"}, + { 13, "SS7 Point Code (PC) and Subsystem Number (SSN)"}, + { 14, "Internet Protocol (IP) Address."}, + { 15, "Reserved for extension"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_min_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + const char *digit_str; + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_mintype); + + digit_str = tvb_bcd_dig_to_wmem_packet_str(tvb, offset, tvb_reported_length_remaining(tvb,offset), NULL, FALSE); + proto_tree_add_string(subtree, hf_ansi_map_bcd_digits, tvb, offset, -1, digit_str); + proto_item_append_text(actx->created_item, " - %s", digit_str); +} + +static void +dissect_ansi_map_digits_type(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + guint8 octet , octet_len; + guint8 b1,b2,b3,b4; + int offset = 0; + const char *digit_str; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_digitstype); + + /* Octet 1 */ + proto_tree_add_item(subtree, hf_ansi_map_type_of_digits, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Octet 2 */ + proto_tree_add_item(subtree, hf_ansi_map_reservedBitHG, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_si, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_reservedBitD, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_navail, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_pi, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_na, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Octet 3 */ + octet = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_np, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_digits_enc, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Octet 4 - */ + switch(octet>>4){ + case 0:/* Unknown or not applicable */ + switch ((octet&0xf)){ + case 1: + /* BCD Coding */ + octet_len = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_nr_digits, tvb, offset, 1, ENC_BIG_ENDIAN); + if(octet_len == 0) + return; + offset++; + digit_str = tvb_bcd_dig_to_wmem_packet_str(tvb, offset, tvb_reported_length_remaining(tvb,offset), &Dgt_tbcd, FALSE); + proto_tree_add_string(subtree, hf_ansi_map_bcd_digits, tvb, offset, -1, digit_str); + proto_item_append_text(actx->created_item, " - %s", digit_str); + break; + case 2: + /* IA5 Coding */ + octet_len = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_nr_digits, tvb, offset, 1, ENC_BIG_ENDIAN); + if(octet_len == 0) + return; + offset++; + proto_tree_add_item(subtree, hf_ansi_map_ia5_digits, tvb, offset, -1, ENC_ASCII|ENC_NA); + proto_item_append_text(actx->created_item, " - %s", tvb_get_string_enc(wmem_packet_scope(),tvb,offset,tvb_reported_length_remaining(tvb,offset),ENC_ASCII|ENC_NA)); + break; + case 3: + /* Octet string */ + break; + default: + break; + } + break; + case 1:/* ISDN Numbering (not used in this Standard). */ + case 3:/* Data Numbering (ITU-T Rec. X.121) (not used in this Standard). */ + case 4:/* Telex Numbering (ITU-T Rec. F.69) (not used in this Standard). */ + case 5:/* Maritime Mobile Numbering (not used in this Standard). */ + proto_tree_add_expert(subtree, pinfo, &ei_ansi_map_nr_not_used, tvb, offset, -1); + break; + case 2:/* Telephony Numbering (ITU-T Rec. E.164,E.163). */ + case 6:/* Land Mobile Numbering (ITU-T Rec. E.212) */ + case 7:/* Private Numbering Plan */ + octet_len = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_nr_digits, tvb, offset, 1, ENC_BIG_ENDIAN); + if(octet_len == 0) + return; + offset++; + switch ((octet&0xf)){ + case 1: + /* BCD Coding */ + digit_str = tvb_bcd_dig_to_wmem_packet_str(tvb, offset, tvb_reported_length_remaining(tvb,offset), &Dgt_tbcd, FALSE); + proto_tree_add_string(subtree, hf_ansi_map_bcd_digits, tvb, offset, -1, digit_str); + proto_item_append_text(actx->created_item, " - %s", digit_str); + break; + case 2: + /* IA5 Coding */ + proto_tree_add_item(subtree, hf_ansi_map_ia5_digits, tvb, offset, -1, ENC_ASCII|ENC_NA); + proto_item_append_text(actx->created_item, " - %s", tvb_get_string_enc(wmem_packet_scope(),tvb,offset,tvb_reported_length_remaining(tvb,offset),ENC_ASCII|ENC_NA)); + break; + case 3: + /* Octet string */ + break; + default: + break; + } + break; + case 13:/* ANSI SS7 Point Code (PC) and Subsystem Number (SSN). */ + switch ((octet&0xf)){ + case 3: + /* Octet string */ + /* Point Code Member Number octet 2 */ + b1 = tvb_get_guint8(tvb,offset); + offset++; + /* Point Code Cluster Number octet 3 */ + b2 = tvb_get_guint8(tvb,offset); + offset++; + /* Point Code Network Number octet 4 */ + b3 = tvb_get_guint8(tvb,offset); + offset++; + proto_tree_add_bytes_format_value(subtree, hf_ansi_map_point_code, tvb, offset-3, 3, NULL, "%u-%u-%u", b3, b2, b1); + /* Subsystem Number (SSN) octet 5 */ + b4 = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_SSN, tvb, offset, 1, ENC_NA); + proto_item_append_text(actx->created_item, " - Point Code %u-%u-%u SSN %u", b3, b2, b1, b4); + break; + default: + break; + } + break; + case 14:/* Internet Protocol (IP) Address. */ + break; + default: + proto_tree_add_expert(subtree, pinfo, &ei_ansi_map_nr_not_used, tvb, offset, -1); + break; + } + +} +/* 6.5.3.13. Subaddress */ + +#if 0 +static const true_false_string ansi_map_Odd_Even_Ind_bool_val = { + "Odd", + "Even" +}; +#endif +/* Type of Subaddress (octet 1, bits E-G) */ +static const value_string ansi_map_sub_addr_type_vals[] = { + { 0, "NSAP (CCITT Rec. X.213 or ISO 8348 AD2)"}, + { 1, "User specified"}, + { 2, "Reserved"}, + { 3, "Reserved"}, + { 4, "Reserved"}, + { 5, "Reserved"}, + { 6, "Reserved"}, + { 7, "Reserved"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_subaddress(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + /* Type of Subaddress (octet 1, bits E-G) */ + proto_tree_add_item(subtree, hf_ansi_map_subaddr_type, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Odd/Even Indicator (O/E) (octet 1, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_subaddr_odd_even, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* + * 6.5.2.2 ActionCode + * Table 114 ActionCode value + * + * 6.5.2.2 ActionCode(TIA/EIA-41.5-D, page 5-129) */ + +static const value_string ansi_map_ActionCode_vals[] = { + { 0, "Not used"}, + { 1, "Continue processing"}, + { 2, "Disconnect call"}, + { 3, "Disconnect call leg"}, + { 4, "Conference Calling Drop Last Party"}, + { 5, "Bridge call leg(s) to conference call"}, + { 6, "Drop call leg on busy or routing failure"}, + { 7, "Disconnect all call legs"}, + { 8, "Attach MSC to OTAF"}, + { 9, "Initiate RegistrationNotification"}, + { 10, "Generate Public Encryption values"}, + { 11, "Generate A-key"}, + { 12, "Perform SSD Update procedure"}, + { 13, "Perform Re-authentication procedure"}, + { 14, "Release TRN"}, + { 15, "Commit A-key"}, + { 16, "Release Resources (e.g., A-key, Traffic Channel)"}, + { 17, "Record NEWMSID"}, + { 18, "Allocate Resources (e.g., Multiple message traffic channel delivery)."}, + { 19, "Generate Authentication Signature"}, + { 20, "Release leg and redirect subscriber"}, + { 21, "Do Not Wait For MS User Level Response"}, + { 22, "Prepare for CDMA Handset-Based Position Determination"}, + { 23, "CDMA Handset-Based Position Determination Complete"}, + { 0, NULL } +}; +static value_string_ext ansi_map_ActionCode_vals_ext = VALUE_STRING_EXT_INIT(ansi_map_ActionCode_vals); + +/* 6.5.2.3 AlertCode */ + +/* Pitch (octet 1, bits G-H) */ +static const value_string ansi_map_AlertCode_Pitch_vals[] = { + { 0, "Medium pitch"}, + { 1, "High pitch"}, + { 2, "Low pitch"}, + { 3, "Reserved"}, + { 0, NULL } +}; +/* Cadence (octet 1, bits A-F) */ +static const value_string ansi_map_AlertCode_Cadence_vals[] = { + { 0, "NoTone"}, + { 1, "Long"}, + { 2, "ShortShort"}, + { 3, "ShortShortLong"}, + { 4, "ShortShort2"}, + { 5, "ShortLongShort"}, + { 6, "ShortShortShortShort"}, + { 7, "PBXLong"}, + { 8, "PBXShortShort"}, + { 9, "PBXShortShortLong"}, + + { 10, "PBXShortLongShort"}, + { 11, "PBXShortShortShortShort"}, + { 12, "PipPipPipPip"}, + { 13, "Reserved. Treat the same as value 0, NoTone"}, + { 14, "Reserved. Treat the same as value 0, NoTone"}, + { 15, "Reserved. Treat the same as value 0, NoTone"}, + { 16, "Reserved. Treat the same as value 0, NoTone"}, + { 17, "Reserved. Treat the same as value 0, NoTone"}, + { 18, "Reserved. Treat the same as value 0, NoTone"}, + { 19, "Reserved. Treat the same as value 0, NoTone"}, + { 0, NULL } +}; + +/* Alert Action (octet 2, bits A-C) */ +static const value_string ansi_map_AlertCode_Alert_Action_vals[] = { + { 0, "Alert without waiting to report"}, + { 1, "Apply a reminder alert once"}, + { 2, "Other values reserved. Treat the same as value 0, Alert without waiting to report"}, + { 3, "Other values reserved. Treat the same as value 0, Alert without waiting to report"}, + { 4, "Other values reserved. Treat the same as value 0, Alert without waiting to report"}, + { 5, "Other values reserved. Treat the same as value 0, Alert without waiting to report"}, + { 6, "Other values reserved. Treat the same as value 0, Alert without waiting to report"}, + { 7, "Other values reserved. Treat the same as value 0, Alert without waiting to report"}, + { 0, NULL } +}; +static void +dissect_ansi_map_alertcode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + /* Pitch (octet 1, bits G-H) */ + proto_tree_add_item(subtree, hf_ansi_alertcode_pitch, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Cadence (octet 1, bits A-F) */ + proto_tree_add_item(subtree, hf_ansi_alertcode_cadence, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + /* Alert Action (octet 2, bits A-C) */ + proto_tree_add_item(subtree, hf_ansi_alertcode_alertaction, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.4 AlertResult */ +/* Result (octet 1) */ +static const value_string ansi_map_AlertResult_result_vals[] = { + { 0, "Not specified"}, + { 1, "Success"}, + { 2, "Failure"}, + { 3, "Denied"}, + { 4, "NotAttempted"}, + { 5, "NoPageResponse"}, + { 6, "Busy"}, + { 0, NULL } +}; + +/* 6.5.2.5 AnnouncementCode Updatef from NS0018Re*/ +/* Tone (octet 1) */ +static const value_string ansi_map_AnnouncementCode_tone_vals[] = { + { 0, "DialTone"}, + { 1, "RingBack or AudibleAlerting"}, + { 2, "InterceptTone or MobileReorder"}, + { 3, "CongestionTone or ReorderTone"}, + { 4, "BusyTone"}, + { 5, "ConfirmationTone"}, + { 6, "AnswerTone"}, + { 7, "CallWaitingTone"}, + { 8, "OffHookTone"}, + { 17, "RecallDialTone"}, + { 18, "BargeInTone"}, + { 20, "PPCInsufficientTone"}, + { 21, "PPCWarningTone1"}, + { 22, "PPCWarningTone2"}, + { 23, "PPCWarningTone3"}, + { 24, "PPCDisconnectTone"}, + { 25, "PPCRedirectTone"}, + { 63, "TonesOff"}, + { 192, "PipTone"}, + { 193, "AbbreviatedIntercept"}, + { 194, "AbbreviatedCongestion"}, + { 195, "WarningTone"}, + { 196, "DenialToneBurst"}, + { 197, "DialToneBurst"}, + { 250, "IncomingAdditionalCallTone"}, + { 251, "PriorityAdditionalCallTone"}, + { 0, NULL } +}; +/* Class (octet 2, bits A-D) */ +static const value_string ansi_map_AnnouncementCode_class_vals[] = { + { 0, "Concurrent"}, + { 1, "Sequential"}, + { 0, NULL } +}; +/* Standard Announcement (octet 3) Updated with N.S0015 */ +static const value_string ansi_map_AnnouncementCode_std_ann_vals[] = { + { 0, "None"}, + { 1, "UnauthorizedUser"}, + { 2, "InvalidESN"}, + { 3, "UnauthorizedMobile"}, + { 4, "SuspendedOrigination"}, + { 5, "OriginationDenied"}, + { 6, "ServiceAreaDenial"}, + { 16, "PartialDial"}, + { 17, "Require1Plus"}, + { 18, "Require1PlusNPA"}, + { 19, "Require0Plus"}, + { 20, "Require0PlusNPA"}, + { 21, "Deny1Plus"}, + { 22, "Unsupported10plus"}, + { 23, "Deny10plus"}, + { 24, "Unsupported10XXX"}, + { 25, "Deny10XXX"}, + { 26, "Deny10XXXLocally"}, + { 27, "Require10Plus"}, + { 28, "RequireNPA"}, + { 29, "DenyTollOrigination"}, + { 30, "DenyInternationalOrigination"}, + { 31, "Deny0Minus"}, + { 48, "DenyNumber"}, + { 49, "AlternateOperatorServices"}, + { 64, "No Circuit or AllCircuitsBusy or FacilityProblem"}, + { 65, "Overload"}, + { 66, "InternalOfficeFailure"}, + { 67, "NoWinkReceived"}, + { 68, "InterofficeLinkFailure"}, + { 69, "Vacant"}, + { 70, "InvalidPrefix or InvalidAccessCode"}, + { 71, "OtherDialingIrregularity"}, + { 80, "VacantNumber or DisconnectedNumber"}, + { 81, "DenyTermination"}, + { 82, "SuspendedTermination"}, + { 83, "ChangedNumber"}, + { 84, "InaccessibleSubscriber"}, + { 85, "DenyIncomingTol"}, + { 86, "RoamerAccessScreening"}, + { 87, "RefuseCall"}, + { 88, "RedirectCall"}, + { 89, "NoPageResponse"}, + { 90, "NoAnswer"}, + { 96, "RoamerIntercept"}, + { 97, "GeneralInformation"}, + { 112, "UnrecognizedFeatureCode"}, + { 113, "UnauthorizedFeatureCode"}, + { 114, "RestrictedFeatureCode"}, + { 115, "InvalidModifierDigits"}, + { 116, "SuccessfulFeatureRegistration"}, + { 117, "SuccessfulFeatureDeRegistration"}, + { 118, "SuccessfulFeatureActivation"}, + { 119, "SuccessfulFeatureDeActivation"}, + { 120, "InvalidForwardToNumber"}, + { 121, "CourtesyCallWarning"}, + { 128, "EnterPINSendPrompt"}, + { 129, "EnterPINPrompt"}, + { 130, "ReEnterPINSendPrompt"}, + { 131, "ReEnterPINPrompt"}, + { 132, "EnterOldPINSendPrompt"}, + { 133, "EnterOldPINPrompt"}, + { 134, "EnterNewPINSendPrompt"}, + { 135, "EnterNewPINPrompt"}, + { 136, "ReEnterNewPINSendPrompt"}, + { 137, "ReEnterNewPINPrompt"}, + { 138, "EnterPasswordPrompt"}, + { 139, "EnterDirectoryNumberPrompt"}, + { 140, "ReEnterDirectoryNumberPrompt"}, + { 141, "EnterFeatureCodePrompt"}, + { 142, "EnterEnterCreditCardNumberPrompt"}, + { 143, "EnterDestinationNumberPrompt"}, + { 152, "PPCInsufficientAccountBalance"}, + { 153, "PPCFiveMinuteWarning"}, + { 154, "PPCThreeMinuteWarning"}, + { 155, "PPCTwoMinuteWarning"}, + { 156, "PPCOneMinuteWarning"}, + { 157, "PPCDisconnect"}, + { 158, "PPCRedirect"}, + { 0, NULL } +}; + + + +static void +dissect_ansi_map_announcementcode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + + /* Tone (octet 1) */ + proto_tree_add_item(subtree, hf_ansi_map_announcementcode_tone, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Class (octet 2, bits A-D) */ + proto_tree_add_item(subtree, hf_ansi_map_announcementcode_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Standard Announcement (octet 3) */ + proto_tree_add_item(subtree, hf_ansi_map_announcementcode_std_ann, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Custom Announcement ( octet 4 ) + e. The assignment of this octet is left to bilateral agreement. When a Custom + Announcement is specified it takes precedence over either the Standard + Announcement or Tone + */ + proto_tree_add_item(subtree, hf_ansi_map_announcementcode_cust_ann, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.8 AuthenticationCapability Updated N.S0003*/ +static const value_string ansi_map_AuthenticationCapability_vals[] = { + { 0, "Not used"}, + { 1, "No authentication required"}, + { 2, "Authentication required"}, + { 128, "Authentication required and UIM capable."}, + { 0, NULL } +}; + +/* 6.5.2.14 AuthorizationPeriod*/ + +/* Period (octet 1) */ +static const value_string ansi_map_authorizationperiod_period_vals[] = { + { 0, "Not used"}, + { 1, "Per Call"}, + { 2, "Hours"}, + { 3, "Days"}, + { 4, "Weeks"}, + { 5, "Per Agreement"}, + { 6, "Indefinite (i.e., authorized until canceled or deregistered)"}, + { 7, "Number of calls. Re-authorization should be attempted after this number of (rejected) call attempts"}, + { 0, NULL } +}; +/* Value (octet 2) +Number of minutes hours, days, weeks, or +number of calls (as per Period). If Period +indicates anything else the Value is set to zero +on sending and ignored on receipt. +*/ +static void +dissect_ansi_map_authorizationperiod(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + proto_tree_add_item(subtree, hf_ansi_map_authorizationperiod_period, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_value, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.15 AvailabilityType */ +static const value_string ansi_map_AvailabilityType_vals[] = { + { 0, "Not used"}, + { 1, "Unspecified MS inactivity type"}, + { 0, NULL } +}; + +/* 6.5.2.16 BillingID */ +static void +dissect_ansi_map_billingid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + + proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* ID Number */ + proto_tree_add_item(subtree, hf_ansi_map_idno, tvb, offset, 3, ENC_BIG_ENDIAN); + offset = offset + 3; + proto_tree_add_item(subtree, hf_ansi_map_segcount, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + + +/* 6.5.2.20 CallingFeaturesIndicator */ +static const value_string ansi_map_FeatureActivity_vals[] = { + { 0, "Not used"}, + { 1, "Not authorized"}, + { 2, "Authorized but de-activated"}, + { 3, "Authorized and activated"}, + { 0, NULL } +}; + + +static void +dissect_ansi_map_callingfeaturesindicator(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + int length; + + proto_tree *subtree; + + length = tvb_reported_length_remaining(tvb,offset); + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + + /* Call Waiting: FeatureActivity, CW-FA (Octet 1 bits GH ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cwfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Forwarding No Answer FeatureActivity, CFNA-FA (Octet 1 bits EF ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cfnafa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Forwarding Busy FeatureActivity, CFB-FA (Octet 1 bits CD ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cfbfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Forwarding Unconditional FeatureActivity, CFU-FA (Octet 1 bits AB ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cfufa, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + length--; + + /* Call Transfer: FeatureActivity, CT-FA (Octet 2 bits GH ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_ctfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Voice Privacy FeatureActivity, VP-FA (Octet 2 bits EF ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_vpfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Delivery: FeatureActivity (not interpreted on reception by IS-41-C or later) + CD-FA (Octet 2 bits CD ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cdfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Three-Way Calling FeatureActivity, 3WC-FA (Octet 2 bits AB ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_3wcfa, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + length--; + + + /* Calling Number Identification Restriction Override FeatureActivity CNIROver-FA (Octet 3 bits GH ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cniroverfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Calling Number Identification Restriction: FeatureActivity CNIR-FA (Octet 3 bits EF ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cnirfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Calling Number Identification Presentation: FeatureActivity CNIP2-FA (Octet 3 bits CD ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cnip2fa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Calling Number Identification Presentation: FeatureActivity CNIP1-FA (Octet 3 bits AB ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cnip1fa, tvb, offset, 1, ENC_BIG_ENDIAN); + length--; + if ( length == 0) + return; + offset++; + + /* USCF divert to voice mail: FeatureActivity USCFvm-FA (Octet 4 bits GH ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_uscfvmfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Answer Hold: FeatureActivity AH-FA (Octet 4 bits EF ) N.S0029-0 v1.0 */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_ahfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Data Privacy Feature Activity DP-FA (Octet 4 bits CD ) N.S0008-0 v 1.0 */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_dpfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Priority Call Waiting FeatureActivity PCW-FA (Octet 4 bits AB ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_pcwfa, tvb, offset, 1, ENC_BIG_ENDIAN); + length--; + if ( length == 0) + return; + offset++; + + /* USCF divert to mobile station provided DN:FeatureActivity.USCFms-FA (Octet 5 bits AB ) */ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_uscfmsfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* USCF divert to network registered DN:FeatureActivity. USCFnr-FA (Octet 5 bits CD )*/ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_uscfnrfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* CDMA-Packet Data Service: FeatureActivity. CPDS-FA (Octet 5 bits EF ) N.S0029-0 v1.0*/ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cpdsfa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* CDMA-Concurrent Service:FeatureActivity. CCS-FA (Octet 5 bits GH ) N.S0029-0 v1.0*/ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_ccsfa, tvb, offset, 1, ENC_BIG_ENDIAN); + length--; + if ( length == 0) + return; + offset++; + + /* TDMA Enhanced Privacy and Encryption:FeatureActivity.TDMA EPE-FA (Octet 6 bits AB ) N.S0029-0 v1.0*/ + proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_epefa, tvb, offset, 1, ENC_BIG_ENDIAN); +} + + +/* 6.5.2.27 CancellationType */ +static const value_string ansi_map_CancellationType_vals[] = { + { 0, "Not used"}, + { 1, "ServingSystemOption"}, + { 2, "ReportInCall."}, + { 3, "Discontinue"}, + { 0, NULL } +}; + +/* 6.5.2.29 CDMACallMode Updated with N.S0029-0 v1.0*/ +/* Call Mode (octet 1, bit A) */ +static const true_false_string ansi_map_CDMACallMode_cdma_bool_val = { + "CDMA 800 MHz channel (Band Class 0) acceptable.", + "CDMA 800 MHz channel (Band Class 0) not acceptable" +}; +/* Call Mode (octet 1, bit B) */ +static const true_false_string ansi_map_CallMode_amps_bool_val = { + "AAMPS 800 MHz channel acceptable", + "AMPS 800 MHz channel not acceptable" +}; +/* Call Mode (octet 1, bit C) */ +static const true_false_string ansi_map_CallMode_namps_bool_val = { + "NAMPS 800 MHz channel acceptable", + "NAMPS 800 MHz channel not acceptable" +}; +/* Call Mode (octet 1, bit D) */ +static const true_false_string ansi_map_CDMACallMode_cls1_bool_val = { + "CDMA 1900 MHz channel (Band Class 1) acceptable.", + "CDMA 1900 MHz channel (Band Class 1) not acceptable" +}; +/* Call Mode (octet 1, bit E) */ +static const true_false_string ansi_map_CDMACallMode_cls2_bool_val = { + "TACS channel (Band Class 2) acceptable", + "TACS channel (Band Class 2) not acceptable" +}; +/* Call Mode (octet 1, bit F) */ +static const true_false_string ansi_map_CDMACallMode_cls3_bool_val = { + "JTACS channel (Band Class 3) acceptable", + "JTACS channel (Band Class 3) not acceptable" +}; +/* Call Mode (octet 1, bit G) */ +static const true_false_string ansi_map_CDMACallMode_cls4_bool_val = { + "Korean PCS channel (Band Class 4) acceptable", + "Korean PCS channel (Band Class 4) not acceptable" +}; +/* Call Mode (octet 1, bit H) */ +static const true_false_string ansi_map_CDMACallMode_cls5_bool_val = { + "450 MHz channel (Band Class 5) not acceptable", + "450 MHz channel (Band Class 5) not acceptable" +}; +/* Call Mode (octet 2, bit A) */ +static const true_false_string ansi_map_CDMACallMode_cls6_bool_val = { + "2 GHz channel (Band Class 6) acceptable.", + "2 GHz channel (Band Class 6) not acceptable." +}; + +/* Call Mode (octet 2, bit B) */ +static const true_false_string ansi_map_CDMACallMode_cls7_bool_val = { + "700 MHz channel (Band Class 7) acceptable", + "700 MHz channel (Band Class 7) not acceptable" +}; + +/* Call Mode (octet 2, bit C) */ +static const true_false_string ansi_map_CDMACallMode_cls8_bool_val = { + "1800 MHz channel (Band Class 8) acceptable", + "1800 MHz channel (Band Class 8) not acceptable" +}; +/* Call Mode (octet 2, bit D) */ +static const true_false_string ansi_map_CDMACallMode_cls9_bool_val = { + "900 MHz channel (Band Class 9) acceptable", + "900 MHz channel (Band Class 9) not acceptable" +}; +/* Call Mode (octet 2, bit E) */ +static const true_false_string ansi_map_CDMACallMode_cls10_bool_val = { + "Secondary 800 MHz channel (Band Class 10) acceptable.", + "Secondary 800 MHz channel (Band Class 10) not acceptable." +}; + +static void +dissect_ansi_map_cdmacallmode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + int length; + + proto_tree *subtree; + + length = tvb_reported_length_remaining(tvb,offset); + + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + /* Call Mode (octet 1, bit H) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls5, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit G) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls4, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit F) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls3, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls2, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls1, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_namps, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_amps, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cdma, tvb, offset, 1, ENC_BIG_ENDIAN); + + length--; + if ( length == 0) + return; + offset++; + + /* Call Mode (octet 2, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls10, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 2, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls9, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 2, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls8, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 2, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls7, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Mode (octet 2, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls6, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.30 CDMAChannelData */ +/* Updated with N.S0010-0 v 1.0 */ + +static const value_string ansi_map_cdmachanneldata_band_cls_vals[] = { + { 0, "800 MHz Cellular System"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_cdmachanneldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + int length; + + proto_tree *subtree; + + length = tvb_reported_length_remaining(tvb,offset); + + + subtree = proto_item_add_subtree(actx->created_item, ett_cdmachanneldata); + + proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_Frame_Offset, tvb, offset, 1, ENC_BIG_ENDIAN); + /* CDMA Channel Number */ + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_CDMA_ch_no, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + length = length -2; + /* Band Class */ + proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_band_cls, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Long Code Mask */ + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b6, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b5, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b4, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b3, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b2, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b1, tvb, offset, 1, ENC_BIG_ENDIAN); + length = length - 6; + if (length == 0) + return; + offset++; + /* NP_EXT */ + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_np_ext, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Nominal Power */ + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_nominal_pwr, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Number Preamble */ + proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_nr_preamble, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.31 CDMACodeChannel */ + +/* 6.5.2.41 CDMAStationClassMark */ +/* Power Class: (PC) (octet 1, bits A and B) */ +static const value_string ansi_map_CDMAStationClassMark_pc_vals[] = { + { 0, "Class I"}, + { 1, "Class II"}, + { 2, "Class III"}, + { 3, "Reserved"}, + { 0, NULL } +}; +/* Analog Transmission: (DTX) (octet 1, bit C) */ +static const true_false_string ansi_map_CDMAStationClassMark_dtx_bool_val = { + "Discontinuous", + "Continuous" +}; +/* Slotted Mode Indicator: (SMI) (octet 1, bit F) */ +static const true_false_string ansi_map_CDMAStationClassMark_smi_bool_val = { + "Slotted capable", + "Slotted incapable" +}; +/* Dual-mode Indicator(DMI) (octet 1, bit G) */ +static const true_false_string ansi_map_CDMAStationClassMark_dmi_bool_val = { + "Dual-mode CDMA", + "CDMA only" +}; + + +static void +dissect_ansi_map_cdmastationclassmark(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_cdmastationclassmark); + + proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Dual-mode Indicator(DMI) (octet 1, bit G) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_dmi, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Slotted Mode Indicator: (SMI) (octet 1, bit F) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_smi, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_reservedBitED, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Analog Transmission: (DTX) (octet 1, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_dtx, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Power Class: (PC) (octet 1, bits A and B) */ + proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_pc, tvb, offset, 1, ENC_BIG_ENDIAN); +} +/* 6.5.2.47 ChannelData */ +/* Discontinuous Transmission Mode (DTX) (octet 1, bits E and D) */ +static const value_string ansi_map_ChannelData_dtx_vals[] = { + { 0, "DTX disabled"}, + { 1, "Reserved. Treat the same as value 00, DTX disabled."}, + { 2, "DTX-low mode"}, + { 3, "DTX mode active or acceptable"}, + { 0, NULL } +}; + + +static void +dissect_ansi_map_channeldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_channeldata); + + /* SAT Color Code (SCC) (octet 1, bits H and G) */ + proto_tree_add_item(subtree, hf_ansi_map_channeldata_scc, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Discontinuous Transmission Mode (DTX) (octet 1, bits E and D) */ + proto_tree_add_item(subtree, hf_ansi_map_channeldata_dtx, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Voice Mobile Attenuation Code (VMAC) (octet 1, bits A - C)*/ + proto_tree_add_item(subtree, hf_ansi_map_channeldata_vmac, tvb, offset, 1, ENC_BIG_ENDIAN); + + offset++; + /* Channel Number (CHNO) ( octet 2 and 3 ) */ + proto_tree_add_item(subtree, hf_ansi_map_channeldata_chno, tvb, offset, 2, ENC_BIG_ENDIAN); + +} + +/* 6.5.2.50 ConfidentialityModes */ +/* Updated with N.S0008-0 v 1.0*/ +/* Voice Privacy (VP) Confidentiality Status (octet 1, bit A) */ + +static const true_false_string ansi_map_ConfidentialityModes_bool_val = { + "On", + "Off" +}; +static void +dissect_ansi_map_confidentialitymodes(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_confidentialitymodes); + + /* DataPrivacy (DP) Confidentiality Status (octet 1, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_ConfidentialityModes_dp, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Signaling Message Encryption (SE) Confidentiality Status (octet 1, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_ConfidentialityModes_se, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Voice Privacy (VP) Confidentiality Status (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_ConfidentialityModes_vp, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + +/* 6.5.2.51 ControlChannelData */ + +/* Digital Color Code (DCC) (octet 1, bit H and G) */ +/* Control Mobile Attenuation Code (CMAC) (octet 1, bit A - C) */ +/* Channel Number (CHNO) ( octet 2 and 3 ) */ +/* Supplementary Digital Color Codes (SDCC1 and SDCC2) */ +/* SDCC1 ( octet 4, bit D and C )*/ +/* SDCC2 ( octet 4, bit A and B )*/ + +static void +dissect_ansi_map_controlchanneldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_controlchanneldata); + + /* Digital Color Code (DCC) (octet 1, bit H and G) */ + proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_dcc, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_reservedBitFED, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Control Mobile Attenuation Code (CMAC) (octet 1, bit A - C) */ + proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_cmac, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Channel Number (CHNO) ( octet 2 and 3 ) */ + proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_chno, tvb, offset, 2, ENC_BIG_ENDIAN); + /* Supplementary Digital Color Codes (SDCC1 and SDCC2) */ + offset = offset +2; + /* SDCC1 ( octet 4, bit D and C )*/ + proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_sdcc1, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_reservedBitHGFE, tvb, offset, 1, ENC_BIG_ENDIAN); + /* SDCC2 ( octet 4, bit A and B )*/ + proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_sdcc2, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + +/* 6.5.2.52 CountUpdateReport */ +static const value_string ansi_map_CountUpdateReport_vals[] = { + { 0, "Class I"}, + { 1, "Class II"}, + { 2, "Class III"}, + { 3, "Reserved"}, + { 0, NULL } +}; + +/* 6.5.2.53 DeniedAuthorizationPeriod */ +/* Period (octet 1) */ +static const value_string ansi_map_deniedauthorizationperiod_period_vals[] = { + { 0, "Not used"}, + { 1, "Per Call. Re-authorization should be attempted on the next call attempt"}, + { 2, "Hours"}, + { 3, "Days"}, + { 4, "Weeks"}, + { 5, "Per Agreement"}, + { 6, "Reserved"}, + { 7, "Number of calls. Re-authorization should be attempted after this number of (rejected) call attempts"}, + { 8, "Minutes"}, + { 0, NULL } +}; +/* Value (octet 2) +Number of minutes hours, days, weeks, or +number of calls (as per Period). If Period +indicates anything else the Value is set to zero +on sending and ignored on receipt. +*/ + +static void +dissect_ansi_map_deniedauthorizationperiod(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + proto_tree_add_item(subtree, hf_ansi_map_deniedauthorizationperiod_period, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_value, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + + +/* 6.5.2.57 DigitCollectionControl */ +/* TODO Add decoding here */ + +/* 6.5.2.64 ExtendedMSCID */ +static const value_string ansi_map_msc_type_vals[] = { + { 0, "Not specified"}, + { 1, "Serving MSC"}, + { 2, "Home MSC"}, + { 3, "Gateway MSC"}, + { 4, "HLR"}, + { 5, "VLR"}, + { 6, "EIR (reserved)"}, + { 7, "AC"}, + { 8, "Border MSC"}, + { 9, "Originating MSC"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_extendedmscid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_extendedmscid); + /* Type (octet 1) */ + proto_tree_add_item(subtree, hf_ansi_map_msc_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.65 ExtendedSystemMyTypeCode */ +static void +dissect_ansi_map_extendedsystemmytypecode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_extendedsystemmytypecode); + /* Type (octet 1) */ + proto_tree_add_item(subtree, hf_ansi_map_msc_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + dissect_ansi_map_SystemMyTypeCode(TRUE, tvb, offset, actx, subtree, hf_ansi_map_systemMyTypeCode); +} + + +/* 6.5.2.68 GeographicAuthorization */ +/* Geographic Authorization (octet 1) */ +static const value_string ansi_map_GeographicAuthorization_vals[] = { + { 0, "Not used"}, + { 1, "Authorized for all MarketIDs served by the VLR"}, + { 2, "Authorized for this MarketID only"}, + { 3, "Authorized for this MarketID and Switch Number only"}, + { 4, "Authorized for this LocationAreaID within a MarketID only"}, + { 5, "VLR"}, + { 6, "EIR (reserved)"}, + { 7, "AC"}, + { 8, "Border MSC"}, + { 9, "Originating MSC"}, + { 0, NULL } +}; + +/* 6.5.2.71 HandoffState */ +/* Party Involved (PI) (octet 1, bit A) */ +static const true_false_string ansi_map_HandoffState_pi_bool_val = { + "Terminator is handing off", + "Originator is handing off" +}; +static void +dissect_ansi_map_handoffstate(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_handoffstate); + /* Party Involved (PI) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_handoffstate_pi, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.72 InterMSCCircuitID */ +/* Trunk Member Number (M) Octet2 */ +static void +dissect_ansi_map_intermsccircuitid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + guint8 octet, octet2; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + /* Trunk Group Number (G) Octet 1 */ + octet = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_tgn, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Trunk Member Number (M) Octet2 */ + octet2 = tvb_get_guint8(tvb,offset); + proto_tree_add_item(subtree, hf_ansi_map_tmn, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_item_append_text(actx->created_item, " (G %u/M %u)", octet, octet2); +} + +/* 6.5.2.78 MessageWaitingNotificationCount */ +/* Type of messages (octet 1) */ +static const value_string ansi_map_MessageWaitingNotificationCount_type_vals[] = { + { 0, "Voice messages"}, + { 1, "Short Message Services (SMS) messages"}, + { 2, "Group 3 (G3) Fax messages"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_messagewaitingnotificationcount(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + /* Type of messages (octet 1) */ + proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationcount_tom, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Number of Messages Waiting (octet 2) */ + proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationcount_no_mw, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + +#if 0 +/* 6.5.2.79 MessageWaitingNotificationType */ +/* Pip Tone (PT) (octet 1, bit A) */ +static const true_false_string ansi_map_MessageWaitingNotificationType_pt_bool_val = { + "Pip Tone (PT) notification is required", + "Pip Tone (PT) notification is not authorized or no notification is required" +}; +#endif +#if 0 +/* Alert Pip Tone (APT) (octet 1, bit B) */ +static const true_false_string ansi_map_MessageWaitingNotificationType_apt_bool_val = { + "Alert Pip Tone (APT) notification is required", + "Alert Pip Tone (APT) notification is not authorized or notification is not required" +}; +#endif +/* Message Waiting Indication (MWI) (octet 1, bits C and D) */ +static const value_string ansi_map_MessageWaitingNotificationType_mwi_vals[] = { + { 0, "No MWI. Message Waiting Indication (MWI) notification is not authorized or notification is not required"}, + { 1, "Reserved"}, + { 2, "MWI On. Message Waiting Indication (MWI) notification is required. Messages waiting"}, + { 3, "MWI Off. Message Waiting Indication (MWI) notification is required. No messages waiting"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_messagewaitingnotificationtype(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + + /* Message Waiting Indication (MWI) (octet 1, bits C and D) */ + proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationtype_mwi, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Alert Pip Tone (APT) (octet 1, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationtype_apt, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Pip Tone (PT) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationtype_pt, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.81 MobileIdentificationNumber */ + +/* 6.5.2.82 MSCID */ + +static void +dissect_ansi_map_mscid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + + proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, ENC_BIG_ENDIAN); +} + + +/* 6.5.2.84 MSLocation */ +static void +dissect_ansi_map_mslocation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + + /* Latitude in tenths of a second octet 1 - 3 */ + proto_tree_add_item(subtree, hf_ansi_map_mslocation_lat, tvb, offset, 3, ENC_BIG_ENDIAN); + offset = offset + 3; + /* Longitude in tenths of a second octet 4 - 6 */ + proto_tree_add_item(subtree, hf_ansi_map_mslocation_long, tvb, offset, 3, ENC_BIG_ENDIAN); + offset = offset + 3; + /* Resolution in units of 1 foot octet 7, octet 8 optional */ + proto_tree_add_item(subtree, hf_ansi_map_mslocation_res, tvb, offset, -1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.85 NAMPSCallMode */ +static void +dissect_ansi_map_nampscallmode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + + /* Call Mode (octet 1, bits A and B) */ + proto_tree_add_item(subtree, hf_ansi_map_nampscallmode_amps, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_nampscallmode_namps, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.86 NAMPSChannelData */ +/* Narrow Analog Voice Channel Assignment (NAVCA) (octet 1, bits A and B) */ +static const value_string ansi_map_NAMPSChannelData_navca_vals[] = { + { 0, "Wide. 30 kHz AMPS voice channel"}, + { 1, "Upper. 10 kHz NAMPS voice channel"}, + { 2, "Middle. 10 kHz NAMPS voice channel"}, + { 3, "Lower. 10 kHz NAMPS voice channel"}, + { 0, NULL } +}; +/* Color Code Indicator (CCIndicator) (octet 1, bits C, D, and E) */ +static const value_string ansi_map_NAMPSChannelData_ccinidicator_vals[] = { + { 0, "ChannelData parameter SCC field applies"}, + { 1, "Digital SAT Color Code 1 (ignore SCC field)"}, + { 2, "Digital SAT Color Code 2 (ignore SCC field)"}, + { 3, "Digital SAT Color Code 3 (ignore SCC field)"}, + { 4, "Digital SAT Color Code 4 (ignore SCC field)"}, + { 5, "Digital SAT Color Code 5 (ignore SCC field)"}, + { 6, "Digital SAT Color Code 6 (ignore SCC field)"}, + { 7, "Digital SAT Color Code 7 (ignore SCC field)"}, + { 0, NULL } +}; + + + +static void +dissect_ansi_map_nampschanneldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + + /* Color Code Indicator (CCIndicator) (octet 1, bits C, D, and E) */ + proto_tree_add_item(subtree, hf_ansi_map_nampschanneldata_CCIndicator, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Narrow Analog Voice Channel Assignment (NAVCA) (octet 1, bits A and B) */ + proto_tree_add_item(subtree, hf_ansi_map_nampschanneldata_navca, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + +#if 0 +/* 6.5.2.88 OneTimeFeatureIndicator */ +/* updated with N.S0012 */ +/* Call Waiting for Future Incoming Call (CWFI) (octet 1, bits A and B) */ +/* Call Waiting for Incoming Call (CWIC) (octet 1, bits C and D) */ + +static const value_string ansi_map_onetimefeatureindicator_cw_vals[] = { + { 0, "Ignore"}, + { 1, "No CW"}, + { 2, "Normal CW"}, + { 3, "Priority CW"}, + { 0, NULL } +}; +#endif +#if 0 +/* MessageWaitingNotification (MWN) (octet 1, bits E and F) */ +static const value_string ansi_map_onetimefeatureindicator_mwn_vals[] = { + { 0, "Ignore"}, + { 1, "Pip Tone Inactive"}, + { 2, "Pip Tone Active"}, + { 3, "Reserved"}, + { 0, NULL } +}; +#endif +#if 0 +/* Calling Number Identification Restriction (CNIR) (octet 1, bits G and H)*/ +static const value_string ansi_map_onetimefeatureindicator_cnir_vals[] = { + { 0, "Ignore"}, + { 1, "CNIR Inactive"}, + { 2, "CNIR Active"}, + { 3, "Reserved"}, + { 0, NULL } +}; +#endif + +#if 0 +/* Priority Access and Channel Assignment (PACA) (octet 2, bits A and B)*/ +static const value_string ansi_map_onetimefeatureindicator_paca_vals[] = { + { 0, "Ignore"}, + { 1, "PACA Demand Inactive"}, + { 2, "PACA Demand Activated"}, + { 3, "Reserved"}, + { 0, NULL } +}; +#endif + +#if 0 +/* Flash Privileges (Flash) (octet 2, bits C and D) */ +static const value_string ansi_map_onetimefeatureindicator_flash_vals[] = { + { 0, "Ignore"}, + { 1, "Flash Inactive"}, + { 2, "Flash Active"}, + { 3, "Reserved"}, + { 0, NULL } +}; +#endif +#if 0 +/* Calling Name Restriction (CNAR) (octet 2, bits E and F) */ +static const value_string ansi_map_onetimefeatureindicator_cnar_vals[] = { + { 0, "Ignore"}, + { 1, "Presentation Allowed"}, + { 2, "Presentation Restricted."}, + { 3, "Blocking Toggle"}, + { 0, NULL } +}; +#endif +static void +dissect_ansi_map_onetimefeatureindicator(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + /* + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_mscid); + */ + /* Calling Number Identification Restriction (CNIR) (octet 1, bits G and H)*/ + /* MessageWaitingNotification (MWN) (octet 1, bits E and F) */ + /* Call Waiting for Incoming Call (CWIC) (octet 1, bits C and D) */ + /* Call Waiting for Future Incoming Call (CWFI) (octet 1, bits A and B) */ + /*offset++;*/ + /* Calling Name Restriction (CNAR) (octet 2, bits E and F) */ + /* Flash Privileges (Flash) (octet 2, bits C and D) */ + /* Priority Access and Channel Assignment (PACA) (octet 2, bits A and B)*/ + + +} + +/* 6.5.2.90 OriginationTriggers */ +/* All Origination (All) (octet 1, bit A) */ +static const true_false_string ansi_map_originationtriggers_all_bool_val = { + "Launch an OriginationRequest for any call attempt. This overrides all other values", + "Trigger is not active" +}; + +/* Local (octet 1, bit B) */ +static const true_false_string ansi_map_originationtriggers_local_bool_val = { + "Launch an OriginationRequest for any local call attempt", + "Trigger is not active" +}; + +/* Intra-LATA Toll (ILATA) (octet 1, bit C) */ +static const true_false_string ansi_map_originationtriggers_ilata_bool_val = { + "Launch an OriginationRequest for any intra-LATA call attempt", + "Trigger is not active" +}; +/* Inter-LATA Toll (OLATA) (octet 1, bit D) */ +static const true_false_string ansi_map_originationtriggers_olata_bool_val = { + "Launch an OriginationRequest for any inter-LATA toll call attempt", + "Trigger is not active" +}; +/* International (Int'l ) (octet 1, bit E) */ +static const true_false_string ansi_map_originationtriggers_int_bool_val = { + "Launch an OriginationRequest for any international call attempt", + "Trigger is not active" +}; +/* World Zone (WZ) (octet 1, bit F) */ +static const true_false_string ansi_map_originationtriggers_wz_bool_val = { + "Launch an OriginationRequest for any call attempt outside of the current World Zone (as defined in ITU-T Rec. E.164)", + "Trigger is not active" +}; + +/* Unrecognized Number (Unrec) (octet 1, bit G) */ +static const true_false_string ansi_map_originationtriggers_unrec_bool_val = { + "Launch an OriginationRequest for any call attempt to an unrecognized number", + "Trigger is not active" +}; +/* Revertive Call (RvtC) (octet 1, bit H)*/ +static const true_false_string ansi_map_originationtriggers_rvtc_bool_val = { + "Launch an OriginationRequest for any Revertive Call attempt", + "Trigger is not active" +}; + +/* Star (octet 2, bit A) */ +static const true_false_string ansi_map_originationtriggers_star_bool_val = { + "Launch an OriginationRequest for any number beginning with a Star '*' digit", + "Trigger is not active" +}; + +/* Double Star (DS) (octet 2, bit B) */ +static const true_false_string ansi_map_originationtriggers_ds_bool_val = { + "Launch an OriginationRequest for any number beginning with two Star '**' digits", + "Trigger is not active" +}; +/* Pound (octet 2, bit C) */ +static const true_false_string ansi_map_originationtriggers_pound_bool_val = { + "Launch an OriginationRequest for any number beginning with a Pound '#' digit", + "Trigger is not active" +}; +/* Double Pound (DP) (octet 2, bit D) */ +static const true_false_string ansi_map_originationtriggers_dp_bool_val = { + "Launch an OriginationRequest for any number beginning with two Pound '##' digits", + "Trigger is not active" +}; +/* Prior Agreement (PA) (octet 2, bit E) */ +static const true_false_string ansi_map_originationtriggers_pa_bool_val = { + "Launch an OriginationRequest for any number matching a criteria of a prior agreement", + "Trigger is not active" +}; + +/* No digits (octet 3, bit A) */ +static const true_false_string ansi_map_originationtriggers_nodig_bool_val = { + "Launch an OriginationRequest for any call attempt with no digits", + "Trigger is not active" +}; + +/* 1 digit (octet 3, bit B) */ +static const true_false_string ansi_map_originationtriggers_onedig_bool_val = { + "Launch an OriginationRequest for any call attempt with 1 digit", + "Trigger is not active" +}; +/* 1 digit (octet 3, bit C) */ +static const true_false_string ansi_map_originationtriggers_twodig_bool_val = { + "Launch an OriginationRequest for any call attempt with 2 digits", + "Trigger is not active" +}; +/* 1 digit (octet 3, bit D) */ +static const true_false_string ansi_map_originationtriggers_threedig_bool_val = { + "Launch an OriginationRequest for any call attempt with 3 digits", + "Trigger is not active" +}; +/* 1 digit (octet 3, bit E) */ +static const true_false_string ansi_map_originationtriggers_fourdig_bool_val = { + "Launch an OriginationRequest for any call attempt with 4 digits", + "Trigger is not active" +}; +/* 1 digit (octet 3, bit F) */ +static const true_false_string ansi_map_originationtriggers_fivedig_bool_val = { + "Launch an OriginationRequest for any call attempt with 5 digits", + "Trigger is not active" +}; +/* 1 digit (octet 3, bit G) */ +static const true_false_string ansi_map_originationtriggers_sixdig_bool_val = { + "Launch an OriginationRequest for any call attempt with 6 digits", + "Trigger is not active" +}; +/* 1 digit (octet 3, bit H) */ +static const true_false_string ansi_map_originationtriggers_sevendig_bool_val = { + "Launch an OriginationRequest for any call attempt with 7 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit A) */ +static const true_false_string ansi_map_originationtriggers_eightdig_bool_val = { + "Launch an OriginationRequest for any call attempt with 8 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit B) */ +static const true_false_string ansi_map_originationtriggers_ninedig_bool_val = { + "Launch an OriginationRequest for any call attempt with 9 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit C) */ +static const true_false_string ansi_map_originationtriggers_tendig_bool_val = { + "Launch an OriginationRequest for any call attempt with 10 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit D) */ +static const true_false_string ansi_map_originationtriggers_elevendig_bool_val = { + "Launch an OriginationRequest for any call attempt with 11 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit E) */ +static const true_false_string ansi_map_originationtriggers_twelvedig_bool_val = { + "Launch an OriginationRequest for any call attempt with 12 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit F) */ +static const true_false_string ansi_map_originationtriggers_thirteendig_bool_val = { + "Launch an OriginationRequest for any call attempt with 13 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit G) */ +static const true_false_string ansi_map_originationtriggers_fourteendig_bool_val = { + "Launch an OriginationRequest for any call attempt with 14 digits", + "Trigger is not active" +}; +/* 1 digit (octet 4, bit H) */ +static const true_false_string ansi_map_originationtriggers_fifteendig_bool_val = { + "Launch an OriginationRequest for any call attempt with 15 digits", + "Trigger is not active" +}; + +static void +dissect_ansi_map_originationtriggers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_originationtriggers); + + /* Revertive Call (RvtC) (octet 1, bit H)*/ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_rvtc, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Unrecognized Number (Unrec) (octet 1, bit G) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_unrec, tvb, offset, 1, ENC_BIG_ENDIAN); + /* World Zone (WZ) (octet 1, bit F) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_wz, tvb, offset, 1, ENC_BIG_ENDIAN); + /* International (Int'l ) (octet 1, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_int, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Inter-LATA Toll (OLATA) (octet 1, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_olata, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Intra-LATA Toll (ILATA) (octet 1, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_ilata, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Local (octet 1, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_local, tvb, offset, 1, ENC_BIG_ENDIAN); + /* All Origination (All) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_all, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + /*Prior Agreement (PA) (octet 2, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_pa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Double Pound (DP) (octet 2, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_dp, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Pound (octet 2, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_pound, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Double Star (DS) (octet 2, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_ds, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Star (octet 2, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_star, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + /* 7 digit (octet 3, bit H) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_sevendig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 6 digit (octet 3, bit G) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_sixdig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 5 digit (octet 3, bit F) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fivedig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 4 digit (octet 3, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fourdig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 3 digit (octet 3, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_threedig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 2 digit (octet 3, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_twodig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 1 digit (octet 3, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_onedig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* No digits (octet 3, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_nodig, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + /* 15 digit (octet 4, bit H) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fifteendig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 14 digit (octet 4, bit G) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fourteendig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 13 digit (octet 4, bit F) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_thirteendig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 12 digit (octet 4, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_twelvedig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 11 digit (octet 4, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_elevendig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 10 digit (octet 4, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_tendig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 9 digit (octet 4, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_ninedig, tvb, offset, 1, ENC_BIG_ENDIAN); + /* 8 digits (octet 4, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_eightdig, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + +/* 6.5.2.91 PACAIndicator */ + +/* Permanent Activation (PA) (octet 1, bit A) */ +static const true_false_string ansi_map_pacaindicator_pa_bool_val = { + "PACA is permanently activated", + "PACA is not permanently activated" +}; + +static const value_string ansi_map_PACA_Level_vals[] = { + { 0, "Not used"}, + { 1, "Priority Level. 1 This is the highest level"}, + { 2, "Priority Level 2"}, + { 3, "Priority Level 3"}, + { 4, "Priority Level 4"}, + { 5, "Priority Level 5"}, + { 6, "Priority Level 6"}, + { 7, "Priority Level 7"}, + { 8, "Priority Level 8"}, + { 9, "Priority Level 9"}, + { 10, "Priority Level 10"}, + { 11, "Priority Level 11"}, + { 12, "Priority Level 12"}, + { 13, "Priority Level 13"}, + { 14, "Priority Level 14"}, + { 15, "Priority Level 15"}, + { 0, NULL } +}; + +static void +dissect_ansi_map_pacaindicator(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_pacaindicator); + /* PACA Level (octet 1, bits B-E) */ + proto_tree_add_item(subtree, hf_ansi_map_PACA_Level, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Permanent Activation (PA) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_pacaindicator_pa, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.92 PageIndicator */ +static const value_string ansi_map_PageIndicator_vals[] = { + { 0, "Not used"}, + { 1, "Page"}, + { 2, "Listen only"}, + { 0, NULL } +}; + +/* 6.5.2.93 PC_SSN */ +static void +dissect_ansi_map_pc_ssn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + guint8 b1,b2,b3; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + /* Type (octet 1) */ + proto_tree_add_item(subtree, hf_ansi_map_msc_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* Point Code Member Number octet 2 */ + b1 = tvb_get_guint8(tvb,offset); + offset++; + /* Point Code Cluster Number octet 3 */ + b2 = tvb_get_guint8(tvb,offset); + offset++; + /* Point Code Network Number octet 4 */ + b3 = tvb_get_guint8(tvb,offset); + offset++; + proto_tree_add_bytes_format_value(subtree, hf_ansi_map_point_code, tvb, offset-3, 3, NULL, "%u-%u-%u", b3, b2, b1); + proto_tree_add_item(subtree, hf_ansi_map_SSN, tvb, offset, 1, ENC_NA); +} +/* 6.5.2.94 PilotBillingID */ +static void +dissect_ansi_map_pilotbillingid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + /* First Originating MarketID octet 1 and 2 */ + proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + /* First Originating Switch Number octet 3*/ + proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* ID Number */ + proto_tree_add_item(subtree, hf_ansi_map_idno, tvb, offset, 3, ENC_BIG_ENDIAN); + offset = offset + 3; + proto_tree_add_item(subtree, hf_ansi_map_segcount, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.96 PreferredLanguageIndicator */ +static const value_string ansi_map_PreferredLanguageIndicator_vals[] = { + { 0, "Unspecified"}, + { 1, "English"}, + { 2, "French"}, + { 3, "Spanish"}, + { 4, "German"}, + { 5, "Portuguese"}, + { 0, NULL } +}; + +/* 6.5.2.106 ReceivedSignalQuality */ +/* a. This octet is encoded the same as octet 1 in the SignalQuality parameter (see + 6.5.2.121). +*/ +/* 6.5.2.118 SetupResult */ +static const value_string ansi_map_SetupResult_vals[] = { + { 0, "Not used"}, + { 1, "Unsuccessful"}, + { 2, "Successful"}, + { 0, NULL } +}; +/* 6.5.2.121 SignalQuality */ +/* TODO */ + +/* 6.5.2.122 SMS_AccessDeniedReason (TIA/EIA-41.5-D, page 5-256) + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_SMS_AccessDeniedReason_vals[] = { + { 0, "Not used"}, + { 1, "Denied"}, + { 2, "Postponed"}, + { 3, "Unavailable"}, + { 4, "Invalid"}, + { 0, NULL } +}; + + +/* 6.5.2.125 SMS_CauseCode (TIA/EIA-41.5-D, page 5-262) + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_SMS_CauseCode_vals[] = { + { 0, "Address vacant"}, + { 1, "Address translation failure"}, + { 2, "Network resource shortage"}, + { 3, "Network failure"}, + { 4, "Invalid Teleservice ID"}, + { 5, "Other network problem"}, + { 6, "Unsupported network interface"}, + { 8, "CDMA handset-based position determination failure"}, + { 9, "CDMA handset-based position determination resources released - voice service request"}, + { 10, "CDMA handset-based position determination resources released - voice service request - message acknowledged"}, + { 11, "Reserved"}, + { 12, "Reserved"}, + { 13, "Reserved"}, + { 14, "Emergency Services Call Precedence"}, + { 32, "No page response"}, + { 33, "Destination busy"}, + { 34, "No acknowledgment"}, + { 35, "Destination resource shortage"}, + { 36, "SMS delivery postponed"}, + { 37, "Destination out of service"}, + { 38, "Destination no longer at this address"}, + { 39, "Other terminal problem"}, + { 64, "Radio interface resource shortage"}, + { 65, "Radio interface incompatibility"}, + { 66, "Other radio interface problem"}, + { 67, "Unsupported Base Station Capability"}, + { 96, "Encoding problem"}, + { 97, "Service origination denied"}, + { 98, "Service termination denied"}, + { 99, "Supplementary service not supported"}, + { 100, "Service not supported"}, + { 101, "Reserved"}, + { 102, "Missing expected parameter"}, + { 103, "Missing mandatory parameter"}, + { 104, "Unrecognized parameter value"}, + { 105, "Unexpected parameter value"}, + { 106, "User Data size error"}, + { 107, "Other general problems"}, + { 108, "Session not active"}, + { 109, "Reserved"}, + { 110, "MS Disconnect"}, + { 0, NULL } +}; +static value_string_ext ansi_map_SMS_CauseCode_vals_ext = VALUE_STRING_EXT_INIT(ansi_map_SMS_CauseCode_vals); + +/* 6.5.2.126 SMS_ChargeIndicator */ +/* SMS Charge Indicator (octet 1) */ +static const value_string ansi_map_SMS_ChargeIndicator_vals[] = { + { 0, "Not used"}, + { 1, "No charge"}, + { 2, "Charge original originator"}, + { 3, "Charge original destination"}, + { 0, NULL } +}; +/* 4 through 63 Reserved. Treat the same as value 1, No charge. + 64 through 127 Reserved. Treat the same as value 2, Charge original originator. + 128 through 223 Reserved. Treat the same as value 3, Charge original destination. + 224 through 255 Reserved for TIA/EIA-41 protocol extension. If unknown, treat the same as value 2, Charge + original originator. +*/ + +/* 6.5.2.130 SMS_NotificationIndicator N.S0005-0 v 1.0*/ +static const value_string ansi_map_SMS_NotificationIndicator_vals[] = { + { 0, "Not used"}, + { 1, "Notify when available"}, + { 2, "Do not notify when available"}, + { 0, NULL } +}; + +/* 6.5.2.136 SMS_OriginationRestrictions */ +/* DEFAULT (octet 1, bits A and B) */ + +static const value_string ansi_map_SMS_OriginationRestrictions_default_vals[] = { + { 0, "Block all"}, + { 1, "Reserved"}, + { 2, "Allow specific"}, + { 3, "Allow all"}, + { 0, NULL } +}; +/* DIRECT (octet 1, bit C) */ +static const true_false_string ansi_map_SMS_OriginationRestrictions_direct_bool_val = { + "Allow Direct", + "Block Direct" +}; + +/* Force Message Center (FMC) (octet 1, bit D) */ +static const true_false_string ansi_map_SMS_OriginationRestrictions_fmc_bool_val = { + "Force Indirect", + "No effect" +}; + +static void +dissect_ansi_map_sms_originationrestrictions(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_sms_originationrestrictions); + proto_tree_add_item(subtree, hf_ansi_map_reservedBitHGFE, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_sms_originationrestrictions_fmc, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_sms_originationrestrictions_direct, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_sms_originationrestrictions_default, tvb, offset, 1, ENC_BIG_ENDIAN); + +} + +/* 6.5.2.137 SMS_TeleserviceIdentifier */ +/* Updated with N.S0011-0 v 1.0 */ + +#if 0 +/* SMS Teleservice Identifier (octets 1 and 2) */ +static const value_string ansi_map_SMS_TeleserviceIdentifier_vals[] = { + { 0, "Not used"}, + { 1, "Reserved for maintenance"}, + { 2, "SSD Update no response"}, + { 3, "SSD Update successful"}, + { 4, "SSD Update failed"}, + { 4096, "AMPS Extended Protocol Enhanced Services" }, + { 4097, "CDMA Cellular Paging Teleservice" }, + { 4098, "CDMA Cellular Messaging Teleservice" }, + { 4099, "CDMA Voice Mail Notification" }, + { 32513, "TDMA Cellular Messaging Teleservice" }, + { 32520, "TDMA System Assisted Mobile Positioning through Satellite (SAMPS)" }, + { 32584, "TDMA Segmented System Assisted Mobile Positioning Service" }, + { 0, NULL } +}; +#endif +/* 6.5.2.140 SPINITriggers */ +/* All Origination (All) (octet 1, bit A) */ + +/* 6.5.2.142 SSDUpdateReport */ +static const value_string ansi_map_SSDUpdateReport_vals[] = { + { 0, "Not used"}, + { 4096, "AMPS Extended Protocol Enhanced Services"}, + { 4097, "CDMA Cellular Paging Teleservice"}, + { 4098, "CDMA Cellular Messaging Teleservice"}, + { 32513, "TDMA Cellular Messaging Teleservice"}, + { 32514, "TDMA Cellular Paging Teleservice (CPT-136)"}, + { 32515, "TDMA Over-the-Air Activation Teleservice (OATS)"}, + { 32516, "TDMA Over-the-Air Programming Teleservice (OPTS)"}, + { 32517, "TDMA General UDP Transport Service (GUTS)"}, + { 32576, "Reserved"}, + { 32577, "TDMA Segmented Cellular MessagingTeleservice"}, + { 32578, "TDMA Segmented Cellular Paging Teleservice"}, + { 32579, "TDMA Segmented Over-the-Air Activation Teleservice (OATS)"}, + { 32580, "TDMA Segmented Over-the-Air Programming Teleservice (OPTS)."}, + { 32581, "TDMA Segmented General UDP Transport Service (GUTS)"}, + { 32576, "Reserved"}, + { 0, NULL } +}; + +/* 6.5.2.143 StationClassMark */ + +/* 6.5.2.144 SystemAccessData */ + +/* 6.5.2.146 SystemCapabilities */ +/* Updated in N.S0008-0 v 1.0 */ +static const true_false_string ansi_map_systemcapabilities_auth_bool_val = { + "Authentication parameters were requested on this system access (AUTH=1 in the OMT)", + "Authentication parameters were not requested on this system access (AUTH=0 in the OMT)." +}; + +static const true_false_string ansi_map_systemcapabilities_se_bool_val = { + "Signaling Message Encryption supported by the system", + "Signaling Message Encryption not supported by the system" +}; + +static const true_false_string ansi_map_systemcapabilities_vp_bool_val = { + "Voice Privacy supported by the system", + "Voice Privacy not supported by the system" +}; + +static const true_false_string ansi_map_systemcapabilities_cave_bool_val = { + "System can execute the CAVE algorithm and share SSD for the indicated MS", + "System cannot execute the CAVE algorithm and cannot share SSD for the indicated MS" +}; + +static const true_false_string ansi_map_systemcapabilities_ssd_bool_val = { + "SSD is shared with the system for the indicated MS", + "SSD is not shared with the system for the indicated MS" +}; + +static const true_false_string ansi_map_systemcapabilities_dp_bool_val = { + "DP is supported by the system", + "DP is not supported by the system" +}; + +static void +dissect_ansi_map_systemcapabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_systemcapabilities); + proto_tree_add_item(subtree, hf_ansi_map_reservedBitHG, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_dp, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_ssd, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_cave, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_vp, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_se, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_auth, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.151 TDMABurstIndicator */ +/* 6.5.2.152 TDMACallMode */ +/* 6.5.2.153 TDMAChannelData Updated in N.S0007-0 v 1.0*/ + +/* 6.5.2.155 TerminationAccessType */ +/* XXX Fix Me, Fill up the values or do special decoding? */ +static const value_string ansi_map_TerminationAccessType_vals[] = { + { 0, "Not used"}, + { 1, "Reserved for controlling system assignment (may be a trunk group identifier)."}, + /* 1 through 127 */ + { 127, "Reserved for controlling system assignment (may be a trunk group identifier)."}, + { 128, "Reserved for TIA/EIA-41 protocol extension. If unknown, treat the same as value 253, Land-to-Mobile Directory Number access"}, + /* 128 through 160 */ + { 160, "Reserved for TIA/EIA-41 protocol extension. If unknown, treat the same as value 253, Land-to-Mobile Directory Number access"}, + { 161, "Reserved for this Standard"}, + /* 161 through 251 */ + { 151, "Reserved for this Standard"}, + { 252, "Mobile-to-Mobile Directory Number access"}, + { 253, "Land-to-Mobile Directory Number access"}, + { 254, "Remote Feature Control port access"}, + { 255, "Roamer port access"}, + { 0, NULL } +}; + +/* 6.5.2.158 TerminationTreatment */ +static const value_string ansi_map_TerminationTreatment_vals[] = { + { 0, "Not used"}, + { 1, "MS Termination"}, + { 2, "Voice Mail Storage"}, + { 3, "Voice Mail Retrieval"}, + { 4, "Dialogue Termination"}, + { 0, NULL } +}; + +/* 6.5.2.159 TerminationTriggers */ +/* Busy (octet 1, bits A and B) */ +static const value_string ansi_map_terminationtriggers_busy_vals[] = { + { 0, "Busy Call"}, + { 1, "Busy Trigger"}, + { 2, "Busy Leg"}, + { 3, "Reserved. Treat as an unrecognized parameter value"}, + { 0, NULL } +}; +/* Routing Failure (RF) (octet 1, bits C and D) */ +static const value_string ansi_map_terminationtriggers_rf_vals[] = { + { 0, "Failed Call"}, + { 1, "Routing Failure Trigger"}, + { 2, "Failed Leg"}, + { 3, "Reserved. Treat as an unrecognized parameter value"}, + { 0, NULL } +}; +/* No Page Response (NPR) (octet 1, bits E and F) */ +static const value_string ansi_map_terminationtriggers_npr_vals[] = { + { 0, "No Page Response Call"}, + { 1, "No Page Response Trigger"}, + { 2, "No Page Response Leg"}, + { 3, "Reserved. Treat as an unrecognized parameter value"}, + { 0, NULL } +}; +/* No Answer (NA) (octet 1, bits G and H) */ +static const value_string ansi_map_terminationtriggers_na_vals[] = { + { 0, "No Answer Call"}, + { 1, "No Answer Trigger"}, + { 2, "No Answer Leg"}, + { 3, "Reserved"}, + { 0, NULL } +}; +/* None Reachable (NR) (octet 2, bit A) */ +static const value_string ansi_map_terminationtriggers_nr_vals[] = { + { 0, "Member Not Reachable"}, + { 1, "Group Not Reachable"}, + { 0, NULL } +}; + +/* 6.5.2.159 TerminationTriggers N.S0005-0 v 1.0*/ +static void +dissect_ansi_map_terminationtriggers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_transactioncapability); + + proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, ENC_BIG_ENDIAN); + /* No Page Response (NPR) (octet 1, bits E and F) */ + proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_npr, tvb, offset, 1, ENC_BIG_ENDIAN); + /* No Answer (NA) (octet 1, bits G and H) */ + proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_na, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Routing Failure (RF) (octet 1, bits C and D) */ + proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_rf, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Busy (octet 1, bits A and B) */ + proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_busy, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + /* None Reachable (NR) (octet 2, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_nr, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.160 TransactionCapability (TIA/EIA-41.5-D, page 5-315) */ +/* Updated with N.S0010-0 v 1.0, N.S0012-0 v 1.0 N.S0013-0 v 1.0 */ +static const true_false_string ansi_map_trans_cap_prof_bool_val = { + "The system is capable of supporting the IS-41-C profile parameters", + "The system is not capable of supporting the IS-41-C profile parameters" +}; + +static const true_false_string ansi_map_trans_cap_busy_bool_val = { + "The system is capable of detecting a busy condition at the current time", + "The system is not capable of detecting a busy condition at the current time" +}; + +static const true_false_string ansi_map_trans_cap_ann_bool_val = { + "The system is capable of honoring the AnnouncementList parameter at the current time", + "The system is not capable of honoring the AnnouncementList parameter at the current time" +}; + +static const true_false_string ansi_map_trans_cap_rui_bool_val = { + "The system is capable of interacting with the user", + "The system is not capable of interacting with the user" +}; + +static const true_false_string ansi_map_trans_cap_spini_bool_val = { + "The system is capable of supporting local SPINI operation", + "The system is not capable of supporting local SPINI operation at the current time" +}; + +static const true_false_string ansi_map_trans_cap_uzci_bool_val = { + "The system is User Zone capable at the current time", + "The system is not User Zone capable at the current time" +}; +static const true_false_string ansi_map_trans_cap_ndss_bool_val = { + "Serving system is NDSS capable", + "Serving system is not NDSS capable" +}; +static const true_false_string ansi_map_trans_cap_nami_bool_val = { + "The system is CNAP/CNAR capable", + "The system is not CNAP/CNAR capable" +}; + +static const value_string ansi_map_trans_cap_multerm_vals[] = { + { 0, "The system cannot accept a termination at this time (i.e., cannot accept routing information)"}, + { 1, "The system supports the number of call legs indicated"}, + { 2, "The system supports the number of call legs indicated"}, + { 3, "The system supports the number of call legs indicated"}, + { 4, "The system supports the number of call legs indicated"}, + { 5, "The system supports the number of call legs indicated"}, + { 6, "The system supports the number of call legs indicated"}, + { 7, "The system supports the number of call legs indicated"}, + { 8, "The system supports the number of call legs indicated"}, + { 9, "The system supports the number of call legs indicated"}, + { 10, "The system supports the number of call legs indicated"}, + { 11, "The system supports the number of call legs indicated"}, + { 12, "The system supports the number of call legs indicated"}, + { 13, "The system supports the number of call legs indicated"}, + { 14, "The system supports the number of call legs indicated"}, + { 15, "The system supports the number of call legs indicated"}, + { 0, NULL } +}; + +static const true_false_string ansi_map_trans_cap_tl_bool_val = { + "The system is capable of supporting the TerminationList parameter at the current time", + "The system is not capable of supporting the TerminationList parameter at the current time" +}; + +static const true_false_string ansi_map_trans_cap_waddr_bool_val = { + "The system is capable of supporting the TriggerAddressList parameter", + "The system is not capable of supporting the TriggerAddressList parameter" +}; + + +static void +dissect_ansi_map_transactioncapability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_transactioncapability); + + /*NAME Capability Indicator (NAMI) (octet 1, bit H) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_nami, tvb, offset, 1, ENC_BIG_ENDIAN); + /* NDSS Capability (NDSS) (octet 1, bit G) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_ndss, tvb, offset, 1, ENC_BIG_ENDIAN); + /* UZ Capability Indicator (UZCI) (octet 1, bit F) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_uzci, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Subscriber PIN Intercept (SPINI) (octet 1, bit E) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_spini, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Remote User Interaction (RUI) (octet 1, bit D) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_rui, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Announcements (ANN) (octet 1, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_ann, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Busy Detection (BUSY) (octet 1, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_busy, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Profile (PROF) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_trans_cap_prof, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + /* WIN Addressing (WADDR) (octet 2, bit F) */ + proto_tree_add_item(subtree, hf_ansi_trans_cap_waddr, tvb, offset, 1, ENC_BIG_ENDIAN); + /* TerminationList (TL) (octet 2, bit E) */ + proto_tree_add_item(subtree, hf_ansi_trans_cap_tl, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Multiple Terminations (octet 2, bits A-D) */ + proto_tree_add_item(subtree, hf_ansi_trans_cap_multerm, tvb, offset, 1, ENC_BIG_ENDIAN); +} + +/* 6.5.2.162 UniqueChallengeReport */ +/* Unique Challenge Report (octet 1) */ +static const value_string ansi_map_UniqueChallengeReport_vals[] = { + { 0, "Not used"}, + { 1, "Unique Challenge not attempted"}, + { 2, "Unique Challenge no response"}, + { 3, "Unique Challenge successful"}, + { 4, "Unique Challenge failed"}, + { 0, NULL } +}; + +/* 6.5.2.166 VoicePrivacyMask */ + + +/* 6.5.2.e (TSB76) CDMAServiceConfigurationRecord N.S0008-0 v 1.0 */ +/* a. This field carries the CDMA Service Configuration Record. The bit-layout is the + same as that of Service Configuration Record in TSB74, and J-STD-008. +*/ + +/* 6.5.2.f CDMAServiceOption N.S0010-0 v 1.0 */ + +/* values copied from old ANSI map dissector */ +static const range_string cdmaserviceoption_vals[] = { + { 1, 1, "Basic Variable Rate Voice Service (8 kbps)" }, + { 2, 2, "Mobile Station Loopback (8 kbps)" }, + { 3, 3, "Enhanced Variable Rate Voice Service (8 kbps)" }, + { 4, 4, "Asynchronous Data Service (9.6 kbps)" }, + { 5, 5, "Group 3 Facsimile (9.6 kbps)" }, + { 6, 6, "Short Message Services (Rate Set 1)" }, + { 7, 7, "Packet Data Service: Internet or ISO Protocol Stack (9.6 kbps)" }, + { 8, 8, "Packet Data Service: CDPD Protocol Stack (9.6 kbps)" }, + { 9, 9, "Mobile Station Loopback (13 kbps)" }, + { 10, 10, "STU-III Transparent Service" }, + { 11, 11, "STU-III Non-Transparent Service" }, + { 12, 12, "Asynchronous Data Service (14.4 or 9.6 kbps)" }, + { 13, 13, "Group 3 Facsimile (14.4 or 9.6 kbps)" }, + { 14, 14, "Short Message Services (Rate Set 2)" }, + { 15, 15, "Packet Data Service: Internet or ISO Protocol Stack (14.4 kbps)" }, + { 16, 16, "Packet Data Service: CDPD Protocol Stack (14.4 kbps)" }, + { 17, 17, "High Rate Voice Service (13 kbps)" }, + { 18, 18, "Over-the-Air Parameter Administration (Rate Set 1)" }, + { 19, 19, "Over-the-Air Parameter Administration (Rate Set 2)" }, + { 20, 20, "Group 3 Analog Facsimile (Rate Set 1)" }, + { 21, 21, "Group 3 Analog Facsimile (Rate Set 2)" }, + { 22, 22, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS1 forward, RS1 reverse)" }, + { 23, 23, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS1 forward, RS2 reverse)" }, + { 24, 24, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS2 forward, RS1 reverse)" }, + { 25, 25, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS2 forward, RS2 reverse)" }, + { 26, 26, "High Speed Packet Data Service: CDPD Protocol Stack (RS1 forward, RS1 reverse)" }, + { 27, 27, "High Speed Packet Data Service: CDPD Protocol Stack (RS1 forward, RS2 reverse)" }, + { 28, 28, "High Speed Packet Data Service: CDPD Protocol Stack (RS2 forward, RS1 reverse)" }, + { 29, 29, "High Speed Packet Data Service: CDPD Protocol Stack (RS2 forward, RS2 reverse)" }, + { 30, 30, "Supplemental Channel Loopback Test for Rate Set 1" }, + { 31, 31, "Supplemental Channel Loopback Test for Rate Set 2" }, + { 32, 32, "Test Data Service Option (TDSO)" }, + { 33, 33, "cdma2000 High Speed Packet Data Service, Internet or ISO Protocol Stack" }, + { 34, 34, "cdma2000 High Speed Packet Data Service, CDPD Protocol Stack" }, + { 35, 35, "Location Services, Rate Set 1 (9.6 kbps)" }, + { 36, 36, "Location Services, Rate Set 2 (14.4 kbps)" }, + { 37, 37, "ISDN Interworking Service (64 kbps)" }, + { 38, 38, "GSM Voice" }, + { 39, 39, "GSM Circuit Data" }, + { 40, 40, "GSM Packet Data" }, + { 41, 41, "GSM Short Message Service" }, + { 42, 42, "None Reserved for MC-MAP standard service options" }, + { 54, 54, "Markov Service Option (MSO)" }, + { 55, 55, "Loopback Service Option (LSO)" }, + { 56, 56, "Selectable Mode Vocoder" }, + { 57, 57, "32 kbps Circuit Video Conferencing" }, + { 58, 58, "64 kbps Circuit Video Conferencing" }, + { 59, 59, "HRPD Accounting Records Identifier" }, + { 60, 60, "Link Layer Assisted Robust Header Compression (LLA ROHC) - Header Removal" }, + { 61, 61, "Link Layer Assisted Robust Header Compression (LLA ROHC) - Header Compression" }, + { 62, 62, "Source-Controlled Variable-Rate Multimode Wideband Speech Codec (VMR-WB) Rate Set 2" }, + { 63, 63, "Source-Controlled Variable-Rate Multimode Wideband Speech Codec (VMR-WB) Rate Set 1" }, + { 64, 64, "HRPD auxiliary Packet Data Service instance" }, + { 65, 65, "cdma2000/GPRS Inter-working" }, + { 66, 66, "cdma2000 High Speed Packet Data Service, Internet or ISO Protocol Stack" }, + { 67, 67, "HRPD Packet Data IP Service where Higher Layer Protocol is IP or ROHC" }, + { 68, 68, "Enhanced Variable Rate Voice Service (EVRC-B)" }, + { 69, 69, "HRPD Packet Data Service, which when used in paging over the 1x air interface, a page response is required" }, + { 70, 70, "Enhanced Variable Rate Voice Service (EVRC-WB)" }, + { 71, 4099, "None Reserved for standard service options" }, + { 4100, 4100, "Asynchronous Data Service, Revision 1 (9.6 or 14.4 kbps)" }, + { 4101, 4101, "Group 3 Facsimile, Revision 1 (9.6 or 14.4 kbps)" }, + { 4102, 4102, "Reserved for standard service option" }, + { 4103, 4103, "Packet Data Service: Internet or ISO Protocol Stack, Revision 1 (9.6 or 14.4 kbps)" }, + { 4104, 4104, "Packet Data Service: CDPD Protocol Stack, Revision 1 (9.6 or 14.4 kbps)" }, + { 4105, 32767, "Reserved for standard service options" }, + { 32768, 32768, "QCELP (13 kbps)" }, + { 32769, 32771, "Proprietary QUALCOMM Incorporated" }, + { 32772, 32775, "Proprietary OKI Telecom" }, + { 32776, 32779, "Proprietary Lucent Technologies" }, + { 32780, 32783, "Nokia" }, + { 32784, 32787, "NORTEL NETWORKS" }, + { 32788, 32791, "Sony Electronics Inc" }, + { 32792, 32795, "Motorola" }, + { 32796, 32799, "QUALCOMM Incorporated" }, + { 32800, 32803, "QUALCOMM Incorporated" }, + { 32804, 32807, "QUALCOMM Incorporated" }, + { 32808, 32811, "QUALCOMM Incorporated" }, + { 32812, 32815, "Lucent Technologies" }, + { 32816, 32819, "Denso International" }, + { 32820, 32823, "Motorola" }, + { 32824, 32827, "Denso International" }, + { 32828, 32831, "Denso International" }, + { 32832, 32835, "Denso International" }, + { 32836, 32839, "NEC America" }, + { 32840, 32843, "Samsung Electronics" }, + { 32844, 32847, "Texas Instruments Incorporated" }, + { 32848, 32851, "Toshiba Corporation" }, + { 32852, 32855, "LG Electronics Inc." }, + { 32856, 32859, "VIA Telecom Inc." }, + { 0, 0, NULL } +}; + +static void +dissect_ansi_map_cdmaserviceoption(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_cdmaserviceoption); + + proto_tree_add_item(subtree, hf_ansi_map_cdmaserviceoption, tvb, offset, 2, ENC_BIG_ENDIAN); + + +} +/* 6.5.2.f (TSB76) CDMAServiceOption N.S0008-0 v 1.0*/ +/* This field carries the CDMA Service Option. The bit-layout is the same as that of + Service Option in TSB74 and J-STD-008.*/ + +/* 6.5.2.i (IS-730) TDMAServiceCode N.S0008-0 v 1.0 */ +static const value_string ansi_map_TDMAServiceCode_vals[] = { + { 0, "Analog Speech Only"}, + { 1, "Digital Speech Only"}, + { 2, "Analog or Digital Speech, Analog Preferred"}, + { 3, "Analog or Digital Speech, Digital Preferred"}, + { 4, "Asynchronous Data"}, + { 5, "G3 Fax"}, + { 6, "Not Used (Service Rejected)"}, + { 7, "STU-III"}, + { 0, NULL } +}; +#if 0 +/* 6.5.2.j (IS-730) TDMATerminalCapability N.S0008-0 v 1.0 Updted with N.S0015-0 */ +/* Supported Frequency Band (octet 1) */ +/* Voice Coder (octet 2) */ +/* Protocol Version (octet 3) N.S0015-0 */ +static const value_string ansi_map_TDMATerminalCapability_prot_ver_vals[] = { + { 0, "EIA-553 or IS-54-A"}, + { 1, "TIA/EIA-627.(IS-54-B)"}, + { 2, "IS-136"}, + { 3, "Permanently Reserved (ANSI J-STD-011).Treat the same as value 4, IS-136-A."}, + { 4, "PV 0 as published in TIA/EIA-136-0 and IS-136-A."}, + { 5, "PV 1 as published in TIA/EIA-136-A."}, + { 6, "PV 2 as published in TIA/EIA-136-A."}, + { 7, "PV 3 as published in TIA/EIA-136-A."}, + { 0, NULL } +}; +#endif +/* Asynchronous Data (ADS) (octet 4, bit A) N.S0007-0*/ +/* Group 3 Fax (G3FAX) (octet 4, bit B) */ +/* Secure Telephone Unit III (STU3) (octet 4, bit C) */ +/* Analog Voice (AVOX) (octet 4, bit D) */ +/* Half Rate (HRATE) (octet 4, bit E) */ +/* Full Rate (FRATE) (octet 4, bit F) */ +/* Double Rate (2RATE) (octet 4, bit G) */ +/* Triple Rate (3RATE) (octet 4, bit H) */ + + +/* 6.5.2.k (IS-730)) TDMAVoiceCoder N.S0008-0 v 1.0, N.S0007-0 */ +/* VoiceCoder (octet 1) */ + +/* 6.5.2.p UserZoneData N.S0015-0 */ + +/* 6.5.2.aa BaseStationManufacturerCode N.S0007-0 v 1.0 */ +/* The BaseStationManufacturerCode (BSMC) parameter specifies the manufacturer of the + base station that is currently serving the MS (see IS-136 for enumeration of values).*/ + +/* 6.5.2.ab BSMCStatus */ + +/* BSMC Status (octet 1) */ +static const value_string ansi_map_BSMCStatus_vals[] = { + { 0, "Same BSMC Value shall not be supported"}, + { 1, "Same BSMC Value shall be supported"}, + { 0, NULL } +}; + +/*- 6.5.2.ac ControlChannelMode (N.S0007-0 v 1.0)*/ +static const value_string ansi_map_ControlChannelMode_vals[] = { + { 0, "Unknown"}, + { 1, "MS is in Analog CC Mode"}, + { 2, "MS is in Digital CC Mode"}, + { 3, "MS is in NAMPS CC Mode"}, + { 0, NULL } +}; + +/* 6.5.2.ad NonPublicData N.S0007-0 v 1.0*/ +/* NP Only Service (NPOS) (octet 1, bits A and B) */ +/* Charging Area Tone Service (CATS) (octet 1, bits C - F) */ +/* PSID/RSID Download Order (PRDO) (octet 1, bits G and H) */ + +/* 6.5.2.ae PagingFrameClass N.S0007-0 v 1.0*/ +/* Paging Frame Class (octet 1) */ + +static const value_string ansi_map_PagingFrameClass_vals[] = { + { 0, "PagingFrameClass 1 (1.28 seconds)"}, + { 1, "PagingFrameClass 2 (2.56 seconds)"}, + { 2, "PagingFrameClass 3 (3.84 seconds)"}, + { 3, "PagingFrameClass 4 (7.68 seconds)"}, + { 4, "PagingFrameClass 5 (15.36 seconds)"}, + { 5, "PagingFrameClass 6 (30.72 seconds)"}, + { 6, "PagingFrameClass 7 (61.44 seconds)"}, + { 7, "PagingFrameClass 8 (122.88 seconds)"}, + { 8, "Reserved. Treat the same as value 0, PagingFrameClass 1"}, + { 0, NULL } +}; + +/* 6.5.2.af PSID_RSIDInformation N.S0007-0 v 1.0*/ +/* PSID/RSID Indicator (octet 1, bit A) */ +/* PSID/RSID Type (octet 1, bits B-D) */ + +/* 6.5.2.ah ServicesResult N.S0007-0 v 1.0*/ +/* PSID/RSID Download Result (PRDR) (octet 1, bits A and B) */ +static const value_string ansi_map_ServicesResult_ppr_vals[] = { + { 0, "No Indication"}, + { 1, "Unsuccessful PSID/RSID download"}, + { 2, "Successful PSID/RSID download"}, + { 3, "Reserved. Treat the same as value 0, No Indication"}, + { 0, NULL } +}; + +/* 6.5.2.ai SOCStatus N.S0007-0 v 1.0*/ + +/* SOC Status (octet 1) */ +static const value_string ansi_map_SOCStatus_vals[] = { + { 0, "Same SOC Value shall not be supported"}, + { 1, "Same SOC Value shall be supported"}, + { 0, NULL } +}; + +/* 6.5.2.aj SystemOperatorCode N.S0007-0 v 1.0*/ +/* The SystemOperatorCode (SOC) parameter specifies the system operator that is currently + providing service to a MS (see IS-136 for enumeration of values) */ + +/* 6.5.2.al UserGroup N.S0007-0 v 1.0*/ + +/* 6.5.2.am UserZoneData N.S0007-0 v 1.0*/ + + +/*Table 6.5.2.ay TDMABandwidth value N.S0008-0 v 1.0 */ +static const value_string ansi_map_TDMABandwidth_vals[] = { + { 0, "Half-Rate Digital Traffic Channel Only"}, + { 1, "Full-Rate Digital Traffic Channel Only"}, + { 2, "Half-Rate or Full-rate Digital Traffic Channel - Full-Rate Preferred"}, + { 3, "Half-rate or Full-rate Digital Traffic Channel - Half-rate Preferred"}, + { 4, "Double Full-Rate Digital Traffic Channel Only"}, + { 5, "Triple Full-Rate Digital Traffic Channel Only"}, + { 6, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 7, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 8, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 9, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 10, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 11, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 12, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 13, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 14, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 15, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"}, + { 0, NULL } + +}; + +/* 6.5.2.az TDMADataFeaturesIndicator N.S0008-0 v 1.0 */ +/* TDMADataFeaturesIndicator + ansi_map_FeatureActivity_vals + + ADS FeatureActivity ADS-FA ( octet 1 bit A and B ) + G3 Fax FeatureActivity G3FAX-FA ( octet 1 bit C and D ) + STU-III FeatureActivity STUIII-FA ( octet 1 bit E and F ) + Half Rate data FeatureActivity HRATE-FA ( octet 2 bit A and B ) + Full Rate data FeatureActivity FRATE-FA ( octet 2 bit C and D ) + Double Rate data FeatureActivity 2RATE-FA ( octet 2 bit E and F ) + Triple Rate data FeatureActivity 3RATE-FA ( octet g bit G and H ) + + Table 6.5.2.azt TDMADataFeaturesIndicator value + static const value_string ansi_map_TDMADataFeaturesIndicator_vals[] = { + { 0, "Not Used"}, + { 1, "Not Authorized"}, + { 2, "Authorized, but de-activated"}, + { 3, "Authorized and activated"}, + { 0, NULL } + + }; +*/ + +/* 6.5.2.ba TDMADataMode N.S0008-0 v 1.0*/ + +/* 6.5.2.bb TDMAVoiceMode */ + +/* 6.5.2.bb CDMAConnectionReference N.S0008-0 v 1.0 */ +/* Service Option Connection Reference Octet 1 */ +/* a. This field carries the CDMA Service Option Connection Reference. The bitlayout + is the same as that of Service Option Connection Reference in TSB74 and + J-STD-008. +*/ + +/* 6.5.2.ad CDMAState N.S0008-0 v 1.0 */ +/* Service Option State Octet 1 */ +/* a. This field carries the CDMA Service Option State information. The CDMA + Service Option State is defined in the current CDMA Service Options standard. + If CDMA Service Option State is not explicitly defined within a section of the + relevant CDMA Service Option standard, the CDMA Service Option State shall + carry the value of the ORD_Q octet of all current Service Option Control Orders + (see IS-95), or the contents of all current CDMA Service Option Control + Messages (see TSB74) type specific field for this connection reference. */ + +/* 6.5.2.aj SecondInterMSCCircuitID */ +/* -- XXX Same code as ISLPinformation??? + dissect_ansi_map_secondintermsccircuitid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree){ + + int offset = 0; + + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_billingid); + / Trunk Group Number (G) Octet 1 / + proto_tree_add_item(subtree, hf_ansi_map_tgn, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + / Trunk Member Number (M) Octet2 / + proto_tree_add_item(subtree, hf_ansi_map_tmn, tvb, offset, 1, ENC_BIG_ENDIAN); + } +*/ +#if 0 +/* 6.5.2.as ChangeServiceAttributes N.S0008-0 v 1.0 */ +/* Change Facilities Flag (CHGFAC)(octet 1, bits A - B) */ +static const value_string ansi_map_ChangeServiceAttributes_chgfac_vals[] = { + { 0, "Change Facilities Operation Requested"}, + { 1, "Change Facilities Operation Not Requested"}, + { 2, "Change Facilities Operation Used"}, + { 3, "Change Facilities Operation Not Used"}, + { 0, NULL } +}; +#endif +#if 0 +/* Service Negotiate Flag (SRVNEG)(octet 1, bits C - D) */ +static const value_string ansi_map_ChangeServiceAttributes_srvneg_vals[] = { + { 0, "Service Negotiation Used"}, + { 1, "Service Negotiation Not Used"}, + { 2, "Service Negotiation Required"}, + { 3, "Service Negotiation Not Required"}, + { 0, NULL } +}; +#endif +#if 0 +/* 6.5.2.au DataPrivacyParameters N.S0008-0 v 1.0*/ +/* Privacy Mode (PM) (octet 1, Bits A and B) */ +static const value_string ansi_map_DataPrivacyParameters_pm_vals[] = { + { 0, "Privacy inactive or not supported"}, + { 1, "Privacy Requested or Acknowledged"}, + { 2, "Reserved. Treat reserved values the same as value 0, Privacy inactive or not supported."}, + { 3, "Reserved. Treat reserved values the same as value 0, Privacy inactive or not supported."}, + { 0, NULL } +}; +#endif +#if 0 +/* Data Privacy Version (PM) (octet 2) */ +static const value_string ansi_map_DataPrivacyParameters_data_priv_ver_vals[] = { + { 0, "Not used"}, + { 1, "Data Privacy Version 1"}, + { 0, NULL } +}; +#endif + +/* 6.5.2.av ISLPInformation N.S0008-0 v 1.0*/ +/* ISLP Type (octet 1) */ +static const value_string ansi_map_islp_type_vals[] = { + { 0, "No ISLP supported"}, + { 1, "ISLP supported"}, + { 0, NULL } +}; +/* 6.5.2.bc AnalogRedirectInfo */ +/* Sys Ordering (octet 1, bits A-E) */ +/* Ignore CDMA (IC) (octet 1, bit F) */ + +/* 6.5.2.be CDMAChannelNumber N.S0010-0 v 1.0*/ + +/* 6.5.2.bg CDMAPowerCombinedIndicator N.S0010-0 v 1.0*/ + +/* 6.5.2.bi CDMASearchParameters N.S0010-0 v 1.0*/ + +/* 6.5.2.bk CDMANetworkIdentification N.S0010-0 v 1.0*/ +/* See CDMA [J-STD-008] for encoding of this field. */ + +/* 6.5.2.bo RequiredParametersMask N.S0010-0 v 1.0 */ + +/* 6.5.2.bp ServiceRedirectionCause */ +static const value_string ansi_map_ServiceRedirectionCause_type_vals[] = { + { 0, "Not used"}, + { 1, "NormalRegistration"}, + { 2, "SystemNotFound."}, + { 3, "ProtocolMismatch."}, + { 4, "RegistrationRejection."}, + { 5, "WrongSID."}, + { 6, "WrongNID.."}, + { 0, NULL } +}; + +/* 6.5.2.bq ServiceRedirectionInfo N.S0010-0 v 1.0 */ + +/* 6.5.2.br RoamingIndication N.S0010-0 v 1.0*/ +/* See CDMA [TSB58] for the definition of this field. */ + +/* 6.5.2.bw CallingPartyName N.S0012-0 v 1.0*/ + +#if 0 +/* Presentation Status (octet 1, bits A and B) */ +static const value_string ansi_map_Presentation_Status_vals[] = { + { 0, "Presentation allowed"}, + { 1, "Presentation restricted"}, + { 2, "Blocking toggle"}, + { 3, "No indication"}, + { 0, NULL } +}; +#endif +#if 0 +/* Availability (octet 1, bit E) N.S0012-0 v 1.0*/ +static const true_false_string ansi_map_Availability_bool_val = { + "Name not available", + "Name available/unknown" +}; +#endif +static void +dissect_ansi_map_callingpartyname(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + /* Availability (octet 1, bit E) N.S0012-0 v 1.0*/ + + /* Presentation Status (octet 1, bits A and B) */ + + + +} + + +/* 6.5.2.bx DisplayText N.S0012-0 v 1.0*/ +/* a. Refer to ANSI T1.610 for field encoding. */ + +/* 6.5.2.bz ServiceID + Service Identifier (octets 1 to n) + 0 Not used. + 1 Calling Name Presentation - No RND. + 2 Calling Name Presentation with RND. +*/ + +/* 6.5.2.co GlobalTitle N.S0013-0 v 1.0 + * Refer to Section 3 of ANSI T1.112 for the encoding of this field. + */ +/* Address Indicator octet 1 */ +/* Global Title Octet 2 - n */ + + +#if 0 +/* 6.5.2.dc SpecializedResource N.S0013-0 v 1.0*/ +/* Resource Type (octet 1) */ +static const value_string ansi_map_resource_type_vals[] = { + { 0, "Not used"}, + { 1, "DTMF tone detector"}, + { 2, "Automatic Speech Recognition - Speaker Independent - Digits"}, + { 3, "Automatic Speech Recognition - Speaker Independent - Speech User Interface Version 1"}, + { 0, NULL } +}; +#endif +/* 6.5.2.df TriggerCapability */ +/* Updated with N.S0004 N.S0013-0 v 1.0*/ + +static const true_false_string ansi_map_triggercapability_bool_val = { + "triggers can be armed by the TriggerAddressList parameter", + "triggers cannot be armed by the TriggerAddressList parameter" +}; + +static void +dissect_ansi_map_triggercapability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_triggercapability); + + + /* O_No_Answer (ONA) (octet 1, bit H)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_ona, tvb, offset, 1, ENC_BIG_ENDIAN); + /* O_Disconnect (ODISC) (octet 1, bit G)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_odisc, tvb, offset, 1, ENC_BIG_ENDIAN); + /* O_Answer (OANS) (octet 1, bit F)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_oans, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Origination_Attempt_Authorized (OAA) (octet 1, bit E)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_oaa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Revertive_Call (RvtC) (octet 1, bit D)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_rvtc, tvb, offset, 1, ENC_BIG_ENDIAN); + /* All_Calls (All) (octet 1, bit C)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_all, tvb, offset, 1, ENC_BIG_ENDIAN); + /* K-digit (K-digit) (octet 1, bit B)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_kdigit, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Introducing Star/Pound (INIT) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_init, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + + + /* O_Called_Party_Busy (OBSY) (octet 2, bit H)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_obsy, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Called_Routing_Address_Available (CdRAA) (octet 2, bit G)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_cdraa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Initial_Termination (IT) (octet 2, bit F)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_it, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Calling_Routing_Address_Available (CgRAA)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_cgraa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Advanced_Termination (AT) (octet 2, bit D)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_at, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Prior_Agreement (PA) (octet 2, bit C)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_pa, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Unrecognized_Number (Unrec) (octet 2, bit B)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_unrec, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Call Types (CT) (octet 2, bit A)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_ct, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; + /* */ + /* */ + /* */ + /* T_Disconnect (TDISC) (octet 3, bit E)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tdisc, tvb, offset, 1, ENC_BIG_ENDIAN); + /* T_Answer (TANS) (octet 3, bit D)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tans, tvb, offset, 1, ENC_BIG_ENDIAN); + /* T_No_Answer (TNA) (octet 3, bit C)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tna, tvb, offset, 1, ENC_BIG_ENDIAN); + /* T_Busy (TBusy) (octet 3, bit B)*/ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tbusy, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Terminating_Resource_Available (TRA) (octet 3, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tra, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* 6.5.2.ei DMH_ServiceID N.S0018 */ + +/* 6.5.2.dj WINOperationsCapability */ +/* Updated with N.S0004 */ +/* ConnectResource (CONN) (octet 1, bit A) */ +static const true_false_string ansi_map_winoperationscapability_conn_bool_val = { + "Sender is capable of supporting the ConnectResource, DisconnectResource, ConnectionFailureReport and ResetTimer (SSFT timer) operations", + "Sender is not capable of supporting the ConnectResource, DisconnectResource,ConnectionFailureReport and ResetTimer (SSFT timer) operations" +}; + +/* CallControlDirective (CCDIR) (octet 1, bit B) */ +static const true_false_string ansi_map_winoperationscapability_ccdir_bool_val = { + "Sender is capable of supporting the CallControlDirective operation", + "Sender is not capable of supporting the CallControlDirective operation" +}; + +/* PositionRequest (POS) (octet 1, bit C) */ +static const true_false_string ansi_map_winoperationscapability_pos_bool_val = { + "Sender is capable of supporting the PositionRequest operation", + "Sender is not capable of supporting the PositionRequest operation" +}; +static void +dissect_ansi_map_winoperationscapability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + subtree = proto_item_add_subtree(actx->created_item, ett_winoperationscapability); + + /* PositionRequest (POS) (octet 1, bit C) */ + proto_tree_add_item(subtree, hf_ansi_map_winoperationscapability_pos, tvb, offset, 1, ENC_BIG_ENDIAN); + /* CallControlDirective (CCDIR) (octet 1, bit B) */ + proto_tree_add_item(subtree, hf_ansi_map_winoperationscapability_ccdir, tvb, offset, 1, ENC_BIG_ENDIAN); + /* ConnectResource (CONN) (octet 1, bit A) */ + proto_tree_add_item(subtree, hf_ansi_map_winoperationscapability_conn, tvb, offset, 1, ENC_BIG_ENDIAN); + +} +/* + * 6.5.2.dk N.S0013-0 v 1.0,X.S0004-550-E v1.0 2.301 + * Code to be found after include functions. + */ + +/* 6.5.2.ei TIA/EIA-41.5-D Modifications N.S0018Re */ +/* Octet 1,2 1st MarketID */ +/* Octet 3 1st MarketSegmentID */ +/* Octet 4,5 1st DMH_ServiceID value */ +/* Second marcet ID etc */ +/* 6.5.2.ek ControlNetworkID N.S0018*/ +static void +dissect_ansi_map_controlnetworkid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + proto_tree *subtree; + + + subtree = proto_item_add_subtree(actx->created_item, ett_controlnetworkid); + /* MarketID octet 1 and 2 */ + proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, ENC_BIG_ENDIAN); + offset = offset + 2; + /* Switch Number octet 3*/ + proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, ENC_BIG_ENDIAN); + offset++; +} + + +/* 6.5.2.dk WIN_TriggerList N.S0013-0 v 1.0 */ + +/* 6.5.2.ec DisplayText2 Updated in N.S0015-0*/ + +/* 6.5.2.eq MSStatus N.S0004 */ + +/* 6.5.2.er PositionInformationCode N.S0004 */ + +/* 6.5.2.fd InterMessageTime N.S0015-0*/ +/* Timer value (in 10s of seconds) octet 1 */ + +/* 6.5.2.fe MSIDUsage N.S0015-0 */ +/* M and I Report (octet 1, bits A and B) */ +static const value_string ansi_MSIDUsage_m_or_i_vals[] = { + { 0, "Not used"}, + { 1, "MIN last used"}, + { 2, "IMSI last used"}, + { 3, "Reserved"}, + { 0, NULL } +}; + +/* 6.5.2.ff NewMINExtension N.S0015-0 */ + +#if 0 +/* 6.5.2.fv ACGEncountered N.S0023-0 v 1.0 */ +/* ACG Encountered (octet 1, bits A-F) */ +static const value_string ansi_ACGEncountered_vals[] = { + { 0, "PC_SSN"}, + { 1, "1-digit control"}, + { 2, "2-digit control"}, + { 3, "3-digit control"}, + { 4, "4-digit control"}, + { 5, "5-digit control"}, + { 6, "6-digit control"}, + { 7, "7-digit control"}, + { 8, "8-digit control"}, + { 9, "9-digit control"}, + { 10, "10-digit control"}, + { 11, "11-digit control"}, + { 12, "12-digit control"}, + { 13, "13-digit control"}, + { 14, "14-digit control"}, + { 15, "15-digit control"}, + { 0, NULL } +}; +#endif +#if 0 +/* Control Type (octet 1, bits G-H) */ +static const value_string ansi_ACGEncountered_cntrl_type_vals[] = { + { 0, "Not used."}, + { 1, "Service Management System Initiated control encountered"}, + { 2, "SCF Overload control encountered"}, + { 3, "Reserved. Treat the same as value 0, Not used."}, + { 0, NULL } +}; +#endif + +/* 6.5.2.fw ControlType N.S0023-0 v 1.0 */ + + + +#if 0 +/* 6.5.2.ge QoSPriority N.S0029-0 v1.0*/ +/* 6.5.2.xx QOSPriority */ +/* Non-Assured Priority (octet 1, bits A-D) */ +static const value_string ansi_map_Priority_vals[] = { + { 0, "Priority Level 0. This is the lowest level"}, + { 1, "Priority Level 1"}, + { 2, "Priority Level 2"}, + { 3, "Priority Level 3"}, + { 4, "Priority Level 4"}, + { 5, "Priority Level 5"}, + { 6, "Priority Level 6"}, + { 7, "Priority Level 7"}, + { 8, "Priority Level 8"}, + { 8, "Priority Level 9"}, + { 10, "Priority Level 10"}, + { 11, "Priority Level 11"}, + { 12, "Priority Level 12"}, + { 13, "Priority Level 13"}, + { 14, "Reserved"}, + { 15, "Reserved"}, + { 0, NULL } +}; +#endif +/* Assured Priority (octet 1, bits E-H)*/ + + +/* 6.5.2.gf PDSNAddress N.S0029-0 v1.0*/ +/* a. See IOS Handoff Request message for the definition of this field. */ + +/* 6.5.2.gg PDSNProtocolType N.S0029-0 v1.0*/ +/* See IOS Handoff Request message for the definition of this field. */ + +/* 6.5.2.gh CDMAMSMeasuredChannelIdentity N.S0029-0 v1.0*/ + +/* 6.5.2.gl CallingPartyCategory N.S0027*/ +/* a. Refer to ITU-T Q.763 (Signalling System No. 7 ISDN user part formats and + codes) for encoding of this parameter. + b. Refer to national ISDN user part specifications for definitions and encoding of the + reserved for national use values. +*/ +/* 6.5.2.gm CDMA2000HandoffInvokeIOSData N.S0029-0 v1.0*/ +/* IOS A1 Element Handoff Invoke Information */ + + +/* 6.5.2.gn CDMA2000HandoffResponseIOSData */ +/* IOS A1 Element Handoff Response Information N.S0029-0 v1.0*/ + +/* 6.5.2.gr CDMAServiceOptionConnectionIdentifier N.S0029-0 v1.0*/ + +/* 6.5.2.fk GeographicPosition */ +/* Calling Geodetic Location (CGL) + * a. See T1.628 for encoding. + * b. Ignore extra octets, if received. Send only defined (or significant) octets. + */ +/* 6.5.2.fs PositionRequestType (See J-STD-036, page 8-47) X.S0002-0 v2.0 + */ + +/* Position Request Type (octet 1, bits A-H) */ +/* + static const value_string ansi_map_Position_Request_Type_vals[] = { + { 0, "Not used"}, + { 1, "Initial Position"}, + { 2, "Return the updated position"}, + { 3, "Return the updated or last known position"}, + { 4, "Reserved for LSP interface"}, + { 5, "Initial Position Only"}, + { 6, "Return the last known position"}, + { 7, "Return the updated position based on the serving cell identity"}, +*/ +/* + values through 95 Reserved. Treat the same as value 1, Initial position. + 96 through 255 Reserved for TIA/EIA-41 protocol extension. If unknown, treat the + same as value 1, Initial position. + * + { 0, NULL } + }; + +*/ + +/* LCS Client Type (CTYP) (octet 2, bit A) * + 0 Emergency services LCS Client. + 1 Non-emergency services LCS Client. + Call-Related Indicator (CALL) (octet 2, bit B) + Decimal Value Meaning + 0 Call-related LCS Client request. + 1 Non call-related LCS Client request. + + Current Serving Cell Information for Coarse Position Determination (CELL) (octet 2, bit C) + Decimal Value Meaning + 0 No specific request. + 1 Current serving cell information. Current serving cell information for + Target MS requested. Radio contact with Target MS is required. +*/ +/* 6.5.2.ft PositionResult * + static const value_string ansi_map_PositionResult_vals[] = { + { 0, "Not used"}, + { 1, "Initial position returned"}, + { 2, "Updated position returned"}, + { 3, "Last known position returned"}, + { 4, "Requested position is not available"}, + { 5, "Target MS disconnect"}, + { 6, "Target MS has handed-off"}, + { 7, "Identified MS is inactive or has roamed to another system"}, + { 8, "Unresponsive"}, + { 9, "Identified MS is responsive, but refused position request"}, + { 10, "System Failure"}, + { 11, "MSID is not known"}, + { 12, "Callback number is not known"}, + { 13, "Improper request"}, + { 14, "Mobile information returned"}, + { 15, "Signal not detected"}, + { 16, "PDE Timeout"}, + { 17, "Position pending"}, + { 18, "TDMA MAHO Information Returned"}, + { 19, "TDMA MAHO Information is not available"}, + { 20, "Access Denied"}, + { 21, "Requested PQOS not met"}, + { 22, "Resource required for CDMA handset-based position determination is currently unavailable"}, + { 23, "CDMA handset-based position determination failure"}, + { 24, "CDMA handset-based position determination failure detected by the PDE"}, + { 25, "CDMA handset-based position determination incomplete traffic channel requested for voice services"}, + { 26, "Emergency services call notification"}, + { 27, "Emergency services call precedence"}, + { 28, "Request acknowledged"}, + { 0, NULL } + }; +*/ +#if 0 +/* 6.5.2.bp-1 ServiceRedirectionCause value */ +static const value_string ansi_map_ServiceRedirectionCause_vals[] = { + { 0, "Not used"}, + { 1, "NormalRegistration"}, + { 2, "SystemNotFound"}, + { 3, "ProtocolMismatch"}, + { 4, "RegistrationRejection"}, + { 5, "WrongSID"}, + { 6, "WrongNID"}, + { 0, NULL } +}; +#endif +/* 6.5.2.mT AuthenticationResponseReauthentication N.S0011-0 v 1.0*/ + +/* 6.5.2.vT ReauthenticationReport N.S0011-0 v 1.0*/ +static const value_string ansi_map_ReauthenticationReport_vals[] = { + { 0, "Not used"}, + { 1, "Reauthentication not attempted"}, + { 2, "Reauthentication no response"}, + { 3, "Reauthentication successful"}, + { 4, "Reauthentication failed"}, + { 0, NULL } +}; + + + +#if 0 +/* 6.5.2.lB AKeyProtocolVersion + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_AKeyProtocolVersion_vals[] = { + { 0, "Not used"}, + { 1, "A-key Generation not supported"}, + { 2, "Diffie Hellman with 768-bit modulus, 160-bit primitive, and 160-bit exponents"}, + { 3, "Diffie Hellman with 512-bit modulus, 160-bit primitive, and 160-bit exponents"}, + { 4, "Diffie Hellman with 768-bit modulus, 32-bit primitive, and 160-bit exponents"}, + { 0, NULL } +}; +#endif +/* 6.5.2.sB OTASP_ResultCode + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_OTASP_ResultCode_vals[] = { + { 0, "Accepted - Successful"}, + { 1, "Rejected - Unknown cause."}, + { 2, "Computation Failure - E.g., unable to compute A-key"}, + { 3, "CSC Rejected - CSC challenge failure"}, + { 4, "Unrecognized OTASPCallEntry"}, + { 5, "Unsupported AKeyProtocolVersion(s)"}, + { 6, "Unable to Commit"}, + { 0, NULL } +}; + +/*6.5.2.wB ServiceIndicator + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_ServiceIndicator_vals[] = { + { 0, "Undefined Service"}, + { 1, "CDMA OTASP Service"}, + { 2, "TDMA OTASP Service"}, + { 3, "CDMA OTAPA Service"}, + { 4, "CDMA Position Determination Service (Emergency Services)"}, + { 5, "AMPS Position Determination Service (Emergency Services)"}, + { 6, "CDMA Position Determination Service (Value Added Services)"}, + { 0, NULL } +}; + +/* 6.5.2.xB SignalingMessageEncryptionReport + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_SMEReport_vals[] = { + { 0, "Not used"}, + { 1, "Signaling Message Encryption enabling not attempted"}, + { 2, "Signaling Message Encryption enabling no response"}, + { 3, "Signaling Message Encryption is enabled"}, + { 4, "Signaling Message Encryption enabling failed"}, + { 0, NULL } +}; + +/* 6.5.2.zB VoicePrivacyReport + N.S0011-0 v 1.0 +*/ +static const value_string ansi_map_VoicePrivacyReport_vals[] = { + { 0, "Not used"}, + { 1, "Voice Privacy not attempted"}, + { 2, "Voice Privacy no response"}, + { 3, "Voice Privacy is active"}, + { 4, "Voice Privacy failed"}, + { 0, NULL } +}; + + +#include "packet-ansi_map-fn.c" + +/* + * 6.5.2.dk N.S0013-0 v 1.0,X.S0004-550-E v1.0 2.301 + */ +static void +dissect_ansi_map_win_trigger_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){ + + int offset = 0; + int end_offset = 0; + int j = 0; + proto_tree *subtree; + guint8 octet; + + end_offset = tvb_reported_length_remaining(tvb,offset); + subtree = proto_item_add_subtree(actx->created_item, ett_win_trigger_list); + + while(offset< end_offset) { + octet = tvb_get_guint8(tvb,offset); + switch (octet){ + case 0xdc: + proto_tree_add_uint_format(subtree, hf_ansi_map_win_trigger_list, tvb, offset, 1, octet, "TDP-R's armed"); + j=0; + break; + case 0xdd: + proto_tree_add_uint_format(subtree, hf_ansi_map_win_trigger_list, tvb, offset, 1, octet, "TDP-N's armed"); + j=0; + break; + case 0xde: + proto_tree_add_uint_format(subtree, hf_ansi_map_win_trigger_list, tvb, offset, 1, octet, "EDP-R's armed"); + j=0; + break; + case 0xdf: + proto_tree_add_uint_format(subtree, hf_ansi_map_win_trigger_list, tvb, offset, 1, octet, "EDP-N's armed"); + j=0; + break; + default: + proto_tree_add_uint_format(subtree, hf_ansi_map_win_trigger_list, tvb, offset, 1, octet, "[%u] (%u) %s",j,octet,val_to_str_ext(octet, &ansi_map_TriggerType_vals_ext, "Unknown TriggerType (%u)")); + j++; + break; + } + offset++; + } +} + + +static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) { + static gboolean opCodeKnown = TRUE; + static ansi_map_tap_rec_t tap_rec[16]; + static ansi_map_tap_rec_t *tap_p; + static int tap_current=0; + + /* + * set tap record pointer + */ + tap_current++; + if (tap_current == array_length(tap_rec)) + { + tap_current = 0; + } + tap_p = &tap_rec[tap_current]; + + switch(OperationCode){ + case 1: /*Handoff Measurement Request*/ + offset = dissect_ansi_map_HandoffMeasurementRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffMeasurementRequest); + break; + case 2: /*Facilities Directive*/ + offset = dissect_ansi_map_FacilitiesDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitiesDirective); + break; + case 3: /*Mobile On Channel*/ + proto_tree_add_expert(tree, actx->pinfo, &ei_ansi_map_no_data, tvb, offset, -1); + break; + case 4: /*Handoff Back*/ + offset = dissect_ansi_map_HandoffBack(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffBack); + break; + case 5: /*Facilities Release*/ + offset = dissect_ansi_map_FacilitiesRelease(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitiesRelease); + break; + case 6: /*Qualification Request*/ + offset = dissect_ansi_map_QualificationRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_qualificationRequest); + break; + case 7: /*Qualification Directive*/ + offset = dissect_ansi_map_QualificationDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_qualificationDirective); + break; + case 8: /*Blocking*/ + offset = dissect_ansi_map_Blocking(TRUE, tvb, offset, actx, tree, hf_ansi_map_blocking); + break; + case 9: /*Unblocking*/ + offset = dissect_ansi_map_Unblocking(TRUE, tvb, offset, actx, tree, hf_ansi_map_unblocking); + break; + case 10: /*Reset Circuit*/ + offset = dissect_ansi_map_ResetCircuit(TRUE, tvb, offset, actx, tree, hf_ansi_map_resetCircuit); + break; + case 11: /*Trunk Test*/ + offset = dissect_ansi_map_TrunkTest(TRUE, tvb, offset, actx, tree, hf_ansi_map_trunkTest); + break; + case 12: /*Trunk Test Disconnect*/ + offset = dissect_ansi_map_TrunkTestDisconnect(TRUE, tvb, offset, actx, tree, hf_ansi_map_trunkTestDisconnect); + break; + case 13: /*Registration Notification*/ + offset = dissect_ansi_map_RegistrationNotification(TRUE, tvb, offset, actx, tree, hf_ansi_map_registrationNotification); + break; + case 14: /*Registration Cancellation*/ + offset = dissect_ansi_map_RegistrationCancellation(TRUE, tvb, offset, actx, tree, hf_ansi_map_registrationCancellation); + break; + case 15: /*Location Request*/ + offset = dissect_ansi_map_LocationRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_locationRequest); + break; + case 16: /*Routing Request*/ + offset = dissect_ansi_map_RoutingRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_routingRequest); + break; + case 17: /*Feature Request*/ + offset = dissect_ansi_map_FeatureRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_featureRequest); + break; + case 18: /*Reserved 18 (Service Profile Request, IS-41-C)*/ + proto_tree_add_expert_format(tree, actx->pinfo, &ei_ansi_map_unknown_invokeData_blob, tvb, offset, -1, "Unknown invokeData blob(18 (Service Profile Request, IS-41-C)"); + break; + case 19: /*Reserved 19 (Service Profile Directive, IS-41-C)*/ + proto_tree_add_expert_format(tree, actx->pinfo, &ei_ansi_map_unknown_invokeData_blob, tvb, offset, -1, "Unknown invokeData blob(19 Service Profile Directive, IS-41-C)"); + break; + case 20: /*Unreliable Roamer Data Directive*/ + offset = dissect_ansi_map_UnreliableRoamerDataDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_unreliableRoamerDataDirective); + break; + case 21: /*Reserved 21 (Call Data Request, IS-41-C)*/ + proto_tree_add_expert_format(tree, actx->pinfo, &ei_ansi_map_unknown_invokeData_blob, tvb, offset, -1, "Unknown invokeData blob(Reserved 21 (Call Data Request, IS-41-C)"); + break; + case 22: /*MS Inactive*/ + offset = dissect_ansi_map_MSInactive(TRUE, tvb, offset, actx, tree, hf_ansi_map_mSInactive); + break; + case 23: /*Transfer To Number Request*/ + offset = dissect_ansi_map_TransferToNumberRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_transferToNumberRequest); + break; + case 24: /*Redirection Request*/ + offset = dissect_ansi_map_RedirectionRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_redirectionRequest); + break; + case 25: /*Handoff To Third*/ + offset = dissect_ansi_map_HandoffToThird(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffToThird); + break; + case 26: /*Flash Request*/ + offset = dissect_ansi_map_FlashRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_flashRequest); + break; + case 27: /*Authentication Directive*/ + offset = dissect_ansi_map_AuthenticationDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationDirective); + break; + case 28: /*Authentication Request*/ + offset = dissect_ansi_map_AuthenticationRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationRequest); + break; + case 29: /*Base Station Challenge*/ + offset = dissect_ansi_map_BaseStationChallenge(TRUE, tvb, offset, actx, tree, hf_ansi_map_baseStationChallenge); + break; + case 30: /*Authentication Failure Report*/ + offset = dissect_ansi_map_AuthenticationFailureReport(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationFailureReport); + break; + case 31: /*Count Request*/ + offset = dissect_ansi_map_CountRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_countRequest); + break; + case 32: /*Inter System Page*/ + offset = dissect_ansi_map_InterSystemPage(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPage); + break; + case 33: /*Unsolicited Response*/ + offset = dissect_ansi_map_UnsolicitedResponse(TRUE, tvb, offset, actx, tree, hf_ansi_map_unsolicitedResponse); + break; + case 34: /*Bulk Deregistration*/ + offset = dissect_ansi_map_BulkDeregistration(TRUE, tvb, offset, actx, tree, hf_ansi_map_bulkDeregistration); + break; + case 35: /*Handoff Measurement Request 2*/ + offset = dissect_ansi_map_HandoffMeasurementRequest2(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffMeasurementRequest2); + break; + case 36: /*Facilities Directive 2*/ + offset = dissect_ansi_map_FacilitiesDirective2(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitiesDirective2); + break; + case 37: /*Handoff Back 2*/ + offset = dissect_ansi_map_HandoffBack2(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffBack2); + break; + case 38: /*Handoff To Third 2*/ + offset = dissect_ansi_map_HandoffToThird2(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffToThird2); + break; + case 39: /*Authentication Directive Forward*/ + offset = dissect_ansi_map_AuthenticationDirectiveForward(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationDirectiveForward); + break; + case 40: /*Authentication Status Report*/ + offset = dissect_ansi_map_AuthenticationStatusReport(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationStatusReport); + break; + case 41: /*Reserved 41*/ + proto_tree_add_expert_format(tree, actx->pinfo, &ei_ansi_map_unknown_invokeData_blob, tvb, offset, -1, "Reserved 41, Unknown invokeData blob"); + break; + case 42: /*Information Directive*/ + offset = dissect_ansi_map_InformationDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_informationDirective); + break; + case 43: /*Information Forward*/ + offset = dissect_ansi_map_InformationForward(TRUE, tvb, offset, actx, tree, hf_ansi_map_informationForward); + break; + case 44: /*Inter System Answer*/ + offset = dissect_ansi_map_InterSystemAnswer(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemAnswer); + break; + case 45: /*Inter System Page 2*/ + offset = dissect_ansi_map_InterSystemPage2(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPage2); + break; + case 46: /*Inter System Setup*/ + offset = dissect_ansi_map_InterSystemSetup(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemSetup); + break; + case 47: /*OriginationRequest*/ + offset = dissect_ansi_map_OriginationRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_originationRequest); + break; + case 48: /*Random Variable Request*/ + offset = dissect_ansi_map_RandomVariableRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_randomVariableRequest); + break; + case 49: /*Redirection Directive*/ + offset = dissect_ansi_map_RedirectionDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_redirectionDirective); + break; + case 50: /*Remote User Interaction Directive*/ + offset = dissect_ansi_map_RemoteUserInteractionDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_remoteUserInteractionDirective); + break; + case 51: /*SMS Delivery Backward*/ + offset = dissect_ansi_map_SMSDeliveryBackward(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSDeliveryBackward); + break; + case 52: /*SMS Delivery Forward*/ + offset = dissect_ansi_map_SMSDeliveryForward(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSDeliveryForward); + break; + case 53: /*SMS Delivery Point to Point*/ + offset = dissect_ansi_map_SMSDeliveryPointToPoint(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSDeliveryPointToPoint); + break; + case 54: /*SMS Notification*/ + offset = dissect_ansi_map_SMSNotification(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSNotification); + break; + case 55: /*SMS Request*/ + offset = dissect_ansi_map_SMSRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSRequest); + break; + /* End N.S0005*/ + /* N.S0010-0 v 1.0 */ + /* N.S0011-0 v 1.0 */ + case 56: /*OTASP Request 6.4.2.CC*/ + offset = dissect_ansi_map_OTASPRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_oTASPRequest); + break; + /*End N.S0011-0 v 1.0 */ + case 57: /*Information Backward*/ + break; + /* N.S0008-0 v 1.0 */ + case 58: /*Change Facilities*/ + offset = dissect_ansi_map_ChangeFacilities(TRUE, tvb, offset, actx, tree, hf_ansi_map_changeFacilities); + break; + case 59: /*Change Service*/ + offset = dissect_ansi_map_ChangeService(TRUE, tvb, offset, actx, tree, hf_ansi_map_changeService); + break; + /* End N.S0008-0 v 1.0 */ + case 60: /*Parameter Request*/ + offset = dissect_ansi_map_ParameterRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_parameterRequest); + break; + case 61: /*TMSI Directive*/ + offset = dissect_ansi_map_TMSIDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_tMSIDirective); + break; + /*End N.S0010-0 v 1.0 */ + case 62: /*NumberPortabilityRequest 62*/ + offset = dissect_ansi_map_NumberPortabilityRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_numberPortabilityRequest); + break; + case 63: /*Service Request N.S0012-0 v 1.0*/ + offset = dissect_ansi_map_ServiceRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_serviceRequest); + break; + /* N.S0013 */ + case 64: /*Analyzed Information Request*/ + offset = dissect_ansi_map_AnalyzedInformation(TRUE, tvb, offset, actx, tree, hf_ansi_map_analyzedInformation); + break; + case 65: /*Connection Failure Report*/ + offset = dissect_ansi_map_ConnectionFailureReport(TRUE, tvb, offset, actx, tree, hf_ansi_map_connectionFailureReport); + break; + case 66: /*Connect Resource*/ + offset = dissect_ansi_map_ConnectResource(TRUE, tvb, offset, actx, tree, hf_ansi_map_connectResource); + break; + case 67: /*Disconnect Resource*/ + /* No data */ + break; + case 68: /*Facility Selected and Available*/ + offset = dissect_ansi_map_FacilitySelectedAndAvailable(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitySelectedAndAvailable); + break; + case 69: /*Instruction Request*/ + /* No data */ + break; + case 70: /*Modify*/ + offset = dissect_ansi_map_Modify(TRUE, tvb, offset, actx, tree, hf_ansi_map_modify); + break; + case 71: /*Reset Timer*/ + /*No Data*/ + break; + case 72: /*Search*/ + offset = dissect_ansi_map_Search(TRUE, tvb, offset, actx, tree, hf_ansi_map_search); + break; + case 73: /*Seize Resource*/ + offset = dissect_ansi_map_SeizeResource(TRUE, tvb, offset, actx, tree, hf_ansi_map_seizeResource); + break; + case 74: /*SRF Directive*/ + offset = dissect_ansi_map_SRFDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_sRFDirective); + break; + case 75: /*T Busy*/ + offset = dissect_ansi_map_TBusy(TRUE, tvb, offset, actx, tree, hf_ansi_map_tBusy); + break; + case 76: /*T NoAnswer*/ + offset = dissect_ansi_map_TNoAnswer(TRUE, tvb, offset, actx, tree, hf_ansi_map_tNoAnswer); + break; + /*END N.S0013 */ + case 77: /*Release*/ + break; + case 78: /*SMS Delivery Point to Point Ack*/ + offset = dissect_ansi_map_SMSDeliveryPointToPointAck(TRUE, tvb, offset, actx, tree, hf_ansi_map_smsDeliveryPointToPointAck); + break; + /* N.S0024*/ + case 79: /*Message Directive*/ + offset = dissect_ansi_map_MessageDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_messageDirective); + break; + /*END N.S0024*/ + /* N.S0018 PN-4287*/ + case 80: /*Bulk Disconnection*/ + offset = dissect_ansi_map_BulkDisconnection(TRUE, tvb, offset, actx, tree, hf_ansi_map_bulkDisconnection); + break; + case 81: /*Call Control Directive*/ + offset = dissect_ansi_map_CallControlDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_callControlDirective); + break; + case 82: /*O Answer*/ + offset = dissect_ansi_map_OAnswer(TRUE, tvb, offset, actx, tree, hf_ansi_map_oAnswer); + break; + case 83: /*O Disconnect*/ + offset = dissect_ansi_map_ODisconnect(TRUE, tvb, offset, actx, tree, hf_ansi_map_oDisconnect); + break; + case 84: /*Call Recovery Report*/ + offset = dissect_ansi_map_CallRecoveryReport(TRUE, tvb, offset, actx, tree, hf_ansi_map_callRecoveryReport); + break; + case 85: /*T Answer*/ + offset = dissect_ansi_map_TAnswer(TRUE, tvb, offset, actx, tree, hf_ansi_map_tAnswer); + break; + case 86: /*T Disconnect*/ + offset = dissect_ansi_map_TDisconnect(TRUE, tvb, offset, actx, tree, hf_ansi_map_tDisconnect); + break; + case 87: /*Unreliable Call Data*/ + offset = dissect_ansi_map_UnreliableCallData(TRUE, tvb, offset, actx, tree, hf_ansi_map_unreliableCallData); + break; + /* N.S0018 PN-4287*/ + /*N.S0004 */ + case 88: /*O CalledPartyBusy*/ + offset = dissect_ansi_map_OCalledPartyBusy(TRUE, tvb, offset, actx, tree, hf_ansi_map_oCalledPartyBusy); + break; + case 89: /*O NoAnswer*/ + offset = dissect_ansi_map_ONoAnswer(TRUE, tvb, offset, actx, tree, hf_ansi_map_oNoAnswer); + break; + case 90: /*Position Request*/ + offset = dissect_ansi_map_PositionRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_positionRequest); + break; + case 91: /*Position Request Forward*/ + offset = dissect_ansi_map_PositionRequestForward(TRUE, tvb, offset, actx, tree, hf_ansi_map_positionRequestForward); + break; + /*END N.S0004 */ + case 92: /*Call Termination Report*/ + offset = dissect_ansi_map_CallTerminationReport(TRUE, tvb, offset, actx, tree, hf_ansi_map_callTerminationReport); + break; + case 93: /*Geo Position Directive*/ + break; + case 94: /*Geo Position Request*/ + offset = dissect_ansi_map_GeoPositionRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPositionRequest); + break; + case 95: /*Inter System Position Request*/ + offset = dissect_ansi_map_InterSystemPositionRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPositionRequest); + break; + case 96: /*Inter System Position Request Forward*/ + offset = dissect_ansi_map_InterSystemPositionRequestForward(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPositionRequestForward); + break; + /* 3GPP2 N.S0023-0 */ + case 97: /*ACG Directive*/ + offset = dissect_ansi_map_ACGDirective(TRUE, tvb, offset, actx, tree, hf_ansi_map_aCGDirective); + break; + /* END 3GPP2 N.S0023-0 */ + case 98: /*Roamer Database Verification Request*/ + offset = dissect_ansi_map_RoamerDatabaseVerificationRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_roamerDatabaseVerificationRequest); + break; + /* N.S0029 X.S0001-A v1.0*/ + case 99: /*Add Service*/ + offset = dissect_ansi_map_AddService(TRUE, tvb, offset, actx, tree, hf_ansi_map_addService); + break; + case 100: /*Drop Service*/ + offset = dissect_ansi_map_DropService(TRUE, tvb, offset, actx, tree, hf_ansi_map_dropService); + break; + /*End N.S0029 X.S0001-A v1.0*/ + /* X.S0002-0 v1.0 */ + /* LCSParameterRequest */ + case 101: /* InterSystemSMSPage 101 */ + offset = dissect_ansi_map_InterSystemSMSPage(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemSMSPage); + break; + case 102: + offset = dissect_ansi_map_LCSParameterRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_lcsParameterRequest); + break; + /* CheckMEID X.S0008-0 v1.0*/ + case 104: + offset = dissect_ansi_map_CheckMEID(TRUE, tvb, offset, actx, tree, hf_ansi_map_checkMEID); + break; + /* PositionEventNotification */ + case 106: + offset = dissect_ansi_map_PositionEventNotification(TRUE, tvb, offset, actx, tree, hf_ansi_map_positionEventNotification); + break; + case 107: + /* StatusRequest X.S0008-0 v1.0*/ + offset = dissect_ansi_map_StatusRequest(TRUE, tvb, offset, actx, tree, hf_ansi_map_statusRequest); + break; + /* InterSystemSMSDelivery-PointToPoint 111 X.S0004-540-E v2.0*/ + case 111: + /* InterSystemSMSDeliveryPointToPoint X.S0004-540-E v2.0 */ + offset = dissect_ansi_map_InterSystemSMSDeliveryPointToPoint(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemSMSDeliveryPointToPoint); + break; + case 112: + /* QualificationRequest2 112 X.S0004-540-E v2.0*/ + offset = dissect_ansi_map_QualificationRequest2(TRUE, tvb, offset, actx, tree, hf_ansi_map_qualificationRequest2); + break; + default: + proto_tree_add_expert(tree, actx->pinfo, &ei_ansi_map_unknown_invokeData_blob, tvb, offset, -1); + opCodeKnown = FALSE; + break; + } + + if (opCodeKnown) + { + tap_p->message_type = OperationCode; + tap_p->size = 0; /* should be number of octets in message */ + + tap_queue_packet(ansi_map_tap, g_pinfo, tap_p); + } + + return offset; +} + +static int dissect_returnData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) { + static gboolean opCodeKnown = TRUE; + static ansi_map_tap_rec_t tap_rec[16]; + static ansi_map_tap_rec_t *tap_p; + static int tap_current=0; + + /* + * set tap record pointer + */ + tap_current++; + if (tap_current == array_length(tap_rec)) + { + tap_current = 0; + } + tap_p = &tap_rec[tap_current]; + + switch(OperationCode){ + case 1: /*Handoff Measurement Request*/ + offset = dissect_ansi_map_HandoffMeasurementRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffMeasurementRequestRes); + break; + case 2: /*Facilities Directive*/ + offset = dissect_ansi_map_FacilitiesDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitiesDirectiveRes); + break; + case 4: /*Handoff Back*/ + offset = dissect_ansi_map_HandoffBackRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffBackRes); + break; + case 5: /*Facilities Release*/ + offset = dissect_ansi_map_FacilitiesReleaseRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitiesReleaseRes); + break; + case 6: /*Qualification Request*/ + offset = dissect_ansi_map_QualificationRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_qualificationRequestRes); + break; + case 7: /*Qualification Directive*/ + offset = dissect_ansi_map_QualificationDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_qualificationDirectiveRes); + break; + case 10: /*Reset Circuit*/ + offset = dissect_ansi_map_ResetCircuitRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_resetCircuitRes); + break; + case 13: /*Registration Notification*/ + offset = dissect_ansi_map_RegistrationNotificationRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_registrationNotificationRes); + break; + case 14: /*Registration Cancellation*/ + offset = dissect_ansi_map_RegistrationCancellationRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_registrationCancellationRes); + break; + case 15: /*Location Request*/ + offset = dissect_ansi_map_LocationRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_locationRequestRes); + break; + case 16: /*Routing Request*/ + offset = dissect_ansi_map_RoutingRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_routingRequestRes); + break; + case 17: /*Feature Request*/ + offset = dissect_ansi_map_FeatureRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_featureRequestRes); + break; + case 23: /*Transfer To Number Request*/ + offset = dissect_ansi_map_TransferToNumberRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_transferToNumberRequestRes); + break; + case 25: /*Handoff To Third*/ + offset = dissect_ansi_map_HandoffToThirdRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffToThirdRes); + break; + case 26: /*Flash Request*/ + /* No data */ + proto_tree_add_expert(tree, actx->pinfo, &ei_ansi_map_no_data, tvb, offset, -1); + break; + case 27: /*Authentication Directive*/ + offset = dissect_ansi_map_AuthenticationDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationDirectiveRes); + break; + case 28: /*Authentication Request*/ + offset = dissect_ansi_map_AuthenticationRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationRequestRes); + break; + case 29: /*Base Station Challenge*/ + offset = dissect_ansi_map_BaseStationChallengeRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_baseStationChallengeRes); + break; + case 30: /*Authentication Failure Report*/ + offset = dissect_ansi_map_AuthenticationFailureReportRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationFailureReportRes); + break; + case 31: /*Count Request*/ + offset = dissect_ansi_map_CountRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_countRequestRes); + break; + case 32: /*Inter System Page*/ + offset = dissect_ansi_map_InterSystemPageRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPageRes); + break; + case 33: /*Unsolicited Response*/ + offset = dissect_ansi_map_UnsolicitedResponseRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_unsolicitedResponseRes); + break; + case 35: /*Handoff Measurement Request 2*/ + offset = dissect_ansi_map_HandoffMeasurementRequest2Res(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffMeasurementRequest2Res); + break; + case 36: /*Facilities Directive 2*/ + offset = dissect_ansi_map_FacilitiesDirective2Res(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitiesDirective2Res); + break; + case 37: /*Handoff Back 2*/ + offset = dissect_ansi_map_HandoffBack2Res(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffBack2Res); + break; + case 38: /*Handoff To Third 2*/ + offset = dissect_ansi_map_HandoffToThird2Res(TRUE, tvb, offset, actx, tree, hf_ansi_map_handoffToThird2Res); + break; + case 39: /*Authentication Directive Forward*/ + offset = dissect_ansi_map_AuthenticationDirectiveForwardRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationDirectiveForwardRes); + break; + case 40: /*Authentication Status Report*/ + offset = dissect_ansi_map_AuthenticationStatusReportRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_authenticationStatusReportRes); + break; + /*Reserved 41*/ + case 42: /*Information Directive*/ + offset = dissect_ansi_map_InformationDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_informationDirectiveRes); + break; + case 43: /*Information Forward*/ + offset = dissect_ansi_map_InformationForwardRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_informationForwardRes); + break; + case 45: /*Inter System Page 2*/ + offset = dissect_ansi_map_InterSystemPage2Res(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPage2Res); + break; + case 46: /*Inter System Setup*/ + offset = dissect_ansi_map_InterSystemSetupRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemSetupRes); + break; + case 47: /*OriginationRequest*/ + offset = dissect_ansi_map_OriginationRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_originationRequestRes); + break; + case 48: /*Random Variable Request*/ + offset = dissect_ansi_map_RandomVariableRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_randomVariableRequestRes); + break; + case 50: /*Remote User Interaction Directive*/ + offset = dissect_ansi_map_RemoteUserInteractionDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_remoteUserInteractionDirectiveRes); + break; + case 51: /*SMS Delivery Backward*/ + offset = dissect_ansi_map_SMSDeliveryBackwardRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSDeliveryBackwardRes); + break; + case 52: /*SMS Delivery Forward*/ + offset = dissect_ansi_map_SMSDeliveryForwardRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSDeliveryForwardRes); + break; + case 53: /*SMS Delivery Point to Point*/ + offset = dissect_ansi_map_SMSDeliveryPointToPointRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSDeliveryPointToPointRes); + break; + case 54: /*SMS Notification*/ + offset = dissect_ansi_map_SMSNotificationRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSNotificationRes); + break; + case 55: /*SMS Request*/ + offset = dissect_ansi_map_SMSRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_sMSRequestRes); + break; + /* N.S0008-0 v 1.0 */ + case 56: /*OTASP Request 6.4.2.CC*/ + offset = dissect_ansi_map_OTASPRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_oTASPRequestRes); + break; + /* 57 Information Backward*/ + case 58: /*Change Facilities*/ + offset = dissect_ansi_map_ChangeFacilitiesRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_changeFacilitiesRes); + break; + case 59: /*Change Service*/ + offset = dissect_ansi_map_ChangeServiceRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_changeServiceRes); + break; + case 60: /*Parameter Request*/ + offset = dissect_ansi_map_ParameterRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_parameterRequestRes); + break; + case 61: /*TMSI Directive*/ + offset = dissect_ansi_map_TMSIDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_tMSIDirectiveRes); + break; + case 62: /*NumberPortabilityRequest */ + offset = dissect_ansi_map_NumberPortabilityRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_numberPortabilityRequestRes); + break; + case 63: /*Service Request*/ + offset = dissect_ansi_map_ServiceRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_serviceRequestRes); + break; + /* N.S0013 */ + case 64: /*Analyzed Information Request*/ + offset = dissect_ansi_map_AnalyzedInformationRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_analyzedInformationRes); + break; + /* 65 Connection Failure Report*/ + /* 66 Connect Resource*/ + /* 67 Disconnect Resource*/ + case 68: /*Facility Selected and Available*/ + offset = dissect_ansi_map_FacilitySelectedAndAvailableRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_facilitySelectedAndAvailableRes); + break; + /* 69 Instruction Request*/ + case 70: /*Modify*/ + offset = dissect_ansi_map_ModifyRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_modifyRes); + break; + case 72: /*Search*/ + offset = dissect_ansi_map_SearchRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_searchRes); + break; + case 73: /*Seize Resource*/ + offset = dissect_ansi_map_SeizeResourceRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_seizeResourceRes); + break; + case 74: /*SRF Directive*/ + offset = dissect_ansi_map_SRFDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_sRFDirectiveRes); + break; + case 75: /*T Busy*/ + offset = dissect_ansi_map_TBusyRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_tBusyRes); + break; + case 76: /*T NoAnswer*/ + offset = dissect_ansi_map_TNoAnswerRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_tNoAnswerRes); + break; + case 81: /*Call Control Directive*/ + offset = dissect_ansi_map_CallControlDirectiveRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_callControlDirectiveRes); + break; + case 83: /*O Disconnect*/ + offset = dissect_ansi_map_ODisconnectRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_oDisconnectRes); + break; + case 86: /*T Disconnect*/ + offset = dissect_ansi_map_TDisconnectRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_tDisconnectRes); + break; + case 88: /*O CalledPartyBusy*/ + offset = dissect_ansi_map_OCalledPartyBusyRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_oCalledPartyBusyRes); + break; + case 89: /*O NoAnswer*/ + offset = dissect_ansi_map_ONoAnswerRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_oNoAnswerRes); + break; + case 90: /*Position Request*/ + offset = dissect_ansi_map_PositionRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_positionRequestRes); + break; + case 91: /*Position Request Forward*/ + offset = dissect_ansi_map_PositionRequestForwardRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_positionRequestForwardRes); + break; + case 95: /*Inter System Position Request*/ + offset = dissect_ansi_map_InterSystemPositionRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPositionRequestRes); + break; + case 96: /*Inter System Position Request Forward*/ + offset = dissect_ansi_map_InterSystemPositionRequestForwardRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemPositionRequestRes); + break; + case 98: /*Roamer Database Verification Request*/ + offset = dissect_ansi_map_RoamerDatabaseVerificationRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_roamerDatabaseVerificationRequestRes); + break; + case 99: /*Add Service*/ + offset = dissect_ansi_map_AddServiceRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_addServiceRes); + break; + case 100: /*Drop Service*/ + offset = dissect_ansi_map_DropServiceRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_dropServiceRes); + break; + /*End N.S0029 */ + /* X.S0002-0 v1.0 */ + /* LCSParameterRequest */ + case 102: + offset = dissect_ansi_map_LCSParameterRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_lcsParameterRequestRes); + break; + /* CheckMEID X.S0008-0 v1.0*/ + case 104: + offset = dissect_ansi_map_CheckMEIDRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_checkMEIDRes); + break; + /* PositionEventNotification * + case 106: + offset = dissect_ansi_map_PositionEventNotification(TRUE, tvb, offset, actx, tree, hf_ansi_map_positionEventNotificationRes); + break; + */ + case 107: + /* StatusRequest X.S0008-0 v1.0*/ + offset = dissect_ansi_map_StatusRequestRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_statusRequestRes); + break; + case 111: + /* InterSystemSMSDeliveryPointToPointRes X.S0004-540-E v2.0 */ + offset = dissect_ansi_map_InterSystemSMSDeliveryPointToPointRes(TRUE, tvb, offset, actx, tree, hf_ansi_map_interSystemSMSDeliveryPointToPointRes); + break; + case 112: + /* QualificationRequest2Res 112 X.S0004-540-E v2.0*/ + offset = dissect_ansi_map_QualificationRequest2Res(TRUE, tvb, offset, actx, tree, hf_ansi_map_qualificationRequest2Res); + break; + default: + proto_tree_add_expert(tree, actx->pinfo, &ei_ansi_map_unknown_invokeData_blob, tvb, offset, -1); + opCodeKnown = FALSE; + break; + } + + if (opCodeKnown) + { + tap_p->message_type = OperationCode; + tap_p->size = 0; /* should be number of octets in message */ + + tap_queue_packet(ansi_map_tap, g_pinfo, tap_p); + } + + return offset; +} + +static int +find_saved_invokedata(asn1_ctx_t *actx, struct ansi_tcap_private_t *p_private_tcap){ + struct ansi_map_invokedata_t *ansi_map_saved_invokedata; + address* src = &(actx->pinfo->src); + address* dst = &(actx->pinfo->dst); + guint8 *src_str; + guint8 *dst_str; + char *buf; + + buf=(char *)wmem_alloc(wmem_packet_scope(), 1024); + + /* Data from the TCAP dissector */ + /* The hash string needs to contain src and dest to distiguish differnt flows */ + src_str = address_to_str(wmem_packet_scope(), src); + dst_str = address_to_str(wmem_packet_scope(), dst); + /* Reverse order to invoke */ + switch(ansi_map_response_matching_type){ + case ANSI_MAP_TID_ONLY: + g_snprintf(buf,1024,"%s",p_private_tcap->TransactionID_str); + break; + case ANSI_MAP_TID_AND_SOURCE: + g_snprintf(buf,1024,"%s%s",p_private_tcap->TransactionID_str,dst_str); + break; + case ANSI_MAP_TID_SOURCE_AND_DEST: + default: + g_snprintf(buf,1024,"%s%s%s",p_private_tcap->TransactionID_str,dst_str,src_str); + break; + } + + /*g_warning("Find Hash string %s pkt: %u",buf,actx->pinfo->num);*/ + ansi_map_saved_invokedata = (struct ansi_map_invokedata_t *)g_hash_table_lookup(TransactionId_table, buf); + if(ansi_map_saved_invokedata){ + OperationCode = ansi_map_saved_invokedata->opcode & 0xff; + ServiceIndicator = ansi_map_saved_invokedata->ServiceIndicator; + }else{ + OperationCode = OperationCode & 0x00ff; + } + + return OperationCode; +} + +static int +dissect_ansi_map(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +{ + proto_item *ansi_map_item; + proto_tree *ansi_map_tree = NULL; + struct ansi_tcap_private_t *p_private_tcap = (struct ansi_tcap_private_t *)data; + asn1_ctx_t asn1_ctx; + asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo); + + SMS_BearerData_tvb = NULL; + ansi_map_sms_tele_id = -1; + g_pinfo = pinfo; + g_tree = tree; + + /* The TCAP dissector should have provided data but didn't so reject it. */ + if (data == NULL) + return 0; + /* + * Make entry in the Protocol column on summary display + */ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "ANSI MAP"); + + /* + * create the ansi_map protocol tree + */ + ansi_map_item = proto_tree_add_item(tree, proto_ansi_map, tvb, 0, -1, ENC_NA); + ansi_map_tree = proto_item_add_subtree(ansi_map_item, ett_ansi_map); + ansi_map_is_invoke = FALSE; + is683_ota = FALSE; + is801_pld = FALSE; + ServiceIndicator = 0; + + switch(p_private_tcap->d.pdu){ + /* + 1 : invoke, + 2 : returnResult, + 3 : returnError, + 4 : reject + */ + case 1: + OperationCode = p_private_tcap->d.OperationCode_private & 0x00ff; + ansi_map_is_invoke = TRUE; + col_add_fstr(pinfo->cinfo, COL_INFO,"%s Invoke ", val_to_str_ext(OperationCode, &ansi_map_opr_code_strings_ext, "Unknown ANSI-MAP PDU (%u)")); + proto_item_append_text(p_private_tcap->d.OperationCode_item," %s",val_to_str_ext(OperationCode, &ansi_map_opr_code_strings_ext, "Unknown ANSI-MAP PDU (%u)")); + dissect_invokeData(ansi_map_tree, tvb, 0, &asn1_ctx); + update_saved_invokedata(pinfo, p_private_tcap); + break; + case 2: + OperationCode = find_saved_invokedata(&asn1_ctx, p_private_tcap); + col_add_fstr(pinfo->cinfo, COL_INFO,"%s ReturnResult ", val_to_str_ext(OperationCode, &ansi_map_opr_code_strings_ext, "Unknown ANSI-MAP PDU (%u)")); + proto_item_append_text(p_private_tcap->d.OperationCode_item," %s",val_to_str_ext(OperationCode, &ansi_map_opr_code_strings_ext, "Unknown ANSI-MAP PDU (%u)")); + dissect_returnData(ansi_map_tree, tvb, 0, &asn1_ctx); + break; + case 3: + col_add_fstr(pinfo->cinfo, COL_INFO,"%s ReturnError ", val_to_str_ext(OperationCode, &ansi_map_opr_code_strings_ext, "Unknown ANSI-MAP PDU (%u)")); + break; + case 4: + col_add_fstr(pinfo->cinfo, COL_INFO,"%s Reject ", val_to_str_ext(OperationCode, &ansi_map_opr_code_strings_ext, "Unknown ANSI-MAP PDU (%u)")); + break; + default: + /* Must be Invoke ReturnResult ReturnError or Reject */ + DISSECTOR_ASSERT_NOT_REACHED(); + break; + } + + return tvb_captured_length(tvb); +} + +static void range_delete_callback(guint32 ssn) +{ + if (ssn) { + delete_ansi_tcap_subdissector(ssn , ansi_map_handle); + } +} + +static void range_add_callback(guint32 ssn) +{ + if (ssn) { + add_ansi_tcap_subdissector(ssn , ansi_map_handle); + } +} + +/* TAP STAT INFO */ +typedef enum +{ + OPCODE_COLUMN = 0, + OPERATION_COLUMN, + COUNT_COLUMN, + TOTAL_BYTES_COLUMN, + AVG_BYTES_COLUMN +} ansi_map_stat_columns; + +static stat_tap_table_item stat_fields[] = {{TABLE_ITEM_UINT, TAP_ALIGN_RIGHT, "OpCode", "0x%02x"}, {TABLE_ITEM_STRING, TAP_ALIGN_LEFT, "Operation Name", "%-50s"}, + {TABLE_ITEM_UINT, TAP_ALIGN_RIGHT, "Count", " %d "}, {TABLE_ITEM_UINT, TAP_ALIGN_RIGHT, "Total Bytes", " %d "}, + {TABLE_ITEM_FLOAT, TAP_ALIGN_RIGHT, "Avg Bytes", " %8.2f "}}; + +static void ansi_map_stat_init(stat_tap_table_ui* new_stat, new_stat_tap_gui_init_cb gui_callback, void* gui_data) +{ + int num_fields = sizeof(stat_fields)/sizeof(stat_tap_table_item); + stat_tap_table* table = new_stat_tap_init_table("ANSI MAP Operation Statistics", num_fields, 0, "ansi_map.op_code", gui_callback, gui_data); + int i = 0; + stat_tap_table_item_type items[sizeof(stat_fields)/sizeof(stat_tap_table_item)]; + + new_stat_tap_add_table(new_stat, table); + + /* Add a fow for each value type */ + while (ansi_map_opr_code_strings[i].strptr) + { + items[OPCODE_COLUMN].type = TABLE_ITEM_UINT; + items[OPCODE_COLUMN].value.uint_value = ansi_map_opr_code_strings[i].value; + items[OPERATION_COLUMN].type = TABLE_ITEM_STRING; + items[OPERATION_COLUMN].value.string_value = ansi_map_opr_code_strings[i].strptr; + items[COUNT_COLUMN].type = TABLE_ITEM_UINT; + items[COUNT_COLUMN].value.uint_value = 0; + items[TOTAL_BYTES_COLUMN].type = TABLE_ITEM_UINT; + items[TOTAL_BYTES_COLUMN].value.uint_value = 0; + items[AVG_BYTES_COLUMN].type = TABLE_ITEM_FLOAT; + items[AVG_BYTES_COLUMN].value.float_value = 0.0f; + + new_stat_tap_init_table_row(table, ansi_map_opr_code_strings[i].value, num_fields, items); + i++; + } +} + + +static gboolean +ansi_map_stat_packet(void *tapdata, packet_info *pinfo _U_, epan_dissect_t *edt _U_, const void *data) +{ + new_stat_data_t* stat_data = (new_stat_data_t*)tapdata; + const ansi_map_tap_rec_t *data_p = (const ansi_map_tap_rec_t *)data; + stat_tap_table* table; + stat_tap_table_item_type* item_data; + guint i = 0, count, total_bytes; + + /* Only tracking field values we know */ + if (try_val_to_str(data_p->message_type, ansi_map_opr_code_strings) == NULL) + return FALSE; + + table = g_array_index(stat_data->stat_tap_data->tables, stat_tap_table*, i); + + item_data = new_stat_tap_get_field_data(table, data_p->message_type, COUNT_COLUMN); + item_data->value.uint_value++; + count = item_data->value.uint_value; + new_stat_tap_set_field_data(table, data_p->message_type, COUNT_COLUMN, item_data); + + item_data = new_stat_tap_get_field_data(table, data_p->message_type, TOTAL_BYTES_COLUMN); + item_data->value.uint_value += data_p->size; + total_bytes = item_data->value.uint_value; + new_stat_tap_set_field_data(table, data_p->message_type, TOTAL_BYTES_COLUMN, item_data); + + item_data = new_stat_tap_get_field_data(table, data_p->message_type, AVG_BYTES_COLUMN); + item_data->value.float_value = (float)total_bytes/(float)count; + new_stat_tap_set_field_data(table, data_p->message_type, AVG_BYTES_COLUMN, item_data); + + return TRUE; +} + +static void +ansi_map_stat_reset(stat_tap_table* table) +{ + guint element; + stat_tap_table_item_type* item_data; + + for (element = 0; element < table->num_elements; element++) + { + item_data = new_stat_tap_get_field_data(table, element, COUNT_COLUMN); + item_data->value.uint_value = 0; + new_stat_tap_set_field_data(table, element, COUNT_COLUMN, item_data); + + item_data = new_stat_tap_get_field_data(table, element, TOTAL_BYTES_COLUMN); + item_data->value.uint_value = 0; + new_stat_tap_set_field_data(table, element, TOTAL_BYTES_COLUMN, item_data); + + item_data = new_stat_tap_get_field_data(table, element, AVG_BYTES_COLUMN); + item_data->value.float_value = 0.0f; + new_stat_tap_set_field_data(table, element, AVG_BYTES_COLUMN, item_data); + } + +} + +void +proto_reg_handoff_ansi_map(void) +{ + static gboolean ansi_map_prefs_initialized = FALSE; + static range_t *ssn_range; + + if(!ansi_map_prefs_initialized) + { + ansi_map_prefs_initialized = TRUE; + ansi_map_handle = find_dissector("ansi_map"); + } + else + { + range_foreach(ssn_range, range_delete_callback); + g_free(ssn_range); + } + + ssn_range = range_copy(global_ssn_range); + + range_foreach(ssn_range, range_add_callback); +} + +/*--- proto_register_ansi_map -------------------------------------------*/ +void proto_register_ansi_map(void) { + + module_t *ansi_map_module; + + /* List of fields */ + static hf_register_info hf[] = { + + { &hf_ansi_map_op_code_fam, + { "Operation Code Family", "ansi_map.op_code_fam", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_reservedBitH, + { "Reserved", "ansi_map.reserved_bitH", + FT_BOOLEAN, 8, NULL,0x80, + NULL, HFILL }}, + { &hf_ansi_map_reservedBitD, + { "Reserved", "ansi_map.reserved_bitD", + FT_BOOLEAN, 8, NULL,0x08, + NULL, HFILL }}, + { &hf_ansi_map_reservedBitHG, + { "Reserved", "ansi_map.reserved_bitHG", + FT_UINT8, BASE_DEC, NULL, 0xc0, + NULL, HFILL }}, + { &hf_ansi_map_reservedBitHGFE, + { "Reserved", "ansi_map.reserved_bitHGFE", + FT_UINT8, BASE_DEC, NULL, 0xf0, + NULL, HFILL }}, + { &hf_ansi_map_reservedBitFED, + { "Reserved", "ansi_map.reserved_bitFED", + FT_UINT8, BASE_DEC, NULL, 0x38, + NULL, HFILL }}, + { &hf_ansi_map_reservedBitED, + { "Reserved", "ansi_map.reserved_bitED", + FT_UINT8, BASE_DEC, NULL, 0x18, + NULL, HFILL }}, + { &hf_ansi_map_op_code, + { "Operation Code", "ansi_map.op_code", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ansi_map_opr_code_strings_ext, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_type_of_digits, + { "Type of Digits", "ansi_map.type_of_digits", + FT_UINT8, BASE_DEC, VALS(ansi_map_type_of_digits_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_na, + { "Nature of Number", "ansi_map.na", + FT_BOOLEAN, 8, TFS(&ansi_map_na_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_pi, + { "Presentation Indication", "ansi_map.type_of_pi", + FT_BOOLEAN, 8, TFS(&ansi_map_pi_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_navail, + { "Number available indication", "ansi_map.navail", + FT_BOOLEAN, 8, TFS(&ansi_map_navail_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_si, + { "Screening indication", "ansi_map.si", + FT_UINT8, BASE_DEC, VALS(ansi_map_si_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_digits_enc, + { "Encoding", "ansi_map.enc", + FT_UINT8, BASE_DEC, VALS(ansi_map_digits_enc_vals), 0x0f, + NULL, HFILL }}, + { &hf_ansi_map_np, + { "Numbering Plan", "ansi_map.np", + FT_UINT8, BASE_DEC, VALS(ansi_map_np_vals), 0xf0, + NULL, HFILL }}, + { &hf_ansi_map_nr_digits, + { "Number of Digits", "ansi_map.nr_digits", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_bcd_digits, + { "BCD digits", "ansi_map.bcd_digits", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_ia5_digits, + { "IA5 digits", "ansi_map.ia5_digits", + FT_STRING, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_subaddr_type, + { "Type of Subaddress", "ansi_map.subaddr_type", + FT_UINT8, BASE_DEC, VALS(ansi_map_sub_addr_type_vals), 0x70, + NULL, HFILL }}, + { &hf_ansi_map_subaddr_odd_even, + { "Odd/Even Indicator", "ansi_map.subaddr_odd_even", + FT_BOOLEAN, 8, TFS(&ansi_map_navail_bool_val),0x08, + NULL, HFILL }}, + + { &hf_ansi_alertcode_cadence, + { "Cadence", "ansi_map.alertcode.cadence", + FT_UINT8, BASE_DEC, VALS(ansi_map_AlertCode_Cadence_vals), 0x3f, + NULL, HFILL }}, + { &hf_ansi_alertcode_pitch, + { "Pitch", "ansi_map.alertcode.pitch", + FT_UINT8, BASE_DEC, VALS(ansi_map_AlertCode_Pitch_vals), 0xc0, + NULL, HFILL }}, + { &hf_ansi_alertcode_alertaction, + { "Alert Action", "ansi_map.alertcode.alertaction", + FT_UINT8, BASE_DEC, VALS(ansi_map_AlertCode_Alert_Action_vals), 0x07, + NULL, HFILL }}, + { &hf_ansi_map_announcementcode_tone, + { "Tone", "ansi_map.announcementcode.tone", + FT_UINT8, BASE_DEC, VALS(ansi_map_AnnouncementCode_tone_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_announcementcode_class, + { "Tone", "ansi_map.announcementcode.class", + FT_UINT8, BASE_DEC, VALS(ansi_map_AnnouncementCode_class_vals), 0xf, + NULL, HFILL }}, + { &hf_ansi_map_announcementcode_std_ann, + { "Standard Announcement", "ansi_map.announcementcode.std_ann", + FT_UINT8, BASE_DEC, VALS(ansi_map_AnnouncementCode_std_ann_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_announcementcode_cust_ann, + { "Custom Announcement", "ansi_map.announcementcode.cust_ann", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_authorizationperiod_period, + { "Period", "ansi_map.authorizationperiod.period", + FT_UINT8, BASE_DEC, VALS(ansi_map_authorizationperiod_period_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_value, + { "Value", "ansi_map.value", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_msc_type, + { "Type", "ansi_map.extendedmscid.type", + FT_UINT8, BASE_DEC, VALS(ansi_map_msc_type_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_handoffstate_pi, + { "Party Involved (PI)", "ansi_map.handoffstate.pi", + FT_BOOLEAN, 8, TFS(&ansi_map_HandoffState_pi_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_tgn, + { "Trunk Group Number (G)", "ansi_map.tgn", + FT_UINT8, BASE_DEC, NULL,0x0, + NULL, HFILL }}, + { &hf_ansi_map_tmn, + { "Trunk Member Number (M)", "ansi_map.tmn", + FT_UINT8, BASE_DEC, NULL,0x0, + NULL, HFILL }}, + { &hf_ansi_map_messagewaitingnotificationcount_tom, + { "Type of messages", "ansi_map.messagewaitingnotificationcount.tom", + FT_UINT8, BASE_DEC, VALS(ansi_map_MessageWaitingNotificationCount_type_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_messagewaitingnotificationcount_no_mw, + { "Number of Messages Waiting", "ansi_map.messagewaitingnotificationcount.nomw", + FT_UINT8, BASE_DEC, NULL,0x0, + NULL, HFILL }}, + { &hf_ansi_map_messagewaitingnotificationtype_mwi, + { "Message Waiting Indication (MWI)", "ansi_map.messagewaitingnotificationcount.mwi", + FT_UINT8, BASE_DEC, VALS(ansi_map_MessageWaitingNotificationType_mwi_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_map_messagewaitingnotificationtype_apt, + { "Alert Pip Tone (APT)", "ansi_map.messagewaitingnotificationtype.apt", + FT_BOOLEAN, 8, TFS(&ansi_map_HandoffState_pi_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_messagewaitingnotificationtype_pt, + { "Pip Tone (PT)", "ansi_map.messagewaitingnotificationtype.pt", + FT_UINT8, BASE_DEC, VALS(ansi_map_MessageWaitingNotificationType_mwi_vals), 0xc0, + NULL, HFILL }}, + + { &hf_ansi_map_trans_cap_prof, + { "Profile (PROF)", "ansi_map.trans_cap_prof", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_prof_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_busy, + { "Busy Detection (BUSY)", "ansi_map.trans_cap_busy", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_busy_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_ann, + { "Announcements (ANN)", "ansi_map.trans_cap_ann", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_ann_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_rui, + { "Remote User Interaction (RUI)", "ansi_map.trans_cap_rui", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_rui_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_spini, + { "Subscriber PIN Intercept (SPINI)", "ansi_map.trans_cap_spini", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_spini_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_uzci, + { "UZ Capability Indicator (UZCI)", "ansi_map.trans_cap_uzci", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_uzci_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_ndss, + { "NDSS Capability (NDSS)", "ansi_map.trans_cap_ndss", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_ndss_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_trans_cap_nami, + { "NAME Capability Indicator (NAMI)", "ansi_map.trans_cap_nami", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_nami_bool_val),0x80, + NULL, HFILL }}, + { &hf_ansi_trans_cap_multerm, + { "Multiple Terminations", "ansi_map.trans_cap_multerm", + FT_UINT8, BASE_DEC, VALS(ansi_map_trans_cap_multerm_vals), 0x0f, + NULL, HFILL }}, + { &hf_ansi_map_terminationtriggers_busy, + { "Busy", "ansi_map.terminationtriggers.busy", + FT_UINT8, BASE_DEC, VALS(ansi_map_terminationtriggers_busy_vals), 0x03, + NULL, HFILL }}, + { &hf_ansi_map_terminationtriggers_rf, + { "Routing Failure (RF)", "ansi_map.terminationtriggers.rf", + FT_UINT8, BASE_DEC, VALS(ansi_map_terminationtriggers_rf_vals), 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_terminationtriggers_npr, + { "No Page Response (NPR)", "ansi_map.terminationtriggers.npr", + FT_UINT8, BASE_DEC, VALS(ansi_map_terminationtriggers_npr_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_terminationtriggers_na, + { "No Answer (NA)", "ansi_map.terminationtriggers.na", + FT_UINT8, BASE_DEC, VALS(ansi_map_terminationtriggers_na_vals), 0xc0, + NULL, HFILL }}, + { &hf_ansi_map_terminationtriggers_nr, + { "None Reachable (NR)", "ansi_map.terminationtriggers.nr", + FT_UINT8, BASE_DEC, VALS(ansi_map_terminationtriggers_nr_vals), 0x01, + NULL, HFILL }}, + { &hf_ansi_trans_cap_tl, + { "TerminationList (TL)", "ansi_map.trans_cap_tl", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_tl_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_cdmaserviceoption, + { "CDMAServiceOption", "ansi_map.cdmaserviceoption", + FT_UINT16, BASE_RANGE_STRING | BASE_DEC, RVALS(cdmaserviceoption_vals), 0x0, + NULL, HFILL }}, + { &hf_ansi_trans_cap_waddr, + { "WIN Addressing (WADDR)", "ansi_map.trans_cap_waddr", + FT_BOOLEAN, 8, TFS(&ansi_map_trans_cap_waddr_bool_val),0x20, + NULL, HFILL }}, + + { &hf_ansi_map_MarketID, + { "MarketID", "ansi_map.marketid", + FT_UINT16, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_swno, + { "Switch Number (SWNO)", "ansi_map.swno", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_idno, + { "ID Number", "ansi_map.idno", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_segcount, + { "Segment Counter", "ansi_map.segcount", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_sms_originationrestrictions_direct, + { "DIRECT", "ansi_map.originationrestrictions.direct", + FT_BOOLEAN, 8, TFS(&ansi_map_SMS_OriginationRestrictions_direct_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_sms_originationrestrictions_default, + { "DEFAULT", "ansi_map.originationrestrictions.default", + FT_UINT8, BASE_DEC, VALS(ansi_map_SMS_OriginationRestrictions_default_vals), 0x03, + NULL, HFILL }}, + { &hf_ansi_map_sms_originationrestrictions_fmc, + { "Force Message Center (FMC)", "ansi_map.originationrestrictions.fmc", + FT_BOOLEAN, 8, TFS(&ansi_map_SMS_OriginationRestrictions_fmc_bool_val),0x08, + NULL, HFILL }}, + + { &hf_ansi_map_systemcapabilities_auth, + { "Authentication Parameters Requested (AUTH)", "ansi_map.systemcapabilities.auth", + FT_BOOLEAN, 8, TFS(&ansi_map_systemcapabilities_auth_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_systemcapabilities_se, + { "Signaling Message Encryption Capable (SE )", "ansi_map.systemcapabilities.se", + FT_BOOLEAN, 8, TFS(&ansi_map_systemcapabilities_se_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_systemcapabilities_vp, + { "Voice Privacy Capable (VP )", "ansi_map.systemcapabilities.vp", + FT_BOOLEAN, 8, TFS(&ansi_map_systemcapabilities_vp_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_systemcapabilities_cave, + { "CAVE Algorithm Capable (CAVE)", "ansi_map.systemcapabilities.cave", + FT_BOOLEAN, 8, TFS(&ansi_map_systemcapabilities_cave_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_systemcapabilities_ssd, + { "Shared SSD (SSD)", "ansi_map.systemcapabilities.ssd", + FT_BOOLEAN, 8, TFS(&ansi_map_systemcapabilities_ssd_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_systemcapabilities_dp, + { "Data Privacy (DP)", "ansi_map.systemcapabilities.dp", + FT_BOOLEAN, 8, TFS(&ansi_map_systemcapabilities_dp_bool_val),0x20, + NULL, HFILL }}, + + { &hf_ansi_map_mslocation_lat, + { "Latitude in tenths of a second", "ansi_map.mslocation.lat", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_mslocation_long, + { "Longitude in tenths of a second", "ansi_map.mslocation.long", + FT_UINT8, BASE_DEC, NULL, 0, + "Switch Number (SWNO)", HFILL }}, + { &hf_ansi_map_mslocation_res, + { "Resolution in units of 1 foot", "ansi_map.mslocation.res", + FT_UINT8, BASE_DEC, NULL, 0, + NULL, HFILL }}, + { &hf_ansi_map_nampscallmode_namps, + { "Call Mode", "ansi_map.nampscallmode.namps", + FT_BOOLEAN, 8, TFS(&ansi_map_CallMode_namps_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_nampscallmode_amps, + { "Call Mode", "ansi_map.nampscallmode.amps", + FT_BOOLEAN, 8, TFS(&ansi_map_CallMode_amps_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_nampschanneldata_navca, + { "Narrow Analog Voice Channel Assignment (NAVCA)", "ansi_map.nampschanneldata.navca", + FT_UINT8, BASE_DEC, VALS(ansi_map_NAMPSChannelData_navca_vals), 0x03, + NULL, HFILL }}, + { &hf_ansi_map_nampschanneldata_CCIndicator, + { "Color Code Indicator (CCIndicator)", "ansi_map.nampschanneldata.ccindicator", + FT_UINT8, BASE_DEC, VALS(ansi_map_NAMPSChannelData_ccinidicator_vals), 0x1c, + NULL, HFILL }}, + + + { &hf_ansi_map_callingfeaturesindicator_cfufa, + { "Call Forwarding Unconditional FeatureActivity, CFU-FA", "ansi_map.callingfeaturesindicator.cfufa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x03, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cfbfa, + { "Call Forwarding Busy FeatureActivity, CFB-FA", "ansi_map.callingfeaturesindicator.cfbafa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cfnafa, + { "Call Forwarding No Answer FeatureActivity, CFNA-FA", "ansi_map.callingfeaturesindicator.cfnafa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cwfa, + { "Call Waiting: FeatureActivity, CW-FA", "ansi_map.callingfeaturesindicator.cwfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0xc0, + NULL, HFILL }}, + + { &hf_ansi_map_callingfeaturesindicator_3wcfa, + { "Three-Way Calling FeatureActivity, 3WC-FA", "ansi_map.callingfeaturesindicator.3wcfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x03, + NULL, HFILL }}, + + { &hf_ansi_map_callingfeaturesindicator_pcwfa, + { "Priority Call Waiting FeatureActivity PCW-FA", "ansi_map.callingfeaturesindicator.pcwfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x03, + NULL, HFILL }}, + + { &hf_ansi_map_callingfeaturesindicator_dpfa, + { "Data Privacy Feature Activity DP-FA", "ansi_map.callingfeaturesindicator.dpfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_ahfa, + { "Answer Hold: FeatureActivity AH-FA", "ansi_map.callingfeaturesindicator.ahfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_uscfvmfa, + { "USCF divert to voice mail: FeatureActivity USCFvm-FA", "ansi_map.callingfeaturesindicator.uscfvmfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0xc0, + NULL, HFILL }}, + + { &hf_ansi_map_callingfeaturesindicator_uscfmsfa, + { "USCF divert to mobile station provided DN:FeatureActivity.USCFms-FA", "ansi_map.callingfeaturesindicator.uscfmsfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x03, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_uscfnrfa, + { "USCF divert to network registered DN:FeatureActivity. USCFnr-FA", "ansi_map.callingfeaturesindicator.uscfnrfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cpdsfa, + { "CDMA-Packet Data Service: FeatureActivity. CPDS-FA", "ansi_map.callingfeaturesindicator.cpdfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_ccsfa, + { "CDMA-Concurrent Service:FeatureActivity. CCS-FA", "ansi_map.callingfeaturesindicator.ccsfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0xc0, + NULL, HFILL }}, + + { &hf_ansi_map_callingfeaturesindicator_epefa, + { "TDMA Enhanced Privacy and Encryption:FeatureActivity.TDMA EPE-FA", "ansi_map.callingfeaturesindicator.epefa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x03, + NULL, HFILL }}, + + + { &hf_ansi_map_callingfeaturesindicator_cdfa, + { "Call Delivery: FeatureActivity, CD-FA", "ansi_map.callingfeaturesindicator.cdfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_vpfa, + { "Voice Privacy FeatureActivity, VP-FA", "ansi_map.callingfeaturesindicator.vpfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_ctfa, + { "Call Transfer: FeatureActivity, CT-FA", "ansi_map.callingfeaturesindicator.ctfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0xc0, + NULL, HFILL }}, + + { &hf_ansi_map_callingfeaturesindicator_cnip1fa, + { "One number (network-provided only) Calling Number Identification Presentation: FeatureActivity CNIP1-FA", "ansi_map.callingfeaturesindicator.cnip1fa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x03, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cnip2fa, + { "Two number (network-provided and user-provided) Calling Number Identification Presentation: FeatureActivity CNIP2-FA", "ansi_map.callingfeaturesindicator.cnip2fa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cnirfa, + { "Calling Number Identification Restriction: FeatureActivity CNIR-FA", "ansi_map.callingfeaturesindicator.cnirfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0x30, + NULL, HFILL }}, + { &hf_ansi_map_callingfeaturesindicator_cniroverfa, + { "Calling Number Identification Restriction Override FeatureActivity CNIROver-FA", "ansi_map.callingfeaturesindicator.cniroverfa", + FT_UINT8, BASE_DEC, VALS(ansi_map_FeatureActivity_vals), 0xc0, + NULL, HFILL }}, + + { &hf_ansi_map_cdmacallmode_cdma, + { "Call Mode", "ansi_map.cdmacallmode.cdma", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cdma_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_amps, + { "Call Mode", "ansi_map.cdmacallmode.amps", + FT_BOOLEAN, 8, TFS(&ansi_map_CallMode_amps_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_namps, + { "Call Mode", "ansi_map.cdmacallmode.namps", + FT_BOOLEAN, 8, TFS(&ansi_map_CallMode_namps_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls1, + { "Call Mode", "ansi_map.cdmacallmode.cls1", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls1_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls2, + { "Call Mode", "ansi_map.cdmacallmode.cls2", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls2_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls3, + { "Call Mode", "ansi_map.cdmacallmode.cls3", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls3_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls4, + { "Call Mode", "ansi_map.cdmacallmode.cls4", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls4_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls5, + { "Call Mode", "ansi_map.cdmacallmode.cls5", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls5_bool_val),0x80, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls6, + { "Call Mode", "ansi_map.cdmacallmode.cls6", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls6_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls7, + { "Call Mode", "ansi_map.cdmacallmode.cls7", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls7_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls8, + { "Call Mode", "ansi_map.cdmacallmode.cls8", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls8_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls9, + { "Call Mode", "ansi_map.cdmacallmode.cls9", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls9_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_cdmacallmode_cls10, + { "Call Mode", "ansi_map.cdmacallmode.cls10", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMACallMode_cls10_bool_val),0x10, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_Frame_Offset, + { "Frame Offset", "ansi_map.cdmachanneldata.frameoffset", + FT_UINT8, BASE_DEC, NULL, 0x78, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_CDMA_ch_no, + { "CDMA Channel Number", "ansi_map.cdmachanneldata.cdma_ch_no", + FT_UINT16, BASE_DEC, NULL, 0x07FF, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_band_cls, + { "Band Class", "ansi_map.cdmachanneldata.band_cls", + FT_UINT8, BASE_DEC, VALS(ansi_map_cdmachanneldata_band_cls_vals), 0x7c, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_lc_mask_b6, + { "Long Code Mask (byte 6) MSB", "ansi_map.cdmachanneldata.lc_mask_b6", + FT_UINT8, BASE_HEX, NULL, 0x03, + "Long Code Mask MSB (byte 6)", HFILL }}, + {&hf_ansi_map_cdmachanneldata_lc_mask_b5, + { "Long Code Mask (byte 5)", "ansi_map.cdmachanneldata.lc_mask_b5", + FT_UINT8, BASE_HEX, NULL, 0xff, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_lc_mask_b4, + { "Long Code Mask (byte 4)", "ansi_map.cdmachanneldata.lc_mask_b4", + FT_UINT8, BASE_HEX, NULL, 0xff, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_lc_mask_b3, + { "Long Code Mask (byte 3)", "ansi_map.cdmachanneldata.lc_mask_b3", + FT_UINT8, BASE_HEX, NULL, 0xff, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_lc_mask_b2, + { "Long Code Mask (byte 2)", "ansi_map.cdmachanneldata.lc_mask_b2", + FT_UINT8, BASE_HEX, NULL, 0xff, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_lc_mask_b1, + { "Long Code Mask LSB(byte 1)", "ansi_map.cdmachanneldata.lc_mask_b1", + FT_UINT8, BASE_HEX, NULL, 0xff, + "Long Code Mask (byte 1)LSB", HFILL }}, + {&hf_ansi_map_cdmachanneldata_np_ext, + { "NP EXT", "ansi_map.cdmachanneldata.np_ext", + FT_BOOLEAN, 8, NULL,0x80, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_nominal_pwr, + { "Nominal Power", "ansi_map.cdmachanneldata.nominal_pwr", + FT_UINT8, BASE_DEC, NULL, 0x71, + NULL, HFILL }}, + {&hf_ansi_map_cdmachanneldata_nr_preamble, + { "Number Preamble", "ansi_map.cdmachanneldata.nr_preamble", + FT_UINT8, BASE_DEC, NULL, 0x07, + NULL, HFILL }}, + + { &hf_ansi_map_cdmastationclassmark_pc, + { "Power Class(PC)", "ansi_map.cdmastationclassmark.pc", + FT_UINT8, BASE_DEC, VALS(ansi_map_CDMAStationClassMark_pc_vals), 0x03, + NULL, HFILL }}, + + { &hf_ansi_map_cdmastationclassmark_dtx, + { "Analog Transmission: (DTX)", "ansi_map.cdmastationclassmark.dtx", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMAStationClassMark_dtx_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_cdmastationclassmark_smi, + { "Slotted Mode Indicator: (SMI)", "ansi_map.cdmastationclassmark.smi", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMAStationClassMark_smi_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_cdmastationclassmark_dmi, + { "Dual-mode Indicator(DMI)", "ansi_map.cdmastationclassmark.dmi", + FT_BOOLEAN, 8, TFS(&ansi_map_CDMAStationClassMark_dmi_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_channeldata_vmac, + { "Voice Mobile Attenuation Code (VMAC)", "ansi_map.channeldata.vmac", + FT_UINT8, BASE_DEC, NULL, 0x07, + NULL, HFILL }}, + { &hf_ansi_map_channeldata_dtx, + { "Discontinuous Transmission Mode (DTX)", "ansi_map.channeldata.dtx", + FT_UINT8, BASE_DEC, VALS(ansi_map_ChannelData_dtx_vals), 0x18, + NULL, HFILL }}, + { &hf_ansi_map_channeldata_scc, + { "SAT Color Code (SCC)", "ansi_map.channeldata.scc", + FT_UINT8, BASE_DEC, NULL, 0xc0, + NULL, HFILL }}, + { &hf_ansi_map_channeldata_chno, + { "Channel Number (CHNO)", "ansi_map.channeldata.chno", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_ConfidentialityModes_vp, + { "Voice Privacy (VP) Confidentiality Status", "ansi_map.confidentialitymodes.vp", + FT_BOOLEAN, 8, TFS(&ansi_map_ConfidentialityModes_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_controlchanneldata_dcc, + { "Digital Color Code (DCC)", "ansi_map.controlchanneldata.dcc", + FT_UINT8, BASE_DEC, NULL, 0xc0, + NULL, HFILL }}, + { &hf_ansi_map_controlchanneldata_cmac, + { "Control Mobile Attenuation Code (CMAC)", "ansi_map.controlchanneldata.cmac", + FT_UINT8, BASE_DEC, NULL, 0x07, + NULL, HFILL }}, + { &hf_ansi_map_controlchanneldata_chno, + { "Channel Number (CHNO)", "ansi_map.controlchanneldata.chno", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_controlchanneldata_sdcc1, + { "Supplementary Digital Color Codes (SDCC1)", "ansi_map.controlchanneldata.ssdc1", + FT_UINT8, BASE_DEC, NULL, 0x0c, + NULL, HFILL }}, + { &hf_ansi_map_controlchanneldata_sdcc2, + { "Supplementary Digital Color Codes (SDCC2)", "ansi_map.controlchanneldata.ssdc2", + FT_UINT8, BASE_DEC, NULL, 0x03, + NULL, HFILL }}, + { &hf_ansi_map_ConfidentialityModes_se, + { "Signaling Message Encryption (SE) Confidentiality Status", "ansi_map.confidentialitymodes.se", + FT_BOOLEAN, 8, TFS(&ansi_map_ConfidentialityModes_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_ConfidentialityModes_dp, + { "DataPrivacy (DP) Confidentiality Status", "ansi_map.confidentialitymodes.dp", + FT_BOOLEAN, 8, TFS(&ansi_map_ConfidentialityModes_bool_val),0x04, + NULL, HFILL }}, + + { &hf_ansi_map_deniedauthorizationperiod_period, + { "Period", "ansi_map.deniedauthorizationperiod.period", + FT_UINT8, BASE_DEC, VALS(ansi_map_deniedauthorizationperiod_period_vals), 0x0, + NULL, HFILL }}, + + + { &hf_ansi_map_originationtriggers_all, + { "All Origination (All)", "ansi_map.originationtriggers.all", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_all_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_local, + { "Local", "ansi_map.originationtriggers.local", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_local_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_ilata, + { "Intra-LATA Toll (ILATA)", "ansi_map.originationtriggers.ilata", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_ilata_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_olata, + { "Inter-LATA Toll (OLATA)", "ansi_map.originationtriggers.olata", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_olata_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_int, + { "International (Int'l )", "ansi_map.originationtriggers.int", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_int_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_wz, + { "World Zone (WZ)", "ansi_map.originationtriggers.wz", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_wz_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_unrec, + { "Unrecognized Number (Unrec)", "ansi_map.originationtriggers.unrec", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_unrec_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_rvtc, + { "Revertive Call (RvtC)", "ansi_map.originationtriggers.rvtc", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_rvtc_bool_val),0x80, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_star, + { "Star", "ansi_map.originationtriggers.star", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_star_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_ds, + { "Double Star (DS)", "ansi_map.originationtriggers.ds", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_ds_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_pound, + { "Pound", "ansi_map.originationtriggers.pound", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_pound_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_dp, + { "Double Pound (DP)", "ansi_map.originationtriggers.dp", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_dp_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_pa, + { "Prior Agreement (PA)", "ansi_map.originationtriggers.pa", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_pa_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_nodig, + { "No digits", "ansi_map.originationtriggers.nodig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_nodig_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_onedig, + { "1 digit", "ansi_map.originationtriggers.onedig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_onedig_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_twodig, + { "2 digits", "ansi_map.originationtriggers.twodig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_twodig_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_threedig, + { "3 digits", "ansi_map.originationtriggers.threedig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_threedig_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_fourdig, + { "4 digits", "ansi_map.originationtriggers.fourdig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_fourdig_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_fivedig, + { "5 digits", "ansi_map.originationtriggers.fivedig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_fivedig_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_sixdig, + { "6 digits", "ansi_map.originationtriggers.sixdig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_sixdig_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_sevendig, + { "7 digits", "ansi_map.originationtriggers.sevendig", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_sevendig_bool_val),0x80, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_eightdig, + { "8 digits", "ansi_map.originationtriggers.eight", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_eightdig_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_ninedig, + { "9 digits", "ansi_map.originationtriggers.nine", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_ninedig_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_tendig, + { "10 digits", "ansi_map.originationtriggers.ten", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_tendig_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_elevendig, + { "11 digits", "ansi_map.originationtriggers.eleven", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_elevendig_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_twelvedig, + { "12 digits", "ansi_map.originationtriggers.twelve", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_twelvedig_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_thirteendig, + { "13 digits", "ansi_map.originationtriggers.thirteen", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_thirteendig_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_fourteendig, + { "14 digits", "ansi_map.originationtriggers.fourteen", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_fourteendig_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_originationtriggers_fifteendig, + { "15 digits", "ansi_map.originationtriggers.fifteen", + FT_BOOLEAN, 8, TFS(&ansi_map_originationtriggers_fifteendig_bool_val),0x80, + NULL, HFILL }}, + + { &hf_ansi_map_triggercapability_init, + { "Introducing Star/Pound (INIT)", "ansi_map.triggercapability.init", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_kdigit, + { "K-digit (K-digit)", "ansi_map.triggercapability.kdigit", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_all, + { "All_Calls (All)", "ansi_map.triggercapability.all", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_rvtc, + { "Revertive_Call (RvtC)", "ansi_map.triggercapability.rvtc", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_oaa, + { "Origination_Attempt_Authorized (OAA)", "ansi_map.triggercapability.oaa", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_oans, + { "O_Answer (OANS)", "ansi_map.triggercapability.oans", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_odisc, + { "O_Disconnect (ODISC)", "ansi_map.triggercapability.odisc", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_ona, + { "O_No_Answer (ONA)", "ansi_map.triggercapability.ona", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x80, + NULL, HFILL }}, + + { &hf_ansi_map_triggercapability_ct , + { "Call Types (CT)", "ansi_map.triggercapability.ct", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_unrec, + { "Unrecognized_Number (Unrec)", "ansi_map.triggercapability.unrec", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_pa, + { "Prior_Agreement (PA)", "ansi_map.triggercapability.pa", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_at, + { "Advanced_Termination (AT)", "ansi_map.triggercapability.at", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_cgraa, + { "Calling_Routing_Address_Available (CgRAA)", "ansi_map.triggercapability.cgraa", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_it, + { "Initial_Termination (IT)", "ansi_map.triggercapability.it", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x20, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_cdraa, + { "Called_Routing_Address_Available (CdRAA)", "ansi_map.triggercapability.cdraa", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x40, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_obsy, + { "O_Called_Party_Busy (OBSY)", "ansi_map.triggercapability.obsy", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x80, + NULL, HFILL }}, + + { &hf_ansi_map_triggercapability_tra , + { "Terminating_Resource_Available (TRA)", "ansi_map.triggercapability.tra", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_tbusy, + { "T_Busy (TBusy)", "ansi_map.triggercapability.tbusy", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_tna, + { "T_No_Answer (TNA)", "ansi_map.triggercapability.tna", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_tans, + { "T_Answer (TANS)", "ansi_map.triggercapability.tans", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x08, + NULL, HFILL }}, + { &hf_ansi_map_triggercapability_tdisc, + { "T_Disconnect (TDISC)", "ansi_map.triggercapability.tdisc", + FT_BOOLEAN, 8, TFS(&ansi_map_triggercapability_bool_val),0x10, + NULL, HFILL }}, + { &hf_ansi_map_winoperationscapability_conn, + { "ConnectResource (CONN)", "ansi_map.winoperationscapability.conn", + FT_BOOLEAN, 8, TFS(&ansi_map_winoperationscapability_conn_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_winoperationscapability_ccdir, + { "CallControlDirective(CCDIR)", "ansi_map.winoperationscapability.ccdir", + FT_BOOLEAN, 8, TFS(&ansi_map_winoperationscapability_ccdir_bool_val),0x02, + NULL, HFILL }}, + { &hf_ansi_map_winoperationscapability_pos, + { "PositionRequest (POS)", "ansi_map.winoperationscapability.pos", + FT_BOOLEAN, 8, TFS(&ansi_map_winoperationscapability_pos_bool_val),0x04, + NULL, HFILL }}, + { &hf_ansi_map_pacaindicator_pa, + { "Permanent Activation (PA)", "ansi_map.pacaindicator_pa", + FT_BOOLEAN, 8, TFS(&ansi_map_pacaindicator_pa_bool_val),0x01, + NULL, HFILL }}, + { &hf_ansi_map_PACA_Level, + { "PACA Level", "ansi_map.PACA_Level", + FT_UINT8, BASE_DEC, VALS(ansi_map_PACA_Level_vals), 0x1e, + NULL, HFILL }}, + { &hf_ansi_map_point_code, + { "Point Code", "ansi_map.point_code", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_SSN, + { "SSN", "ansi_map.SSN", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_ansi_map_win_trigger_list, + { "WIN trigger list", "ansi_map.win_trigger_list", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + +#include "packet-ansi_map-hfarr.c" + }; + + /* List of subtrees */ + static gint *ett[] = { + &ett_ansi_map, + &ett_mintype, + &ett_digitstype, + &ett_billingid, + &ett_sms_bearer_data, + &ett_sms_teleserviceIdentifier, + &ett_extendedmscid, + &ett_extendedsystemmytypecode, + &ett_handoffstate, + &ett_mscid, + &ett_cdmachanneldata, + &ett_cdmastationclassmark, + &ett_channeldata, + &ett_confidentialitymodes, + &ett_controlchanneldata, + &ett_CDMA2000HandoffInvokeIOSData, + &ett_CDMA2000HandoffResponseIOSData, + &ett_originationtriggers, + &ett_pacaindicator, + &ett_callingpartyname, + &ett_triggercapability, + &ett_winoperationscapability, + &ett_win_trigger_list, + &ett_controlnetworkid, + &ett_transactioncapability, + &ett_cdmaserviceoption, + &ett_sms_originationrestrictions, + &ett_systemcapabilities, +#include "packet-ansi_map-ettarr.c" + }; + + static ei_register_info ei[] = { + { &ei_ansi_map_nr_not_used, { "ansi_map.nr_not_used", PI_PROTOCOL, PI_WARN, "This Number plan should not have been used", EXPFILL }}, + { &ei_ansi_map_unknown_invokeData_blob, { "ansi_map.unknown_invokeData_blob", PI_PROTOCOL, PI_WARN, "Unknown invokeData blob", EXPFILL }}, + { &ei_ansi_map_no_data, { "ansi_map.no_data", PI_PROTOCOL, PI_NOTE, "Carries no data", EXPFILL }}, + }; + + expert_module_t* expert_ansi_map; + + static const enum_val_t ansi_map_response_matching_type_values[] = { + {"Only Transaction ID will be used in Invoke/response matching", "Transaction ID only", ANSI_MAP_TID_ONLY}, + {"Transaction ID and Source will be used in Invoke/response matching", "Transaction ID and Source", ANSI_MAP_TID_AND_SOURCE}, + {"Transaction ID Source and Destination will be used in Invoke/response matching", "Transaction ID Source and Destination", ANSI_MAP_TID_SOURCE_AND_DEST}, + {NULL, NULL, -1} + }; + + /* TAP STAT INFO */ + static stat_tap_table_ui stat_table = { + REGISTER_STAT_GROUP_TELEPHONY_ANSI, + "Map Operation Statistics", + "ansi_map", + "ansi_map", + ansi_map_stat_init, + ansi_map_stat_packet, + ansi_map_stat_reset, + NULL, + NULL, + sizeof(stat_fields)/sizeof(stat_tap_table_item), stat_fields, + 0, NULL, + NULL + }; + + /* Register protocol */ + proto_ansi_map = proto_register_protocol(PNAME, PSNAME, PFNAME); + /* Register fields and subtrees */ + proto_register_field_array(proto_ansi_map, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_ansi_map = expert_register_protocol(proto_ansi_map); + expert_register_field_array(expert_ansi_map, ei, array_length(ei)); + + register_dissector("ansi_map", dissect_ansi_map, proto_ansi_map); + + is637_tele_id_dissector_table = + register_dissector_table("ansi_map.tele_id", "IS-637 Teleservice ID", + FT_UINT8, BASE_DEC, DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE); + + is683_dissector_table = + register_dissector_table("ansi_map.ota", "IS-683-A (OTA)", + FT_UINT8, BASE_DEC, DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE); + + is801_dissector_table = + register_dissector_table("ansi_map.pld", "IS-801 (PLD)", + FT_UINT8, BASE_DEC, DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE); + + ansi_map_tap = register_tap("ansi_map"); + + + range_convert_str(&global_ssn_range, "5-14", MAX_SSN); + + ansi_map_module = prefs_register_protocol(proto_ansi_map, proto_reg_handoff_ansi_map); + + + prefs_register_range_preference(ansi_map_module, "map.ssn", "ANSI MAP SSNs", + "ANSI MAP SSNs to decode as ANSI MAP", + &global_ssn_range, MAX_SSN); + + prefs_register_enum_preference(ansi_map_module, "transaction.matchtype", + "Type of matching invoke/response", + "Type of matching invoke/response, risk of mismatch if loose matching chosen", + &ansi_map_response_matching_type, ansi_map_response_matching_type_values, FALSE); + + register_init_routine(&ansi_map_init); + register_cleanup_routine(&ansi_map_cleanup); + register_stat_tap_table_ui(&stat_table); +} + +/* + * 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: + */ |