5d2327c20900dd1c64993d2e8081aa922c8cb333
[obnox/wireshark/wip.git] / asn1 / ansi_map / packet-ansi_map-template.c
1 /* packet-ansi_map.c
2  * Routines for ANSI 41 Mobile Application Part (IS41 MAP) dissection
3  * Specications from 3GPP2 (www.3gpp2.org)
4  * Based on the dissector by :
5  * Michael Lum <mlum [AT] telostech.com>
6  * In association with Telos Technology Inc.
7  *
8  * Copyright 2005 - 2009, Anders Broman <anders.broman@ericsson.com>
9  *
10  * $Id$
11  *
12  * Wireshark - Network traffic analyzer
13  * By Gerald Combs <gerald@wireshark.org>
14  * Copyright 1998 Gerald Combs
15  *
16  * This program is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU General Public License
18  * as published by the Free Software Foundation; either version 2
19  * of the License, or (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
29  *
30  * Credit to Tomas Kukosa for developing the asn2wrs compiler.
31  *
32  * Title                3GPP2                   Other
33  *
34  *   Cellular Radiotelecommunications Intersystem Operations
35  *                      3GPP2 N.S0005-0 v 1.0           ANSI/TIA/EIA-41-D
36  *
37  *   Network Support for MDN-Based Message Centers
38  *                      3GPP2 N.S0024-0 v1.0    IS-841
39  *
40  *   Enhanced International Calling
41  *                      3GPP2 N.S0027           IS-875
42  *
43  *   ANSI-41-D Miscellaneous Enhancements Revision 0
44  *                      3GPP2 N.S0015           PN-3590 (ANSI-41-E)
45  *
46  *   Authentication Enhancements
47  *                      3GPP2 N.S0014-0 v1.0    IS-778
48  *
49  *   Features In CDMA
50  *                      3GPP2 N.S0010-0 v1.0    IS-735
51  *
52  *   OTASP and OTAPA
53  *                      3GPP2 N.S0011-0 v1.0    IS-725-A
54  *
55  *   Circuit Mode Services
56  *                      3GPP2 N.S0008-0 v1.0    IS-737
57  *      XXX SecondInterMSCCircuitID not implemented, parameter ID conflicts with ISLP Information!
58  *
59  *   IMSI
60  *                      3GPP2 N.S0009-0 v1.0    IS-751
61  *
62  *   WIN Phase 1
63  *                      3GPP2 N.S0013-0 v1.0    IS-771
64  *
65  *       DCCH (Clarification of Audit Order with Forced
66  *         Re-Registration in pre-TIA/EIA-136-A Implementation
67  *                      3GPP2 A.S0017-B                 IS-730
68  *
69  *   UIM
70  *                      3GPP2 N.S0003
71  *
72  *   WIN Phase 2
73  *                      3GPP2 N.S0004-0 v1.0    IS-848
74  *
75  *   TIA/EIA-41-D Pre-Paid Charging
76  *                      3GPP2 N.S0018-0 v1.0    IS-826
77  *
78  *   User Selective Call Forwarding
79  *                      3GPP2 N.S0021-0 v1.0    IS-838
80  *
81  *
82  *   Answer Hold
83  *                      3GPP2 N.S0022-0 v1.0    IS-837
84  *
85  */
86
87 #ifdef HAVE_CONFIG_H
88 # include "config.h"
89 #endif
90
91 #include <glib.h>
92 #include <epan/packet.h>
93 #include <epan/prefs.h>
94 #include <epan/tap.h>
95 #include <epan/asn1.h>
96
97 #include "packet-ber.h"
98 #include "packet-ansi_map.h"
99 #include "packet-ansi_a.h"
100 #include "packet-gsm_map.h"
101 #include "packet-tcap.h"
102 #include "packet-ansi_tcap.h"
103
104 #define PNAME  "ANSI Mobile Application Part"
105 #define PSNAME "ANSI MAP"
106 #define PFNAME "ansi_map"
107
108 /* Preference settings default */
109 #define MAX_SSN 254
110 static range_t *global_ssn_range;
111
112 static dissector_handle_t ansi_map_handle=NULL;
113
114 /* Initialize the protocol and registered fields */
115 static int ansi_map_tap = -1;
116 static int proto_ansi_map = -1;
117
118 static int hf_ansi_map_op_code_fam = -1;
119 static int hf_ansi_map_op_code = -1;
120
121 static int hf_ansi_map_reservedBitH = -1;
122 static int hf_ansi_map_reservedBitHG = -1;
123 static int hf_ansi_map_reservedBitHGFE = -1;
124 static int hf_ansi_map_reservedBitFED = -1;
125 static int hf_ansi_map_reservedBitD = -1;
126 static int hf_ansi_map_reservedBitED = -1;
127
128 static int hf_ansi_map_type_of_digits = -1;
129 static int hf_ansi_map_na = -1;
130 static int hf_ansi_map_pi = -1;
131 static int hf_ansi_map_navail = -1;
132 static int hf_ansi_map_si = -1;
133 static int hf_ansi_map_digits_enc = -1;
134 static int hf_ansi_map_np = -1;
135 static int hf_ansi_map_nr_digits = -1;
136 static int hf_ansi_map_bcd_digits = -1;
137 static int hf_ansi_map_ia5_digits = -1;
138 static int hf_ansi_map_subaddr_type = -1;
139 static int hf_ansi_map_subaddr_odd_even = -1;
140 static int hf_ansi_alertcode_cadence = -1;
141 static int hf_ansi_alertcode_pitch = -1;
142 static int hf_ansi_alertcode_alertaction = -1;
143 static int hf_ansi_map_announcementcode_tone = -1;
144 static int hf_ansi_map_announcementcode_class = -1;
145 static int hf_ansi_map_announcementcode_std_ann = -1;
146 static int hf_ansi_map_announcementcode_cust_ann = -1;
147 static int hf_ansi_map_authorizationperiod_period = -1;
148 static int hf_ansi_map_value = -1;
149 static int hf_ansi_map_msc_type = -1;
150 static int hf_ansi_map_handoffstate_pi = -1;
151 static int hf_ansi_map_tgn = -1;
152 static int hf_ansi_map_tmn = -1;
153 static int hf_ansi_map_messagewaitingnotificationcount_tom = -1;
154 static int hf_ansi_map_messagewaitingnotificationcount_no_mw = -1;
155 static int hf_ansi_map_messagewaitingnotificationtype_mwi = -1;
156 static int hf_ansi_map_messagewaitingnotificationtype_apt = -1;
157 static int hf_ansi_map_messagewaitingnotificationtype_pt = -1;
158
159 static int hf_ansi_map_trans_cap_prof = -1;
160 static int hf_ansi_map_trans_cap_busy = -1;
161 static int hf_ansi_map_trans_cap_ann = -1;
162 static int hf_ansi_map_trans_cap_rui = -1;
163 static int hf_ansi_map_trans_cap_spini = -1;
164 static int hf_ansi_map_trans_cap_uzci = -1;
165 static int hf_ansi_map_trans_cap_ndss = -1;
166 static int hf_ansi_map_trans_cap_nami = -1;
167 static int hf_ansi_trans_cap_multerm = -1;
168 static int hf_ansi_map_terminationtriggers_busy = -1;
169 static int hf_ansi_map_terminationtriggers_rf = -1;
170 static int hf_ansi_map_terminationtriggers_npr = -1;
171 static int hf_ansi_map_terminationtriggers_na = -1;
172 static int hf_ansi_map_terminationtriggers_nr = -1;
173 static int hf_ansi_trans_cap_tl = -1;
174 static int hf_ansi_map_cdmaserviceoption = -1;
175 static int hf_ansi_trans_cap_waddr = -1;
176 static int hf_ansi_map_MarketID = -1;
177 static int hf_ansi_map_swno = -1;
178 static int hf_ansi_map_idno = -1;
179 static int hf_ansi_map_segcount = -1;
180 static int hf_ansi_map_sms_originationrestrictions_fmc = -1;
181 static int hf_ansi_map_sms_originationrestrictions_direct = -1;
182 static int hf_ansi_map_sms_originationrestrictions_default = -1;
183 static int hf_ansi_map_systemcapabilities_auth = -1;
184 static int hf_ansi_map_systemcapabilities_se = -1;
185 static int hf_ansi_map_systemcapabilities_vp = -1;
186 static int hf_ansi_map_systemcapabilities_cave = -1;
187 static int hf_ansi_map_systemcapabilities_ssd = -1;
188 static int hf_ansi_map_systemcapabilities_dp = -1;
189
190 static int hf_ansi_map_mslocation_lat = -1;
191 static int hf_ansi_map_mslocation_long = -1;
192 static int hf_ansi_map_mslocation_res = -1;
193 static int hf_ansi_map_nampscallmode_namps = -1;
194 static int hf_ansi_map_nampscallmode_amps = -1;
195 static int hf_ansi_map_nampschanneldata_navca = -1;
196 static int hf_ansi_map_nampschanneldata_CCIndicator = -1;
197
198 static int hf_ansi_map_callingfeaturesindicator_cfufa = -1;
199 static int hf_ansi_map_callingfeaturesindicator_cfbfa = -1;
200 static int hf_ansi_map_callingfeaturesindicator_cfnafa = -1;
201 static int hf_ansi_map_callingfeaturesindicator_cwfa = -1;
202 static int hf_ansi_map_callingfeaturesindicator_3wcfa = -1;
203 static int hf_ansi_map_callingfeaturesindicator_pcwfa =-1;
204 static int hf_ansi_map_callingfeaturesindicator_dpfa = -1;
205 static int hf_ansi_map_callingfeaturesindicator_ahfa = -1;
206 static int hf_ansi_map_callingfeaturesindicator_uscfvmfa = -1;
207 static int hf_ansi_map_callingfeaturesindicator_uscfmsfa = -1;
208 static int hf_ansi_map_callingfeaturesindicator_uscfnrfa = -1;
209 static int hf_ansi_map_callingfeaturesindicator_cpdsfa = -1;
210 static int hf_ansi_map_callingfeaturesindicator_ccsfa = -1;
211 static int hf_ansi_map_callingfeaturesindicator_epefa = -1;
212 static int hf_ansi_map_callingfeaturesindicator_cdfa = -1;
213 static int hf_ansi_map_callingfeaturesindicator_vpfa = -1;
214 static int hf_ansi_map_callingfeaturesindicator_ctfa = -1;
215 static int hf_ansi_map_callingfeaturesindicator_cnip1fa = -1;
216 static int hf_ansi_map_callingfeaturesindicator_cnip2fa = -1;
217 static int hf_ansi_map_callingfeaturesindicator_cnirfa = -1;
218 static int hf_ansi_map_callingfeaturesindicator_cniroverfa = -1;
219 static int hf_ansi_map_cdmacallmode_cdma = -1;
220 static int hf_ansi_map_cdmacallmode_amps = -1;
221 static int hf_ansi_map_cdmacallmode_namps = -1;
222 static int hf_ansi_map_cdmacallmode_cls1 = -1;
223 static int hf_ansi_map_cdmacallmode_cls2 = -1;
224 static int hf_ansi_map_cdmacallmode_cls3 = -1;
225 static int hf_ansi_map_cdmacallmode_cls4 = -1;
226 static int hf_ansi_map_cdmacallmode_cls5 = -1;
227 static int hf_ansi_map_cdmacallmode_cls6 = -1;
228 static int hf_ansi_map_cdmacallmode_cls7 = -1;
229 static int hf_ansi_map_cdmacallmode_cls8 = -1;
230 static int hf_ansi_map_cdmacallmode_cls9 = -1;
231 static int hf_ansi_map_cdmacallmode_cls10 = -1;
232 static int hf_ansi_map_cdmachanneldata_Frame_Offset = -1;
233 static int hf_ansi_map_cdmachanneldata_CDMA_ch_no = -1;
234 static int hf_ansi_map_cdmachanneldata_band_cls = -1;
235 static int hf_ansi_map_cdmachanneldata_lc_mask_b6 = -1;
236 static int hf_ansi_map_cdmachanneldata_lc_mask_b5 = -1;
237 static int hf_ansi_map_cdmachanneldata_lc_mask_b4 = -1;
238 static int hf_ansi_map_cdmachanneldata_lc_mask_b3 = -1;
239 static int hf_ansi_map_cdmachanneldata_lc_mask_b2 = -1;
240 static int hf_ansi_map_cdmachanneldata_lc_mask_b1 = -1;
241 static int hf_ansi_map_cdmachanneldata_np_ext = -1;
242 static int hf_ansi_map_cdmachanneldata_nominal_pwr = -1;
243 static int hf_ansi_map_cdmachanneldata_nr_preamble = -1;
244
245 static int hf_ansi_map_cdmastationclassmark_pc = -1;
246 static int hf_ansi_map_cdmastationclassmark_dtx = -1;
247 static int hf_ansi_map_cdmastationclassmark_smi = -1;
248 static int hf_ansi_map_cdmastationclassmark_dmi = -1;
249 static int hf_ansi_map_channeldata_vmac = -1;
250 static int hf_ansi_map_channeldata_dtx = -1;
251 static int hf_ansi_map_channeldata_scc = -1;
252 static int hf_ansi_map_channeldata_chno = -1;
253 static int hf_ansi_map_ConfidentialityModes_vp = -1;
254 static int hf_ansi_map_controlchanneldata_dcc = -1;
255 static int hf_ansi_map_controlchanneldata_cmac = -1;
256 static int hf_ansi_map_controlchanneldata_chno = -1;
257 static int hf_ansi_map_controlchanneldata_sdcc1 = -1;
258 static int hf_ansi_map_controlchanneldata_sdcc2 = -1;
259 static int hf_ansi_map_ConfidentialityModes_se = -1;
260 static int hf_ansi_map_deniedauthorizationperiod_period = -1;
261 static int hf_ansi_map_ConfidentialityModes_dp = -1;
262
263 static int hf_ansi_map_originationtriggers_all = -1;
264 static int hf_ansi_map_originationtriggers_local = -1;
265 static int hf_ansi_map_originationtriggers_ilata = -1;
266 static int hf_ansi_map_originationtriggers_olata = -1;
267 static int hf_ansi_map_originationtriggers_int = -1;
268 static int hf_ansi_map_originationtriggers_wz = -1;
269 static int hf_ansi_map_originationtriggers_unrec = -1;
270 static int hf_ansi_map_originationtriggers_rvtc = -1;
271 static int hf_ansi_map_originationtriggers_star = -1;
272 static int hf_ansi_map_originationtriggers_ds = -1;
273 static int hf_ansi_map_originationtriggers_pound = -1;
274 static int hf_ansi_map_originationtriggers_dp = -1;
275 static int hf_ansi_map_originationtriggers_pa = -1;
276 static int hf_ansi_map_originationtriggers_nodig = -1;
277 static int hf_ansi_map_originationtriggers_onedig = -1;
278 static int hf_ansi_map_originationtriggers_twodig = -1;
279 static int hf_ansi_map_originationtriggers_threedig = -1;
280 static int hf_ansi_map_originationtriggers_fourdig = -1;
281 static int hf_ansi_map_originationtriggers_fivedig = -1;
282 static int hf_ansi_map_originationtriggers_sixdig = -1;
283 static int hf_ansi_map_originationtriggers_sevendig = -1;
284 static int hf_ansi_map_originationtriggers_eightdig = -1;
285 static int hf_ansi_map_originationtriggers_ninedig = -1;
286 static int hf_ansi_map_originationtriggers_tendig = -1;
287 static int hf_ansi_map_originationtriggers_elevendig = -1;
288 static int hf_ansi_map_originationtriggers_twelvedig = -1;
289 static int hf_ansi_map_originationtriggers_thirteendig = -1;
290 static int hf_ansi_map_originationtriggers_fourteendig = -1;
291 static int hf_ansi_map_originationtriggers_fifteendig = -1;
292 static int hf_ansi_map_triggercapability_init = -1;
293 static int hf_ansi_map_triggercapability_kdigit = -1;
294 static int hf_ansi_map_triggercapability_all = -1;
295 static int hf_ansi_map_triggercapability_rvtc = -1;
296 static int hf_ansi_map_triggercapability_oaa = -1;
297 static int hf_ansi_map_triggercapability_oans = -1;
298 static int hf_ansi_map_triggercapability_odisc = -1;
299 static int hf_ansi_map_triggercapability_ona = -1;
300 static int hf_ansi_map_triggercapability_ct = -1;
301 static int hf_ansi_map_triggercapability_unrec =-1;
302 static int hf_ansi_map_triggercapability_pa = -1;
303 static int hf_ansi_map_triggercapability_at = -1;
304 static int hf_ansi_map_triggercapability_cgraa = -1;
305 static int hf_ansi_map_triggercapability_it = -1;
306 static int hf_ansi_map_triggercapability_cdraa = -1;
307 static int hf_ansi_map_triggercapability_obsy = -1;
308 static int hf_ansi_map_triggercapability_tra = -1;
309 static int hf_ansi_map_triggercapability_tbusy = -1;
310 static int hf_ansi_map_triggercapability_tna = -1;
311 static int hf_ansi_map_triggercapability_tans = -1;
312 static int hf_ansi_map_triggercapability_tdisc = -1;
313 static int hf_ansi_map_winoperationscapability_conn = -1;
314 static int hf_ansi_map_winoperationscapability_ccdir = -1;
315 static int hf_ansi_map_winoperationscapability_pos = -1;
316 static int hf_ansi_map_PACA_Level = -1;
317 static int hf_ansi_map_pacaindicator_pa = -1;
318
319 #include "packet-ansi_map-hf.c"
320
321 /* Initialize the subtree pointers */
322 static gint ett_ansi_map = -1;
323 static gint ett_mintype = -1;
324 static gint ett_digitstype = -1;
325 static gint ett_billingid = -1;
326 static gint ett_sms_bearer_data = -1;
327 static gint ett_sms_teleserviceIdentifier = -1;
328 static gint ett_extendedmscid = -1;
329 static gint ett_extendedsystemmytypecode = -1;
330 static gint ett_handoffstate = -1;
331 static gint ett_mscid = -1;
332 static gint ett_cdmachanneldata = -1;
333 static gint ett_cdmastationclassmark = -1;
334 static gint ett_channeldata = -1;
335 static gint ett_confidentialitymodes = -1;
336 static gint ett_controlchanneldata = -1;
337 static gint ett_CDMA2000HandoffInvokeIOSData = -1;
338 static gint ett_CDMA2000HandoffResponseIOSData = -1;
339 static gint ett_originationtriggers = -1;
340 static gint ett_pacaindicator = -1;
341 static gint ett_callingpartyname = -1;
342 static gint ett_triggercapability = -1;
343 static gint ett_winoperationscapability = -1;
344 static gint ett_win_trigger_list = -1;
345 static gint ett_controlnetworkid = -1;
346 static gint ett_transactioncapability = -1;
347 static gint ett_cdmaserviceoption = -1;
348 static gint ett_systemcapabilities = -1;
349 static gint ett_sms_originationrestrictions = -1;
350
351 #include "packet-ansi_map-ett.c"
352
353 /* Global variables */
354 static dissector_table_t is637_tele_id_dissector_table; /* IS-637 Teleservice ID */
355 static dissector_table_t is683_dissector_table; /* IS-683-A (OTA) */
356 static dissector_table_t is801_dissector_table; /* IS-801 (PLD) */
357 static packet_info *g_pinfo;
358 static proto_tree *g_tree;
359 tvbuff_t *SMS_BearerData_tvb = NULL;
360 gint32    ansi_map_sms_tele_id = -1;
361 static gboolean is683_ota;
362 static gboolean is801_pld;
363 static gboolean ansi_map_is_invoke;
364 static guint32 OperationCode;
365 static guint8 ServiceIndicator;
366
367
368 struct ansi_map_invokedata_t {
369     guint32 opcode;
370     guint8 ServiceIndicator;
371 };
372
373 static void dissect_ansi_map_win_trigger_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_);
374
375
376 /* Transaction table */
377 static GHashTable *TransactionId_table=NULL;
378
379 static void
380 TransactionId_table_cleanup(gpointer key , gpointer value, gpointer user_data _U_){
381
382     struct ansi_map_invokedata_t *ansi_map_saved_invokedata = value;
383     gchar *TransactionId_str = key;
384
385     g_free(TransactionId_str);
386     g_free(ansi_map_saved_invokedata);
387
388 }
389
390 static void
391 ansi_map_init_transaction_table(void){
392
393     /* Destroy any existing memory chunks / hashes. */
394     if (TransactionId_table){
395         g_hash_table_foreach(TransactionId_table, TransactionId_table_cleanup, NULL);
396         g_hash_table_destroy(TransactionId_table);
397     }
398
399     TransactionId_table = g_hash_table_new(g_str_hash, g_str_equal);
400
401 }
402
403 static void
404 ansi_map_init_protocol(void)
405 {
406     ansi_map_init_transaction_table();
407 }
408
409 /* Store Invoke information needed for the corresponding reply */
410 static void
411 update_saved_invokedata(packet_info *pinfo, proto_tree *tree _U_, tvbuff_t *tvb _U_){
412     struct ansi_map_invokedata_t *ansi_map_saved_invokedata;
413     struct ansi_tcap_private_t *p_private_tcap;
414     address* src = &(pinfo->src);
415     address* dst = &(pinfo->dst);
416     guint8 *src_str;
417     guint8 *dst_str;
418     char *buf;
419
420     buf=ep_alloc(1024);
421
422     src_str = ep_address_to_str(src);
423     dst_str = ep_address_to_str(dst);
424
425     /* Data from the TCAP dissector */
426     if (pinfo->private_data != NULL){
427         p_private_tcap=pinfo->private_data;
428         if ((!pinfo->fd->flags.visited)&&(p_private_tcap->TransactionID_str)){
429             /* Only do this once XXX I hope its the right thing to do */
430             /* The hash string needs to contain src and dest to distiguish differnt flows */
431             g_snprintf(buf,1024,"%s%s%s",p_private_tcap->TransactionID_str,src_str,dst_str);
432             /* If the entry allready exists don't owervrite it */
433             ansi_map_saved_invokedata = g_hash_table_lookup(TransactionId_table,buf);
434             if(ansi_map_saved_invokedata)
435                 return;
436
437             ansi_map_saved_invokedata = g_malloc(sizeof(struct ansi_map_invokedata_t));
438             ansi_map_saved_invokedata->opcode = p_private_tcap->d.OperationCode_private;
439             ansi_map_saved_invokedata->ServiceIndicator = ServiceIndicator;
440
441             g_hash_table_insert(TransactionId_table,
442                                 g_strdup(buf),
443                                 ansi_map_saved_invokedata);
444             /*
445               g_warning("Invoke Hash string %s",buf);
446             */
447         }
448     }
449
450 }
451 /* value strings */
452 const value_string ansi_map_opr_code_strings[] = {
453     {   1, "Handoff Measurement Request" },
454     {   2, "Facilities Directive" },
455     {   3, "Mobile On Channel" },
456     {   4, "Handoff Back" },
457     {   5, "Facilities Release" },
458     {   6, "Qualification Request" },
459     {   7, "Qualification Directive" },
460     {   8, "Blocking" },
461     {   9, "Unblocking" },
462     {  10,  "Reset Circuit" },
463     {  11, "Trunk Test" },
464     {  12, "Trunk Test Disconnect" },
465     {  13, "Registration Notification" },
466     {  14, "Registration Cancellation" },
467     {  15, "Location Request" },
468     {  16, "Routing Request" },
469     {  17, "Feature Request" },
470     {  18, "Reserved 18 (Service Profile Request, IS-41-C)" },
471     {  19, "Reserved 19 (Service Profile Directive, IS-41-C)" },
472     {  20, "Unreliable Roamer Data Directive" },
473     {  21, "Reserved 21 (Call Data Request, IS-41-C)" },
474     {  22, "MS Inactive" },
475     {  23, "Transfer To Number Request" },
476     {  24, "Redirection Request" },
477     {  25, "Handoff To Third" },
478     {  26, "Flash Request" },
479     {  27, "Authentication Directive" },
480     {  28, "Authentication Request" },
481     {  29, "Base Station Challenge" },
482     {  30, "Authentication Failure Report" },
483     {  31, "Count Request" },
484     {  32, "Inter System Page" },
485     {  33, "Unsolicited Response" },
486     {  34, "Bulk Deregistration" },
487     {  35, "Handoff Measurement Request 2" },
488     {  36, "Facilities Directive 2" },
489     {  37, "Handoff Back 2" },
490     {  38, "Handoff To Third 2" },
491     {  39, "Authentication Directive Forward" },
492     {  40, "Authentication Status Report" },
493     {  41, "Reserved 41" },
494     {  42, "Information Directive" },
495     {  43, "Information Forward" },
496     {  44, "Inter System Answer" },
497     {  45, "Inter System Page 2" },
498     {  46, "Inter System Setup" },
499     {  47, "Origination Request" },
500     {  48, "Random Variable Request" },
501     {  49, "Redirection Directive" },
502     {  50, "Remote User Interaction Directive" },
503     {  51, "SMS Delivery Backward" },
504     {  52, "SMS Delivery Forward" },
505     {  53, "SMS Delivery Point to Point" },
506     {  54, "SMS Notification" },
507     {  55, "SMS Request" },
508     {  56, "OTASP Request" },
509     {  57, "Information Backward" },
510     {  58, "Change Facilities" },
511     {  59, "Change Service" },
512     {  60, "Parameter Request" },
513     {  61, "TMSI Directive" },
514     {  62, "NumberPortabilityRequest" },
515     {  63, "Service Request" },
516     {  64, "Analyzed Information Request" },
517     {  65, "Connection Failure Report" },
518     {  66, "Connect Resource" },
519     {  67, "Disconnect Resource" },
520     {  68, "Facility Selected and Available" },
521     {  69, "Instruction Request" },
522     {  70, "Modify" },
523     {  71, "Reset Timer" },
524     {  72, "Search" },
525     {  73, "Seize Resource" },
526     {  74, "SRF Directive" },
527     {  75, "T Busy" },
528     {  76, "T NoAnswer" },
529     {  77, "Release" },
530     {  78, "SMS Delivery Point to Point Ack" },
531     {  79, "Message Directive" },
532     {  80, "Bulk Disconnection" },
533     {  81, "Call Control Directive" },
534     {  82, "O Answer" },
535     {  83, "O Disconnect" },
536     {  84, "Call Recovery Report" },
537     {  85, "T Answer" },
538     {  86, "T Disconnect" },
539     {  87, "Unreliable Call Data" },
540     {  88, "O CalledPartyBusy" },
541     {  89, "O NoAnswer" },
542     {  90, "Position Request" },
543     {  91, "Position Request Forward" },
544     {  92, "Call Termination Report" },
545     {  93, "Geo Position Directive" },
546     {  94, "Geo Position Request" },
547     {  95, "Inter System Position Request" },
548     {  96, "Inter System Position Request Forward" },
549     {  97, "ACG Directive" },
550     {  98, "Roamer Database Verification Request" },
551     {  99, "Add Service" },
552     { 100, "Drop Service" },
553     { 101, "InterSystemSMSPage" },
554     { 102, "LCSParameterRequest" },
555     { 103, "Unknown ANSI-MAP PDU" },
556     { 104, "Unknown ANSI-MAP PDU" },
557     { 105, "Unknown ANSI-MAP PDU" },
558     { 106, "PositionEventNotification" },
559     { 107, "Unknown ANSI-MAP PDU" },
560     { 108, "Unknown ANSI-MAP PDU" },
561     { 109, "Unknown ANSI-MAP PDU" },
562     { 110, "Unknown ANSI-MAP PDU" },
563     { 111, "InterSystemSMSDelivery-PointToPoint" },
564     { 112, "QualificationRequest2" },
565     {   0, NULL },
566 };
567 static value_string_ext ansi_map_opr_code_strings_ext = VALUE_STRING_EXT_INIT(ansi_map_opr_code_strings);
568
569 static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx);
570 static int dissect_returnData(proto_tree *tree, tvbuff_t *tvb, int offset,  asn1_ctx_t *actx);
571 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_);
572
573 #if 0
574 /* Moved to tvbuff.h
575  * XXX remove after trial period.
576  */
577 typedef struct dgt_set_t
578 {
579     unsigned char out[15];
580 }
581 dgt_set_t;
582 #endif
583 static dgt_set_t Dgt_tbcd = {
584     {
585   /*  0   1   2   3   4   5   6   7   8   9   a   b   c   d   e */
586      '0','1','2','3','4','5','6','7','8','9','?','B','C','*','#'
587     }
588 };
589 static dgt_set_t Dgt1_9_bcd = {
590     {
591   /*  0   1   2   3   4   5   6   7   8   9   a   b   c   d   e */
592      '0','1','2','3','4','5','6','7','8','9','?','?','?','?','?'
593     }
594 };
595 /* Assumes the rest of the tvb contains the digits to be turned into a string
596  */
597 static const char*
598 unpack_digits2(tvbuff_t *tvb, int offset,dgt_set_t *dgt){
599
600     int length;
601     guint8 octet;
602     int i=0;
603     char *digit_str;
604
605     length = tvb_length(tvb);
606     if (length < offset)
607         return "";
608     digit_str = ep_alloc((length - offset)*2+1);
609
610     while ( offset < length ){
611
612         octet = tvb_get_guint8(tvb,offset);
613         digit_str[i] = dgt->out[octet & 0x0f];
614         i++;
615
616         /*
617          * unpack second value in byte
618          */
619         octet = octet >> 4;
620
621         if (octet == 0x0f)      /* odd number bytes - hit filler */
622             break;
623
624         digit_str[i] = dgt->out[octet & 0x0f];
625         i++;
626         offset++;
627
628     }
629     digit_str[i]= '\0';
630     return digit_str;
631 }
632
633
634
635 /* Type of Digits (octet 1, bits A-H) */
636 static const value_string ansi_map_type_of_digits_vals[] = {
637     {   0, "Not Used" },
638     {   1, "Dialed Number or Called Party Number" },
639     {   2, "Calling Party Number" },
640     {   3, "Caller Interaction" },
641     {   4, "Routing Number" },
642     {   5, "Billing Number" },
643     {   6, "Destination Number" },
644     {   7, "LATA" },
645     {   8, "Carrier" },
646     {   0, NULL }
647 };
648 /* Nature of Number (octet 2, bits A-H )*/
649 static const true_false_string ansi_map_na_bool_val  = {
650     "International",
651     "National"
652 };
653 static const true_false_string ansi_map_pi_bool_val  = {
654     "Presentation Restricted",
655     "Presentation Allowed"
656 };
657 static const true_false_string ansi_map_navail_bool_val  = {
658     "Number is not available",
659     "Number is available"
660 };
661 static const true_false_string ansi_map_si_bool_val  = {
662     "User provided, screening passed",
663     "User provided, not screened"
664 };
665 static const value_string ansi_map_si_vals[]  = {
666     {   0, "User provided, not screened"},
667     {   1, "User provided, screening passed"},
668     {   2, "User provided, screening failed"},
669     {   3, "Network provided"},
670     {   0, NULL }
671 };
672 /* Encoding (octet 3, bits A-D) */
673 static const value_string ansi_map_digits_enc_vals[]  = {
674     {   0, "Not used"},
675     {   1, "BCD"},
676     {   2, "IA5"},
677     {   3, "Octet string"},
678     {   0, NULL }
679 };
680 /* Numbering Plan (octet 3, bits E-H) */
681 static const value_string ansi_map_np_vals[]  = {
682     {   0, "Unknown or not applicable"},
683     {   1, "ISDN Numbering"},
684     {   2, "Telephony Numbering (ITU-T Rec. E.164,E.163)"},
685     {   3, "Data Numbering (ITU-T Rec. X.121)"},
686     {   4, "Telex Numbering (ITU-T Rec. F.69)"},
687     {   5, "Maritime Mobile Numbering"},
688     {   6, "Land Mobile Numbering (ITU-T Rec. E.212)"},
689     {   7, "Private Numbering Plan"},
690     {  13, "SS7 Point Code (PC) and Subsystem Number (SSN)"},
691     {  14, "Internet Protocol (IP) Address."},
692     {  15, "Reserved for extension"},
693     {   0, NULL }
694 };
695
696 static void
697 dissect_ansi_map_min_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
698     const char *digit_str;
699     int   offset = 0;
700
701     proto_tree *subtree;
702
703
704     subtree = proto_item_add_subtree(actx->created_item, ett_mintype);
705
706     digit_str = unpack_digits2(tvb, offset, &Dgt1_9_bcd);
707     proto_tree_add_string(subtree, hf_ansi_map_bcd_digits, tvb, offset, -1, digit_str);
708     proto_item_append_text(actx->created_item, " - %s", digit_str);
709 }
710
711 static void
712 dissect_ansi_map_digits_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
713
714     guint8 octet , octet_len;
715     guint8 b1,b2,b3,b4;
716     int    offset = 0;
717     const char *digit_str;
718
719     proto_tree *subtree;
720
721
722     subtree = proto_item_add_subtree(actx->created_item, ett_digitstype);
723
724     /* Octet 1 */
725     proto_tree_add_item(subtree, hf_ansi_map_type_of_digits, tvb, offset, 1, FALSE);
726     offset++;
727     /* Octet 2 */
728     proto_tree_add_item(subtree, hf_ansi_map_reservedBitHG, tvb, offset, 1, FALSE);
729     proto_tree_add_item(subtree, hf_ansi_map_si, tvb, offset, 1, FALSE);
730     proto_tree_add_item(subtree, hf_ansi_map_reservedBitD, tvb, offset, 1, FALSE);
731     proto_tree_add_item(subtree, hf_ansi_map_navail, tvb, offset, 1, FALSE);
732     proto_tree_add_item(subtree, hf_ansi_map_pi, tvb, offset, 1, FALSE);
733     proto_tree_add_item(subtree, hf_ansi_map_na, tvb, offset, 1, FALSE);
734     offset++;
735     /* Octet 3 */
736     octet = tvb_get_guint8(tvb,offset);
737     proto_tree_add_item(subtree, hf_ansi_map_np, tvb, offset, 1, FALSE);
738     proto_tree_add_item(subtree, hf_ansi_map_digits_enc, tvb, offset, 1, FALSE);
739     offset++;
740     /* Octet 4 - */
741     switch(octet>>4){
742     case 0:/* Unknown or not applicable */
743         switch ((octet&0xf)){
744         case 1:
745             /* BCD Coding */
746             octet_len = tvb_get_guint8(tvb,offset);
747             proto_tree_add_item(subtree, hf_ansi_map_nr_digits, tvb, offset, 1, FALSE);
748             if(octet_len == 0)
749                 return;
750             offset++;
751             digit_str = unpack_digits2(tvb, offset, &Dgt_tbcd);
752             proto_tree_add_string(subtree, hf_ansi_map_bcd_digits, tvb, offset, -1, digit_str);
753             proto_item_append_text(actx->created_item, " - %s", digit_str);
754             break;
755         case 2:
756             /* IA5 Coding */
757             octet_len = tvb_get_guint8(tvb,offset);
758             proto_tree_add_item(subtree, hf_ansi_map_nr_digits, tvb, offset, 1, FALSE);
759             if(octet_len == 0)
760                 return;
761             offset++;
762             proto_tree_add_item(subtree, hf_ansi_map_ia5_digits, tvb, offset, -1, FALSE);
763             proto_item_append_text(actx->created_item, " - %s", tvb_get_ephemeral_string(tvb,offset,tvb_length_remaining(tvb,offset)));
764             break;
765         case 3:
766             /* Octet string */
767             break;
768         default:
769             break;
770         }
771         break;
772     case 1:/* ISDN Numbering (not used in this Standard). */
773     case 3:/* Data Numbering (ITU-T Rec. X.121) (not used in this Standard). */
774     case 4:/* Telex Numbering (ITU-T Rec. F.69) (not used in this Standard). */
775     case 5:/* Maritime Mobile Numbering (not used in this Standard). */
776         proto_tree_add_text(subtree, tvb, offset, -1, "This Number plan should not have been used");
777         break;
778     case 2:/* Telephony Numbering (ITU-T Rec. E.164,E.163). */
779     case 6:/* Land Mobile Numbering (ITU-T Rec. E.212) */
780     case 7:/* Private Numbering Plan */
781         octet_len = tvb_get_guint8(tvb,offset);
782         proto_tree_add_item(subtree, hf_ansi_map_nr_digits, tvb, offset, 1, FALSE);
783         if(octet_len == 0)
784             return;
785         offset++;
786         switch ((octet&0xf)){
787         case 1:
788             /* BCD Coding */
789             digit_str = unpack_digits2(tvb, offset, &Dgt_tbcd);
790             proto_tree_add_string(subtree, hf_ansi_map_bcd_digits, tvb, offset, -1, digit_str);
791             proto_item_append_text(actx->created_item, " - %s", digit_str);
792             break;
793         case 2:
794             /* IA5 Coding */
795             proto_tree_add_item(subtree, hf_ansi_map_ia5_digits, tvb, offset, -1, FALSE);
796             proto_item_append_text(actx->created_item, " - %s", tvb_get_ephemeral_string(tvb,offset,tvb_length_remaining(tvb,offset)));
797             break;
798         case 3:
799             /* Octet string */
800             break;
801         default:
802             break;
803         }
804         break;
805     case 13:/* ANSI SS7 Point Code (PC) and Subsystem Number (SSN). */
806         switch ((octet&0xf)){
807         case 3:
808             /* Octet string */
809             /* Point Code Member Number octet 2 */
810             b1 = tvb_get_guint8(tvb,offset);
811             offset++;
812             /* Point Code Cluster Number octet 3 */
813             b2 = tvb_get_guint8(tvb,offset);
814             offset++;
815             /* Point Code Network Number octet 4 */
816             b3 = tvb_get_guint8(tvb,offset);
817             offset++;
818             /* Subsystem Number (SSN) octet 5 */
819             b4 = tvb_get_guint8(tvb,offset);
820             proto_tree_add_text(subtree, tvb, offset-3, 4 , "Point Code %u-%u-%u  SSN %u",
821                                 b3, b2, b1, b4);
822             proto_item_append_text(actx->created_item, " - Point Code %u-%u-%u  SSN %u", b3, b2, b1, b4);
823             break;
824         default:
825             break;
826         }
827         break;
828     case 14:/* Internet Protocol (IP) Address. */
829         break;
830     default:
831         proto_tree_add_text(subtree, tvb, offset, -1, "This Number plan should not have been used");
832         break;
833     }
834
835 }
836 /* 6.5.3.13. Subaddress */
837
838 static const true_false_string ansi_map_Odd_Even_Ind_bool_val  = {
839   "Odd",
840   "Even"
841 };
842 /* Type of Subaddress (octet 1, bits E-G) */
843 static const value_string ansi_map_sub_addr_type_vals[]  = {
844     {   0, "NSAP (CCITT Rec. X.213 or ISO 8348 AD2)"},
845     {   1, "User specified"},
846     {   2, "Reserved"},
847     {   3, "Reserved"},
848     {   4, "Reserved"},
849     {   5, "Reserved"},
850     {   6, "Reserved"},
851     {   7, "Reserved"},
852     {   0, NULL }
853 };
854
855 static void
856 dissect_ansi_map_subaddress(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
857     int offset = 0;
858
859     proto_tree *subtree;
860
861
862     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
863     /* Type of Subaddress (octet 1, bits E-G) */
864     proto_tree_add_item(subtree, hf_ansi_map_subaddr_type, tvb, offset, 1, FALSE);
865     /* Odd/Even Indicator (O/E) (octet 1, bit D) */
866     proto_tree_add_item(subtree, hf_ansi_map_subaddr_odd_even, tvb, offset, 1, FALSE);
867
868 }
869 /*
870  * 6.5.2.2 ActionCode
871  * Table 114 ActionCode value
872  *
873  * 6.5.2.2 ActionCode(TIA/EIA-41.5-D, page 5-129) */
874
875 static const value_string ansi_map_ActionCode_vals[]  = {
876     {   0, "Not used"},
877     {   1, "Continue processing"},
878     {   2, "Disconnect call"},
879     {   3, "Disconnect call leg"},
880     {   4, "Conference Calling Drop Last Party"},
881     {   5, "Bridge call leg(s) to conference call"},
882     {   6, "Drop call leg on busy or routing failure"},
883     {   7, "Disconnect all call legs"},
884     {   8, "Attach MSC to OTAF"},
885     {   9, "Initiate RegistrationNotification"},
886     {  10, "Generate Public Encryption values"},
887     {  11, "Generate A-key"},
888     {  12, "Perform SSD Update procedure"},
889     {  13, "Perform Re-authentication procedure"},
890     {  14, "Release TRN"},
891     {  15, "Commit A-key"},
892     {  16, "Release Resources (e.g., A-key, Traffic Channel)"},
893     {  17, "Record NEWMSID"},
894     {  18, "Allocate Resources (e.g., Multiple message traffic channel delivery)."},
895     {  19, "Generate Authentication Signature"},
896     {  20, "Release leg and redirect subscriber"},
897     {  21, "Do Not Wait For MS User Level Response"},
898     {  22, "Prepare for CDMA Handset-Based Position Determination"},
899     {  23, "CDMA Handset-Based Position Determination Complete"},
900     {   0, NULL }
901 };
902 static value_string_ext ansi_map_ActionCode_vals_ext = VALUE_STRING_EXT_INIT(ansi_map_ActionCode_vals);
903
904 /* 6.5.2.3 AlertCode */
905
906 /* Pitch (octet 1, bits G-H) */
907 static const value_string ansi_map_AlertCode_Pitch_vals[]  = {
908     {   0, "Medium pitch"},
909     {   1, "High pitch"},
910     {   2, "Low pitch"},
911     {   3, "Reserved"},
912     {   0, NULL }
913 };
914 /* Cadence (octet 1, bits A-F) */
915 static const value_string ansi_map_AlertCode_Cadence_vals[]  = {
916     {   0, "NoTone"},
917     {   1, "Long"},
918     {   2, "ShortShort"},
919     {   3, "ShortShortLong"},
920     {   4, "ShortShort2"},
921     {   5, "ShortLongShort"},
922     {   6, "ShortShortShortShort"},
923     {   7, "PBXLong"},
924     {   8, "PBXShortShort"},
925     {   9, "PBXShortShortLong"},
926
927     {  10, "PBXShortLongShort"},
928     {  11, "PBXShortShortShortShort"},
929     {  12, "PipPipPipPip"},
930     {  13, "Reserved. Treat the same as value 0, NoTone"},
931     {  14, "Reserved. Treat the same as value 0, NoTone"},
932     {  15, "Reserved. Treat the same as value 0, NoTone"},
933     {  16, "Reserved. Treat the same as value 0, NoTone"},
934     {  17, "Reserved. Treat the same as value 0, NoTone"},
935     {  18, "Reserved. Treat the same as value 0, NoTone"},
936     {  19, "Reserved. Treat the same as value 0, NoTone"},
937     {   0, NULL }
938 };
939
940 /* Alert Action (octet 2, bits A-C) */
941 static const value_string ansi_map_AlertCode_Alert_Action_vals[]  = {
942     {   0, "Alert without waiting to report"},
943     {   1, "Apply a reminder alert once"},
944     {   2, "Other values reserved. Treat the same as value 0, Alert without waiting to report"},
945     {   3, "Other values reserved. Treat the same as value 0, Alert without waiting to report"},
946     {   4, "Other values reserved. Treat the same as value 0, Alert without waiting to report"},
947     {   5, "Other values reserved. Treat the same as value 0, Alert without waiting to report"},
948     {   6, "Other values reserved. Treat the same as value 0, Alert without waiting to report"},
949     {   7, "Other values reserved. Treat the same as value 0, Alert without waiting to report"},
950     {   0, NULL }
951 };
952 static void
953 dissect_ansi_map_alertcode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
954
955     int offset = 0;
956
957     proto_tree *subtree;
958
959
960     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
961     /* Pitch (octet 1, bits G-H) */
962     proto_tree_add_item(subtree, hf_ansi_alertcode_pitch, tvb, offset, 1, FALSE);
963     /* Cadence (octet 1, bits A-F) */
964     proto_tree_add_item(subtree, hf_ansi_alertcode_cadence, tvb, offset, 1, FALSE);
965     offset++;
966
967     /* Alert Action (octet 2, bits A-C) */
968     proto_tree_add_item(subtree, hf_ansi_alertcode_alertaction, tvb, offset, 1, FALSE);
969
970 }
971 /* 6.5.2.4 AlertResult */
972 /* Result (octet 1) */
973 static const value_string ansi_map_AlertResult_result_vals[]  = {
974     {   0, "Not specified"},
975     {   1, "Success"},
976     {   2, "Failure"},
977     {   3, "Denied"},
978     {   4, "NotAttempted"},
979     {   5, "NoPageResponse"},
980     {   6, "Busy"},
981     {   0, NULL }
982 };
983
984 /* 6.5.2.5 AnnouncementCode Updatef from NS0018Re*/
985 /* Tone (octet 1) */
986 static const value_string ansi_map_AnnouncementCode_tone_vals[]  = {
987     {   0, "DialTone"},
988     {   1, "RingBack or AudibleAlerting"},
989     {   2, "InterceptTone or MobileReorder"},
990     {   3, "CongestionTone or ReorderTone"},
991     {   4, "BusyTone"},
992     {   5, "ConfirmationTone"},
993     {   6, "AnswerTone"},
994     {   7, "CallWaitingTone"},
995     {   8, "OffHookTone"},
996     {  17, "RecallDialTone"},
997     {  18, "BargeInTone"},
998     {  20, "PPCInsufficientTone"},
999     {  21, "PPCWarningTone1"},
1000     {  22, "PPCWarningTone2"},
1001     {  23, "PPCWarningTone3"},
1002     {  24, "PPCDisconnectTone"},
1003     {  25, "PPCRedirectTone"},
1004     {  63, "TonesOff"},
1005     { 192, "PipTone"},
1006     { 193, "AbbreviatedIntercept"},
1007     { 194, "AbbreviatedCongestion"},
1008     { 195, "WarningTone"},
1009     { 196, "DenialToneBurst"},
1010     { 197, "DialToneBurst"},
1011     { 250, "IncomingAdditionalCallTone"},
1012     { 251, "PriorityAdditionalCallTone"},
1013     {   0, NULL }
1014 };
1015 /* Class (octet 2, bits A-D) */
1016 static const value_string ansi_map_AnnouncementCode_class_vals[]  = {
1017     {   0, "Concurrent"},
1018     {   1, "Sequential"},
1019     {   0, NULL }
1020 };
1021 /* Standard Announcement (octet 3) Updated with N.S0015 */
1022 static const value_string ansi_map_AnnouncementCode_std_ann_vals[]  = {
1023     {   0, "None"},
1024     {   1, "UnauthorizedUser"},
1025     {   2, "InvalidESN"},
1026     {   3, "UnauthorizedMobile"},
1027     {   4, "SuspendedOrigination"},
1028     {   5, "OriginationDenied"},
1029     {   6, "ServiceAreaDenial"},
1030     {  16, "PartialDial"},
1031     {  17, "Require1Plus"},
1032     {  18, "Require1PlusNPA"},
1033     {  19, "Require0Plus"},
1034     {  20, "Require0PlusNPA"},
1035     {  21, "Deny1Plus"},
1036     {  22, "Unsupported10plus"},
1037     {  23, "Deny10plus"},
1038     {  24, "Unsupported10XXX"},
1039     {  25, "Deny10XXX"},
1040     {  26, "Deny10XXXLocally"},
1041     {  27, "Require10Plus"},
1042     {  28, "RequireNPA"},
1043     {  29, "DenyTollOrigination"},
1044     {  30, "DenyInternationalOrigination"},
1045     {  31, "Deny0Minus"},
1046     {  48, "DenyNumber"},
1047     {  49, "AlternateOperatorServices"},
1048     {  64, "No Circuit or AllCircuitsBusy or FacilityProblem"},
1049     {  65, "Overload"},
1050     {  66, "InternalOfficeFailure"},
1051     {  67, "NoWinkReceived"},
1052     {  68, "InterofficeLinkFailure"},
1053     {  69, "Vacant"},
1054     {  70, "InvalidPrefix or InvalidAccessCode"},
1055     {  71, "OtherDialingIrregularity"},
1056     {  80, "VacantNumber or DisconnectedNumber"},
1057     {  81, "DenyTermination"},
1058     {  82, "SuspendedTermination"},
1059     {  83, "ChangedNumber"},
1060     {  84, "InaccessibleSubscriber"},
1061     {  85, "DenyIncomingTol"},
1062     {  86, "RoamerAccessScreening"},
1063     {  87, "RefuseCall"},
1064     {  88, "RedirectCall"},
1065     {  89, "NoPageResponse"},
1066     {  90, "NoAnswer"},
1067     {  96, "RoamerIntercept"},
1068     {  97, "GeneralInformation"},
1069     { 112, "UnrecognizedFeatureCode"},
1070     { 113, "UnauthorizedFeatureCode"},
1071     { 114, "RestrictedFeatureCode"},
1072     { 115, "InvalidModifierDigits"},
1073     { 116, "SuccessfulFeatureRegistration"},
1074     { 117, "SuccessfulFeatureDeRegistration"},
1075     { 118, "SuccessfulFeatureActivation"},
1076     { 119, "SuccessfulFeatureDeActivation"},
1077     { 120, "InvalidForwardToNumber"},
1078     { 121, "CourtesyCallWarning"},
1079     { 128, "EnterPINSendPrompt"},
1080     { 129, "EnterPINPrompt"},
1081     { 130, "ReEnterPINSendPrompt"},
1082     { 131, "ReEnterPINPrompt"},
1083     { 132, "EnterOldPINSendPrompt"},
1084     { 133, "EnterOldPINPrompt"},
1085     { 134, "EnterNewPINSendPrompt"},
1086     { 135, "EnterNewPINPrompt"},
1087     { 136, "ReEnterNewPINSendPrompt"},
1088     { 137, "ReEnterNewPINPrompt"},
1089     { 138, "EnterPasswordPrompt"},
1090     { 139, "EnterDirectoryNumberPrompt"},
1091     { 140, "ReEnterDirectoryNumberPrompt"},
1092     { 141, "EnterFeatureCodePrompt"},
1093     { 142, "EnterEnterCreditCardNumberPrompt"},
1094     { 143, "EnterDestinationNumberPrompt"},
1095     { 152, "PPCInsufficientAccountBalance"},
1096     { 153, "PPCFiveMinuteWarning"},
1097     { 154, "PPCThreeMinuteWarning"},
1098     { 155, "PPCTwoMinuteWarning"},
1099     { 156, "PPCOneMinuteWarning"},
1100     { 157, "PPCDisconnect"},
1101     { 158, "PPCRedirect"},
1102     {   0, NULL }
1103 };
1104
1105
1106
1107 static void
1108 dissect_ansi_map_announcementcode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1109
1110     int offset = 0;
1111
1112     proto_tree *subtree;
1113
1114
1115     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1116
1117     /* Tone (octet 1) */
1118     proto_tree_add_item(subtree, hf_ansi_map_announcementcode_tone, tvb, offset, 1, FALSE);
1119     offset++;
1120     /* Class (octet 2, bits A-D) */
1121     proto_tree_add_item(subtree, hf_ansi_map_announcementcode_class, tvb, offset, 1, FALSE);
1122     offset++;
1123     /* Standard Announcement (octet 3) */
1124     proto_tree_add_item(subtree, hf_ansi_map_announcementcode_std_ann, tvb, offset, 1, FALSE);
1125     offset++;
1126     /* Custom Announcement ( octet 4 )
1127        e.       The assignment of this octet is left to bilateral agreement. When a Custom
1128        Announcement is specified it takes precedence over either the Standard
1129        Announcement or Tone
1130     */
1131     proto_tree_add_item(subtree, hf_ansi_map_announcementcode_cust_ann, tvb, offset, 1, FALSE);
1132
1133 }
1134 /* 6.5.2.8 AuthenticationCapability Updated N.S0003*/
1135 static const value_string ansi_map_AuthenticationCapability_vals[]  = {
1136     {   0, "Not used"},
1137     {   1, "No authentication required"},
1138     {   2, "Authentication required"},
1139     { 128, "Authentication required and UIM capable."},
1140     {   0, NULL }
1141 };
1142
1143 /* 6.5.2.14 AuthorizationPeriod*/
1144
1145 /* Period (octet 1) */
1146 static const value_string ansi_map_authorizationperiod_period_vals[]  = {
1147     {   0, "Not used"},
1148     {   1, "Per Call"},
1149     {   2, "Hours"},
1150     {   3, "Days"},
1151     {   4, "Weeks"},
1152     {   5, "Per Agreement"},
1153     {   6, "Indefinite (i.e., authorized until canceled or deregistered)"},
1154     {   7, "Number of calls. Re-authorization should be attempted after this number of (rejected) call attempts"},
1155     {   0, NULL }
1156 };
1157 /* Value (octet 2)
1158 Number of minutes hours, days, weeks, or
1159 number of calls (as per Period). If Period
1160 indicates anything else the Value is set to zero
1161 on sending and ignored on receipt.
1162 */
1163 static void
1164 dissect_ansi_map_authorizationperiod(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1165
1166     int offset = 0;
1167
1168     proto_tree *subtree;
1169
1170
1171     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1172     proto_tree_add_item(subtree, hf_ansi_map_authorizationperiod_period, tvb, offset, 1, FALSE);
1173     offset++;
1174     proto_tree_add_item(subtree, hf_ansi_map_value, tvb, offset, 1, FALSE);
1175
1176 }
1177 /* 6.5.2.15 AvailabilityType */
1178 static const value_string ansi_map_AvailabilityType_vals[]  = {
1179     {   0, "Not used"},
1180     {   1, "Unspecified MS inactivity type"},
1181     {   0, NULL }
1182 };
1183
1184 /* 6.5.2.16 BillingID */
1185 static void
1186 dissect_ansi_map_billingid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1187
1188     int offset = 0;
1189
1190     proto_tree *subtree;
1191
1192
1193     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1194
1195     proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, FALSE);
1196     offset = offset + 2;
1197     proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, FALSE);
1198     offset++;
1199     /* ID Number */
1200     proto_tree_add_item(subtree, hf_ansi_map_idno, tvb, offset, 3, FALSE);
1201     offset = offset + 3;
1202     proto_tree_add_item(subtree, hf_ansi_map_segcount, tvb, offset, 1, FALSE);
1203
1204 }
1205
1206
1207 /* 6.5.2.20 CallingFeaturesIndicator */
1208 static const value_string ansi_map_FeatureActivity_vals[]  = {
1209     {   0, "Not used"},
1210     {   1, "Not authorized"},
1211     {   2, "Authorized but de-activated"},
1212     {   3, "Authorized and activated"},
1213     {   0, NULL }
1214 };
1215
1216
1217 static void
1218 dissect_ansi_map_callingfeaturesindicator(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1219     int offset = 0;
1220     int length;
1221
1222     proto_tree *subtree;
1223
1224     length = tvb_length_remaining(tvb,offset);
1225
1226     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1227
1228     /* Call Waiting: FeatureActivity, CW-FA (Octet 1 bits GH )          */
1229     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cwfa, tvb, offset, 1, FALSE);
1230     /* Call Forwarding No Answer FeatureActivity, CFNA-FA (Octet 1 bits EF )    */
1231     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cfnafa, tvb, offset, 1, FALSE);
1232     /* Call Forwarding Busy FeatureActivity, CFB-FA (Octet 1 bits CD )  */
1233     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cfbfa, tvb, offset, 1, FALSE);
1234     /* Call Forwarding Unconditional FeatureActivity, CFU-FA (Octet 1 bits AB ) */
1235     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cfufa, tvb, offset, 1, FALSE);
1236     offset++;
1237     length--;
1238
1239     /* Call Transfer: FeatureActivity, CT-FA (Octet 2 bits GH )         */
1240     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_ctfa, tvb, offset, 1, FALSE);
1241     /* Voice Privacy FeatureActivity, VP-FA (Octet 2 bits EF )  */
1242     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_vpfa, tvb, offset, 1, FALSE);
1243     /* Call Delivery: FeatureActivity (not interpreted on reception by IS-41-C or later)
1244        CD-FA (Octet 2 bits CD )         */
1245     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cdfa, tvb, offset, 1, FALSE);
1246     /* Three-Way Calling FeatureActivity, 3WC-FA (Octet 2 bits AB )     */
1247     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_3wcfa, tvb, offset, 1, FALSE);
1248     offset++;
1249     length--;
1250
1251
1252     /* Calling Number Identification Restriction Override FeatureActivity CNIROver-FA (Octet 3 bits GH )        */
1253     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cniroverfa, tvb, offset, 1, FALSE);
1254     /* Calling Number Identification Restriction: FeatureActivity CNIR-FA (Octet 3 bits EF )    */
1255     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cnirfa, tvb, offset, 1, FALSE);
1256     /* Calling Number Identification Presentation: FeatureActivity CNIP2-FA (Octet 3 bits CD )  */
1257     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cnip2fa, tvb, offset, 1, FALSE);
1258     /* Calling Number Identification Presentation: FeatureActivity CNIP1-FA (Octet 3 bits AB )  */
1259     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cnip1fa, tvb, offset, 1, FALSE);
1260     length--;
1261     if ( length == 0)
1262         return;
1263     offset++;
1264
1265     /* USCF divert to voice mail: FeatureActivity USCFvm-FA (Octet 4 bits GH )  */
1266     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_uscfvmfa, tvb, offset, 1, FALSE);
1267     /* Answer Hold: FeatureActivity AH-FA (Octet 4 bits EF ) N.S0029-0 v1.0     */
1268     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_ahfa, tvb, offset, 1, FALSE);
1269     /* Data Privacy Feature Activity DP-FA (Octet 4 bits CD ) N.S0008-0 v 1.0   */
1270     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_dpfa, tvb, offset, 1, FALSE);
1271     /* Priority Call Waiting FeatureActivity PCW-FA (Octet 4 bits AB )  */
1272     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_pcwfa, tvb, offset, 1, FALSE);
1273     length--;
1274     if ( length == 0)
1275         return;
1276     offset++;
1277
1278     /* USCF divert to mobile station provided DN:FeatureActivity.USCFms-FA (Octet 5 bits AB ) */
1279     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_uscfmsfa, tvb, offset, 1, FALSE);
1280     /* USCF divert to network registered DN:FeatureActivity. USCFnr-FA (Octet 5 bits CD )*/
1281     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_uscfnrfa, tvb, offset, 1, FALSE);
1282     /* CDMA-Packet Data Service: FeatureActivity. CPDS-FA (Octet 5 bits EF ) N.S0029-0 v1.0*/
1283     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_cpdsfa, tvb, offset, 1, FALSE);
1284     /* CDMA-Concurrent Service:FeatureActivity. CCS-FA (Octet 5 bits GH ) N.S0029-0 v1.0*/
1285     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_ccsfa, tvb, offset, 1, FALSE);
1286     length--;
1287     if ( length == 0)
1288         return;
1289     offset++;
1290
1291     /* TDMA Enhanced Privacy and Encryption:FeatureActivity.TDMA EPE-FA (Octet 6 bits AB ) N.S0029-0 v1.0*/
1292     proto_tree_add_item(subtree, hf_ansi_map_callingfeaturesindicator_epefa, tvb, offset, 1, FALSE);
1293 }
1294
1295
1296 /* 6.5.2.27 CancellationType */
1297 static const value_string ansi_map_CancellationType_vals[]  = {
1298     {   0, "Not used"},
1299     {   1, "ServingSystemOption"},
1300     {   2, "ReportInCall."},
1301     {   3, "Discontinue"},
1302     {   0, NULL }
1303 };
1304
1305 /* 6.5.2.29 CDMACallMode Updated with N.S0029-0 v1.0*/
1306 /* Call Mode (octet 1, bit A) */
1307 static const true_false_string ansi_map_CDMACallMode_cdma_bool_val  = {
1308   "CDMA 800 MHz channel (Band Class 0) acceptable.",
1309   "CDMA 800 MHz channel (Band Class 0) not acceptable"
1310 };
1311 /* Call Mode (octet 1, bit B) */
1312 static const true_false_string ansi_map_CallMode_amps_bool_val  = {
1313     "AAMPS 800 MHz channel acceptable",
1314     "AMPS 800 MHz channel not acceptable"
1315 };
1316 /* Call Mode (octet 1, bit C) */
1317 static const true_false_string ansi_map_CallMode_namps_bool_val  = {
1318     "NAMPS 800 MHz channel acceptable",
1319     "NAMPS 800 MHz channel not acceptable"
1320 };
1321 /* Call Mode (octet 1, bit D) */
1322 static const true_false_string ansi_map_CDMACallMode_cls1_bool_val  = {
1323     "CDMA 1900 MHz channel (Band Class 1) acceptable.",
1324     "CDMA 1900 MHz channel (Band Class 1) not acceptable"
1325 };
1326 /* Call Mode (octet 1, bit E) */
1327 static const true_false_string ansi_map_CDMACallMode_cls2_bool_val  = {
1328     "TACS channel (Band Class 2) acceptable",
1329     "TACS channel (Band Class 2) not acceptable"
1330 };
1331 /* Call Mode (octet 1, bit F) */
1332 static const true_false_string ansi_map_CDMACallMode_cls3_bool_val  = {
1333     "JTACS channel (Band Class 3) acceptable",
1334     "JTACS channel (Band Class 3) not acceptable"
1335 };
1336 /* Call Mode (octet 1, bit G) */
1337 static const true_false_string ansi_map_CDMACallMode_cls4_bool_val  = {
1338     "Korean PCS channel (Band Class 4) acceptable",
1339     "Korean PCS channel (Band Class 4) not acceptable"
1340 };
1341 /* Call Mode (octet 1, bit H) */
1342 static const true_false_string ansi_map_CDMACallMode_cls5_bool_val  = {
1343     "450 MHz channel (Band Class 5) not acceptable",
1344     "450 MHz channel (Band Class 5) not acceptable"
1345 };
1346 /* Call Mode (octet 2, bit A) */
1347 static const true_false_string ansi_map_CDMACallMode_cls6_bool_val  = {
1348     "2 GHz channel (Band Class 6) acceptable.",
1349     "2 GHz channel (Band Class 6) not acceptable."
1350 };
1351
1352 /* Call Mode (octet 2, bit B) */
1353 static const true_false_string ansi_map_CDMACallMode_cls7_bool_val  = {
1354     "700 MHz channel (Band Class 7) acceptable",
1355     "700 MHz channel (Band Class 7) not acceptable"
1356 };
1357
1358 /* Call Mode (octet 2, bit C) */
1359 static const true_false_string ansi_map_CDMACallMode_cls8_bool_val  = {
1360     "1800 MHz channel (Band Class 8) acceptable",
1361     "1800 MHz channel (Band Class 8) not acceptable"
1362 };
1363 /* Call Mode (octet 2, bit D) */
1364 static const true_false_string ansi_map_CDMACallMode_cls9_bool_val  = {
1365     "900 MHz channel (Band Class 9) acceptable",
1366     "900 MHz channel (Band Class 9) not acceptable"
1367 };
1368 /* Call Mode (octet 2, bit E) */
1369 static const true_false_string ansi_map_CDMACallMode_cls10_bool_val  = {
1370     "Secondary 800 MHz channel (Band Class 10) acceptable.",
1371     "Secondary 800 MHz channel (Band Class 10) not acceptable."
1372 };
1373
1374 static void
1375 dissect_ansi_map_cdmacallmode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1376     int offset = 0;
1377     int length;
1378
1379     proto_tree *subtree;
1380
1381     length = tvb_length_remaining(tvb,offset);
1382
1383
1384     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1385     /* Call Mode (octet 1, bit H) */
1386     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls5, tvb, offset, 1, FALSE);
1387     /* Call Mode (octet 1, bit G) */
1388     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls4, tvb, offset, 1, FALSE);
1389     /* Call Mode (octet 1, bit F) */
1390     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls3, tvb, offset, 1, FALSE);
1391     /* Call Mode (octet 1, bit E) */
1392     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls2, tvb, offset, 1, FALSE);
1393     /* Call Mode (octet 1, bit D) */
1394     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls1, tvb, offset, 1, FALSE);
1395     /* Call Mode (octet 1, bit C) */
1396     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_namps, tvb, offset, 1, FALSE);
1397     /* Call Mode (octet 1, bit B) */
1398     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_amps, tvb, offset, 1, FALSE);
1399     /* Call Mode (octet 1, bit A) */
1400     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cdma, tvb, offset, 1, FALSE);
1401
1402     length--;
1403     if ( length == 0)
1404         return;
1405     offset++;
1406
1407     /* Call Mode (octet 2, bit E) */
1408     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls10, tvb, offset, 1, FALSE);
1409     /* Call Mode (octet 2, bit D) */
1410     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls9, tvb, offset, 1, FALSE);
1411     /* Call Mode (octet 2, bit C) */
1412     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls8, tvb, offset, 1, FALSE);
1413     /* Call Mode (octet 2, bit B) */
1414     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls7, tvb, offset, 1, FALSE);
1415     /* Call Mode (octet 2, bit A) */
1416     proto_tree_add_item(subtree, hf_ansi_map_cdmacallmode_cls6, tvb, offset, 1, FALSE);
1417
1418 }
1419 /* 6.5.2.30 CDMAChannelData */
1420 /* Updated with N.S0010-0 v 1.0 */
1421
1422 static const value_string ansi_map_cdmachanneldata_band_cls_vals[]  = {
1423     {   0, "800 MHz Cellular System"},
1424     {   0, NULL }
1425 };
1426
1427 static void
1428 dissect_ansi_map_cdmachanneldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1429
1430     int offset = 0;
1431     int length;
1432
1433     proto_tree *subtree;
1434
1435     length = tvb_length_remaining(tvb,offset);
1436
1437
1438     subtree = proto_item_add_subtree(actx->created_item, ett_cdmachanneldata);
1439
1440     proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, FALSE);
1441     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_Frame_Offset, tvb, offset, 1, FALSE);
1442     /* CDMA Channel Number */
1443     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_CDMA_ch_no, tvb, offset, 2, FALSE);
1444     offset = offset + 2;
1445     length = length -2;
1446     /* Band Class */
1447     proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, FALSE);
1448     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_band_cls, tvb, offset, 1, FALSE);
1449     /* Long Code Mask */
1450     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b6, tvb, offset, 1, FALSE);
1451     offset++;
1452     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b5, tvb, offset, 1, FALSE);
1453     offset++;
1454     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b4, tvb, offset, 1, FALSE);
1455     offset++;
1456     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b3, tvb, offset, 1, FALSE);
1457     offset++;
1458     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b2, tvb, offset, 1, FALSE);
1459     offset++;
1460     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_lc_mask_b1, tvb, offset, 1, FALSE);
1461     length = length - 6;
1462     if (length == 0)
1463         return;
1464     offset++;
1465     /* NP_EXT */
1466     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_np_ext, tvb, offset, 1, FALSE);
1467     /* Nominal Power */
1468     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_nominal_pwr, tvb, offset, 1, FALSE);
1469     /* Number Preamble */
1470     proto_tree_add_item(subtree, hf_ansi_map_cdmachanneldata_nr_preamble, tvb, offset, 1, FALSE);
1471
1472 }
1473 /* 6.5.2.31 CDMACodeChannel */
1474
1475 /* 6.5.2.41 CDMAStationClassMark */
1476 /* Power Class: (PC) (octet 1, bits A and B) */
1477 static const value_string ansi_map_CDMAStationClassMark_pc_vals[]  = {
1478     {   0, "Class I"},
1479     {   1, "Class II"},
1480     {   2, "Class III"},
1481     {   3, "Reserved"},
1482     {   0, NULL }
1483 };
1484 /* Analog Transmission: (DTX) (octet 1, bit C) */
1485 static const true_false_string ansi_map_CDMAStationClassMark_dtx_bool_val  = {
1486     "Discontinuous",
1487     "Continuous"
1488 };
1489 /* Slotted Mode Indicator: (SMI) (octet 1, bit F) */
1490 static const true_false_string ansi_map_CDMAStationClassMark_smi_bool_val  = {
1491     "Slotted capable",
1492     "Slotted incapable"
1493 };
1494 /* Dual-mode Indicator(DMI) (octet 1, bit G) */
1495 static const true_false_string ansi_map_CDMAStationClassMark_dmi_bool_val  = {
1496     "Dual-mode CDMA",
1497     "CDMA only"
1498 };
1499
1500
1501 static void
1502 dissect_ansi_map_cdmastationclassmark(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1503     int offset = 0;
1504
1505     proto_tree *subtree;
1506
1507
1508     subtree = proto_item_add_subtree(actx->created_item, ett_cdmastationclassmark);
1509
1510     proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, FALSE);
1511     /* Dual-mode Indicator(DMI) (octet 1, bit G) */
1512     proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_dmi, tvb, offset, 1, FALSE);
1513     /* Slotted Mode Indicator: (SMI) (octet 1, bit F) */
1514     proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_smi, tvb, offset, 1, FALSE);
1515     proto_tree_add_item(subtree, hf_ansi_map_reservedBitED, tvb, offset, 1, FALSE);
1516     /* Analog Transmission: (DTX) (octet 1, bit C) */
1517     proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_dtx, tvb, offset, 1, FALSE);
1518     /* Power Class: (PC) (octet 1, bits A and B) */
1519     proto_tree_add_item(subtree, hf_ansi_map_cdmastationclassmark_pc, tvb, offset, 1, FALSE);
1520 }
1521 /* 6.5.2.47 ChannelData */
1522 /* Discontinuous Transmission Mode (DTX) (octet 1, bits E and D) */
1523 static const value_string ansi_map_ChannelData_dtx_vals[]  = {
1524     {   0, "DTX disabled"},
1525     {   1, "Reserved. Treat the same as value 00, DTX disabled."},
1526     {   2, "DTX-low mode"},
1527     {   3, "DTX mode active or acceptable"},
1528     {   0, NULL }
1529 };
1530
1531
1532 static void
1533 dissect_ansi_map_channeldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1534     int offset = 0;
1535
1536     proto_tree *subtree;
1537
1538
1539     subtree = proto_item_add_subtree(actx->created_item, ett_channeldata);
1540
1541     /* SAT Color Code (SCC) (octet 1, bits H and G) */
1542     proto_tree_add_item(subtree, hf_ansi_map_channeldata_scc, tvb, offset, 1, FALSE);
1543     /* Discontinuous Transmission Mode (DTX) (octet 1, bits E and D) */
1544     proto_tree_add_item(subtree, hf_ansi_map_channeldata_dtx, tvb, offset, 1, FALSE);
1545     /* Voice Mobile Attenuation Code (VMAC) (octet 1, bits A - C)*/
1546     proto_tree_add_item(subtree, hf_ansi_map_channeldata_vmac, tvb, offset, 1, FALSE);
1547
1548     offset++;
1549     /* Channel Number (CHNO) ( octet 2 and 3 ) */
1550     proto_tree_add_item(subtree, hf_ansi_map_channeldata_chno, tvb, offset, 2, FALSE);
1551
1552 }
1553
1554 /* 6.5.2.50 ConfidentialityModes */
1555 /* Updated with N.S0008-0 v 1.0*/
1556 /* Voice Privacy (VP) Confidentiality Status (octet 1, bit A) */
1557
1558 static const true_false_string ansi_map_ConfidentialityModes_bool_val  = {
1559     "On",
1560     "Off"
1561 };
1562 static void
1563 dissect_ansi_map_confidentialitymodes(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1564     int offset = 0;
1565
1566     proto_tree *subtree;
1567
1568
1569     subtree = proto_item_add_subtree(actx->created_item, ett_confidentialitymodes);
1570
1571     /* DataPrivacy (DP) Confidentiality Status (octet 1, bit C) */
1572     proto_tree_add_item(subtree, hf_ansi_map_ConfidentialityModes_dp, tvb, offset, 1, FALSE);
1573     /* Signaling Message Encryption (SE) Confidentiality Status (octet 1, bit B) */
1574     proto_tree_add_item(subtree, hf_ansi_map_ConfidentialityModes_se, tvb, offset, 1, FALSE);
1575     /* Voice Privacy (VP) Confidentiality Status (octet 1, bit A) */
1576     proto_tree_add_item(subtree, hf_ansi_map_ConfidentialityModes_vp, tvb, offset, 1, FALSE);
1577
1578 }
1579
1580 /* 6.5.2.51 ControlChannelData */
1581
1582 /* Digital Color Code (DCC) (octet 1, bit H and G) */
1583 /* Control Mobile Attenuation Code (CMAC) (octet 1, bit A - C) */
1584 /* Channel Number (CHNO) ( octet 2 and 3 ) */
1585 /* Supplementary Digital Color Codes (SDCC1 and SDCC2) */
1586 /* SDCC1 ( octet 4, bit D and C )*/
1587 /* SDCC2 ( octet 4, bit A and B )*/
1588
1589 static void
1590 dissect_ansi_map_controlchanneldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1591     int offset = 0;
1592
1593     proto_tree *subtree;
1594
1595
1596     subtree = proto_item_add_subtree(actx->created_item, ett_controlchanneldata);
1597
1598     /* Digital Color Code (DCC) (octet 1, bit H and G) */
1599     proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_dcc, tvb, offset, 1, FALSE);
1600     proto_tree_add_item(subtree, hf_ansi_map_reservedBitFED, tvb, offset, 1, FALSE);
1601     /* Control Mobile Attenuation Code (CMAC) (octet 1, bit A - C) */
1602     proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_cmac, tvb, offset, 1, FALSE);
1603     offset++;
1604     /* Channel Number (CHNO) ( octet 2 and 3 ) */
1605     proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_chno, tvb, offset, 2, FALSE);
1606     /* Supplementary Digital Color Codes (SDCC1 and SDCC2) */
1607     offset = offset +2;
1608     /* SDCC1 ( octet 4, bit D and C )*/
1609     proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_sdcc1, tvb, offset, 1, FALSE);
1610     proto_tree_add_item(subtree, hf_ansi_map_reservedBitHGFE, tvb, offset, 1, FALSE);
1611     /* SDCC2 ( octet 4, bit A and B )*/
1612     proto_tree_add_item(subtree, hf_ansi_map_controlchanneldata_sdcc2, tvb, offset, 1, FALSE);
1613
1614 }
1615
1616 /* 6.5.2.52 CountUpdateReport */
1617 static const value_string ansi_map_CountUpdateReport_vals[]  = {
1618     {   0, "Class I"},
1619     {   1, "Class II"},
1620     {   2, "Class III"},
1621     {   3, "Reserved"},
1622     {   0, NULL }
1623 };
1624
1625 /* 6.5.2.53 DeniedAuthorizationPeriod */
1626 /* Period (octet 1) */
1627 static const value_string ansi_map_deniedauthorizationperiod_period_vals[]  = {
1628     {   0, "Not used"},
1629     {   1, "Per Call. Re-authorization should be attempted on the next call attempt"},
1630     {   2, "Hours"},
1631     {   3, "Days"},
1632     {   4, "Weeks"},
1633     {   5, "Per Agreement"},
1634     {   6, "Reserved"},
1635     {   7, "Number of calls. Re-authorization should be attempted after this number of (rejected) call attempts"},
1636     {   8, "Minutes"},
1637     {   0, NULL }
1638 };
1639 /* Value (octet 2)
1640 Number of minutes hours, days, weeks, or
1641 number of calls (as per Period). If Period
1642 indicates anything else the Value is set to zero
1643 on sending and ignored on receipt.
1644 */
1645
1646 static void
1647 dissect_ansi_map_deniedauthorizationperiod(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1648
1649     int offset = 0;
1650
1651     proto_tree *subtree;
1652
1653
1654     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1655     proto_tree_add_item(subtree, hf_ansi_map_deniedauthorizationperiod_period, tvb, offset, 1, FALSE);
1656     offset++;
1657     proto_tree_add_item(subtree, hf_ansi_map_value, tvb, offset, 1, FALSE);
1658
1659 }
1660
1661
1662 /* 6.5.2.57 DigitCollectionControl */
1663 /* TODO Add decoding here */
1664
1665 /* 6.5.2.64 ExtendedMSCID */
1666 static const value_string ansi_map_msc_type_vals[]  = {
1667     {   0, "Not specified"},
1668     {   1, "Serving MSC"},
1669     {   2, "Home MSC"},
1670     {   3, "Gateway MSC"},
1671     {   4, "HLR"},
1672     {   5, "VLR"},
1673     {   6, "EIR (reserved)"},
1674     {   7, "AC"},
1675     {   8, "Border MSC"},
1676     {   9, "Originating MSC"},
1677     {   0, NULL }
1678 };
1679
1680 static void
1681 dissect_ansi_map_extendedmscid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1682
1683     int offset = 0;
1684
1685     proto_tree *subtree;
1686
1687
1688     subtree = proto_item_add_subtree(actx->created_item, ett_extendedmscid);
1689     /* Type (octet 1) */
1690     proto_tree_add_item(subtree, hf_ansi_map_msc_type, tvb, offset, 1, FALSE);
1691     offset++;
1692     proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, FALSE);
1693     offset = offset + 2;
1694     proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, FALSE);
1695
1696 }
1697 /* 6.5.2.65 ExtendedSystemMyTypeCode */
1698 static void
1699 dissect_ansi_map_extendedsystemmytypecode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx){
1700
1701     int offset = 0;
1702
1703     proto_tree *subtree;
1704
1705
1706     subtree = proto_item_add_subtree(actx->created_item, ett_extendedsystemmytypecode);
1707     /* Type (octet 1) */
1708     proto_tree_add_item(subtree, hf_ansi_map_msc_type, tvb, offset, 1, FALSE);
1709     offset++;
1710     offset = dissect_ansi_map_SystemMyTypeCode(TRUE, tvb, offset, actx, subtree, hf_ansi_map_systemMyTypeCode);
1711 }
1712
1713
1714 /* 6.5.2.68 GeographicAuthorization */
1715 /* Geographic Authorization (octet 1) */
1716 static const value_string ansi_map_GeographicAuthorization_vals[]  = {
1717     {   0, "Not used"},
1718     {   1, "Authorized for all MarketIDs served by the VLR"},
1719     {   2, "Authorized for this MarketID only"},
1720     {   3, "Authorized for this MarketID and Switch Number only"},
1721     {   4, "Authorized for this LocationAreaID within a MarketID only"},
1722     {   5, "VLR"},
1723     {   6, "EIR (reserved)"},
1724     {   7, "AC"},
1725     {   8, "Border MSC"},
1726     {   9, "Originating MSC"},
1727     {   0, NULL }
1728 };
1729
1730 /* 6.5.2.71 HandoffState */
1731 /* Party Involved (PI) (octet 1, bit A) */
1732 static const true_false_string ansi_map_HandoffState_pi_bool_val  = {
1733     "Terminator is handing off",
1734     "Originator is handing off"
1735 };
1736 static void
1737 dissect_ansi_map_handoffstate(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1738
1739     int offset = 0;
1740
1741     proto_tree *subtree;
1742
1743
1744     subtree = proto_item_add_subtree(actx->created_item, ett_handoffstate);
1745     /* Party Involved (PI) (octet 1, bit A) */
1746     proto_tree_add_item(subtree, hf_ansi_map_handoffstate_pi, tvb, offset, 1, FALSE);
1747 }
1748
1749 /* 6.5.2.72 InterMSCCircuitID */
1750 /* Trunk Member Number (M) Octet2 */
1751 static void
1752 dissect_ansi_map_intermsccircuitid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1753
1754     int offset = 0;
1755
1756     proto_tree *subtree;
1757     guint8 octet, octet2;
1758
1759
1760     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1761     /* Trunk Group Number (G) Octet 1 */
1762     octet = tvb_get_guint8(tvb,offset);
1763     proto_tree_add_item(subtree, hf_ansi_map_tgn, tvb, offset, 1, FALSE);
1764     offset++;
1765     /* Trunk Member Number (M) Octet2 */
1766     octet2 = tvb_get_guint8(tvb,offset);
1767     proto_tree_add_item(subtree, hf_ansi_map_tmn, tvb, offset, 1, FALSE);
1768     proto_item_append_text(actx->created_item, " (G %u/M %u)", octet, octet2);
1769 }
1770
1771 /* 6.5.2.78 MessageWaitingNotificationCount */
1772 /* Type of messages (octet 1) */
1773 static const value_string ansi_map_MessageWaitingNotificationCount_type_vals[]  = {
1774     {   0, "Voice messages"},
1775     {   1, "Short Message Services (SMS) messages"},
1776     {   2, "Group 3 (G3) Fax messages"},
1777     {   0, NULL }
1778 };
1779
1780 static void
1781 dissect_ansi_map_messagewaitingnotificationcount(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1782
1783     int offset = 0;
1784
1785     proto_tree *subtree;
1786
1787
1788     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1789     /* Type of messages (octet 1) */
1790     proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationcount_tom, tvb, offset, 1, FALSE);
1791     offset++;
1792     /* Number of Messages Waiting (octet 2) */
1793     proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationcount_no_mw, tvb, offset, 1, FALSE);
1794
1795 }
1796
1797 /* 6.5.2.79 MessageWaitingNotificationType */
1798 /* Pip Tone (PT) (octet 1, bit A) */
1799 static const true_false_string ansi_map_MessageWaitingNotificationType_pt_bool_val  = {
1800     "Pip Tone (PT) notification is required",
1801     "Pip Tone (PT) notification is not authorized or no notification is required"
1802 };
1803 /* Alert Pip Tone (APT) (octet 1, bit B) */
1804 static const true_false_string ansi_map_MessageWaitingNotificationType_apt_bool_val  = {
1805     "Alert Pip Tone (APT) notification is required",
1806     "Alert Pip Tone (APT) notification is not authorized or notification is not required"
1807 };
1808 /* Message Waiting Indication (MWI) (octet 1, bits C and D) */
1809 static const value_string ansi_map_MessageWaitingNotificationType_mwi_vals[]  = {
1810     {   0, "No MWI. Message Waiting Indication (MWI) notification is not authorized or notification is not required"},
1811     {   1, "Reserved"},
1812     {   2, "MWI On. Message Waiting Indication (MWI) notification is required. Messages waiting"},
1813     {   3, "MWI Off. Message Waiting Indication (MWI) notification is required. No messages waiting"},
1814     {   0, NULL }
1815 };
1816
1817 static void
1818 dissect_ansi_map_messagewaitingnotificationtype(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1819
1820     int offset = 0;
1821
1822     proto_tree *subtree;
1823
1824
1825     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
1826
1827     /* Message Waiting Indication (MWI) (octet 1, bits C and D) */
1828     proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationtype_mwi, tvb, offset, 1, FALSE);
1829     /* Alert Pip Tone (APT) (octet 1, bit B) */
1830     proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationtype_apt, tvb, offset, 1, FALSE);
1831     /* Pip Tone (PT) (octet 1, bit A) */
1832     proto_tree_add_item(subtree, hf_ansi_map_messagewaitingnotificationtype_pt, tvb, offset, 1, FALSE);
1833 }
1834
1835 /* 6.5.2.81 MobileIdentificationNumber */
1836
1837 /* 6.5.2.82 MSCID */
1838
1839 static void
1840 dissect_ansi_map_mscid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1841     int offset = 0;
1842
1843     proto_tree *subtree;
1844
1845
1846     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1847
1848     proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, FALSE);
1849     offset = offset + 2;
1850     proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, FALSE);
1851 }
1852
1853
1854 /* 6.5.2.84 MSLocation */
1855 static void
1856 dissect_ansi_map_mslocation(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1857     int offset = 0;
1858
1859     proto_tree *subtree;
1860
1861
1862     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1863
1864     /* Latitude in tenths of a second octet 1 - 3 */
1865     proto_tree_add_item(subtree, hf_ansi_map_mslocation_lat, tvb, offset, 3, FALSE);
1866     offset = offset + 3;
1867     /* Longitude in tenths of a second octet 4 - 6 */
1868     proto_tree_add_item(subtree, hf_ansi_map_mslocation_long, tvb, offset, 3, FALSE);
1869     offset = offset + 3;
1870     /* Resolution in units of 1 foot octet 7, octet 8 optional */
1871     proto_tree_add_item(subtree, hf_ansi_map_mslocation_res, tvb, offset, -1, FALSE);
1872
1873 }
1874 /* 6.5.2.85 NAMPSCallMode */
1875 static void
1876 dissect_ansi_map_nampscallmode(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1877     int offset = 0;
1878     proto_tree *subtree;
1879
1880
1881     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1882
1883     /* Call Mode (octet 1, bits A and B) */
1884     proto_tree_add_item(subtree, hf_ansi_map_nampscallmode_amps, tvb, offset, 1, FALSE);
1885     proto_tree_add_item(subtree, hf_ansi_map_nampscallmode_namps, tvb, offset, 1, FALSE);
1886 }
1887
1888 /* 6.5.2.86 NAMPSChannelData */
1889 /* Narrow Analog Voice Channel Assignment (NAVCA) (octet 1, bits A and B) */
1890 static const value_string ansi_map_NAMPSChannelData_navca_vals[]  = {
1891     {   0, "Wide. 30 kHz AMPS voice channel"},
1892     {   1, "Upper. 10 kHz NAMPS voice channel"},
1893     {   2, "Middle. 10 kHz NAMPS voice channel"},
1894     {   3, "Lower. 10 kHz NAMPS voice channel"},
1895     {   0, NULL }
1896 };
1897 /* Color Code Indicator (CCIndicator) (octet 1, bits C, D, and E) */
1898 static const value_string ansi_map_NAMPSChannelData_ccinidicator_vals[]  = {
1899     {   0, "ChannelData parameter SCC field applies"},
1900     {   1, "Digital SAT Color Code 1 (ignore SCC field)"},
1901     {   2, "Digital SAT Color Code 2 (ignore SCC field)"},
1902     {   3, "Digital SAT Color Code 3 (ignore SCC field)"},
1903     {   4, "Digital SAT Color Code 4 (ignore SCC field)"},
1904     {   5, "Digital SAT Color Code 5 (ignore SCC field)"},
1905     {   6, "Digital SAT Color Code 6 (ignore SCC field)"},
1906     {   7, "Digital SAT Color Code 7 (ignore SCC field)"},
1907     {   0, NULL }
1908 };
1909
1910
1911
1912 static void
1913 dissect_ansi_map_nampschanneldata(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1914     int offset = 0;
1915     proto_tree *subtree;
1916
1917
1918     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1919
1920     /* Color Code Indicator (CCIndicator) (octet 1, bits C, D, and E) */
1921     proto_tree_add_item(subtree, hf_ansi_map_nampschanneldata_CCIndicator, tvb, offset, 1, FALSE);
1922     /* Narrow Analog Voice Channel Assignment (NAVCA) (octet 1, bits A and B) */
1923     proto_tree_add_item(subtree, hf_ansi_map_nampschanneldata_navca, tvb, offset, 1, FALSE);
1924
1925 }
1926
1927 /* 6.5.2.88 OneTimeFeatureIndicator */
1928 /* updated with N.S0012 */
1929 /* Call Waiting for Future Incoming Call (CWFI) (octet 1, bits A and B) */
1930 /* Call Waiting for Incoming Call (CWIC) (octet 1, bits C and D) */
1931
1932 static const value_string ansi_map_onetimefeatureindicator_cw_vals[]  = {
1933     {   0, "Ignore"},
1934     {   1, "No CW"},
1935     {   2, "Normal CW"},
1936     {   3, "Priority CW"},
1937     {   0, NULL }
1938 };
1939 /* MessageWaitingNotification (MWN) (octet 1, bits E and F) */
1940 static const value_string ansi_map_onetimefeatureindicator_mwn_vals[]  = {
1941     {   0, "Ignore"},
1942     {   1, "Pip Tone Inactive"},
1943     {   2, "Pip Tone Active"},
1944     {   3, "Reserved"},
1945     {   0, NULL }
1946 };
1947 /* Calling Number Identification Restriction (CNIR) (octet 1, bits G and H)*/
1948 static const value_string ansi_map_onetimefeatureindicator_cnir_vals[]  = {
1949     {   0, "Ignore"},
1950     {   1, "CNIR Inactive"},
1951     {   2, "CNIR Active"},
1952     {   3, "Reserved"},
1953     {   0, NULL }
1954 };
1955
1956 /* Priority Access and Channel Assignment (PACA) (octet 2, bits A and B)*/
1957 static const value_string ansi_map_onetimefeatureindicator_paca_vals[]  = {
1958     {   0, "Ignore"},
1959     {   1, "PACA Demand Inactive"},
1960     {   2, "PACA Demand Activated"},
1961     {   3, "Reserved"},
1962     {   0, NULL }
1963 };
1964
1965 /* Flash Privileges (Flash) (octet 2, bits C and D) */
1966 static const value_string ansi_map_onetimefeatureindicator_flash_vals[]  = {
1967     {   0, "Ignore"},
1968     {   1, "Flash Inactive"},
1969     {   2, "Flash Active"},
1970     {   3, "Reserved"},
1971     {   0, NULL }
1972 };
1973 /* Calling Name Restriction (CNAR) (octet 2, bits E and F) */
1974 static const value_string ansi_map_onetimefeatureindicator_cnar_vals[]  = {
1975     {   0, "Ignore"},
1976     {   1, "Presentation Allowed"},
1977     {   2, "Presentation Restricted."},
1978     {   3, "Blocking Toggle"},
1979     {   0, NULL }
1980 };
1981 static void
1982 dissect_ansi_map_onetimefeatureindicator(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
1983     int offset = 0;
1984     proto_tree *subtree;
1985
1986
1987     subtree = proto_item_add_subtree(actx->created_item, ett_mscid);
1988
1989     /* Calling Number Identification Restriction (CNIR) (octet 1, bits G and H)*/
1990     /* MessageWaitingNotification (MWN) (octet 1, bits E and F) */
1991     /* Call Waiting for Incoming Call (CWIC) (octet 1, bits C and D) */
1992     /* Call Waiting for Future Incoming Call (CWFI) (octet 1, bits A and B) */
1993     offset++;
1994     /* Calling Name Restriction (CNAR) (octet 2, bits E and F) */
1995     /* Flash Privileges (Flash) (octet 2, bits C and D) */
1996     /* Priority Access and Channel Assignment (PACA) (octet 2, bits A and B)*/
1997
1998
1999 }
2000
2001 /* 6.5.2.90 OriginationTriggers */
2002 /* All Origination (All) (octet 1, bit A) */
2003 static const true_false_string ansi_map_originationtriggers_all_bool_val  = {
2004     "Launch an OriginationRequest for any call attempt. This overrides all other values",
2005     "Trigger is not active"
2006 };
2007
2008 /* Local (octet 1, bit B) */
2009 static const true_false_string ansi_map_originationtriggers_local_bool_val  = {
2010     "Launch an OriginationRequest for any local call attempt",
2011     "Trigger is not active"
2012 };
2013
2014 /* Intra-LATA Toll (ILATA) (octet 1, bit C) */
2015 static const true_false_string ansi_map_originationtriggers_ilata_bool_val  = {
2016     "Launch an OriginationRequest for any intra-LATA call attempt",
2017     "Trigger is not active"
2018 };
2019 /* Inter-LATA Toll (OLATA) (octet 1, bit D) */
2020 static const true_false_string ansi_map_originationtriggers_olata_bool_val  = {
2021     "Launch an OriginationRequest for any inter-LATA toll call attempt",
2022     "Trigger is not active"
2023 };
2024 /* International (Int'l ) (octet 1, bit E) */
2025 static const true_false_string ansi_map_originationtriggers_int_bool_val  = {
2026     "Launch an OriginationRequest for any international call attempt",
2027     "Trigger is not active"
2028 };
2029 /* World Zone (WZ) (octet 1, bit F) */
2030 static const true_false_string ansi_map_originationtriggers_wz_bool_val  = {
2031     "Launch an OriginationRequest for any call attempt outside of the current World Zone (as defined in ITU-T Rec. E.164)",
2032     "Trigger is not active"
2033 };
2034
2035 /* Unrecognized Number (Unrec) (octet 1, bit G) */
2036 static const true_false_string ansi_map_originationtriggers_unrec_bool_val  = {
2037     "Launch an OriginationRequest for any call attempt to an unrecognized number",
2038     "Trigger is not active"
2039 };
2040 /* Revertive Call (RvtC) (octet 1, bit H)*/
2041 static const true_false_string ansi_map_originationtriggers_rvtc_bool_val  = {
2042     "Launch an OriginationRequest for any Revertive Call attempt",
2043     "Trigger is not active"
2044 };
2045
2046 /* Star (octet 2, bit A) */
2047 static const true_false_string ansi_map_originationtriggers_star_bool_val  = {
2048     "Launch an OriginationRequest for any number beginning with a Star '*' digit",
2049     "Trigger is not active"
2050 };
2051
2052 /* Double Star (DS) (octet 2, bit B) */
2053 static const true_false_string ansi_map_originationtriggers_ds_bool_val  = {
2054     "Launch an OriginationRequest for any number beginning with two Star '**' digits",
2055     "Trigger is not active"
2056 };
2057 /* Pound (octet 2, bit C) */
2058 static const true_false_string ansi_map_originationtriggers_pound_bool_val  = {
2059     "Launch an OriginationRequest for any number beginning with a Pound '#' digit",
2060     "Trigger is not active"
2061 };
2062 /* Double Pound (DP) (octet 2, bit D) */
2063 static const true_false_string ansi_map_originationtriggers_dp_bool_val  = {
2064     "Launch an OriginationRequest for any number beginning with two Pound '##' digits",
2065     "Trigger is not active"
2066 };
2067 /* Prior Agreement (PA) (octet 2, bit E) */
2068 static const true_false_string ansi_map_originationtriggers_pa_bool_val  = {
2069     "Launch an OriginationRequest for any number matching a criteria of a prior agreement",
2070     "Trigger is not active"
2071 };
2072
2073 /* No digits (octet 3, bit A) */
2074 static const true_false_string ansi_map_originationtriggers_nodig_bool_val  = {
2075     "Launch an OriginationRequest for any call attempt with no digits",
2076     "Trigger is not active"
2077 };
2078
2079 /* 1 digit (octet 3, bit B) */
2080 static const true_false_string ansi_map_originationtriggers_onedig_bool_val  = {
2081     "Launch an OriginationRequest for any call attempt with 1 digit",
2082     "Trigger is not active"
2083 };
2084 /* 1 digit (octet 3, bit C) */
2085 static const true_false_string ansi_map_originationtriggers_twodig_bool_val  = {
2086     "Launch an OriginationRequest for any call attempt with 2 digits",
2087     "Trigger is not active"
2088 };
2089 /* 1 digit (octet 3, bit D) */
2090 static const true_false_string ansi_map_originationtriggers_threedig_bool_val  = {
2091     "Launch an OriginationRequest for any call attempt with 3 digits",
2092     "Trigger is not active"
2093 };
2094 /* 1 digit (octet 3, bit E) */
2095 static const true_false_string ansi_map_originationtriggers_fourdig_bool_val  = {
2096     "Launch an OriginationRequest for any call attempt with 4 digits",
2097     "Trigger is not active"
2098 };
2099 /* 1 digit (octet 3, bit F) */
2100 static const true_false_string ansi_map_originationtriggers_fivedig_bool_val  = {
2101     "Launch an OriginationRequest for any call attempt with 5 digits",
2102     "Trigger is not active"
2103 };
2104 /* 1 digit (octet 3, bit G) */
2105 static const true_false_string ansi_map_originationtriggers_sixdig_bool_val  = {
2106     "Launch an OriginationRequest for any call attempt with 6 digits",
2107     "Trigger is not active"
2108 };
2109 /* 1 digit (octet 3, bit H) */
2110 static const true_false_string ansi_map_originationtriggers_sevendig_bool_val  = {
2111     "Launch an OriginationRequest for any call attempt with 7 digits",
2112     "Trigger is not active"
2113 };
2114 /* 1 digit (octet 4, bit A) */
2115 static const true_false_string ansi_map_originationtriggers_eightdig_bool_val  = {
2116     "Launch an OriginationRequest for any call attempt with 8 digits",
2117     "Trigger is not active"
2118 };
2119 /* 1 digit (octet 4, bit B) */
2120 static const true_false_string ansi_map_originationtriggers_ninedig_bool_val  = {
2121     "Launch an OriginationRequest for any call attempt with 9 digits",
2122     "Trigger is not active"
2123 };
2124 /* 1 digit (octet 4, bit C) */
2125 static const true_false_string ansi_map_originationtriggers_tendig_bool_val  = {
2126     "Launch an OriginationRequest for any call attempt with 10 digits",
2127     "Trigger is not active"
2128 };
2129 /* 1 digit (octet 4, bit D) */
2130 static const true_false_string ansi_map_originationtriggers_elevendig_bool_val  = {
2131     "Launch an OriginationRequest for any call attempt with 11 digits",
2132     "Trigger is not active"
2133 };
2134 /* 1 digit (octet 4, bit E) */
2135 static const true_false_string ansi_map_originationtriggers_twelvedig_bool_val  = {
2136     "Launch an OriginationRequest for any call attempt with 12 digits",
2137     "Trigger is not active"
2138 };
2139 /* 1 digit (octet 4, bit F) */
2140 static const true_false_string ansi_map_originationtriggers_thirteendig_bool_val  = {
2141     "Launch an OriginationRequest for any call attempt with 13 digits",
2142     "Trigger is not active"
2143 };
2144 /* 1 digit (octet 4, bit G) */
2145 static const true_false_string ansi_map_originationtriggers_fourteendig_bool_val  = {
2146     "Launch an OriginationRequest for any call attempt with 14 digits",
2147     "Trigger is not active"
2148 };
2149 /* 1 digit (octet 4, bit H) */
2150 static const true_false_string ansi_map_originationtriggers_fifteendig_bool_val  = {
2151     "Launch an OriginationRequest for any call attempt with 15 digits",
2152     "Trigger is not active"
2153 };
2154
2155 static void
2156 dissect_ansi_map_originationtriggers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2157
2158     int offset = 0;
2159     proto_tree *subtree;
2160
2161
2162     subtree = proto_item_add_subtree(actx->created_item, ett_originationtriggers);
2163
2164     /* Revertive Call (RvtC) (octet 1, bit H)*/
2165     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_rvtc, tvb, offset,     1, FALSE);
2166     /* Unrecognized Number (Unrec) (octet 1, bit G) */
2167     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_unrec, tvb, offset,    1, FALSE);
2168     /* World Zone (WZ) (octet 1, bit F) */
2169     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_wz, tvb, offset,       1, FALSE);
2170     /* International (Int'l ) (octet 1, bit E) */
2171     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_int, tvb, offset,      1, FALSE);
2172     /* Inter-LATA Toll (OLATA) (octet 1, bit D) */
2173     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_olata, tvb, offset,    1, FALSE);
2174     /* Intra-LATA Toll (ILATA) (octet 1, bit C) */
2175     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_ilata, tvb, offset,    1, FALSE);
2176     /* Local (octet 1, bit B) */
2177     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_local, tvb, offset,    1, FALSE);
2178     /* All Origination (All) (octet 1, bit A) */
2179     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_all, tvb, offset,      1, FALSE);
2180     offset++;
2181
2182     /*Prior Agreement (PA) (octet 2, bit E) */
2183     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_pa, tvb, offset,       1, FALSE);
2184     /* Double Pound (DP) (octet 2, bit D) */
2185     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_dp, tvb, offset,       1, FALSE);
2186     /* Pound (octet 2, bit C) */
2187     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_pound, tvb, offset,    1, FALSE);
2188     /* Double Star (DS) (octet 2, bit B) */
2189     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_ds, tvb, offset,       1, FALSE);
2190     /* Star (octet 2, bit A) */
2191     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_star, tvb, offset,     1, FALSE);
2192     offset++;
2193
2194     /* 7 digit (octet 3, bit H) */
2195     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_sevendig, tvb, offset, 1, FALSE);
2196     /* 6 digit (octet 3, bit G) */
2197     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_sixdig, tvb, offset,   1, FALSE);
2198     /* 5 digit (octet 3, bit F) */
2199     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fivedig, tvb, offset,  1, FALSE);
2200     /* 4 digit (octet 3, bit E) */
2201     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fourdig, tvb, offset,  1, FALSE);
2202     /* 3 digit (octet 3, bit D) */
2203     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_threedig, tvb, offset, 1, FALSE);
2204     /* 2 digit (octet 3, bit C) */
2205     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_twodig, tvb, offset,   1, FALSE);
2206     /* 1 digit (octet 3, bit B) */
2207     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_onedig, tvb, offset,   1, FALSE);
2208     /* No digits (octet 3, bit A) */
2209     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_nodig, tvb, offset,    1, FALSE);
2210     offset++;
2211
2212     /* 15 digit (octet 4, bit H) */
2213     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fifteendig, tvb, offset,       1, FALSE);
2214     /* 14 digit (octet 4, bit G) */
2215     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_fourteendig, tvb, offset,      1, FALSE);
2216     /* 13 digit (octet 4, bit F) */
2217     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_thirteendig, tvb, offset,      1, FALSE);
2218     /* 12 digit (octet 4, bit E) */
2219     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_twelvedig, tvb, offset,        1, FALSE);
2220     /* 11 digit (octet 4, bit D) */
2221     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_elevendig, tvb, offset,        1, FALSE);
2222     /* 10 digit (octet 4, bit C) */
2223     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_tendig, tvb, offset,   1, FALSE);
2224     /* 9 digit (octet 4, bit B) */
2225     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_ninedig, tvb, offset,  1, FALSE);
2226     /* 8 digits (octet 4, bit A) */
2227     proto_tree_add_item(subtree, hf_ansi_map_originationtriggers_eightdig, tvb, offset, 1, FALSE);
2228
2229 }
2230
2231 /* 6.5.2.91 PACAIndicator */
2232
2233 /* Permanent Activation (PA) (octet 1, bit A) */
2234 static const true_false_string ansi_map_pacaindicator_pa_bool_val  = {
2235     "PACA is permanently activated",
2236     "PACA is not permanently activated"
2237 };
2238
2239 static const value_string ansi_map_PACA_Level_vals[]  = {
2240     {   0, "Not used"},
2241     {   1, "Priority Level. 1 This is the highest level"},
2242     {   2, "Priority Level 2"},
2243     {   3, "Priority Level 3"},
2244     {   4, "Priority Level 4"},
2245     {   5, "Priority Level 5"},
2246     {   6, "Priority Level 6"},
2247     {   7, "Priority Level 7"},
2248     {   8, "Priority Level 8"},
2249     {   8, "Priority Level 9"},
2250     {   10, "Priority Level 10"},
2251     {   11, "Priority Level 11"},
2252     {   12, "Priority Level 12"},
2253     {   13, "Priority Level 13"},
2254     {   14, "Priority Level 14"},
2255     {   15, "Priority Level 15"},
2256     {   0, NULL }
2257 };
2258
2259 static void
2260 dissect_ansi_map_pacaindicator(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2261
2262     int offset = 0;
2263     proto_tree *subtree;
2264
2265
2266     subtree = proto_item_add_subtree(actx->created_item, ett_pacaindicator);
2267     /* PACA Level (octet 1, bits B-E) */
2268     proto_tree_add_item(subtree, hf_ansi_map_PACA_Level, tvb, offset,   1, FALSE);
2269     /* Permanent Activation (PA) (octet 1, bit A) */
2270     proto_tree_add_item(subtree, hf_ansi_map_pacaindicator_pa, tvb, offset,     1, FALSE);
2271 }
2272
2273 /* 6.5.2.92 PageIndicator */
2274 static const value_string ansi_map_PageIndicator_vals[]  = {
2275     {   0, "Not used"},
2276     {   1, "Page"},
2277     {   2, "Listen only"},
2278     {   0, NULL }
2279 };
2280
2281 /* 6.5.2.93 PC_SSN */
2282 static void
2283 dissect_ansi_map_pc_ssn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2284
2285     int offset = 0;
2286     proto_tree *subtree;
2287     guint8 b1,b2,b3,b4;
2288
2289
2290     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
2291     /* Type (octet 1) */
2292     proto_tree_add_item(subtree, hf_ansi_map_msc_type, tvb, offset, 1, FALSE);
2293     offset++;
2294     /* Point Code Member Number octet 2 */
2295     b1 = tvb_get_guint8(tvb,offset);
2296     offset++;
2297     /* Point Code Cluster Number octet 3 */
2298     b2 = tvb_get_guint8(tvb,offset);
2299     offset++;
2300     /* Point Code Network Number octet 4 */
2301     b3 = tvb_get_guint8(tvb,offset);
2302     offset++;
2303     /* Subsystem Number (SSN) octet 5 */
2304     b4 = tvb_get_guint8(tvb,offset);
2305     proto_tree_add_text(subtree, tvb, offset-3, 4 , "Point Code %u-%u-%u  SSN %u",
2306                         b3, b2, b1, b4);
2307
2308 }
2309 /* 6.5.2.94 PilotBillingID */
2310 static void
2311 dissect_ansi_map_pilotbillingid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2312
2313     int offset = 0;
2314     proto_tree *subtree;
2315
2316
2317     subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
2318     /* First Originating MarketID octet 1 and 2 */
2319     proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, FALSE);
2320     offset = offset + 2;
2321     /* First Originating Switch Number octet 3*/
2322     proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, FALSE);
2323     offset++;
2324     /* ID Number */
2325     proto_tree_add_item(subtree, hf_ansi_map_idno, tvb, offset, 3, FALSE);
2326     offset = offset + 3;
2327     proto_tree_add_item(subtree, hf_ansi_map_segcount, tvb, offset, 1, FALSE);
2328
2329 }
2330 /* 6.5.2.96 PreferredLanguageIndicator */
2331 static const value_string ansi_map_PreferredLanguageIndicator_vals[]  = {
2332     {   0, "Unspecified"},
2333     {   1, "English"},
2334     {   2, "French"},
2335     {   3, "Spanish"},
2336     {   4, "German"},
2337     {   5, "Portuguese"},
2338     {   0, NULL }
2339 };
2340
2341 /* 6.5.2.106 ReceivedSignalQuality */
2342 /* a. This octet is encoded the same as octet 1 in the SignalQuality parameter (see
2343    6.5.2.121).
2344 */
2345 /* 6.5.2.118 SetupResult */
2346 static const value_string ansi_map_SetupResult_vals[]  = {
2347     {   0, "Not used"},
2348     {   1, "Unsuccessful"},
2349     {   2, "Successful"},
2350     {   0, NULL }
2351 };
2352 /* 6.5.2.121 SignalQuality */
2353 /* TODO */
2354
2355 /*      6.5.2.122 SMS_AccessDeniedReason (TIA/EIA-41.5-D, page 5-256)
2356         N.S0011-0 v 1.0
2357 */
2358 static const value_string ansi_map_SMS_AccessDeniedReason_vals[]  = {
2359     {   0, "Not used"},
2360     {   1, "Denied"},
2361     {   2, "Postponed"},
2362     {   3, "Unavailable"},
2363     {   4, "Invalid"},
2364     {   0, NULL }
2365 };
2366
2367
2368 /* 6.5.2.125 SMS_CauseCode (TIA/EIA-41.5-D, page 5-262)
2369    N.S0011-0 v 1.0
2370 */
2371 static const value_string ansi_map_SMS_CauseCode_vals[]  = {
2372     {   0, "Address vacant"},
2373     {   1, "Address translation failure"},
2374     {   2, "Network resource shortage"},
2375     {   3, "Network failure"},
2376     {   4, "Invalid Teleservice ID"},
2377     {   5, "Other network problem"},
2378     {   6, "Unsupported network interface"},
2379     {   8, "CDMA handset-based position determination failure"},
2380     {   9, "CDMA handset-based position determination resources released - voice service request"},
2381     {   10, "CDMA handset-based position determination resources released - voice service request - message acknowledged"},
2382     {   11, "Reserved"},
2383     {   12, "Reserved"},
2384     {   13, "Reserved"},
2385     {   14, "Emergency Services Call Precedence"},
2386     {   32, "No page response"},
2387     {   33, "Destination busy"},
2388     {   34, "No acknowledgment"},
2389     {   35, "Destination resource shortage"},
2390     {   36, "SMS delivery postponed"},
2391     {   37, "Destination out of service"},
2392     {   38, "Destination no longer at this address"},
2393     {   39, "Other terminal problem"},
2394     {   64, "Radio interface resource shortage"},
2395     {   65, "Radio interface incompatibility"},
2396     {   66, "Other radio interface problem"},
2397     {   67, "Unsupported Base Station Capability"},
2398     {   96, "Encoding problem"},
2399     {   97, "Service origination denied"},
2400     {   98, "Service termination denied"},
2401     {   99, "Supplementary service not supported"},
2402     {   100, "Service not supported"},
2403     {   101, "Reserved"},
2404     {   102, "Missing expected parameter"},
2405     {   103, "Missing mandatory parameter"},
2406     {   104, "Unrecognized parameter value"},
2407     {   105, "Unexpected parameter value"},
2408     {   106, "User Data size error"},
2409     {   107, "Other general problems"},
2410     {   108, "Session not active"},
2411     {   109, "Reserved"},
2412     {   110, "MS Disconnect"},
2413     {   0, NULL }
2414 };
2415 static value_string_ext ansi_map_SMS_CauseCode_vals_ext = VALUE_STRING_EXT_INIT(ansi_map_SMS_CauseCode_vals);
2416
2417 /* 6.5.2.126 SMS_ChargeIndicator */
2418 /* SMS Charge Indicator (octet 1) */
2419 static const value_string ansi_map_SMS_ChargeIndicator_vals[]  = {
2420     {   0, "Not used"},
2421     {   1, "No charge"},
2422     {   2, "Charge original originator"},
2423     {   3, "Charge original destination"},
2424     {   0, NULL }
2425 };
2426 /*      4 through 63 Reserved. Treat the same as value 1, No charge.
2427         64 through 127 Reserved. Treat the same as value 2, Charge original originator.
2428         128 through 223 Reserved. Treat the same as value 3, Charge original destination.
2429         224 through 255 Reserved for TIA/EIA-41 protocol extension. If unknown, treat the same as value 2, Charge
2430         original originator.
2431 */
2432
2433 /* 6.5.2.130 SMS_NotificationIndicator N.S0005-0 v 1.0*/
2434 static const value_string ansi_map_SMS_NotificationIndicator_vals[]  = {
2435     {   0, "Not used"},
2436     {   1, "Notify when available"},
2437     {   2, "Do not notify when available"},
2438     {   0, NULL }
2439 };
2440
2441 /* 6.5.2.136 SMS_OriginationRestrictions */
2442 /* DEFAULT (octet 1, bits A and B) */
2443
2444 static const value_string ansi_map_SMS_OriginationRestrictions_default_vals[]  = {
2445     {   0, "Block all"},
2446     {   1, "Reserved"},
2447     {   1, "Allow specific"},
2448     {   1, "Allow all"},
2449     {   0, NULL }
2450 };
2451 /* DIRECT (octet 1, bit C) */
2452 static const true_false_string ansi_map_SMS_OriginationRestrictions_direct_bool_val  = {
2453     "Allow Direct",
2454     "Block Direct"
2455 };
2456
2457 /* Force Message Center (FMC) (octet 1, bit D) */
2458 static const true_false_string ansi_map_SMS_OriginationRestrictions_fmc_bool_val  = {
2459     "Force Indirect",
2460     "No effect"
2461 };
2462
2463 static void
2464 dissect_ansi_map_sms_originationrestrictions(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2465
2466     int offset = 0;
2467     proto_tree *subtree;
2468
2469
2470     subtree = proto_item_add_subtree(actx->created_item, ett_sms_originationrestrictions);
2471     proto_tree_add_item(subtree, hf_ansi_map_reservedBitHGFE, tvb, offset, 1, FALSE);
2472     proto_tree_add_item(subtree, hf_ansi_map_sms_originationrestrictions_fmc, tvb, offset, 1, FALSE);
2473     proto_tree_add_item(subtree, hf_ansi_map_sms_originationrestrictions_direct, tvb, offset, 1, FALSE);
2474     proto_tree_add_item(subtree, hf_ansi_map_sms_originationrestrictions_default, tvb, offset, 1, FALSE);
2475
2476 }
2477
2478 /* 6.5.2.137 SMS_TeleserviceIdentifier */
2479 /* Updated with N.S0011-0 v 1.0 */
2480
2481 /* SMS Teleservice Identifier (octets 1 and 2) */
2482 static const value_string ansi_map_SMS_TeleserviceIdentifier_vals[]  = {
2483     {     0, "Not used"},
2484     {     1, "Reserved for maintenance"},
2485     {     2, "SSD Update no response"},
2486     {     3, "SSD Update successful"},
2487     {     4, "SSD Update failed"},
2488     {  4096, "AMPS Extended Protocol Enhanced Services" },
2489     {  4097, "CDMA Cellular Paging Teleservice" },
2490     {  4098, "CDMA Cellular Messaging Teleservice" },
2491     {  4099, "CDMA Voice Mail Notification" },
2492     { 32513, "TDMA Cellular Messaging Teleservice" },
2493     { 32520, "TDMA System Assisted Mobile Positioning through Satellite (SAMPS)" },
2494     { 32584, "TDMA Segmented System Assisted Mobile Positioning Service" },
2495     {     0, NULL }
2496 };
2497 /* 6.5.2.140 SPINITriggers */
2498 /* All Origination (All) (octet 1, bit A) */
2499
2500 /* 6.5.2.142 SSDUpdateReport */
2501 static const value_string ansi_map_SSDUpdateReport_vals[]  = {
2502     {       0, "Not used"},
2503     {    4096, "AMPS Extended Protocol Enhanced Services"},
2504     {    4097, "CDMA Cellular Paging Teleservice"},
2505     {    4098, "CDMA Cellular Messaging Teleservice"},
2506     {   32513, "TDMA Cellular Messaging Teleservice"},
2507     {   32514, "TDMA Cellular Paging Teleservice (CPT-136)"},
2508     {   32515, "TDMA Over-the-Air Activation Teleservice (OATS)"},
2509     {   32516, "TDMA Over-the-Air Programming Teleservice (OPTS)"},
2510     {   32517, "TDMA General UDP Transport Service (GUTS)"},
2511     {   32576, "Reserved"},
2512     {   32577, "TDMA Segmented Cellular MessagingTeleservice"},
2513     {   32578, "TDMA Segmented Cellular Paging Teleservice"},
2514     {   32579, "TDMA Segmented Over-the-Air Activation Teleservice (OATS)"},
2515     {   32580, "TDMA Segmented Over-the-Air Programming Teleservice (OPTS)."},
2516     {   32581, "TDMA Segmented General UDP Transport Service (GUTS)"},
2517     {   32576, "Reserved"},
2518     {       0, NULL }
2519 };
2520
2521 /* 6.5.2.143 StationClassMark */
2522
2523 /* 6.5.2.144 SystemAccessData */
2524
2525 /* 6.5.2.146 SystemCapabilities */
2526 /* Updated in N.S0008-0 v 1.0 */
2527 static const true_false_string ansi_map_systemcapabilities_auth_bool_val  = {
2528     "Authentication parameters were requested on this system access (AUTH=1 in the OMT)",
2529     "Authentication parameters were not requested on this system access (AUTH=0 in the OMT)."
2530 };
2531
2532 static const true_false_string ansi_map_systemcapabilities_se_bool_val  = {
2533     "Signaling Message Encryption supported by the system",
2534     "Signaling Message Encryption not supported by the system"
2535 };
2536
2537 static const true_false_string ansi_map_systemcapabilities_vp_bool_val  = {
2538     "Voice Privacy supported by the system",
2539     "Voice Privacy not supported by the system"
2540 };
2541
2542 static const true_false_string ansi_map_systemcapabilities_cave_bool_val  = {
2543     "System can execute the CAVE algorithm and share SSD for the indicated MS",
2544     "System cannot execute the CAVE algorithm and cannot share SSD for the indicated MS"
2545 };
2546
2547 static const true_false_string ansi_map_systemcapabilities_ssd_bool_val  = {
2548     "SSD is shared with the system for the indicated MS",
2549     "SSD is not shared with the system for the indicated MS"
2550 };
2551
2552 static const true_false_string ansi_map_systemcapabilities_dp_bool_val  = {
2553     "DP is supported by the system",
2554     "DP is not supported by the system"
2555 };
2556
2557 static void
2558 dissect_ansi_map_systemcapabilities(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2559
2560     int offset = 0;
2561     proto_tree *subtree;
2562
2563
2564     subtree = proto_item_add_subtree(actx->created_item, ett_systemcapabilities);
2565     proto_tree_add_item(subtree, hf_ansi_map_reservedBitHG, tvb, offset, 1, FALSE);
2566     proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_dp, tvb, offset, 1, FALSE);
2567     proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_ssd, tvb, offset, 1, FALSE);
2568     proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_cave, tvb, offset, 1, FALSE);
2569     proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_vp, tvb, offset, 1, FALSE);
2570     proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_se, tvb, offset, 1, FALSE);
2571     proto_tree_add_item(subtree, hf_ansi_map_systemcapabilities_auth, tvb, offset, 1, FALSE);
2572 }
2573
2574 /* 6.5.2.151 TDMABurstIndicator */
2575 /* 6.5.2.152 TDMACallMode */
2576 /* 6.5.2.153 TDMAChannelData Updated in N.S0007-0 v 1.0*/
2577
2578 /* 6.5.2.155 TerminationAccessType */
2579 /* XXX Fix Me, Fill up the values or do special decoding? */
2580 static const value_string ansi_map_TerminationAccessType_vals[]  = {
2581     {   0, "Not used"},
2582     {   1, "Reserved for controlling system assignment (may be a trunk group identifier)."},
2583     /* 1 through  127 */
2584     { 127, "Reserved for controlling system assignment (may be a trunk group identifier)."},
2585     { 128, "Reserved for TIA/EIA-41 protocol extension. If unknown, treat the same as value 253, Land-to-Mobile Directory Number access"},
2586     /* 128 through  160 */
2587     { 160, "Reserved for TIA/EIA-41 protocol extension. If unknown, treat the same as value 253, Land-to-Mobile Directory Number access"},
2588     { 161, "Reserved for this Standard"},
2589     /* 161 through  251 */
2590     { 151, "Reserved for this Standard"},
2591     { 252, "Mobile-to-Mobile Directory Number access"},
2592     { 253, "Land-to-Mobile Directory Number access"},
2593     { 254, "Remote Feature Control port access"},
2594     { 255, "Roamer port access"},
2595     {   0, NULL }
2596 };
2597
2598 /* 6.5.2.158 TerminationTreatment */
2599 static const value_string ansi_map_TerminationTreatment_vals[]  = {
2600     {   0, "Not used"},
2601     {   1, "MS Termination"},
2602     {   2, "Voice Mail Storage"},
2603     {   3, "Voice Mail Retrieval"},
2604     {   4, "Dialogue Termination"},
2605     {   0, NULL }
2606 };
2607
2608 /* 6.5.2.159 TerminationTriggers */
2609 /* Busy (octet 1, bits A and B) */
2610 static const value_string ansi_map_terminationtriggers_busy_vals[]  = {
2611     {   0, "Busy Call"},
2612     {   1, "Busy Trigger"},
2613     {   2, "Busy Leg"},
2614     {   3, "Reserved. Treat as an unrecognized parameter value"},
2615     {   0, NULL }
2616 };
2617 /* Routing Failure (RF) (octet 1, bits C and D) */
2618 static const value_string ansi_map_terminationtriggers_rf_vals[]  = {
2619     {   0, "Failed Call"},
2620     {   1, "Routing Failure Trigger"},
2621     {   2, "Failed Leg"},
2622     {   3, "Reserved. Treat as an unrecognized parameter value"},
2623     {   0, NULL }
2624 };
2625 /* No Page Response (NPR) (octet 1, bits E and F) */
2626 static const value_string ansi_map_terminationtriggers_npr_vals[]  = {
2627     {   0, "No Page Response Call"},
2628     {   1, "No Page Response Trigger"},
2629     {   2, "No Page Response Leg"},
2630     {   3, "Reserved. Treat as an unrecognized parameter value"},
2631     {   0, NULL }
2632 };
2633 /* No Answer (NA) (octet 1, bits G and H) */
2634 static const value_string ansi_map_terminationtriggers_na_vals[]  = {
2635     {   0, "No Answer Call"},
2636     {   1, "No Answer Trigger"},
2637     {   2, "No Answer Leg"},
2638     {   3, "Reserved"},
2639     {   0, NULL }
2640 };
2641 /* None Reachable (NR) (octet 2, bit A) */
2642 static const value_string ansi_map_terminationtriggers_nr_vals[]  = {
2643     {   0, "Member Not Reachable"},
2644     {   1, "Group Not Reachable"},
2645     {   0, NULL }
2646 };
2647
2648 /* 6.5.2.159 TerminationTriggers N.S0005-0 v 1.0*/
2649 static void
2650 dissect_ansi_map_terminationtriggers(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2651
2652     int offset = 0;
2653     proto_tree *subtree;
2654
2655
2656     subtree = proto_item_add_subtree(actx->created_item, ett_transactioncapability);
2657
2658     proto_tree_add_item(subtree, hf_ansi_map_reservedBitH, tvb, offset, 1, FALSE);
2659     /* No Page Response (NPR) (octet 1, bits E and F) */
2660     proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_npr, tvb, offset, 1, FALSE);
2661     /* No Answer (NA) (octet 1, bits G and H) */
2662     proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_na, tvb, offset, 1, FALSE);
2663     /* Routing Failure (RF) (octet 1, bits C and D) */
2664     proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_rf, tvb, offset, 1, FALSE);
2665     /* Busy (octet 1, bits A and B) */
2666     proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_busy, tvb, offset, 1, FALSE);
2667     offset++;
2668
2669     /* None Reachable (NR) (octet 2, bit A) */
2670     proto_tree_add_item(subtree, hf_ansi_map_terminationtriggers_nr, tvb, offset, 1, FALSE);
2671 }
2672
2673 /* 6.5.2.160 TransactionCapability (TIA/EIA-41.5-D, page 5-315) */
2674 /* Updated with N.S0010-0 v 1.0, N.S0012-0 v 1.0 N.S0013-0 v 1.0 */
2675 static const true_false_string ansi_map_trans_cap_prof_bool_val  = {
2676     "The system is capable of supporting the IS-41-C profile parameters",
2677     "The system is not capable of supporting the IS-41-C profile parameters"
2678 };
2679
2680 static const true_false_string ansi_map_trans_cap_busy_bool_val  = {
2681     "The system is capable of detecting a busy condition at the current time",
2682     "The system is not capable of detecting a busy condition at the current time"
2683 };
2684
2685 static const true_false_string ansi_map_trans_cap_ann_bool_val  = {
2686     "The system is capable of honoring the AnnouncementList parameter at the current time",
2687     "The system is not capable of honoring the AnnouncementList parameter at the current time"
2688 };
2689
2690 static const true_false_string ansi_map_trans_cap_rui_bool_val  = {
2691     "The system is capable of interacting with the user",
2692     "The system is not capable of interacting with the user"
2693 };
2694
2695 static const true_false_string ansi_map_trans_cap_spini_bool_val  = {
2696     "The system is capable of supporting local SPINI operation",
2697     "The system is not capable of supporting local SPINI operation at the current time"
2698 };
2699
2700 static const true_false_string ansi_map_trans_cap_uzci_bool_val  = {
2701     "The system is User Zone capable at the current time",
2702     "The system is not User Zone capable at the current time"
2703 };
2704 static const true_false_string ansi_map_trans_cap_ndss_bool_val  = {
2705     "Serving system is NDSS capable",
2706     "Serving system is not NDSS capable"
2707 };
2708 static const true_false_string ansi_map_trans_cap_nami_bool_val  = {
2709     "The system is CNAP/CNAR capable",
2710     "The system is not CNAP/CNAR capable"
2711 };
2712
2713 static const value_string ansi_map_trans_cap_multerm_vals[]  = {
2714     {   0, "The system cannot accept a termination at this time (i.e., cannot accept routing information)"},
2715     {   1, "The system supports the number of call legs indicated"},
2716     {   2, "The system supports the number of call legs indicated"},
2717     {   3, "The system supports the number of call legs indicated"},
2718     {   4, "The system supports the number of call legs indicated"},
2719     {   5, "The system supports the number of call legs indicated"},
2720     {   6, "The system supports the number of call legs indicated"},
2721     {   7, "The system supports the number of call legs indicated"},
2722     {   8, "The system supports the number of call legs indicated"},
2723     {   9, "The system supports the number of call legs indicated"},
2724     {   10, "The system supports the number of call legs indicated"},
2725     {   11, "The system supports the number of call legs indicated"},
2726     {   12, "The system supports the number of call legs indicated"},
2727     {   13, "The system supports the number of call legs indicated"},
2728     {   14, "The system supports the number of call legs indicated"},
2729     {   15, "The system supports the number of call legs indicated"},
2730     {   0, NULL }
2731 };
2732
2733 static const true_false_string ansi_map_trans_cap_tl_bool_val  = {
2734     "The system is capable of supporting the TerminationList parameter at the current time",
2735     "The system is not capable of supporting the TerminationList parameter at the current time"
2736 };
2737
2738 static const true_false_string ansi_map_trans_cap_waddr_bool_val  = {
2739     "The system is capable of supporting the TriggerAddressList parameter",
2740     "The system is not capable of supporting the TriggerAddressList parameter"
2741 };
2742
2743
2744 static void
2745 dissect_ansi_map_transactioncapability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2746
2747     int offset = 0;
2748     proto_tree *subtree;
2749
2750
2751     subtree = proto_item_add_subtree(actx->created_item, ett_transactioncapability);
2752
2753     /*NAME Capability Indicator (NAMI) (octet 1, bit H) */
2754     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_nami, tvb, offset, 1, FALSE);
2755     /* NDSS Capability (NDSS) (octet 1, bit G) */
2756     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_ndss, tvb, offset, 1, FALSE);
2757     /* UZ Capability Indicator (UZCI) (octet 1, bit F) */
2758     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_uzci, tvb, offset, 1, FALSE);
2759     /* Subscriber PIN Intercept (SPINI) (octet 1, bit E) */
2760     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_spini, tvb, offset, 1, FALSE);
2761     /* Remote User Interaction (RUI) (octet 1, bit D) */
2762     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_rui, tvb, offset, 1, FALSE);
2763     /* Announcements (ANN) (octet 1, bit C) */
2764     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_ann, tvb, offset, 1, FALSE);
2765     /* Busy Detection (BUSY) (octet 1, bit B) */
2766     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_busy, tvb, offset, 1, FALSE);
2767     /* Profile (PROF) (octet 1, bit A) */
2768     proto_tree_add_item(subtree, hf_ansi_map_trans_cap_prof, tvb, offset, 1, FALSE);
2769     offset++;
2770
2771     /* WIN Addressing (WADDR) (octet 2, bit F) */
2772     proto_tree_add_item(subtree, hf_ansi_trans_cap_waddr, tvb, offset, 1, FALSE);
2773     /* TerminationList (TL) (octet 2, bit E) */
2774     proto_tree_add_item(subtree, hf_ansi_trans_cap_tl, tvb, offset, 1, FALSE);
2775     /* Multiple Terminations (octet 2, bits A-D) */
2776     proto_tree_add_item(subtree, hf_ansi_trans_cap_multerm, tvb, offset, 1, FALSE);
2777 }
2778
2779 /* 6.5.2.162 UniqueChallengeReport */
2780 /* Unique Challenge Report (octet 1) */
2781 static const value_string ansi_map_UniqueChallengeReport_vals[]  = {
2782     {   0, "Not used"},
2783     {   1, "Unique Challenge not attempted"},
2784     {   2, "Unique Challenge no response"},
2785     {   3, "Unique Challenge successful"},
2786     {   4, "Unique Challenge failed"},
2787     {   0, NULL }
2788 };
2789
2790 /* 6.5.2.166 VoicePrivacyMask */
2791
2792
2793 /* 6.5.2.e (TSB76) CDMAServiceConfigurationRecord N.S0008-0 v 1.0 */
2794 /* a. This field carries the CDMA Service Configuration Record. The bit-layout is the
2795    same as that of Service Configuration Record in TSB74, and J-STD-008.
2796 */
2797
2798 /* 6.5.2.f CDMAServiceOption N.S0010-0 v 1.0 */
2799
2800 /* values copied from old ANSI map dissector */
2801 static const range_string cdmaserviceoption_vals[] = {
2802     { 1, 1, "Basic Variable Rate Voice Service (8 kbps)" },
2803     { 2, 2, "Mobile Station Loopback (8 kbps)" },
2804     { 3, 3, "Enhanced Variable Rate Voice Service (8 kbps)" },
2805     { 4, 4, "Asynchronous Data Service (9.6 kbps)" },
2806     { 5, 5, "Group 3 Facsimile (9.6 kbps)" },
2807     { 6, 6, "Short Message Services (Rate Set 1)" },
2808     { 7, 7, "Packet Data Service: Internet or ISO Protocol Stack (9.6 kbps)" },
2809     { 8, 8, "Packet Data Service: CDPD Protocol Stack (9.6 kbps)" },
2810     { 9, 9, "Mobile Station Loopback (13 kbps)" },
2811     { 10, 10, "STU-III Transparent Service" },
2812     { 11, 11, "STU-III Non-Transparent Service" },
2813     { 12, 12, "Asynchronous Data Service (14.4 or 9.6 kbps)" },
2814     { 13, 13, "Group 3 Facsimile (14.4 or 9.6 kbps)" },
2815     { 14, 14, "Short Message Services (Rate Set 2)" },
2816     { 15, 15, "Packet Data Service: Internet or ISO Protocol Stack (14.4 kbps)" },
2817     { 16, 16, "Packet Data Service: CDPD Protocol Stack (14.4 kbps)" },
2818     { 17, 17, "High Rate Voice Service (13 kbps)" },
2819     { 18, 18, "Over-the-Air Parameter Administration (Rate Set 1)" },
2820     { 19, 19, "Over-the-Air Parameter Administration (Rate Set 2)" },
2821     { 20, 20, "Group 3 Analog Facsimile (Rate Set 1)" },
2822     { 21, 21, "Group 3 Analog Facsimile (Rate Set 2)" },
2823     { 22, 22, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS1 forward, RS1 reverse)" },
2824     { 23, 23, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS1 forward, RS2 reverse)" },
2825     { 24, 24, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS2 forward, RS1 reverse)" },
2826     { 25, 25, "High Speed Packet Data Service: Internet or ISO Protocol Stack (RS2 forward, RS2 reverse)" },
2827     { 26, 26, "High Speed Packet Data Service: CDPD Protocol Stack (RS1 forward, RS1 reverse)" },
2828     { 27, 27, "High Speed Packet Data Service: CDPD Protocol Stack (RS1 forward, RS2 reverse)" },
2829     { 28, 28, "High Speed Packet Data Service: CDPD Protocol Stack (RS2 forward, RS1 reverse)" },
2830     { 29, 29, "High Speed Packet Data Service: CDPD Protocol Stack (RS2 forward, RS2 reverse)" },
2831     { 30, 30, "Supplemental Channel Loopback Test for Rate Set 1" },
2832     { 31, 31, "Supplemental Channel Loopback Test for Rate Set 2" },
2833     { 32, 32, "Test Data Service Option (TDSO)" },
2834     { 33, 33, "cdma2000 High Speed Packet Data Service, Internet or ISO Protocol Stack" },
2835     { 34, 34, "cdma2000 High Speed Packet Data Service, CDPD Protocol Stack" },
2836     { 35, 35, "Location Services, Rate Set 1 (9.6 kbps)" },
2837     { 36, 36, "Location Services, Rate Set 2 (14.4 kbps)" },
2838     { 37, 37, "ISDN Interworking Service (64 kbps)" },
2839     { 38, 38, "GSM Voice" },
2840     { 39, 39, "GSM Circuit Data" },
2841     { 40, 40, "GSM Packet Data" },
2842     { 41, 41, "GSM Short Message Service" },
2843     { 42, 42, "None Reserved for MC-MAP standard service options" },
2844     { 54, 54, "Markov Service Option (MSO)" },
2845     { 55, 55, "Loopback Service Option (LSO)" },
2846     { 56, 56, "Selectable Mode Vocoder" },
2847     { 57, 57, "32 kbps Circuit Video Conferencing" },
2848     { 58, 58, "64 kbps Circuit Video Conferencing" },
2849     { 59, 59, "HRPD Accounting Records Identifier" },
2850     { 60, 60, "Link Layer Assisted Robust Header Compression (LLA ROHC) - Header Removal" },
2851     { 61, 61, "Link Layer Assisted Robust Header Compression (LLA ROHC) - Header Compression" },
2852     { 62, 62, "Source-Controlled Variable-Rate Multimode Wideband Speech Codec (VMR-WB) Rate Set 2" },
2853     { 63, 63, "Source-Controlled Variable-Rate Multimode Wideband Speech Codec (VMR-WB) Rate Set 1" },
2854     { 64, 64, "HRPD auxiliary Packet Data Service instance" },
2855     { 65, 65, "cdma2000/GPRS Inter-working" },
2856     { 66, 66, "cdma2000 High Speed Packet Data Service, Internet or ISO Protocol Stack" },
2857     { 67, 67, "HRPD Packet Data IP Service where Higher Layer Protocol is IP or ROHC" },
2858     { 68, 68, "Enhanced Variable Rate Voice Service (EVRC-B)" },
2859     { 69, 69, "HRPD Packet Data Service, which when used in paging over the 1x air interface, a page response is required" },
2860     { 70, 70, "Enhanced Variable Rate Voice Service (EVRC-WB)" },
2861     { 71, 4099, "None Reserved for standard service options" },
2862     { 4100, 4100, "Asynchronous Data Service, Revision 1 (9.6 or 14.4 kbps)" },
2863     { 4101, 4101, "Group 3 Facsimile, Revision 1 (9.6 or 14.4 kbps)" },
2864     { 4102, 4102, "Reserved for standard service option" },
2865     { 4103, 4103, "Packet Data Service: Internet or ISO Protocol Stack, Revision 1 (9.6 or 14.4 kbps)" },
2866     { 4104, 4104, "Packet Data Service: CDPD Protocol Stack, Revision 1 (9.6 or 14.4 kbps)" },
2867     { 4105, 32767, "Reserved for standard service options" },
2868     { 32768, 32768, "QCELP (13 kbps)" },
2869     { 32769, 32771, "Proprietary QUALCOMM Incorporated" },
2870     { 32772, 32775, "Proprietary OKI Telecom" },
2871     { 32776, 32779, "Proprietary Lucent Technologies" },
2872     { 32780, 32783, "Nokia" },
2873     { 32784, 32787, "NORTEL NETWORKS" },
2874     { 32788, 32791, "Sony Electronics Inc" },
2875     { 32792, 32795, "Motorola" },
2876     { 32796, 32799, "QUALCOMM Incorporated" },
2877     { 32800, 32803, "QUALCOMM Incorporated" },
2878     { 32804, 32807, "QUALCOMM Incorporated" },
2879     { 32808, 32811, "QUALCOMM Incorporated" },
2880     { 32812, 32815, "Lucent Technologies" },
2881     { 32816, 32819, "Denso International" },
2882     { 32820, 32823, "Motorola" },
2883     { 32824, 32827, "Denso International" },
2884     { 32828, 32831, "Denso International" },
2885     { 32832, 32835, "Denso International" },
2886     { 32836, 32839, "NEC America" },
2887     { 32840, 32843, "Samsung Electronics" },
2888     { 32844, 32847, "Texas Instruments Incorporated" },
2889     { 32848, 32851, "Toshiba Corporation" },
2890     { 32852, 32855, "LG Electronics Inc." },
2891     { 32856, 32859, "VIA Telecom Inc." },
2892     { 0,           0,          NULL                   }
2893 };
2894
2895 static void
2896 dissect_ansi_map_cdmaserviceoption(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
2897     int offset = 0;
2898     proto_tree *subtree;
2899
2900
2901     subtree = proto_item_add_subtree(actx->created_item, ett_cdmaserviceoption);
2902
2903     proto_tree_add_item(subtree, hf_ansi_map_cdmaserviceoption, tvb, offset, 2, FALSE);
2904
2905
2906 }
2907 /* 6.5.2.f (TSB76) CDMAServiceOption N.S0008-0 v 1.0*/
2908 /* This field carries the CDMA Service Option. The bit-layout is the same as that of
2909    Service Option in TSB74 and J-STD-008.*/
2910
2911 /* 6.5.2.i (IS-730) TDMAServiceCode N.S0008-0 v 1.0 */
2912 static const value_string ansi_map_TDMAServiceCode_vals[]  = {
2913     {   0, "Analog Speech Only"},
2914     {   1, "Digital Speech Only"},
2915     {   2, "Analog or Digital Speech, Analog Preferred"},
2916     {   3, "Analog or Digital Speech, Digital Preferred"},
2917     {   4, "Asynchronous Data"},
2918     {   5, "G3 Fax"},
2919     {   6, "Not Used (Service Rejected)"},
2920     {   7, "STU-III"},
2921     {   0, NULL }
2922 };
2923 /* 6.5.2.j (IS-730) TDMATerminalCapability N.S0008-0 v 1.0 Updted with N.S0015-0 */
2924 /* Supported Frequency Band (octet 1) */
2925 /* Voice Coder (octet 2) */
2926 /* Protocol Version (octet 3) N.S0015-0 */
2927 static const value_string ansi_map_TDMATerminalCapability_prot_ver_vals[]  = {
2928     {   0, "EIA-553 or IS-54-A"},
2929     {   1, "TIA/EIA-627.(IS-54-B)"},
2930     {   2, "IS-136"},
2931     {   3, "Permanently Reserved (ANSI J-STD-011).Treat the same as value 4, IS-136-A."},
2932     {   4, "PV 0 as published in TIA/EIA-136-0 and IS-136-A."},
2933     {   5, "PV 1 as published in TIA/EIA-136-A."},
2934     {   6, "PV 2 as published in TIA/EIA-136-A."},
2935     {   7, "PV 3 as published in TIA/EIA-136-A."},
2936     {   0, NULL }
2937 };
2938 /* Asynchronous Data (ADS) (octet 4, bit A) N.S0007-0*/
2939 /* Group 3 Fax (G3FAX) (octet 4, bit B) */
2940 /* Secure Telephone Unit III (STU3) (octet 4, bit C) */
2941 /* Analog Voice (AVOX) (octet 4, bit D) */
2942 /* Half Rate (HRATE) (octet 4, bit E) */
2943 /* Full Rate (FRATE) (octet 4, bit F) */
2944 /* Double Rate (2RATE) (octet 4, bit G) */
2945 /* Triple Rate (3RATE) (octet 4, bit H) */
2946
2947
2948 /* 6.5.2.k (IS-730)) TDMAVoiceCoder N.S0008-0 v 1.0, N.S0007-0 */
2949 /* VoiceCoder (octet 1) */
2950
2951 /* 6.5.2.p UserZoneData N.S0015-0 */
2952
2953 /* 6.5.2.aa BaseStationManufacturerCode N.S0007-0 v 1.0 */
2954 /* The BaseStationManufacturerCode (BSMC) parameter specifies the manufacturer of the
2955    base station that is currently serving the MS (see IS-136 for enumeration of values).*/
2956
2957 /* 6.5.2.ab BSMCStatus */
2958
2959 /* BSMC Status (octet 1) */
2960 static const value_string ansi_map_BSMCStatus_vals[]  = {
2961     {   0, "Same BSMC Value shall not be supported"},
2962     {   1, "Same BSMC Value shall be supported"},
2963     {   0, NULL }
2964 };
2965
2966 /*- 6.5.2.ac ControlChannelMode (N.S0007-0 v 1.0)*/
2967 static const value_string ansi_map_ControlChannelMode_vals[]  = {
2968     {   0, "Unknown"},
2969     {   1, "MS is in Analog CC Mode"},
2970     {   2, "MS is in Digital CC Mode"},
2971     {   3, "MS is in NAMPS CC Mode"},
2972     {   0, NULL }
2973 };
2974
2975 /* 6.5.2.ad NonPublicData N.S0007-0 v 1.0*/
2976 /* NP Only Service (NPOS) (octet 1, bits A and B) */
2977 /* Charging Area Tone Service (CATS) (octet 1, bits C - F) */
2978 /* PSID/RSID Download Order (PRDO) (octet 1, bits G and H) */
2979
2980 /* 6.5.2.ae PagingFrameClass N.S0007-0 v 1.0*/
2981 /* Paging Frame Class (octet 1) */
2982
2983 static const value_string ansi_map_PagingFrameClass_vals[]  = {
2984     {   0, "PagingFrameClass 1 (1.28 seconds)"},
2985     {   1, "PagingFrameClass 2 (2.56 seconds)"},
2986     {   2, "PagingFrameClass 3 (3.84 seconds)"},
2987     {   3, "PagingFrameClass 4 (7.68 seconds)"},
2988     {   4, "PagingFrameClass 5 (15.36 seconds)"},
2989     {   5, "PagingFrameClass 6 (30.72 seconds)"},
2990     {   6, "PagingFrameClass 7 (61.44 seconds)"},
2991     {   7, "PagingFrameClass 8 (122.88 seconds)"},
2992     {   8, "Reserved. Treat the same as value 0, PagingFrameClass 1"},
2993     {   0, NULL }
2994 };
2995
2996 /* 6.5.2.af PSID_RSIDInformation N.S0007-0 v 1.0*/
2997 /* PSID/RSID Indicator (octet 1, bit A) */
2998 /* PSID/RSID Type (octet 1, bits B-D) */
2999
3000 /* 6.5.2.ah ServicesResult N.S0007-0 v 1.0*/
3001 /* PSID/RSID Download Result (PRDR) (octet 1, bits A and B) */
3002 static const value_string ansi_map_ServicesResult_ppr_vals[]  = {
3003     {   0, "No Indication"},
3004     {   1, "Unsuccessful PSID/RSID download"},
3005     {   2, "Successful PSID/RSID download"},
3006     {   3, "Reserved. Treat the same as value 0, No Indication"},
3007     {   0, NULL }
3008 };
3009
3010 /* 6.5.2.ai SOCStatus N.S0007-0 v 1.0*/
3011
3012 /* SOC Status (octet 1) */
3013 static const value_string ansi_map_SOCStatus_vals[]  = {
3014     {   0, "Same SOC Value shall not be supported"},
3015     {   1, "Same SOC Value shall be supported"},
3016     {   0, NULL }
3017 };
3018
3019 /* 6.5.2.aj SystemOperatorCode N.S0007-0 v 1.0*/
3020 /* The SystemOperatorCode (SOC) parameter specifies the system operator that is currently
3021    providing service to a MS (see IS-136 for enumeration of values) */
3022
3023 /* 6.5.2.al UserGroup N.S0007-0 v 1.0*/
3024
3025 /* 6.5.2.am UserZoneData N.S0007-0 v 1.0*/
3026
3027
3028 /*Table 6.5.2.ay TDMABandwidth value N.S0008-0 v 1.0 */
3029 static const value_string ansi_map_TDMABandwidth_vals[]  = {
3030     {   0, "Half-Rate Digital Traffic Channel Only"},
3031     {   1, "Full-Rate Digital Traffic Channel Only"},
3032     {   2, "Half-Rate or Full-rate Digital Traffic Channel - Full-Rate Preferred"},
3033     {   3, "Half-rate or Full-rate Digital Traffic Channel - Half-rate Preferred"},
3034     {   4, "Double Full-Rate Digital Traffic Channel Only"},
3035     {   5, "Triple Full-Rate Digital Traffic Channel Only"},
3036     {   6, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3037     {   7, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3038     {   8, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3039     {   9, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3040     {   10, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3041     {   11, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3042     {   12, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3043     {   13, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3044     {   14, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3045     {   15, "Reserved. Treat reserved values the same as value 1 - Full-Rate Digital Traffic Channel Only"},
3046     {   0, NULL }
3047
3048 };
3049
3050 /* 6.5.2.az TDMADataFeaturesIndicator N.S0008-0 v 1.0 */
3051 /* TDMADataFeaturesIndicator
3052    ansi_map_FeatureActivity_vals
3053
3054    ADS FeatureActivity ADS-FA ( octet 1 bit A and B )
3055    G3 Fax FeatureActivity G3FAX-FA ( octet 1 bit C and D )
3056    STU-III FeatureActivity STUIII-FA ( octet 1 bit E and F )
3057    Half Rate data FeatureActivity HRATE-FA ( octet 2 bit A and B )
3058    Full Rate data FeatureActivity FRATE-FA ( octet 2 bit C and D )
3059    Double Rate data FeatureActivity 2RATE-FA ( octet 2 bit E and F )
3060    Triple Rate data FeatureActivity 3RATE-FA ( octet g bit G and H )
3061
3062    Table 6.5.2.azt TDMADataFeaturesIndicator value
3063    static const value_string ansi_map_TDMADataFeaturesIndicator_vals[]  = {
3064    {   0, "Not Used"},
3065    {   1, "Not Authorized"},
3066    {   2, "Authorized, but de-activated"},
3067    {   3, "Authorized and activated"},
3068    {   0, NULL }
3069
3070    };
3071 */
3072
3073 /* 6.5.2.ba TDMADataMode N.S0008-0 v 1.0*/
3074
3075 /* 6.5.2.bb TDMAVoiceMode */
3076
3077 /* 6.5.2.bb CDMAConnectionReference N.S0008-0 v 1.0 */
3078 /* Service Option Connection Reference Octet 1 */
3079 /*      a. This field carries the CDMA Service Option Connection Reference. The bitlayout
3080         is the same as that of Service Option Connection Reference in TSB74 and
3081         J-STD-008.
3082 */
3083
3084 /* 6.5.2.ad CDMAState N.S0008-0 v 1.0 */
3085 /* Service Option State Octet 1 */
3086 /* a. This field carries the CDMA Service Option State information. The CDMA
3087    Service Option State is defined in the current CDMA Service Options standard.
3088    If CDMA Service Option State is not explicitly defined within a section of the
3089    relevant CDMA Service Option standard, the CDMA Service Option State shall
3090    carry the value of the ORD_Q octet of all current Service Option Control Orders
3091    (see IS-95), or the contents of all current CDMA Service Option Control
3092    Messages (see TSB74) type specific field for this connection reference. */
3093
3094 /* 6.5.2.aj SecondInterMSCCircuitID */
3095 /* -- XXX Same code as ISLPinformation???
3096    dissect_ansi_map_secondintermsccircuitid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree){
3097
3098    int offset = 0;
3099
3100    proto_tree *subtree;
3101
3102
3103    subtree = proto_item_add_subtree(actx->created_item, ett_billingid);
3104    / Trunk Group Number (G) Octet 1 /
3105    proto_tree_add_item(subtree, hf_ansi_map_tgn, tvb, offset, 1, FALSE);
3106    offset++;
3107    / Trunk Member Number (M) Octet2 /
3108    proto_tree_add_item(subtree, hf_ansi_map_tmn, tvb, offset, 1, FALSE);
3109    }
3110 */
3111 /* 6.5.2.as ChangeServiceAttributes N.S0008-0 v 1.0 */
3112 /* Change Facilities Flag (CHGFAC)(octet 1, bits A - B) */
3113 static const value_string ansi_map_ChangeServiceAttributes_chgfac_vals[]  = {
3114     {   0, "Change Facilities Operation Requested"},
3115     {   1, "Change Facilities Operation Not Requested"},
3116     {   2, "Change Facilities Operation Used"},
3117     {   3, "Change Facilities Operation Not Used"},
3118     {   0, NULL }
3119 };
3120 /* Service Negotiate Flag (SRVNEG)(octet 1, bits C - D) */
3121 static const value_string ansi_map_ChangeServiceAttributes_srvneg_vals[]  = {
3122     {   0, "Service Negotiation Used"},
3123     {   1, "Service Negotiation Not Used"},
3124     {   2, "Service Negotiation Required"},
3125     {   3, "Service Negotiation Not Required"},
3126     {   0, NULL }
3127 };
3128 /* 6.5.2.au DataPrivacyParameters N.S0008-0 v 1.0*/
3129 /* Privacy Mode (PM) (octet 1, Bits A and B) */
3130 static const value_string ansi_map_DataPrivacyParameters_pm_vals[]  = {
3131     {   0, "Privacy inactive or not supported"},
3132     {   1, "Privacy Requested or Acknowledged"},
3133     {   2, "Reserved. Treat reserved values the same as value 0, Privacy inactive or not supported."},
3134     {   3, "Reserved. Treat reserved values the same as value 0, Privacy inactive or not supported."},
3135     {   0, NULL }
3136 };
3137 /* Data Privacy Version (PM) (octet 2) */
3138 static const value_string ansi_map_DataPrivacyParameters_data_priv_ver_vals[]  = {
3139     {   0, "Not used"},
3140     {   1, "Data Privacy Version 1"},
3141     {   0, NULL }
3142 };
3143
3144 /* 6.5.2.av ISLPInformation N.S0008-0 v 1.0*/
3145 /* ISLP Type (octet 1) */
3146 static const value_string ansi_map_islp_type_vals[]  = {
3147     {   0, "No ISLP supported"},
3148     {   1, "ISLP supported"},
3149     {   0, NULL }
3150 };
3151 /* 6.5.2.bc AnalogRedirectInfo */
3152 /* Sys Ordering (octet 1, bits A-E) */
3153 /* Ignore CDMA (IC) (octet 1, bit F) */
3154
3155 /* 6.5.2.be CDMAChannelNumber N.S0010-0 v 1.0*/
3156
3157 /* 6.5.2.bg CDMAPowerCombinedIndicator N.S0010-0 v 1.0*/
3158
3159 /* 6.5.2.bi CDMASearchParameters N.S0010-0 v 1.0*/
3160
3161 /* 6.5.2.bk CDMANetworkIdentification N.S0010-0 v 1.0*/
3162 /* See CDMA [J-STD-008] for encoding of this field. */
3163
3164 /* 6.5.2.bo RequiredParametersMask N.S0010-0 v 1.0 */
3165
3166 /* 6.5.2.bp ServiceRedirectionCause */
3167 static const value_string ansi_map_ServiceRedirectionCause_type_vals[]  = {
3168     {   0, "Not used"},
3169     {   1, "NormalRegistration"},
3170     {   2, "SystemNotFound."},
3171     {   3, "ProtocolMismatch."},
3172     {   4, "RegistrationRejection."},
3173     {   5, "WrongSID."},
3174     {   6, "WrongNID.."},
3175     {   0, NULL }
3176 };
3177
3178 /* 6.5.2.bq ServiceRedirectionInfo  N.S0010-0 v 1.0 */
3179
3180 /* 6.5.2.br RoamingIndication N.S0010-0 v 1.0*/
3181 /* See CDMA [TSB58] for the definition of this field. */
3182
3183 /* 6.5.2.bw CallingPartyName N.S0012-0 v 1.0*/
3184
3185 /* Presentation Status (octet 1, bits A and B) */
3186 static const value_string ansi_map_Presentation_Status_vals[]  = {
3187     {   0, "Presentation allowed"},
3188     {   1, "Presentation restricted"},
3189     {   2, "Blocking toggle"},
3190     {   3, "No indication"},
3191     {   0, NULL }
3192 };
3193 /* Availability (octet 1, bit E) N.S0012-0 v 1.0*/
3194 static const true_false_string ansi_map_Availability_bool_val  = {
3195     "Name not available",
3196     "Name available/unknown"
3197 };
3198 static void
3199 dissect_ansi_map_callingpartyname(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
3200
3201     proto_tree *subtree;
3202
3203     subtree = proto_item_add_subtree(actx->created_item, ett_callingpartyname);
3204     /* Availability (octet 1, bit E) N.S0012-0 v 1.0*/
3205
3206     /* Presentation Status (octet 1, bits A and B) */
3207
3208
3209
3210 }
3211
3212
3213 /* 6.5.2.bx DisplayText N.S0012-0 v 1.0*/
3214 /* a. Refer to ANSI T1.610 for field encoding. */
3215
3216 /* 6.5.2.bz ServiceID
3217    Service Identifier (octets 1 to n)
3218    0 Not used.
3219    1 Calling Name Presentation - No RND.
3220    2 Calling Name Presentation with RND.
3221 */
3222
3223 /* 6.5.2.co GlobalTitle N.S0013-0 v 1.0
3224  * Refer to Section 3 of ANSI T1.112 for the encoding of this field.
3225  */
3226 /* Address Indicator octet 1 */
3227 /* Global Title Octet 2 - n */
3228
3229
3230 /* 6.5.2.dc SpecializedResource N.S0013-0 v 1.0*/
3231 /* Resource Type (octet 1) */
3232 static const value_string ansi_map_resource_type_vals[]  = {
3233     {   0, "Not used"},
3234     {   1, "DTMF tone detector"},
3235     {   2, "Automatic Speech Recognition - Speaker Independent - Digits"},
3236     {   3, "Automatic Speech Recognition - Speaker Independent - Speech User Interface Version 1"},
3237     {   0, NULL }
3238 };
3239 /* 6.5.2.df TriggerCapability */
3240 /* Updated with N.S0004 N.S0013-0 v 1.0*/
3241
3242 static const true_false_string ansi_map_triggercapability_bool_val  = {
3243     "triggers can be armed by the TriggerAddressList parameter",
3244     "triggers cannot be armed by the TriggerAddressList parameter"
3245 };
3246
3247 static void
3248 dissect_ansi_map_triggercapability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
3249
3250     int offset = 0;
3251     proto_tree *subtree;
3252
3253
3254     subtree = proto_item_add_subtree(actx->created_item, ett_triggercapability);
3255
3256
3257     /* O_No_Answer (ONA) (octet 1, bit H)*/
3258     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_ona, tvb, offset,        1, FALSE);
3259     /* O_Disconnect (ODISC) (octet 1, bit G)*/
3260     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_odisc, tvb, offset,      1, FALSE);
3261     /* O_Answer (OANS) (octet 1, bit F)*/
3262     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_oans, tvb, offset,       1, FALSE);
3263     /* Origination_Attempt_Authorized (OAA) (octet 1, bit E)*/
3264     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_oaa, tvb, offset,        1, FALSE);
3265     /* Revertive_Call (RvtC) (octet 1, bit D)*/
3266     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_rvtc, tvb, offset,       1, FALSE);
3267     /* All_Calls (All) (octet 1, bit C)*/
3268     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_all, tvb, offset,        1, FALSE);
3269     /* K-digit (K-digit) (octet 1, bit B)*/
3270     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_kdigit, tvb, offset,     1, FALSE);
3271     /* Introducing Star/Pound (INIT) (octet 1, bit A) */
3272     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_init, tvb, offset,       1, FALSE);
3273     offset++;
3274
3275
3276     /* O_Called_Party_Busy (OBSY) (octet 2, bit H)*/
3277     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_obsy, tvb, offset,       1, FALSE);
3278     /* Called_Routing_Address_Available (CdRAA) (octet 2, bit G)*/
3279     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_cdraa, tvb, offset,      1, FALSE);
3280     /* Initial_Termination (IT) (octet 2, bit F)*/
3281     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_it, tvb, offset,         1, FALSE);
3282     /* Calling_Routing_Address_Available (CgRAA)*/
3283     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_cgraa, tvb, offset,      1, FALSE);
3284     /* Advanced_Termination (AT) (octet 2, bit D)*/
3285     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_at, tvb, offset,         1, FALSE);
3286     /* Prior_Agreement (PA) (octet 2, bit C)*/
3287     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_pa, tvb, offset,         1, FALSE);
3288     /* Unrecognized_Number (Unrec) (octet 2, bit B)*/
3289     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_unrec, tvb, offset,      1, FALSE);
3290     /* Call Types (CT) (octet 2, bit A)*/
3291     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_ct, tvb, offset,         1, FALSE);
3292     offset++;
3293     /* */
3294     /* */
3295     /* */
3296     /* T_Disconnect (TDISC) (octet 3, bit E)*/
3297     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tdisc, tvb, offset,      1, FALSE);
3298     /* T_Answer (TANS) (octet 3, bit D)*/
3299     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tans, tvb, offset,       1, FALSE);
3300     /* T_No_Answer (TNA) (octet 3, bit C)*/
3301     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tna, tvb, offset,        1, FALSE);
3302     /* T_Busy (TBusy) (octet 3, bit B)*/
3303     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tbusy, tvb, offset,      1, FALSE);
3304     /* Terminating_Resource_Available (TRA) (octet 3, bit A) */
3305     proto_tree_add_item(subtree, hf_ansi_map_triggercapability_tra, tvb, offset,        1, FALSE);
3306
3307 }
3308 /* 6.5.2.ei DMH_ServiceID N.S0018 */
3309
3310 /* 6.5.2.dj WINOperationsCapability */
3311 /* Updated with N.S0004 */
3312 /* ConnectResource (CONN) (octet 1, bit A) */
3313 static const true_false_string ansi_map_winoperationscapability_conn_bool_val  = {
3314     "Sender is capable of supporting the ConnectResource, DisconnectResource, ConnectionFailureReport and ResetTimer (SSFT timer) operations",
3315     "Sender is not capable of supporting the ConnectResource, DisconnectResource,ConnectionFailureReport and ResetTimer (SSFT timer) operations"
3316 };
3317
3318 /* CallControlDirective (CCDIR) (octet 1, bit B) */
3319 static const true_false_string ansi_map_winoperationscapability_ccdir_bool_val  = {
3320     "Sender is capable of supporting the CallControlDirective operation",
3321     "Sender is not capable of supporting the CallControlDirective operation"
3322 };
3323
3324 /* PositionRequest (POS) (octet 1, bit C) */
3325 static const true_false_string ansi_map_winoperationscapability_pos_bool_val  = {
3326     "Sender is capable of supporting the PositionRequest operation",
3327     "Sender is not capable of supporting the PositionRequest operation"
3328 };
3329 static void
3330 dissect_ansi_map_winoperationscapability(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
3331
3332     int offset = 0;
3333     proto_tree *subtree;
3334
3335     subtree = proto_item_add_subtree(actx->created_item, ett_winoperationscapability);
3336
3337     /* PositionRequest (POS) (octet 1, bit C) */
3338     proto_tree_add_item(subtree, hf_ansi_map_winoperationscapability_pos, tvb, offset,  1, FALSE);
3339     /* CallControlDirective (CCDIR) (octet 1, bit B) */
3340     proto_tree_add_item(subtree, hf_ansi_map_winoperationscapability_ccdir, tvb, offset,        1, FALSE);
3341     /* ConnectResource (CONN) (octet 1, bit A) */
3342     proto_tree_add_item(subtree, hf_ansi_map_winoperationscapability_conn, tvb, offset, 1, FALSE);
3343
3344 }
3345 /*
3346  * 6.5.2.dk N.S0013-0 v 1.0,X.S0004-550-E v1.0 2.301
3347  * Code to be found after include functions.
3348  */
3349
3350 /* 6.5.2.ei TIA/EIA-41.5-D Modifications N.S0018Re */
3351 /* Octet 1,2 1st MarketID */
3352 /* Octet 3 1st MarketSegmentID */
3353 /* Octet 4,5 1st DMH_ServiceID value */
3354 /* Second marcet ID etc */
3355 /* 6.5.2.ek ControlNetworkID N.S0018*/
3356 static void
3357 dissect_ansi_map_controlnetworkid(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
3358
3359     int offset = 0;
3360     proto_tree *subtree;
3361
3362
3363     subtree = proto_item_add_subtree(actx->created_item, ett_controlnetworkid);
3364     /* MarketID octet 1 and 2 */
3365     proto_tree_add_item(subtree, hf_ansi_map_MarketID, tvb, offset, 2, FALSE);
3366     offset = offset + 2;
3367     /* Switch Number octet 3*/
3368     proto_tree_add_item(subtree, hf_ansi_map_swno, tvb, offset, 1, FALSE);
3369     offset++;
3370 }
3371
3372
3373 /* 6.5.2.dk WIN_TriggerList N.S0013-0 v 1.0 */
3374
3375 /* 6.5.2.ec DisplayText2 Updated in N.S0015-0*/
3376
3377 /* 6.5.2.eq MSStatus N.S0004 */
3378
3379 /* 6.5.2.er PositionInformationCode N.S0004 */
3380
3381 /* 6.5.2.fd InterMessageTime N.S0015-0*/
3382 /* Timer value (in 10s of seconds) octet 1 */
3383
3384 /* 6.5.2.fe MSIDUsage N.S0015-0 */
3385 /* M and I Report (octet 1, bits A and B) */
3386 static const value_string ansi_MSIDUsage_m_or_i_vals[]  = {
3387     {   0, "Not used"},
3388     {   1, "MIN last used"},
3389     {   2, "IMSI last used"},
3390     {   3, "Reserved"},
3391     {   0, NULL }
3392 };
3393
3394 /* 6.5.2.ff NewMINExtension N.S0015-0 */
3395
3396 /* 6.5.2.fv ACGEncountered N.S0023-0 v 1.0 */
3397 /* ACG Encountered (octet 1, bits A-F) */
3398 static const value_string ansi_ACGEncountered_vals[]  = {
3399     {   0, "PC_SSN"},
3400     {   1, "1-digit control"},
3401     {   2, "2-digit control"},
3402     {   3, "3-digit control"},
3403     {   4, "4-digit control"},
3404     {   5, "5-digit control"},
3405     {   6, "6-digit control"},
3406     {   7, "7-digit control"},
3407     {   8, "8-digit control"},
3408     {   9, "9-digit control"},
3409     {   10, "10-digit control"},
3410     {   11, "11-digit control"},
3411     {   12, "12-digit control"},
3412     {   13, "13-digit control"},
3413     {   14, "14-digit control"},
3414     {   15, "15-digit control"},
3415     {   0, NULL }
3416 };
3417 /* Control Type (octet 1, bits G-H) */
3418 static const value_string ansi_ACGEncountered_cntrl_type_vals[]  = {
3419     {   0, "Not used."},
3420     {   1, "Service Management System Initiated control encountered"},
3421     {   2, "SCF Overload control encountered"},
3422     {   3, "Reserved. Treat the same as value 0, Not used."},
3423     {   0, NULL }
3424 };
3425
3426 /* 6.5.2.fw ControlType N.S0023-0 v 1.0 */
3427
3428
3429
3430 /* 6.5.2.ge QoSPriority N.S0029-0 v1.0*/
3431 /* 6.5.2.xx QOSPriority */
3432 /* Non-Assured Priority (octet 1, bits A-D) */
3433 static const value_string ansi_map_Priority_vals[]  = {
3434     {   0, "Priority Level 0. This is the lowest level"},
3435     {   1, "Priority Level 1"},
3436     {   2, "Priority Level 2"},
3437     {   3, "Priority Level 3"},
3438     {   4, "Priority Level 4"},
3439     {   5, "Priority Level 5"},
3440     {   6, "Priority Level 6"},
3441     {   7, "Priority Level 7"},
3442     {   8, "Priority Level 8"},
3443     {   8, "Priority Level 9"},
3444     {   10, "Priority Level 10"},
3445     {   11, "Priority Level 11"},
3446     {   12, "Priority Level 12"},
3447     {   13, "Priority Level 13"},
3448     {   14, "Reserved"},
3449     {   15, "Reserved"},
3450     {   0, NULL }
3451 };
3452 /* Assured Priority (octet 1, bits E-H)*/
3453
3454
3455 /* 6.5.2.gf PDSNAddress N.S0029-0 v1.0*/
3456 /* a. See IOS Handoff Request message for the definition of this field. */
3457
3458 /* 6.5.2.gg PDSNProtocolType N.S0029-0 v1.0*/
3459 /* See IOS Handoff Request message for the definition of this field. */
3460
3461 /* 6.5.2.gh CDMAMSMeasuredChannelIdentity N.S0029-0 v1.0*/
3462
3463 /* 6.5.2.gl CallingPartyCategory N.S0027*/
3464 /* a. Refer to ITU-T Q.763 (Signalling System No. 7  ISDN user part formats and
3465    codes) for encoding of this parameter.
3466    b. Refer to national ISDN user part specifications for definitions and encoding of the
3467    reserved for national use values.
3468 */
3469 /* 6.5.2.gm CDMA2000HandoffInvokeIOSData N.S0029-0 v1.0*/
3470 /* IOS A1 Element Handoff Invoke Information */
3471
3472
3473 /* 6.5.2.gn CDMA2000HandoffResponseIOSData */
3474 /* IOS A1 Element Handoff Response Information N.S0029-0 v1.0*/
3475
3476 /* 6.5.2.gr CDMAServiceOptionConnectionIdentifier N.S0029-0 v1.0*/
3477
3478 /* 6.5.2.fk GeographicPosition */
3479 /* Calling Geodetic Location (CGL)
3480  * a. See T1.628 for encoding.
3481  * b. Ignore extra octets, if received. Send only defined (or significant) octets.
3482  */
3483 /* 6.5.2.fs PositionRequestType (See J-STD-036, page 8-47) X.S0002-0 v2.0
3484  */
3485
3486 /* Position Request Type (octet 1, bits A-H) */
3487 /*
3488   static const value_string ansi_map_Position_Request_Type_vals[]  = {
3489   {   0, "Not used"},
3490   {   1, "Initial Position"},
3491   {   2, "Return the updated position"},
3492   {   3, "Return the updated or last known position"},
3493   {   4, "Reserved for LSP interface"},
3494   {   5, "Initial Position Only"},
3495   {   6, "Return the last known position"},
3496   {   7, "Return the updated position based on the serving cell identity"},
3497 */
3498 /*
3499   values through 95 Reserved. Treat the same as value 1, Initial position.
3500   96 through 255 Reserved for TIA/EIA-41 protocol extension. If unknown, treat the
3501   same as value 1, Initial position.
3502   *
3503   {     0, NULL }
3504   };
3505
3506 */
3507
3508 /* LCS Client Type (CTYP) (octet 2, bit A) *
3509    0 Emergency services LCS Client.
3510    1 Non-emergency services LCS Client.
3511    Call-Related Indicator (CALL) (octet 2, bit B)
3512    Decimal Value Meaning
3513    0 Call-related LCS Client request.
3514    1 Non call-related LCS Client request.
3515
3516    Current Serving Cell Information for Coarse Position Determination (CELL) (octet 2, bit C)
3517    Decimal Value Meaning
3518    0 No specific request.
3519    1 Current serving cell information. Current serving cell information for
3520    Target MS requested. Radio contact with Target MS is required.
3521 */
3522 /* 6.5.2.ft PositionResult *
3523    static const value_string ansi_map_PositionResult_vals[]  = {
3524    {   0, "Not used"},
3525    {   1, "Initial position returned"},
3526    {   2, "Updated position returned"},
3527    {   3, "Last known position returned"},
3528    {   4, "Requested position is not available"},
3529    {   5, "Target MS disconnect"},
3530    {   6, "Target MS has handed-off"},
3531    {   7, "Identified MS is inactive or has roamed to another system"},
3532    {   8, "Unresponsive"},
3533    {   9, "Identified MS is responsive, but refused position request"},
3534    {   10, "System Failure"},
3535    {   11, "MSID is not known"},
3536    {   12, "Callback number is not known"},
3537    {   13, "Improper request"},
3538    {   14, "Mobile information returned"},
3539    {   15, "Signal not detected"},
3540    {   16, "PDE Timeout"},
3541    {   17, "Position pending"},
3542    {   18, "TDMA MAHO Information Returned"},
3543    {   19, "TDMA MAHO Information is not available"},
3544    {   20, "Access Denied"},
3545    {   21, "Requested PQOS not met"},
3546    {   22, "Resource required for CDMA handset-based position determination is currently unavailable"},
3547    {   23, "CDMA handset-based position determination failure"},
3548    {   24, "CDMA handset-based position determination failure detected by the PDE"},
3549    {   25, "CDMA handset-based position determination incomplete traffic channel requested for voice services"},
3550    {   26, "Emergency services call notification"},
3551    {   27, "Emergency services call precedence"},
3552    {   28, "Request acknowledged"},
3553    {    0, NULL }
3554    };
3555 */
3556 /* 6.5.2.bp-1 ServiceRedirectionCause value */
3557 static const value_string ansi_map_ServiceRedirectionCause_vals[]  = {
3558     {   0, "Not used"},
3559     {   1, "NormalRegistration"},
3560     {   2, "SystemNotFound"},
3561     {   3, "ProtocolMismatch"},
3562     {   4, "RegistrationRejection"},
3563     {   5, "WrongSID"},
3564     {   6, "WrongNID"},
3565     {   0, NULL }
3566 };
3567 /* 6.5.2.mT AuthenticationResponseReauthentication N.S0011-0 v 1.0*/
3568
3569 /* 6.5.2.vT ReauthenticationReport N.S0011-0 v 1.0*/
3570 static const value_string ansi_map_ReauthenticationReport_vals[]  = {
3571     {   0, "Not used"},
3572     {   1, "Reauthentication not attempted"},
3573     {   2, "Reauthentication no response"},
3574     {   3, "Reauthentication successful"},
3575     {   4, "Reauthentication failed"},
3576     {   0, NULL }
3577 };
3578
3579
3580
3581 /* 6.5.2.lB AKeyProtocolVersion
3582    N.S0011-0 v 1.0
3583 */
3584 static const value_string ansi_map_AKeyProtocolVersion_vals[]  = {
3585     {   0, "Not used"},
3586     {   1, "A-key Generation not supported"},
3587     {   2, "Diffie Hellman with 768-bit modulus, 160-bit primitive, and 160-bit exponents"},
3588     {   3, "Diffie Hellman with 512-bit modulus, 160-bit primitive, and 160-bit exponents"},
3589     {   4, "Diffie Hellman with 768-bit modulus, 32-bit primitive, and 160-bit exponents"},
3590     {   0, NULL }
3591 };
3592 /* 6.5.2.sB OTASP_ResultCode
3593    N.S0011-0 v 1.0
3594 */
3595 static const value_string ansi_map_OTASP_ResultCode_vals[]  = {
3596     {   0, "Accepted - Successful"},
3597     {   1, "Rejected - Unknown cause."},
3598     {   2, "Computation Failure - E.g., unable to compute A-key"},
3599     {   3, "CSC Rejected - CSC challenge failure"},
3600     {   4, "Unrecognized OTASPCallEntry"},
3601     {   5, "Unsupported AKeyProtocolVersion(s)"},
3602     {   6, "Unable to Commit"},
3603     {   0, NULL }
3604 };
3605
3606 /*6.5.2.wB ServiceIndicator
3607   N.S0011-0 v 1.0
3608 */
3609 static const value_string ansi_map_ServiceIndicator_vals[]  = {
3610     {   0, "Undefined Service"},
3611     {   1, "CDMA OTASP Service"},
3612     {   2, "TDMA OTASP Service"},
3613     {   3, "CDMA OTAPA Service"},
3614     {   4, "CDMA Position Determination Service (Emergency Services)"},
3615     {   5, "AMPS Position Determination Service (Emergency Services)"},
3616     {   6, "CDMA Position Determination Service (Value Added Services)"},
3617     {   0, NULL }
3618 };
3619
3620 /* 6.5.2.xB SignalingMessageEncryptionReport
3621    N.S0011-0 v 1.0
3622 */
3623 static const value_string ansi_map_SMEReport_vals[]  = {
3624     {   0, "Not used"},
3625     {   1, "Signaling Message Encryption enabling not attempted"},
3626     {   2, "Signaling Message Encryption enabling no response"},
3627     {   3, "Signaling Message Encryption is enabled"},
3628     {   4, "Signaling Message Encryption enabling failed"},
3629     {   0, NULL }
3630 };
3631
3632 /* 6.5.2.zB VoicePrivacyReport
3633    N.S0011-0 v 1.0
3634 */
3635 static const value_string ansi_map_VoicePrivacyReport_vals[]  = {
3636     {   0, "Not used"},
3637     {   1, "Voice Privacy not attempted"},
3638     {   2, "Voice Privacy no response"},
3639     {   3, "Voice Privacy is active"},
3640     {   4, "Voice Privacy failed"},
3641     {   0, NULL }
3642 };
3643
3644
3645 #include "packet-ansi_map-fn.c"
3646
3647 /*
3648  * 6.5.2.dk N.S0013-0 v 1.0,X.S0004-550-E v1.0 2.301
3649  */
3650 static void
3651 dissect_ansi_map_win_trigger_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
3652
3653     int offset = 0;
3654     int end_offset = 0;
3655     int j = 0;
3656     proto_tree *subtree;
3657     guint8 octet;
3658
3659     end_offset = tvb_length_remaining(tvb,offset);
3660     subtree = proto_item_add_subtree(actx->created_item, ett_win_trigger_list);
3661
3662     while(offset< end_offset) {
3663         octet = tvb_get_guint8(tvb,offset);
3664         switch (octet){
3665         case 0xdc:
3666             proto_tree_add_text(subtree, tvb, offset, 1, "TDP-R's armed");
3667             j=0;
3668             break;
3669         case 0xdd:
3670             proto_tree_add_text(subtree, tvb, offset, 1, "TDP-N's armed");
3671             j=0;
3672             break;
3673         case 0xde:
3674             proto_tree_add_text(subtree, tvb, offset, 1, "EDP-R's armed");
3675             j=0;
3676             break;
3677         case 0xdf:
3678             proto_tree_add_text(subtree, tvb, offset, 1, "EDP-N's armed");
3679             j=0;
3680             break;
3681         default:
3682             proto_tree_add_text(subtree, tvb, offset, 1, "[%u] (%u) %s",j,octet,val_to_str_ext(octet, &ansi_map_TriggerType_vals_ext, "Unknown TriggerType (%u)"));
3683             j++;
3684             break;
3685         }
3686         offset++;
3687     }
3688 }
3689
3690
3691 static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
3692     static gboolean               opCodeKnown = TRUE;
3693     static ansi_map_tap_rec_t     tap_rec[16];
3694     static ansi_map_tap_rec_t     *tap_p;
3695     static int                    tap_current=0;
3696
3697     /*
3698      * set tap record pointer
3699      */
3700     tap_current++;
3701     if (tap_current == array_length(tap_rec))
3702     {
3703         tap_current = 0;
3704     }
3705     tap_p = &tap_rec[tap_current];
3706