summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/lnpdqp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--epan/dissectors/asn1/lnpdqp/CMakeLists.txt39
-rw-r--r--epan/dissectors/asn1/lnpdqp/LNPDQP.asn66
-rw-r--r--epan/dissectors/asn1/lnpdqp/lnpdqp.cnf45
-rw-r--r--epan/dissectors/asn1/lnpdqp/packet-lnpdqp-template.c359
4 files changed, 509 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/lnpdqp/CMakeLists.txt b/epan/dissectors/asn1/lnpdqp/CMakeLists.txt
new file mode 100644
index 00000000..06b06715
--- /dev/null
+++ b/epan/dissectors/asn1/lnpdqp/CMakeLists.txt
@@ -0,0 +1,39 @@
+# CMakeLists.txt
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+
+set( PROTOCOL_NAME lnpdqp )
+
+set( PROTO_OPT )
+
+set( EXPORT_FILES
+ ${PROTOCOL_NAME}-exp.cnf
+)
+
+set( EXT_ASN_FILE_LIST
+)
+
+set( ASN_FILE_LIST
+ LNPDQP.asn
+)
+
+set( EXTRA_DIST
+ ${ASN_FILE_LIST}
+ packet-${PROTOCOL_NAME}-template.c
+ ${PROTOCOL_NAME}.cnf
+)
+
+set( SRC_FILES
+ ${EXTRA_DIST}
+ ${EXT_ASN_FILE_LIST}
+)
+
+set( A2W_FLAGS -b )
+
+ASN2WRS()
+
diff --git a/epan/dissectors/asn1/lnpdqp/LNPDQP.asn b/epan/dissectors/asn1/lnpdqp/LNPDQP.asn
new file mode 100644
index 00000000..d9840150
--- /dev/null
+++ b/epan/dissectors/asn1/lnpdqp/LNPDQP.asn
@@ -0,0 +1,66 @@
+-- lnpdqp.asn
+-- GR-533 i2 2001
+--
+
+LNPDQP-Protocol {
+ itu-t identified-organization (4) etsi (0) mobileDomain (0)
+ gsm-Network (1) modules (3) map-OM-DataTypes (12) version13 (13)}
+
+DEFINITIONS
+
+IMPLICIT TAGS
+
+::=
+
+BEGIN
+
+-- ConnectionControl ::= OPERATION
+-- PARAMETER [PRIVATE 18] SET {
+ ConnectionControlArg ::= [PRIVATE 18] SET {
+-- carrierID [4] Digits, - - Note 1
+-- networkRoutingNumber [4] Digits,
+-- as2wrs does not like two equal tags
+ digits [4] Digits,
+ billingIndicators [PRIVATE 65] BillingIndicators -- Note 1
+ }
+-- Note 1 This parameter is not used.
+
+-- ProvideInstruction ::= OPERATION
+-- PARAMETER [PRIVATE 18] SET {
+ ProvideInstructionArg ::= [PRIVATE 18] SET {
+ calledPartyNumber [10] ServiceKey,
+-- callingPartyANI [4] Digits OPTIONAL,
+-- originatingLATA [4] Digits OPTIONAL,
+-- as2wrs does not like two equal tags
+ digits [4] Digits,
+ oli [PRIVATE 69] OriginatingStationType
+ }
+-- ERRORS {
+-- dataUnavailable,
+-- unavailableResource,
+-- unexpectedComponentSequence,
+-- unexpectedDataValue
+-- }
+-- LINKED {
+-- ConnectionControl
+-- }
+
+BillingIndicators ::= OCTET STRING (SIZE(4))
+
+Digits ::= OCTET STRING (SIZE(4..9))
+
+OriginatingStationType ::= OCTET STRING (SIZE(1))
+
+ServiceKey ::= CHOICE {
+ digits [4] Digits
+}
+
+--DataUnavailable ::= ERROR
+--PARAMETER [PRIVATE 18] SET { }
+-- Optional
+
+--UnavailableResource ::= ERROR
+--PARAMETER [PRIVATE 18] SET { }
+-- Optional
+
+END \ No newline at end of file
diff --git a/epan/dissectors/asn1/lnpdqp/lnpdqp.cnf b/epan/dissectors/asn1/lnpdqp/lnpdqp.cnf
new file mode 100644
index 00000000..d9884247
--- /dev/null
+++ b/epan/dissectors/asn1/lnpdqp/lnpdqp.cnf
@@ -0,0 +1,45 @@
+# lnpdqp.cnf
+# lnpdqp conformation file
+
+#.OPT
+#.END
+
+#.PDU
+ConnectionControlArg
+ProvideInstructionArg
+
+
+#.FN_BODY Digits VAL_PTR = &parameter_tvb
+ tvbuff_t *parameter_tvb = NULL;
+ guint8 type_of_dgt;
+ proto_tree *subtree;
+
+ type_of_dgt = tvb_get_guint8(tvb,offset);
+ switch(type_of_dgt){
+ case 2:
+ /* Calling Party Number */
+ hf_index = hf_lnpdqp_callingPartyANI;
+ break;
+ case 4:
+ /* Routing Number */
+ hf_index = hf_lnpdqp_networkRoutingNumber;
+ break;
+ case 7:
+ /* Local Access and Transport Area */
+ hf_index = hf_lnpdqp_originatingLATA;
+ break;
+ case 8:
+ /* Carrier */
+ hf_index = hf_lnpdqp_carrierID;
+ break;
+ default:
+ break;
+ }
+%(DEFAULT_BODY)s
+ if (parameter_tvb){
+ subtree = proto_item_add_subtree(actx->created_item, ett_lnpdqp_digits);
+ dissect_lnpdqp_digits_type(parameter_tvb,actx->pinfo,subtree, actx);
+ }
+
+#.TYPE_ATTR
+OriginatingStationType TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(lnpdqp_OriginatingStationType_vals)
diff --git a/epan/dissectors/asn1/lnpdqp/packet-lnpdqp-template.c b/epan/dissectors/asn1/lnpdqp/packet-lnpdqp-template.c
new file mode 100644
index 00000000..f3ecee1d
--- /dev/null
+++ b/epan/dissectors/asn1/lnpdqp/packet-lnpdqp-template.c
@@ -0,0 +1,359 @@
+/* packet-lnpdqp-template.c
+ * Routines for Local Number Portability Database Query Protocol dissection
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Ref GR-533 i2 2001
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+
+#include <epan/asn1.h>
+#include "packet-ber.h"
+
+#define PNAME "Local Number Portability Database Query"
+#define PSNAME "LNPDQP"
+#define PFNAME "lnpdqp"
+
+/*
+ * Operation Code is partitioned into:
+ * Operation Family = ConnectionControl, no Reply Required (4)
+ * Operation Specifier = Connect (1)
+ */
+#define LNPDQP_ANSI_TCAP_OPCODE_CC 0x0401
+/*
+ * Operation Code is partitioned into:
+ * Operation Family = ProvideInstruction, Reply Required (131) 0x83
+ * Operation Specifier = Start (1)
+ */
+/* Exluding H bit */
+#define LNPDQP_ANSI_TCAP_OPCODE_PI 0x0301
+
+void proto_reg_handoff_lnpdqp(void);
+void proto_register_lnpdqp(void);
+
+/* Initialize the protocol and registered fields */
+static int proto_lnpdqp = -1;
+
+
+static int hf_lnpdqp_type_of_digits = -1;
+static int hf_lnpdqp_nature_of_number = -1;
+static int hf_lnpdqp_digits_enc = -1;
+static int hf_lnpdqp_np = -1;
+static int hf_lnpdqp_nr_digits = -1;
+static int hf_lnpdqp_bcd_digits = -1;
+static int hf_lnpdqp_ia5_digits = -1;
+
+/* asn2wrs/the ber dissector does not handle the same tag used multiple times
+ * in asn1 description, do some magic to handle.
+ */
+static int hf_lnpdqp_networkRoutingNumber = -1; /* Digits */
+static int hf_lnpdqp_callingPartyANI = -1; /* Digits */
+static int hf_lnpdqp_originatingLATA = -1; /* Digits */
+static int hf_lnpdqp_carrierID = -1; /* Digits */
+
+#include "packet-lnpdqp-hf.c"
+
+static int ett_lnpdqp = -1;
+static int ett_lnpdqp_digitstype = -1;
+static int ett_lnpdqp_digits = -1;
+#include "packet-lnpdqp-ett.c"
+
+
+/* Type of Digits (octet 1, bits A-H) */
+static const value_string lnpdqp_type_of_digits_vals[] = {
+ { 0, "Not Used" },
+ { 1, "Dialed Number or Called Party Number" },
+ { 2, "Calling Party Number" },
+ { 3, "Caller Interaction" },
+ { 4, "Routing Number" },
+ { 5, "Billing Number" },
+ { 6, "Destination Number" },
+ { 7, "LATA" },
+ { 8, "Carrier" },
+ { 9, "Last Calling Party" },
+ { 10, "Last Party Called" },
+ { 11, "Calling Directory Number" },
+ { 12, "VMSR Identifier" },
+ { 13, "Original Called Number" },
+ { 14, "Redirecting Number" },
+ { 15, "Connected Number" },
+ { 0, NULL }
+};
+
+#if 0
+XXXX Currently unused
+/* Nature of Number (octet 2, bits A-H )*/
+static const true_false_string lnpdqp_na_bool_val = {
+ "International",
+ "National"
+};
+static const true_false_string lnpdqp_pi_bool_val = {
+ "Presentation Restricted",
+ "Presentation Allowed"
+};
+static const true_false_string lnpdqp_navail_bool_val = {
+ "Number is not available",
+ "Number is available"
+};
+static const true_false_string lnpdqp_si_bool_val = {
+ "User provided, screening passed",
+ "User provided, not screened"
+};
+#endif
+static const value_string lnpdqp_na_vals[] = {
+ { 0, "National, No Presentation Restricted"},
+ { 1, "International, No Presentation Restricted"},
+ { 2, "National, Presentation Restricted"},
+ { 3, "International, Presentation Restricted"},
+ { 0, NULL }
+};
+/* Encoding (octet 3, bits A-D) */
+static const value_string lnpdqp_digits_enc_vals[] = {
+ { 0, "Not used"},
+ { 1, "BCD"},
+ { 2, "IA5"},
+ { 3, "Octet string"},
+ { 0, NULL }
+};
+/* Numbering Plan (octet 3, bits E-H) */
+static const value_string lnpdqp_np_vals[] = {
+ { 0, "Unknown or not applicable"},
+ { 1, "ISDN Numbering Plan (ITU Rec. E.164)"},
+ { 2, "Telephony Numbering (ITU-T Rec. E.164,E.163)"},
+ { 3, "Data Numbering (ITU-T Rec. X.121)"},
+ { 4, "Telex Numbering (ITU-T Rec. F.69)"},
+ { 5, "Maritime Mobile Numbering"},
+ { 6, "Land Mobile Numbering (ITU-T Rec. E.212)"},
+ { 7, "Private Numbering Plan"},
+ { 0, NULL }
+};
+
+/*
+ * OriginatingStationType ::= OCTET STRING (SIZE(1))
+ * The following codes are used in the originating line information field:
+ * 00000010 } Binary values administered by the North
+ * to } American Numbering Administration
+ * 01100011 }
+ * Ref http://www.nanpa.com/number_resource_info/ani_ii_assignments.html
+ */
+
+static const value_string lnpdqp_OriginatingStationType_vals[] = {
+ { 0, "Plain Old Telephone Service (POTS) - non-coin service requiring no special treatment"},
+ { 1, "Multiparty line (more than 2) - ANI cannot be provided on 4 or 8 party lines. "},
+ { 2, "ANI Failure "},
+ /* 03-05 Unassigned */
+ { 6, "Station Level Rating "},
+ { 7, "Special Operator Handling Required"},
+ /* 08-09 Unassigned */
+ { 10, "Not assignable - conflict with 10X test code"},
+ /* 11 Unassigned */
+ /* 12-19 Not assignable - conflict with international outpulsing code */
+ { 20, "Automatic Identified Outward Dialing (AIOD)"},
+ /* 21-22 Unassigned */
+ /* To lasy to do these */
+ { 61, "Cellular/Wireless PCS (Type 1) "},
+ { 62, "Cellular/Wireless PCS (Type 2) "},
+ { 63, "Cellular/Wireless PCS (Roaming)"},
+ { 0, NULL }
+};
+
+static void
+dissect_lnpdqp_digits_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree _U_, asn1_ctx_t *actx _U_){
+
+ guint8 octet , no_of_digits;
+ int offset = 0;
+ char *digit_str;
+
+ proto_tree *subtree;
+
+
+ subtree = proto_item_add_subtree(actx->created_item, ett_lnpdqp_digitstype);
+
+ /* Octet 1 Type of Digits*/
+ proto_tree_add_item(subtree, hf_lnpdqp_type_of_digits, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* Octet 2 Nature of Number*/
+ proto_tree_add_item(subtree, hf_lnpdqp_nature_of_number, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* Octet 3 Numbering Plan |Encoding Scheme| */
+ octet = tvb_get_guint8(tvb,offset);
+ proto_tree_add_item(subtree, hf_lnpdqp_np, tvb, offset, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_lnpdqp_digits_enc, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset++;
+ /* Octet 4 Number of Digits */
+ switch ((octet&0xf)){
+ case 1:
+ /* BCD Coding */
+ no_of_digits = tvb_get_guint8(tvb,offset);
+ proto_tree_add_item(subtree, hf_lnpdqp_nr_digits, tvb, offset, 1, ENC_BIG_ENDIAN);
+ if(no_of_digits == 0)
+ return;
+ offset++;
+ proto_tree_add_item_ret_display_string(subtree, hf_lnpdqp_bcd_digits, tvb, offset, -1, ENC_KEYPAD_BC_TBCD, pinfo->pool, &digit_str);
+ proto_item_append_text(actx->created_item, " - %s", digit_str);
+ break;
+ case 2:
+ /* IA5 Coding */
+ no_of_digits = tvb_get_guint8(tvb,offset);
+ proto_tree_add_item(subtree, hf_lnpdqp_nr_digits, tvb, offset, 1, ENC_BIG_ENDIAN);
+ if(no_of_digits == 0)
+ return;
+ offset++;
+ proto_tree_add_item(subtree, hf_lnpdqp_ia5_digits, tvb, offset, -1, ENC_ASCII);
+ proto_item_append_text(actx->created_item, " - %s", tvb_get_string_enc(pinfo->pool,tvb,offset,tvb_reported_length_remaining(tvb,offset), ENC_ASCII | ENC_NA));
+ break;
+ default:
+ break;
+ }
+
+}
+
+
+#include "packet-lnpdqp-fn.c"
+
+static int
+dissect_lnpdqp_cc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
+{
+ proto_item *item=NULL;
+ proto_tree *tree=NULL;
+ asn1_ctx_t asn1_ctx;
+
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, PSNAME);
+ col_set_str(pinfo->cinfo, COL_INFO, "ConnectionControl");
+
+
+ /* create display subtree for the protocol */
+ item = proto_tree_add_item(parent_tree, proto_lnpdqp, tvb, 0, -1, ENC_NA);
+ tree = proto_item_add_subtree(item, ett_lnpdqp);
+
+ return dissect_ConnectionControlArg_PDU(tvb, pinfo, tree, NULL);
+}
+
+static int
+dissect_lnpdqp_pi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void *data _U_)
+{
+ proto_item *item=NULL;
+ proto_tree *tree=NULL;
+ asn1_ctx_t asn1_ctx;
+
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, PSNAME);
+ col_set_str(pinfo->cinfo, COL_INFO, "ProvideInstruction");
+
+
+ /* create display subtree for the protocol */
+ item = proto_tree_add_item(parent_tree, proto_lnpdqp, tvb, 0, -1, ENC_NA);
+ tree = proto_item_add_subtree(item, ett_lnpdqp);
+
+ return dissect_ProvideInstructionArg_PDU(tvb, pinfo, tree, NULL);
+
+}
+
+
+void proto_register_lnpdqp(void) {
+
+ /* List of fields */
+ static hf_register_info hf[] = {
+ { &hf_lnpdqp_type_of_digits,
+ { "Type of Digits", "lnpdqp.type_of_digits",
+ FT_UINT8, BASE_DEC, VALS(lnpdqp_type_of_digits_vals), 0x0,
+ NULL, HFILL }},
+ { &hf_lnpdqp_nature_of_number,
+ { "Nature of Number", "lnpdqp.na",
+ FT_UINT8, BASE_DEC, VALS(lnpdqp_na_vals), 0x0,
+ NULL, HFILL }},
+ { &hf_lnpdqp_digits_enc,
+ { "Encoding", "lnpdqp.enc",
+ FT_UINT8, BASE_DEC, VALS(lnpdqp_digits_enc_vals), 0x0f,
+ NULL, HFILL }},
+ { &hf_lnpdqp_np,
+ { "Numbering Plan", "lnpdqp.np",
+ FT_UINT8, BASE_DEC, VALS(lnpdqp_np_vals), 0xf0,
+ NULL, HFILL }},
+ { &hf_lnpdqp_nr_digits,
+ { "Number of Digits", "lnpdqp.nr_digits",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+ { &hf_lnpdqp_bcd_digits,
+ { "BCD digits", "lnpdqp.bcd_digits",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+ { &hf_lnpdqp_ia5_digits,
+ { "IA5 digits", "lnpdqp.ia5_digits",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+/* asn2wrs/the ber dissector does not handle the same tag used multiple times
+ * in asn1 description, do some magic to handle.
+ */
+ { &hf_lnpdqp_networkRoutingNumber,
+ { "networkRoutingNumber", "lnpdqp.networkRoutingNumber",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Digits", HFILL }},
+
+ { &hf_lnpdqp_callingPartyANI,
+ { "callingPartyANI", "lnpdqp.callingPartyANI",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Digits", HFILL }},
+ { &hf_lnpdqp_originatingLATA,
+ { "originatingLATA", "lnpdqp.originatingLATA",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Digits", HFILL }},
+ { &hf_lnpdqp_carrierID,
+ { "carrierID", "lnpdqp.carrierID",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ "Digits", HFILL }},
+
+#include "packet-lnpdqp-hfarr.c"
+ };
+
+ /* List of subtrees */
+ static gint *ett[] = {
+ &ett_lnpdqp,
+ &ett_lnpdqp_digitstype,
+ &ett_lnpdqp_digits,
+
+#include "packet-lnpdqp-ettarr.c"
+ };
+
+ /* Register protocol */
+ proto_lnpdqp = proto_register_protocol(PNAME, PSNAME, PFNAME);
+
+
+ register_dissector("lnpdqp_cc", dissect_lnpdqp_cc, proto_lnpdqp);
+ register_dissector("lnpdqp_pi", dissect_lnpdqp_pi, proto_lnpdqp);
+
+ /* Register fields and subtrees */
+ proto_register_field_array(proto_lnpdqp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+}
+void proto_reg_handoff_lnpdqp(void) {
+
+ static dissector_handle_t lnpdqp_cc_handle, lnpdqp_pi_handle;
+
+ lnpdqp_cc_handle = find_dissector("lnpdqp_cc");
+ lnpdqp_pi_handle = find_dissector("lnpdqp_pi");
+
+ dissector_add_uint("ansi_tcap.nat.opcode", LNPDQP_ANSI_TCAP_OPCODE_CC, lnpdqp_cc_handle);
+ dissector_add_uint("ansi_tcap.nat.opcode", LNPDQP_ANSI_TCAP_OPCODE_PI, lnpdqp_pi_handle);
+
+}
+/*
+* Editor modelines
+*
+* Local Variables:
+* c-basic-offset: 4
+* tab-width: 8
+* indent-tabs-mode: nil
+* End:
+*
+* ex: set shiftwidth=4 tabstop=8 expandtab:
+* :indentSize=4:tabSize=8:noTabs=true:
+*/