Files
ocs/plat/xapp/src/mapp/is41_coding.c
2025-03-03 11:01:26 +08:00

491 lines
19 KiB
C

/* MAP Update Location c file */
/* created by daniel zhang 2004-06-17 */
/* last modufy by xinyu yan 2006-05-15 */
/* ------------------------------------ */
#include "map_includes.h"
#include "map_code.h"
/* external functions */
void is41_debug(DWORD mask, const char *fmt, ...);
void is41_showbuf(DWORD mask, BYTE *buf, int len);
static int (*is41_assign_arg[128]) ();
static int (*is41_assign_rsp[128]) ();
static int (*is41_extract_arg[128]) ();
static int (*is41_extract_rsp[128]) ();
static char is41_opr_string[128][48] = {
"",
"HandoffMeasurementRequest",
"FacilitiesDirective",
"MobileOnChannel",
"HandoffBack",
"FacilitiesRelease",
"QualificationRequest",
"QualificationDirective",
"Blocking",
"Unblocking",
"ResetCircuit",
"TrunkTest",
"TrunkTestDisconnect",
"RegistrationNotification",
"RegistrationCancellation",
"LocationRequest",
"RoutingRequest",
"FeatureRequest",
"ServiceProfileRequest",
"ServiceProfileDirective",
"UnreliableRoamerDataDirective",
"CallDataREquest",
"MSInactive",
"TransferToNumberRequest",
"RedirectionRequest",
"HandoffToThird",
"FlashRequest",
"AuthenticationDirective",
"AuthenticationRequest",
"BaseStationChallenge",
"AuthenticationFailureReport",
"CountRequest",
"InterSystemPage",
"UnsolicitedResponse",
"BulkDeregistration",
"HandoffMeasurementRequest2",
"FacilitiesDirective2",
"HandoffBack2",
"HandoffToThird2",
"AuthenticationDirectiveForward",
"AuthenticationStatusReport",
"InformationBackward",
"InformationDirective",
"InformationForward",
"InterSystemAnswer",
"InterSystemPage2",
"InterSystemSetup",
"OriginationRequest",
"RandomVariableRequest",
"RedirectionDirective",
"RemoteUserInteractionDirective",
"SMSDeliveryBackward",
"SMSDeliveryForward",
"SMSDeliveryPointToPoint",
"SMSNotification",
"SMSRequest",
"", "", "", "", "", "", "", "",
"AnalyzedInformation",
"ConnectionFailureReport",
"ConnectResource",
"DisconnectResource",
"FacilitySelectedAndAvailable",
"InstructionRequest",
"Modify",
"ResetTimer",
"Search",
"SeizeResource",
"SRFDirective",
"TBusy",
"TNoAnswer",
"", "", "",
"BulkDisconnection",
"CallControlDirective",
"OAnswer",
"ODisconnect",
"CallRecoveryReport",
"TAnswer",
"TDisconnect",
"UnreliableCallData",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
"ShortMessageAnalyzed",
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
};
void is41_register_encode_arg(u8 opr_code, int (*func)())
{
is41_assign_arg[opr_code] = func;
}
void is41_register_encode_rsp(u8 opr_code, int (*func)())
{
is41_assign_rsp[opr_code] = func;
}
void is41_register_decode_arg(u8 opr_code, int (*func)())
{
is41_extract_arg[opr_code] = func;
}
void is41_register_decode_rsp(u8 opr_code, int (*func)())
{
is41_extract_rsp[opr_code] = func;
}
void init_assignFunc_pointer()
{
is41_register_encode_arg(IS41OPR_AuthenticationDirective, assign_is41AuthenticationDirective_arg);
is41_register_encode_rsp(IS41OPR_AuthenticationDirective, assign_is41AuthenticationDirective_rsp);
is41_register_encode_arg(IS41OPR_AuthenticationFailureReport, assign_is41AuthenticationFailureReport_arg);
is41_register_encode_rsp(IS41OPR_AuthenticationFailureReport, assign_is41AuthenticationFailureReport_rsp);
is41_register_encode_arg(IS41OPR_AuthenticationRequest, assign_is41AuthenticationRequest_arg);
is41_register_encode_rsp(IS41OPR_AuthenticationRequest, assign_is41AuthenticationRequest_rsp);
is41_register_encode_arg(IS41OPR_AuthenticationStatusReport, assign_is41AuthenticationStatusReport_arg);
is41_register_encode_rsp(IS41OPR_AuthenticationStatusReport, assign_is41AuthenticationStatusReport_rsp);
is41_register_encode_arg(IS41OPR_AuthenticationDirectiveForward, assign_is41AuthenticationDirectiveForward_arg);
is41_register_encode_arg(IS41OPR_BaseStationChallenge, assign_is41BaseStationChallenge_arg);
is41_register_encode_rsp(IS41OPR_BaseStationChallenge, assign_is41BaseStationChallenge_rsp);
is41_register_encode_arg(IS41OPR_CountRequest, assign_is41CountRequest_arg);
is41_register_encode_rsp(IS41OPR_CountRequest, assign_is41CountRequest_rsp);
is41_register_encode_arg(IS41OPR_SMSDeliveryBackward, assign_Is41SmsDeliveryBackward_arg);
is41_register_encode_rsp(IS41OPR_SMSDeliveryBackward, assign_Is41SmsDeliveryBackward_rsp);
is41_register_encode_arg(IS41OPR_SMSDeliveryForward, assign_Is41SmsDeliveryForward_arg);
is41_register_encode_rsp(IS41OPR_SMSDeliveryForward, assign_Is41SmsDeliveryForward_rsp);
is41_register_encode_arg(IS41OPR_SMSDeliveryPointToPoint, assign_Is41SmsDeliveryPointToPoint_arg);
is41_register_encode_rsp(IS41OPR_SMSDeliveryPointToPoint, assign_Is41SmsDeliveryPointToPoint_rsp);
is41_register_encode_arg(IS41OPR_SMSNotification, assign_Is41SmsNotification_arg);
is41_register_encode_rsp(IS41OPR_SMSNotification, assign_Is41SmsNotification_rsp);
is41_register_encode_arg(IS41OPR_SMSRequest, assign_Is41SmsRequest_arg);
is41_register_encode_rsp(IS41OPR_SMSRequest, assign_Is41SmsRequest_rsp);
is41_register_encode_arg(IS41OPR_RegistrationNotification, assign_is41RegistrationNotification_arg);
is41_register_encode_rsp(IS41OPR_RegistrationNotification, assign_is41RegistrationNotification_rsp);
is41_register_encode_arg(IS41OPR_RegistrationCancellation, assign_is41RegistrationCancellation_arg);
is41_register_encode_rsp(IS41OPR_RegistrationCancellation, assign_is41RegistrationCancellation_rsp);
is41_register_encode_arg(IS41OPR_LocationRequest, assign_is41LocationRequest_arg);
is41_register_encode_rsp(IS41OPR_LocationRequest, assign_is41LocationRequest_rsp);
is41_register_encode_arg(IS41OPR_RoutingRequest, assign_is41RoutingRequest_arg);
is41_register_encode_rsp(IS41OPR_RoutingRequest, assign_is41RoutingRequest_rsp);
is41_register_encode_arg(IS41OPR_MSInactive, assign_is41MSInactive_arg);
is41_register_encode_rsp(IS41OPR_MSInactive, assign_is41MSInactive_rsp);
is41_register_encode_arg(IS41OPR_FeatureRequest, assign_is41FeatureRequest_arg);
is41_register_encode_rsp(IS41OPR_FeatureRequest, assign_is41FeatureRequest_rsp);
is41_register_encode_arg(IS41OPR_QualificationDirective, assign_is41QualificationDirective_arg);
is41_register_encode_rsp(IS41OPR_QualificationDirective, assign_is41QualificationDirective_rsp);
is41_register_encode_arg(IS41OPR_TransferToNumberRequest, assign_is41TransferToNumberRequest_arg);
is41_register_encode_rsp(IS41OPR_TransferToNumberRequest, assign_is41TransferToNumberRequest_rsp);
is41_register_encode_arg(IS41OPR_RedirectionRequest, assign_is41RedirectionRequest_arg);
is41_register_encode_rsp(IS41OPR_RedirectionRequest, assign_is41RedirectionRequest_rsp);
is41_register_encode_arg(IS41OPR_OriginationRequest, assign_is41OriginationRequest_arg);
is41_register_encode_rsp(IS41OPR_OriginationRequest, assign_is41OriginationRequest_rsp);
is41_register_encode_arg(IS41OPR_AnalyzedInformation, assign_is41AnalyzedInformation_arg);
is41_register_encode_rsp(IS41OPR_AnalyzedInformation, assign_is41AnalyzedInformation_rsp);
is41_register_encode_arg(IS41OPR_OAnswer, assign_is41OAnswer_arg);
is41_register_encode_arg(IS41OPR_ODisconnect, assign_is41ODisconnect_arg);
is41_register_encode_rsp(IS41OPR_ODisconnect, assign_is41ODisconnect_rsp);
is41_register_encode_arg(IS41OPR_TAnswer, assign_is41TAnswer_arg);
is41_register_encode_arg(IS41OPR_TDisconnect, assign_is41TDisconnect_arg);
is41_register_encode_rsp(IS41OPR_TDisconnect, assign_is41TDisconnect_rsp);
is41_register_encode_arg(IS41OPR_CallControlDirective, assign_is41CallControlDirective_arg);
is41_register_encode_rsp(IS41OPR_CallControlDirective, assign_is41CallControlDirective_rsp);
is41_register_encode_arg(IS41OPR_SeizeResource, assign_is41SeizeResource_arg);
is41_register_encode_rsp(IS41OPR_SeizeResource, assign_is41SeizeResource_rsp);
is41_register_encode_arg(IS41OPR_ConnectResource, assign_is41ConnectResource_arg);
is41_register_encode_arg(IS41OPR_SRFDirective, assign_is41SRFDirective_arg);
is41_register_encode_rsp(IS41OPR_SRFDirective, assign_is41SRFDirective_rsp);
is41_register_encode_arg(IS41OPR_ShortMessageAnalyzed, assign_is41ShortMessageAnalyzed_arg);
is41_register_encode_rsp(IS41OPR_ShortMessageAnalyzed, assign_is41ShortMessageAnalyzed_rsp);
}
void init_extractFunc_pointer()
{
is41_register_decode_arg(IS41OPR_AuthenticationDirective, extract_is41AuthenticationDirective_arg);
is41_register_decode_rsp(IS41OPR_AuthenticationDirective, extract_is41AuthenticationDirective_rsp);
is41_register_decode_arg(IS41OPR_AuthenticationFailureReport, extract_is41AuthenticationFailureReport_arg);
is41_register_decode_rsp(IS41OPR_AuthenticationFailureReport, extract_is41AuthenticationFailureReport_rsp);
is41_register_decode_arg(IS41OPR_AuthenticationRequest, extract_is41AuthenticationRequest_arg);
is41_register_decode_rsp(IS41OPR_AuthenticationRequest, extract_is41AuthenticationRequest_rsp);
is41_register_decode_arg(IS41OPR_AuthenticationStatusReport, extract_is41AuthenticationStatusReport_arg);
is41_register_decode_rsp(IS41OPR_AuthenticationStatusReport, extract_is41AuthenticationStatusReport_rsp);
is41_register_decode_arg(IS41OPR_AuthenticationDirectiveForward, extract_is41AuthenticationDirectiveForward_arg);
is41_register_decode_arg(IS41OPR_BaseStationChallenge, extract_is41BaseStationChallenge_arg);
is41_register_decode_rsp(IS41OPR_BaseStationChallenge, extract_is41BaseStationChallenge_rsp);
is41_register_decode_arg(IS41OPR_CountRequest, extract_is41CountRequest_arg);
is41_register_decode_rsp(IS41OPR_CountRequest, extract_is41CountRequest_rsp);
is41_register_decode_arg(IS41OPR_SMSDeliveryBackward, extract_Is41SmsDeliveryBackward_arg);
is41_register_decode_rsp(IS41OPR_SMSDeliveryBackward, extract_Is41SmsDeliveryBackward_rsp);
is41_register_decode_arg(IS41OPR_SMSDeliveryForward, extract_Is41SmsDeliveryForward_arg);
is41_register_decode_rsp(IS41OPR_SMSDeliveryForward, extract_Is41SmsDeliveryForward_rsp);
is41_register_decode_arg(IS41OPR_SMSDeliveryPointToPoint, extract_Is41SmsDeliveryPointToPoint_arg);
is41_register_decode_rsp(IS41OPR_SMSDeliveryPointToPoint, extract_Is41SmsDeliveryPointToPoint_rsp);
is41_register_decode_arg(IS41OPR_SMSNotification, extract_Is41SmsNotification_arg);
is41_register_decode_rsp(IS41OPR_SMSNotification, extract_Is41SmsNotification_rsp);
is41_register_decode_arg(IS41OPR_SMSRequest, extract_Is41SmsRequest_arg);
is41_register_decode_rsp(IS41OPR_SMSRequest, extract_Is41SmsRequest_rsp);
is41_register_decode_arg(IS41OPR_RegistrationNotification, extract_is41RegistrationNotification_arg);
is41_register_decode_rsp(IS41OPR_RegistrationNotification, extract_is41RegistrationNotification_rsp);
is41_register_decode_arg(IS41OPR_RegistrationCancellation, extract_is41RegistrationCancellation_arg);
is41_register_decode_rsp(IS41OPR_RegistrationCancellation, extract_is41RegistrationCancellation_rsp);
is41_register_decode_arg(IS41OPR_LocationRequest, extract_is41LocationRequest_arg);
is41_register_decode_rsp(IS41OPR_LocationRequest, extract_is41LocationRequest_rsp);
is41_register_decode_arg(IS41OPR_RoutingRequest, extract_is41RoutingRequest_arg);
is41_register_decode_rsp(IS41OPR_RoutingRequest, extract_is41RoutingRequest_rsp);
is41_register_decode_arg(IS41OPR_MSInactive, extract_is41MSInactive_arg);
is41_register_decode_rsp(IS41OPR_MSInactive, extract_is41MSInactive_rsp);
is41_register_decode_arg(IS41OPR_FeatureRequest, extract_is41FeatureRequest_arg);
is41_register_decode_rsp(IS41OPR_FeatureRequest, extract_is41FeatureRequest_rsp);
is41_register_decode_arg(IS41OPR_QualificationDirective, extract_is41QualificationDirective_arg);
is41_register_decode_rsp(IS41OPR_QualificationDirective, extract_is41QualificationDirective_rsp);
is41_register_decode_arg(IS41OPR_TransferToNumberRequest, extract_is41TransferToNumberRequest_arg);
is41_register_decode_rsp(IS41OPR_TransferToNumberRequest, extract_is41TransferToNumberRequest_rsp);
is41_register_decode_arg(IS41OPR_RedirectionRequest, extract_is41RedirectionRequest_arg);
is41_register_decode_rsp(IS41OPR_RedirectionRequest, extract_is41RedirectionRequest_rsp);
is41_register_decode_arg(IS41OPR_OriginationRequest, extract_is41OriginationRequest_arg);
is41_register_decode_rsp(IS41OPR_OriginationRequest, extract_is41OriginationRequest_rsp);
is41_register_decode_arg(IS41OPR_AnalyzedInformation, extract_is41AnalyzedInformation_arg);
is41_register_decode_rsp(IS41OPR_AnalyzedInformation, extract_is41AnalyzedInformation_rsp);
is41_register_decode_arg(IS41OPR_OAnswer, extract_is41OAnswer_arg);
is41_register_decode_arg(IS41OPR_ODisconnect, extract_is41ODisconnect_arg);
is41_register_decode_rsp(IS41OPR_ODisconnect, extract_is41ODisconnect_rsp);
is41_register_decode_arg(IS41OPR_TAnswer, extract_is41TAnswer_arg);
is41_register_decode_arg(IS41OPR_TDisconnect, extract_is41TDisconnect_arg);
is41_register_decode_rsp(IS41OPR_TDisconnect, extract_is41TDisconnect_rsp);
is41_register_decode_arg(IS41OPR_CallControlDirective, extract_is41CallControlDirective_arg);
is41_register_decode_rsp(IS41OPR_CallControlDirective, extract_is41CallControlDirective_rsp);
is41_register_decode_arg(IS41OPR_SeizeResource, extract_is41SeizeResource_arg);
is41_register_decode_rsp(IS41OPR_SeizeResource, extract_is41SeizeResource_rsp);
is41_register_decode_arg(IS41OPR_ConnectResource, extract_is41ConnectResource_arg);
is41_register_decode_arg(IS41OPR_SRFDirective, extract_is41SRFDirective_arg);
is41_register_decode_rsp(IS41OPR_SRFDirective, extract_is41SRFDirective_rsp);
is41_register_decode_arg(IS41OPR_ShortMessageAnalyzed, extract_is41ShortMessageAnalyzed_arg);
is41_register_decode_rsp(IS41OPR_ShortMessageAnalyzed, extract_is41ShortMessageAnalyzed_rsp);
}
int is41_u8Type_to_charType(u8 type,char *cType)
{
if(type >= 128)
return 0;
else if(strlen(is41_opr_string[type]) == 0)
return 0;
strcpy(cType, is41_opr_string[type]);
return 1;
}
/*int is41_u8Type_to_charType(u8 type,char *cType)
{
switch (type)
{
// Authentication service operation
case IS41OPR_AuthenticationDirective:
sprintf(cType,"AuthenticationDirective");
break;
case IS41OPR_AuthenticationFailureReport:
sprintf(cType,"AuthenticationFailureReport");
break;
case IS41OPR_AuthenticationRequest:
sprintf(cType,"AuthenticationRequest");
break;
case IS41OPR_AuthenticationStatusReport:
sprintf(cType,"AuthenticationStatusReport");
break;
case IS41OPR_AuthenticationDirectiveForward:
sprintf(cType,"AuthenticationDirectiveForward");
break;
case IS41OPR_CountRequest:
sprintf(cType,"CountRequest");
break;
case IS41OPR_BaseStationChallenge:
sprintf(cType,"BaseStationChallenge");
break;
case IS41OPR_SMSDeliveryBackward:
sprintf(cType,"SMSDeliveryBackward");
break;
case IS41OPR_SMSDeliveryForward:
sprintf(cType,"SMSDeliveryForward");
break;
case IS41OPR_SMSDeliveryPointToPoint:
sprintf(cType,"SMSDeliveryPointToPoint");
break;
case IS41OPR_SMSNotification:
sprintf(cType,"IS41OPR_SMSNotification");
break;
case IS41OPR_SMSRequest:
sprintf(cType,"SMSRequest");
break;
case IS41OPR_RegistrationNotification:
sprintf(cType,"REGNOT");
break;
case IS41OPR_RegistrationCancellation:
sprintf(cType,"REGCANC");
break;
case IS41OPR_LocationRequest:
sprintf(cType,"LOCREQ");
break;
case IS41OPR_RoutingRequest:
sprintf(cType,"ROUTREQ");
break;
case IS41OPR_MSInactive:
sprintf(cType,"MSINACT");
break;
case IS41OPR_FeatureRequest:
sprintf(cType,"FEATREQ");
break;
case IS41OPR_QualificationDirective:
sprintf(cType,"QUALDIR");
break;
case IS41OPR_TransferToNumberRequest:
sprintf(cType,"TRANUMREQ");
break;
case IS41OPR_RedirectionRequest:
sprintf(cType,"REDREQ");
break;
default: // unknown operation
// sprintf(info_str,"MAPP error:the operation is unknown:%d",opr_ptr->message_type);
// xap_send_error(info_str);
return 0;
}
return 1;
}*/
int build_is41param(struct MapOprSrv_struct *opr_ptr,u8 *buf) // build is41 service paramter
{
ASN_BUF asn_buf;
u8 seq_flag=1;
int param_len = 0;
u8 info_str[1024];
char charName[128];
if (opr_ptr == NULL || buf == NULL)
return 0;
if (!is41_u8Type_to_charType(opr_ptr->message_type,charName))
{
is41_debug(IS41DB_ENCODE,"[IS41-Encode]Building param,Operation code:%d not correct",opr_ptr->message_type);
return 0;
}
if (opr_ptr->message_flag == MAP_REQUEST)
{
is41_debug(IS41DB_ENCODE,"[IS41-Encode] MAP_REQUEST,OPRType=%s",charName);
param_len = (*is41_assign_arg[opr_ptr->message_type]) (opr_ptr,buf);
}
else if (opr_ptr->message_flag == MAP_RESPONSE)
{
is41_debug(IS41DB_ENCODE,"[IS41-Encode] MAP_RESPONSE,OPRType=%s",charName);
param_len = (*is41_assign_rsp[opr_ptr->message_type])(opr_ptr,buf);
}
else
return 0;
if (seq_flag == 1 && param_len > 0)
{
memcpy(info_str,buf,param_len%1024);
AsnEncode(buf,256,&asn_buf);
param_len = AddTLV(SET_NATIONAL,param_len,info_str,0xe0,&asn_buf);
is41_debug(IS41DB_ENCODE,"[IS41-Encode] Completed,len=%d",param_len);
is41_showbuf(IS41DB_ENCODE,buf,param_len);
}
else
{
AsnEncode(buf,256,&asn_buf);
param_len = AddTLV(SET_NATIONAL,0,info_str,0xc0,&asn_buf);
is41_debug(IS41DB_ENCODE,"[IS41-Encode] Completed,paramlen=0");
is41_showbuf(IS41DB_ENCODE,buf,param_len);
}
return param_len;
}
u8 extract_is41param(struct MapOprSrv_struct *opr_ptr,u8 opr_code,u8 opr_flag,u32 pre_param_len,u8 *pre_param)
{
ASN_BUF asn_buf;
// u8 info_str[1024];
u8 param[1024];
int param_len;
char charName[128];
asn_decode(pre_param,1,&asn_buf);
param_len = get_tlv(SET_NATIONAL,param,&asn_buf);
if (param_len == -1) // not has sequence id
{
param_len = pre_param_len;
memcpy(param,pre_param,param_len);
}
if (!is41_u8Type_to_charType(opr_code,charName))
{
is41_debug(IS41DB_ENCODE,"[IS41-Encode]Extracting param,Operation code:%d not correct",opr_code);
return 0;
}
if (opr_flag == MAP_INDICATE)
{
is41_debug(IS41DB_DECODE,"[IS41-Decode]USER->IS41P,IS41_INDICATE,OPRType=%s",charName);
is41_showbuf(IS41DB_DECODE,param,param_len);
if (*is41_extract_arg[opr_code] != NULL)
{
return (*is41_extract_arg[opr_code])(opr_ptr,param_len,param);
}
else
{
is41_debug(IS41DB_ERR,"[IS41-Decode]No decode function for IS41_INDICATE opr_code=%d",opr_code);
return 0;
}
}
else if (opr_flag == MAP_CONFIRM)
{
is41_debug(IS41DB_DECODE,"[IS41-Decode]USER->IS41P,MAP_CONFIRM,OPRType=%s",charName);
is41_showbuf(IS41DB_DECODE,param,param_len);
if (*is41_extract_rsp[opr_code] != NULL)
return (*is41_extract_rsp[opr_code])(opr_ptr,param_len,param);
else
{
is41_debug(IS41DB_ERR,"[IS41-Decode]No decode function for IS41_CONFIRM opr_code=%d",opr_code);
return 0;
}
}
return 1;
}