From LEGO via bug 4405:
[obnox/wireshark/wip.git] / asn1 / inap / packet-inap-template.c
index 4ecee8e813ff516795d36018933f9954443b0a9b..4d91a38ac1fc71dede85c68f1b2c680198e94ce3 100644 (file)
@@ -32,8 +32,8 @@
 #include <glib.h>
 #include <epan/packet.h>
 #include <epan/prefs.h>
-#include <epan/conversation.h>
-#include "epan/expert.h"
+#include <epan/oids.h>
+#include <epan/expert.h>
 #include <epan/asn1.h>
 
 #include <stdio.h>
 #include "packet-e164.h"
 #include "packet-isup.h"
 #include "packet-tcap.h"
+#include "packet-dap.h"
+#include "packet-dsp.h"
 
 #define PNAME  "Intelligent Network Application Protocol"
 #define PSNAME "INAP"
 #define PFNAME "inap"
 
 /* Initialize the protocol and registered fields */
-int proto_inap = -1;
+static int proto_inap = -1;
+
+/* include constants */
+#include "packet-inap-val.h"
 
 #include "packet-inap-hf.c"
 
 #define MAX_SSN 254
 static range_t *global_ssn_range;
-static range_t *ssn_range;
 
 static dissector_handle_t      inap_handle;
 
 /* Global variables */
 static guint32 opcode=0;
-static guint32 errorCode;
+static guint32 errorCode=0;
+
+static int inap_opcode_type;
+#define INAP_OPCODE_INVOKE        1
+#define INAP_OPCODE_RETURN_RESULT 2
+#define INAP_OPCODE_RETURN_ERROR  3
+#define INAP_OPCODE_REJECT        4
 
 /* Initialize the subtree pointers */
 static gint ett_inap = -1;
 static gint ett_inapisup_parameter = -1;
+static gint ett_inap_HighLayerCompatibility = -1;
 #include "packet-inap-ett.c"
 
-const value_string inap_opr_code_strings[] = {
-
-       {0,"InitialDP"},
-       {1, "OriginationAttemptAuthorized"},
-       {2, "CollectedInformation"},
-       {3, "AnalysedInformation"},
-       {4, "RouteSelectFailure"},
-       {5, "oCalledPartyBusy"},
-       {6, "oNoAnswer"},
-       {7, "oAnswer"},
-       {8, "oDisconnect"},
-       {9, "TermAttemptAuthorized"},
-       {10, "tBusy"},
-       {11, "tNoAnswer"},
-       {12, "tAnswer"},
-       {13, "tDisconnect"},
-       {14, "oMidCall"},
-       {15, "tMidCall"},
-       {16, "AssistRequestInstructions"},
-       {17,"EstablishTemporaryConnection"},
-       {18, "DisconnectForwardConnection"},
-       {19,"ConnectToResource"},
-       {20, "Connect"},
-       {21,"HoldCallInNetwork"},
-       {22, "ReleaseCall"},
-       {23, "RequestReportBCSMEven"},
-       {23,"RequestReportBCSMEvent"},
-       {24,"EventReportBCSM"},
-       {25, "RequestNotificationChargingEvent"},
-       {26, "EventNotificationCharging"},
-       {27, "CollectInformation"},
-       {28, "AnalyseInformation"},
-       {29, "SelectRoute"},
-       {30, "SelectFacility"},
-       {31, "Continue"},
-       {32, "InitiateCallAttempt"},
-       {33,"ResetTimer"},
-       {34,"FurnishChargingInformation"},
-       {35, "ApplyCharging"},
-       {36, "ApplyChargingReport"},
-       {37, "RequestCurrentStatusReport"},
-       {38, "RequestEveryStatusChangeReport"},
-       {39, "RequestFirstStatusMatchReport"},
-       {40, "StatusReport"},
-       {41, "CallGap"},
-       {42, "ActivateServiceFiltering"},
-       {43, "ServiceFilteringResponse"},
-       {44, "CallInformationReport"},
-       {45, "CallInformationRequest"},
-       {46, "SendChargingInformation"},
-       {47,"PlayAnnouncement"},
-       {48,"PromptAndCollectUserInformation"},
-       {49,"SpecializedResourceReport"},
-       {53, "Cancel"},
-       {55, "ActivityTest"},
-       {99,"ReceivedInformation"}, /*???????*/
-       {0, NULL}
-};
-
-const value_string inap_error_code_strings[] = {
-
-{0,"cancelled"},
-{1,"cancelFailed"},
-{3,"etcFailed"},
-{4,"improperCallerResponse"},
-{6,"missingCustomerRecord"},
-{7,"missingParameter"},
-{8,"parameterOutOfRange"},
-{10,"RequestedInfoError"},
-{11,"SystemFailure"},
-{12,"TaskRefused"},
-{13,"UnavailableResource"},
-{14,"UnexpectedComponentSequence"},
-{15,"UnexpectedDataValue"},
-{16,"UnexpectedParameter"},
-{17,"UnknownLegID"},
-{18,"UnknownResource"},
-{0, NULL}
-};
+#include "packet-inap-table.c"
 
 const value_string inap_general_problem_strings[] = {
 {0,"General Problem Unrecognized Component"},
@@ -183,205 +116,8 @@ TC-Invokable OPERATION ::=
    promptAndCollectUserInformation}
 */
 
-static int dissect_invokeData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_) {
-  switch(opcode){
-  case 0: /*InitialDP*/
-    offset=dissect_inap_InitialDP(FALSE, tvb, offset, actx, tree, hf_inap_InitialDP_PDU);
-    break;
-  case 1: /*1 OriginationAttemptAuthorized */
-    offset=dissect_inap_OriginationAttemptAuthorizedArg(FALSE, tvb, offset, actx, tree, hf_inap_OriginationAttemptAuthorizedArg_PDU);
-    break;
-  case 2: /*2 CollectedInformation */
-    offset=dissect_inap_CollectedInformationArg(FALSE, tvb, offset, actx, tree, hf_inap_CollectedInformationArg_PDU);
-    break;
-  case 3: /*3 AnalysedInformation */
-    offset=dissect_inap_AnalysedInformationArg(FALSE, tvb, offset, actx, tree, hf_inap_AnalysedInformationArg_PDU);
-    break;
-  case 4: /*4 RouteSelectFailure */
-    offset=dissect_inap_RouteSelectFailureArg(FALSE, tvb, offset, actx, tree, hf_inap_RouteSelectFailureArg_PDU);
-    break;
-  case 5: /*5 oCalledPartyBusy */
-    offset=dissect_inap_OCalledPartyBusyArg(FALSE, tvb, offset, actx, tree, hf_inap_OCalledPartyBusyArg_PDU);
-    break;      
-  case 6: /*6 oNoAnswer */
-    offset=dissect_inap_ONoAnswer(FALSE, tvb, offset, actx, tree, hf_inap_ONoAnswer_PDU);
-    break;
-  case 7: /*7 oAnswer */
-    offset=dissect_inap_OAnswerArg(FALSE, tvb, offset, actx, tree, hf_inap_OAnswerArg_PDU);
-    break;
-  case 8: /*8 oDisconnect */
-    offset=dissect_inap_ODisconnectArg(FALSE, tvb, offset, actx, tree, hf_inap_ODisconnectArg_PDU);
-    break;
-  case 9: /*9 TermAttemptAuthorized */
-    offset=dissect_inap_TermAttemptAuthorizedArg(FALSE, tvb, offset, actx, tree, hf_inap_TermAttemptAuthorizedArg_PDU);
-    break;
-  case 10: /*10 tBusy */
-    offset=dissect_inap_TBusyArg(FALSE, tvb, offset, actx, tree, hf_inap_TBusyArg_PDU);
-    break;
-  case 11: /*11 tNoAnswer */
-    offset=dissect_inap_TNoAnswerArg(FALSE, tvb, offset, actx, tree, hf_inap_TNoAnswerArg_PDU);
-    break;
-  case 12: /*12 tAnswer */
-    offset=dissect_inap_TAnswerArg(FALSE, tvb, offset, actx, tree, hf_inap_TAnswerArg_PDU);
-    break;
-  case 13: /*13 tDisconnect */
-    offset=dissect_inap_TDisconnectArg(FALSE, tvb, offset, actx, tree, hf_inap_TDisconnectArg_PDU);
-    break;
-  case 14: /*14 oMidCall */
-    offset=dissect_inap_MidCallArg(FALSE, tvb, offset, actx, tree, hf_inap_MidCallArg_PDU);
-    break;
-  case 15: /*15 tMidCall */
-    offset=dissect_inap_MidCallArg(FALSE, tvb, offset, actx, tree, hf_inap_MidCallArg_PDU);
-    break;
-  case  16: /*AssistRequestInstructions*/
-    offset=dissect_inap_AssistRequestInstructionsArg(FALSE, tvb, offset, actx, tree, hf_inap_AssistRequestInstructionsArg_PDU);
-    break;
-  case  17: /*EstablishTemporaryConnection*/
-    offset=dissect_inap_EstablishTemporaryConnectionArg(FALSE, tvb, offset, actx, tree, hf_inap_EstablishTemporaryConnectionArg_PDU);
-    break;
-  case  18: /*DisconnectForwardConnections*/
-    proto_tree_add_text(tree, tvb, offset, -1, "Disconnect Forward Connection");
-    break;
-  case  19: /*ConnectToResource*/
-    offset=dissect_inap_ConnectToResourceArg(FALSE, tvb, offset, actx, tree, hf_inap_ConnectToResourceArg_PDU);
-    break;
-  case  20: /*Connect*/
-    offset=dissect_inap_ConnectArg(FALSE, tvb, offset, actx, tree,hf_inap_ConnectArg_PDU);
-    break;     
-  case  21: /* 21 HoldCallInNetwork */
-    offset=dissect_inap_HoldCallInNetworkArg(FALSE, tvb, offset, actx, tree,hf_inap_HoldCallInNetworkArg_PDU);
-    break;
-
-   case 22: /*ReleaseCall*/
-    offset=dissect_inap_ReleaseCallArg(FALSE, tvb, offset, actx, tree,hf_inap_ReleaseCallArg_PDU);
-    break;
-    case 23: /*InitialDP*/
-    offset=dissect_inap_RequestReportBCSMEventArg(FALSE, tvb, offset, actx, tree, hf_inap_RequestReportBCSMEventArg_PDU);
-    break;
-  case  24: /*EventReportBCSM*/
-    offset=dissect_inap_EventReportBCSMArg(FALSE, tvb, offset, actx, tree, hf_inap_EventReportBCSMArg_PDU);
-    break;
-  case  25: /*25, "RequestNotificationChargingEvent */
-    offset=dissect_inap_RequestNotificationChargingEvent(FALSE, tvb, offset, actx, tree, hf_inap_RequestNotificationChargingEvent_PDU);
-    break;
-  case  26: /*26, "EventNotificationCharging */
-    offset=dissect_inap_EventNotificationChargingArg(FALSE, tvb, offset, actx, tree, hf_inap_EventNotificationChargingArg_PDU);
-    break;
-  case  27: /*27, "CollectInformation */
-    offset=dissect_inap_CollectInformationArg(FALSE, tvb, offset, actx, tree, hf_inap_CollectInformationArg_PDU);
-    break;
-  case  28: /*28, "AnalyseInformation */
-    offset=dissect_inap_AnalyseInformationArg(FALSE, tvb, offset, actx, tree, hf_inap_AnalyseInformationArg_PDU);
-    break;
-  case  29: /*29, "SelectRoute */
-    offset=dissect_inap_SelectRouteArg(FALSE, tvb, offset, actx, tree, hf_inap_SelectRouteArg_PDU);
-    break;
-  case  30: /*30, "SelectFacility */
-    offset=dissect_inap_SelectFacilityArg(FALSE, tvb, offset, actx, tree, hf_inap_SelectFacilityArg_PDU);
-    break;
-       /*31, "Continue */
-  case  32: /*32, InitiateCallAttempt*/
-    offset=dissect_inap_InitiateCallAttemptArg(FALSE, tvb, offset, actx, tree, hf_inap_InitiateCallAttemptArg_PDU);
-    break;
-  case 33: /*ResetTimer*/
-    offset=dissect_inap_ResetTimerArg(FALSE, tvb, offset, actx, tree, hf_inap_ResetTimerArg_PDU);
-    break;
-  case 34: /*FurnishChargingInformation*/
-    offset=dissect_inap_FurnishChargingInformationArg(FALSE, tvb, offset, actx, tree, hf_inap_FurnishChargingInformationArg_PDU);
-    break;
-  case 35: /*35, ApplyCharging */
-    offset=dissect_inap_ApplyChargingArg(FALSE, tvb, offset, actx, tree, hf_inap_ApplyChargingArg_PDU);
-    break;     
-  case 36: /*36, "ApplyChargingReport */
-    offset=dissect_inap_ApplyChargingReportArg(FALSE, tvb, offset, actx, tree, hf_inap_ApplyChargingReportArg_PDU);
-    break;
-  case 37: /*37, "RequestCurrentStatusReport */
-    offset=dissect_inap_RequestCurrentStatusReportArg(FALSE, tvb, offset, actx, tree, hf_inap_RequestCurrentStatusReportArg_PDU);
-    break;
-  case 38:/*38, "RequestEveryStatusChangeReport */
-    offset=dissect_inap_RequestEveryStatusChangeReportArg(FALSE, tvb, offset, actx, tree, hf_inap_RequestEveryStatusChangeReportArg_PDU);
-    break;
-  case 39:/*39, "RequestFirstStatusMatchReport */
-    offset=dissect_inap_RequestFirstStatusMatchReportArg(FALSE, tvb, offset, actx, tree, hf_inap_RequestFirstStatusMatchReportArg_PDU);
-    break;
-  case 40:/*40, "StatusReport */
-    offset=dissect_inap_StatusReportArg(FALSE, tvb, offset, actx, tree, hf_inap_StatusReportArg_PDU);
-    break;
-  case 41:/*41, "CallGap */
-    offset=dissect_inap_CallGapArg(FALSE, tvb, offset, actx, tree, hf_inap_CallGapArg_PDU);
-    break;
-  case 42:/*42, "ActivateServiceFiltering */
-    offset=dissect_inap_ActivateServiceFilteringArg(FALSE, tvb, offset, actx, tree, hf_inap_ActivateServiceFilteringArg_PDU);
-    break;
-  case 43:/*43, "ServiceFilteringResponse */
-    offset=dissect_inap_ServiceFilteringResponseArg(FALSE, tvb, offset, actx, tree, hf_inap_ServiceFilteringResponseArg_PDU);
-    break;    
-  case  44: /*CallInformationReport*/
-    offset=dissect_inap_CallInformationReportArg(FALSE, tvb, offset, actx, tree, hf_inap_CallInformationReportArg_PDU);
-    break;
-  case  45: /*CallInformationRequest*/
-    offset=dissect_inap_CallInformationRequestArg(FALSE, tvb, offset, actx, tree, hf_inap_CallInformationRequestArg_PDU);
-    break;
-  case 47: /*PlayAnnouncement*/
-    offset=dissect_inap_PlayAnnouncementArg(FALSE, tvb, offset, actx, tree, hf_inap_PlayAnnouncementArg_PDU);
-    break;
-  case 48: /*PromptAndCollectUserInformation*/
-    offset=dissect_inap_PromptAndCollectUserInformationArg(FALSE, tvb, offset, actx, tree, hf_inap_PromptAndCollectUserInformationArg_PDU);
-    break;
-  case 49: /* 49 SpecializedResourceReport */
-    offset=dissect_inap_SpecializedResourceReportArg(FALSE, tvb, offset, actx, tree, hf_inap_SpecializedResourceReportArg_PDU);
-    break;
-  case  53: /*Cancel*/
-    offset=dissect_inap_CancelArg(FALSE, tvb, offset, actx, tree, hf_inap_CancelArg_PDU);
-    break;
-       /*55 ActivityTest*/
-   default:
-    proto_tree_add_text(tree, tvb, offset, -1, "Unknown invokeData blob");
-    /* todo call the asn.1 dissector */
-  }
-  return offset;
-}
+#include "packet-inap-table2.c"
 
-/*
-TC-Returnable OPERATION ::=
-  {activateServiceFiltering | activityTest | requestCurrentStatusReport |
-   requestEveryStatusChangeReport | requestFirstStatusMatchReport |
-   promptAndCollectUserInformation}
-
-   activateServiceFiltering                    - No arg
-   activityTest                                                - No Arg
-   requestCurrentStatusReport          - RESULT         RequestCurrentStatusReportResultArg
-   requestEveryStatusChangeReport      - No arg
-   requestFirstStatusMatchReport       - No Arg 
-   promptAndCollectUserInformation     - RESULT         ReceivedInformationArg
-       
-*/
-static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_) {
-  switch(opcode){
-   case 37: /*requestCurrentStatusReport*/
-    offset=dissect_inap_RequestCurrentStatusReportResultArg(FALSE, tvb, offset, actx, tree, -1);
-    break;
-   case 48: /*PromptAndCollectUserInformation*/
-    offset=dissect_inap_ReceivedInformationArg(FALSE, tvb, offset, actx, tree, -1);
-    break;
-  default:
-    proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnResultData blob");
-  }
-  return offset;
-}
-/* From GSMMAP TODO find out if there is ERROR parameters */
-static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx) {
-  proto_item *cause;
-       
-  switch(errorCode){
-  default:
-    cause=proto_tree_add_text(tree, tvb, offset, -1, "Unknown returnErrorData blob");
-    proto_item_set_expert_flags(cause, PI_MALFORMED, PI_WARN);
-    expert_add_info_format(actx->pinfo, cause, PI_MALFORMED, PI_WARN, "Unknown invokeData %d",errorCode);
-    break;
-  }
-  return offset;
-}
 
 static guint8 inap_pdu_type = 0;
 static guint8 inap_pdu_size = 0;
@@ -393,11 +129,10 @@ dissect_inap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
     proto_item         *item=NULL;
     proto_tree         *tree=NULL;
        int                             offset = 0;
+       asn1_ctx_t asn1_ctx;
+       asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
 
-    if (check_col(pinfo->cinfo, COL_PROTOCOL))
-    {
-       col_set_str(pinfo->cinfo, COL_PROTOCOL, "INAP");
-    }
+    col_set_str(pinfo->cinfo, COL_PROTOCOL, "INAP");
 
     /* create display subtree for the protocol */
     if(parent_tree){
@@ -408,7 +143,7 @@ dissect_inap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
        /* Get the length and add 2 */
        inap_pdu_size = tvb_get_guint8(tvb, offset+1)+2;
        opcode = 0;
-    dissect_Component_PDU(tvb, pinfo, tree);
+    offset = dissect_inap_ROS(TRUE, tvb, offset, &asn1_ctx, tree, -1);
 
 
 }
@@ -430,21 +165,23 @@ static void range_add_callback(guint32 ssn)
 
 void proto_reg_handoff_inap(void) {
 
-    static int inap_prefs_initialized = FALSE;
-    
-    inap_handle = create_dissector_handle(dissect_inap, proto_inap);
-       
+    static gboolean inap_prefs_initialized = FALSE;
+    static range_t *ssn_range;
+
     if (!inap_prefs_initialized) {
            inap_prefs_initialized = TRUE;
+           inap_handle = find_dissector("inap");
+           oid_add_from_string("Core-INAP-CS1-Codes","0.4.0.1.1.0.3.0");
     }
     else {
            range_foreach(ssn_range, range_delete_callback);
+            g_free(ssn_range);
     }
 
-    g_free(ssn_range);
     ssn_range = range_copy(global_ssn_range);
 
     range_foreach(ssn_range, range_add_callback);
+
 }
 
 
@@ -453,7 +190,7 @@ void proto_register_inap(void) {
   /* List of fields */
   static hf_register_info hf[] = {
 
-         
+
 
 #include "packet-inap-hfarr.c"
   };
@@ -467,6 +204,7 @@ void proto_register_inap(void) {
   static gint *ett[] = {
     &ett_inap,
        &ett_inapisup_parameter,
+       &ett_inap_HighLayerCompatibility,
 #include "packet-inap-ettarr.c"
   };
 
@@ -476,15 +214,14 @@ void proto_register_inap(void) {
   /* Register fields and subtrees */
   proto_register_field_array(proto_inap, hf, array_length(hf));
   proto_register_subtree_array(ett, array_length(ett));
-  
+
   /* Set default SSNs */
   range_convert_str(&global_ssn_range, "106,241", MAX_SSN);
-  ssn_range = range_empty();
-  
+
   inap_module = prefs_register_protocol(proto_inap, proto_reg_handoff_inap);
 
   prefs_register_obsolete_preference(inap_module, "tcap.itu_ssn");
+
   prefs_register_obsolete_preference(inap_module, "tcap.itu_ssn1");
 
   prefs_register_range_preference(inap_module, "ssn", "TCAP SSNs",