# tcap.cnf # tcap conformation file #.NO_EMIT ONLY_VALS PackageType #.OMIT_ASSIGNMENT # Removed as they are giving 'defined but not used' warnings currently. Priority #.END #--- OperationCode --- #.FN_PARS OperationCode VAL_PTR = &ansi_tcap_private.d.OperationCode OperationCode/private VAL_PTR = &ansi_tcap_private.d.OperationCode_private #.FN_FTR OperationCode ansi_tcap_private.d.OperationCode_item = actx->created_item; #.END #.FN_BODY OperationCode/national VAL_PTR = &ansi_tcap_private.d.OperationCode_national proto_tree *subtree; proto_item *spcifier_item; int start_offset = offset; guint8 family; guint8 specifier; %(DEFAULT_BODY)s /* mask off the H bit */ ansi_tcap_private.d.OperationCode_national = (ansi_tcap_private.d.OperationCode_national&0x7fff); subtree = proto_item_add_subtree(actx->created_item, ett_ansi_tcap_op_code_nat); /* Bit H is used to distinguish between Operations that require a reply and those that do not. A value of 1 * indicates that a reply is required; a value of 0 indicates that a reply is not required. */ family = (ansi_tcap_private.d.OperationCode_national & 0x7f00)>>8; specifier = (guint8)(ansi_tcap_private.d.OperationCode_national & 0xff); proto_tree_add_item(subtree, hf_ansi_tcap_bit_h, tvb, start_offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(subtree, hf_ansi_tcap_op_family, tvb, start_offset, 2, ENC_BIG_ENDIAN); spcifier_item = proto_tree_add_item(subtree, hf_ansi_tcap_op_specifier, tvb, start_offset, 2, ENC_BIG_ENDIAN); switch(family){ case 0: /* All Families ( Not used ) */ break; case 1: /* Parameter */ if(specifier== 1){ proto_item_append_text(spcifier_item, " Provide Value"); }else if (specifier== 2){ proto_item_append_text(spcifier_item, " Set Value"); } break; case 2: /* Charging */ if (specifier== 1){ proto_item_append_text(spcifier_item, " Bill Call"); } break; case 3: /* Provide Instructions */ if (specifier== 1){ proto_item_append_text(spcifier_item, " Start"); }else if (specifier== 2){ proto_item_append_text(spcifier_item, " Assist"); } break; case 4: /* Connection Control */ if (specifier== 1){ proto_item_append_text(spcifier_item, " Connect"); }else if (specifier== 2){ proto_item_append_text(spcifier_item, " Temporary Connect"); }else if (specifier== 3){ proto_item_append_text(spcifier_item, " Disconnect"); }else if (specifier== 4){ proto_item_append_text(spcifier_item, " Forward Disconnect"); } break; default: break; } #--- INVOKE --- #.FN_BODY Invoke/parameter if(find_tcap_subdissector(tvb, actx, tree)) offset = tvb_reported_length(tvb); #.FN_HDR Invoke ansi_tcap_private.d.pdu = 1; #--- RETURN RESULT --- #.FIELD_ATTR #.FN_BODY ReturnResult/parameter if(find_tcap_subdissector(tvb, actx, tree)) offset = tvb_reported_length(tvb); #.FN_HDR ReturnResult ansi_tcap_private.d.pdu = 2; #--- RETURN ERROR --- #.FN_BODY ReturnError/parameter if(find_tcap_subdissector(tvb, actx, tree)) offset = tvb_reported_length(tvb); #.FN_HDR ReturnError ansi_tcap_private.d.pdu = 3; #--- ObjectIDApplicationContext -- #.FN_BODY ObjectIDApplicationContext FN_VARIANT = _str VAL_PTR = &oid_str static const char * oid_str; %(DEFAULT_BODY)s ansi_tcap_private.objectApplicationId_oid= (const void*) oid_str; ansi_tcap_private.oid_is_present=TRUE; #.FN_HDR PackageType/unidirectional gp_tcapsrt_info->ope=TC_ANSI_ALL; col_set_str(actx->pinfo->cinfo, COL_INFO, "unidirectional "); #.FN_HDR PackageType/queryWithPerm gp_tcapsrt_info->ope=TC_ANSI_ALL; col_set_str(actx->pinfo->cinfo, COL_INFO, "queryWithPerm "); #.FN_HDR PackageType/queryWithoutPerm gp_tcapsrt_info->ope=TC_ANSI_ALL; col_set_str(actx->pinfo->cinfo, COL_INFO, "queryWithoutPerm "); #.FN_HDR PackageType/response gp_tcapsrt_info->ope=TC_ANSI_ALL; col_set_str(actx->pinfo->cinfo, COL_INFO, "response "); #.FN_HDR PackageType/conversationWithPerm gp_tcapsrt_info->ope=TC_ANSI_ALL; col_set_str(actx->pinfo->cinfo, COL_INFO, "conversationWithPerm "); #.FN_HDR PackageType/conversationWithoutPerm gp_tcapsrt_info->ope=TC_ANSI_ALL; col_set_str(actx->pinfo->cinfo, COL_INFO, "conversationWithoutPerm "); #.FN_HDR PackageType/abort gp_tcapsrt_info->ope=TC_ANSI_ABORT; col_set_str(actx->pinfo->cinfo, COL_INFO, "Abort "); #.FN_BODY TransactionID/_untag VAL_PTR = &next_tvb tvbuff_t *next_tvb; guint8 len; %(DEFAULT_BODY)s if(next_tvb) { len = tvb_reported_length_remaining(next_tvb, 0); if(len !=0){ /* 0 octets for the Unidirectional, * 4 octets for Query, Response & Abort * 8 octets for Conversation in the order Originating then Responding TID * * In order to match this it seems like we should only use the last 4 octets * in the 8 octets case. */ if (len > 4){ ansi_tcap_private.TransactionID_str = tvb_bytes_to_str(wmem_packet_scope(), next_tvb, 4,len-4); }else{ ansi_tcap_private.TransactionID_str = tvb_bytes_to_str(wmem_packet_scope(), next_tvb, 0,len); } } switch(len) { case 1: gp_tcapsrt_info->src_tid=tvb_get_guint8(next_tvb, 0); break; case 2: gp_tcapsrt_info->src_tid=tvb_get_ntohs(next_tvb, 0); break; case 4: gp_tcapsrt_info->src_tid=tvb_get_ntohl(next_tvb, 0); break; default: gp_tcapsrt_info->src_tid=0; break; } } #.END