summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/map_operations.hrl101
-rw-r--r--src/map_helper.erl109
2 files changed, 209 insertions, 1 deletions
diff --git a/include/map_operations.hrl b/include/map_operations.hrl
new file mode 100644
index 0000000..f28fcbe
--- /dev/null
+++ b/include/map_operations.hrl
@@ -0,0 +1,101 @@
+% from MAP-MobileServiceOperations.asn 3GPP TS 29.002 V9.3.0 (2010-09)
+-define(MAP_OP_UPDATE_LOCATION, 2).
+-define(MAP_OP_CANCEL_LOCATION, 3).
+-define(MAP_OP_PURGE_MS, 67).
+-define(MAP_OP_SEND_IDENTIFICATION, 55).
+-define(MAP_OP_UPDATE_GRPS_LOCATION, 23).
+-define(MAP_OP_PROVIDE_SUBSCR_INFO, 70).
+-define(MAP_OP_ANYTIME_INTERROGATION, 71).
+-define(MAP_OP_ANYTIME_SUBSCR_INTERR, 62).
+-define(MAP_OP_ANYTIME_MODIFICATION, 65).
+-define(MAP_OP_NOTE_SUBSCR_DAT_MODIF, 5).
+-define(MAP_OP_PREPARE_HANDOVER, 68).
+-define(MAP_OP_SEND_END_SIGNAL, 29).
+-define(MAP_OP_PROC_ACC_SIGNALLING, 33).
+-define(MAP_OP_FWD_ACC_SIGNALLING, 34).
+-define(MAP_OP_PREPARE_SUBSEQ_HO, 69).
+-define(MAP_OP_SEND_AUTH_INFO, 56).
+-define(MAP_OP_AUTH_FAIL_REPORT, 15).
+-define(MAP_OP_CHECK_IMEI, 43).
+-define(MAP_OP_INSERT_SUBSCR_DATA, 7).
+-define(MAP_OP_DELETE_SUBSCR_DATA, 8).
+-define(MAP_OP_RESET, 37).
+-define(MAP_OP_FW_CHECK_SS, 38).
+-define(MAP_OP_RESTORE_DATA, 57).
+-define(MAP_OP_SRI_FOR_GPRS, 24).
+-define(MAP_OP_FAILURE_REPORT, 25).
+-define(MAP_OP_NOTE_MS_PRESENT_GPRS, 26).
+-define(MAP_OP_NOTE_MM_EVENT, 89).
+
+% from ShortMessageOperations.asn
+-define(MAP_OP_SRI_FOR_SM, 45).
+-define(MAP_OP_MO_FORWARD_SM, 46).
+-define(MAP_OP_MT_FORWARD_SM, 44).
+-define(MAP_OP_REPORT_SM_DEL_STATUS, 47).
+-define(MAP_OP_NOTE_SUBSCR_PRESENT, 48).
+-define(MAP_OP_ALERT_SC_NO_RESULT, 49).
+-define(MAP_OP_ALERT_SC, 64).
+-define(MAP_OP_INFORM_SC, 63).
+-define(MAP_OP_READY_FOR_SM, 66).
+-define(MAP_OP_MT_FW_SMS_VGCS, 21).
+
+% from SS-Operations.asn 3GPP TS 24.080 V9.1.0
+-define(MAP_OP_NOTIFY_SS, 16).
+-define(MAP_OP_PROC_USS_DATA, 19).
+-define(MAP_OP_LCS_PER_LOC_CANCEL, 109).
+-define(MAP_OP_LCS_LOC_UPD, 110).
+-define(MAP_OP_LCS_PER_LOC_REQ, 111).
+-define(MAP_OP_LCS_AREA_EVT_CANCEL, 112).
+-define(MAP_OP_LCS_AREA_EVT_REP, 113).
+-define(MAP_OP_LCS_AREA_EVT_REQ, 114).
+-define(MAP_OP_LCS_MOLR, 115).
+-define(MAP_OP_LCS_LOC_NOTIF, 116).
+-define(MAP_OP_CALL_DEFLECTION, 117).
+-define(MAP_OP_USER_USER_SVC, 118).
+-define(MAP_OP_ACC_REG_CC_ENTRY, 119).
+-define(MAP_OP_FW_CUG_INFO, 120).
+-define(MAP_OP_SPLIT_MPTY, 121).
+-define(MAP_OP_RETR_MPTY, 122).
+-define(MAP_OP_HOLD_MPTY, 123).
+-define(MAP_OP_BUILD_MPTY, 124).
+-define(MAP_OP_FW_CHG_ADVICE, 125).
+-define(MAP_OP_EXPLICIT_CT, 126).
+
+% from SupplementaryServiceOperations.asn
+-define(MAP_OP_REGISTER_SS, 10).
+-define(MAP_OP_ERASE_SS, 11).
+-define(MAP_OP_ACTIVATE_SS, 12).
+-define(MAP_OP_DEACTIVATE_SS, 13).
+-define(MAP_OP_INTERROGATE_SS, 14).
+-define(MAP_OP_PROC_USS_REQ, 59).
+-define(MAP_OP_USS_REQ, 60).
+-define(MAP_OP_USS_NOTIFY, 61).
+-define(MAP_OP_REGISTER_PW, 17).
+-define(MAP_OP_GET_PW, 18).
+-define(MAP_OP_SS_INVOC_NOTIF, 72).
+-define(MAP_OP_REGISTER_CC_ENTRY, 76).
+-define(MAP_OP_ERASE_CC_ENTRY, 77).
+
+% from MAP-CallHandlingOperations.asn
+-define(MAP_OP_SEND_ROUTING_INFO, 22).
+-define(MAP_OP_PROVIDE_ROAMING_NR, 4).
+-define(MAP_OP_RESUME_CALL_HANDLING, 6).
+-define(MAP_OP_SET_REPORTING_STATE, 73).
+-define(MAP_OP_STATUS_REPORT, 74).
+-define(MAP_OP_REMOTE_USER_FREE, 75).
+-define(MAP_OP_IST_ALERT, 87).
+-define(MAP_OP_IST_COMMAND, 88).
+-define(MAP_OP_RELEASE_RESOURCES, 20).
+
+% from MAP-LocationServiceOperations.asn
+-define(MAP_OP_SRI_FOR_LCS, 85).
+-define(MAP_OP_PROV_SUBSCR_LOC, 83).
+-define(MAP_OP_SUBSCR_LOC_REPORT, 86).
+
+% FIXME: GroupCallOperations, OandMOperations, SecureTransportOperations
+
+% maximum values as gvin in TS 09.02 / 17.1.2
+-define(MAP_INV_TIMER_S, 10*1000).
+-define(MAP_INV_TIMER_M, 30*1000).
+-define(MAP_INV_TIMER_ML, 10*60*1000).
+-define(MAP_INV_TIMER_L, 38*60*60*1000).
diff --git a/src/map_helper.erl b/src/map_helper.erl
index 0ccbd72..f25a5f6 100644
--- a/src/map_helper.erl
+++ b/src/map_helper.erl
@@ -36,8 +36,10 @@
-include_lib("osmo_ss7/include/isup.hrl").
-include_lib("osmo_map/include/map.hrl").
+-include_lib("osmo_map/include/map_operations.hrl").
--export([postproc/2, postproc_gt/2, postproc_imsi/2, postproc_msisdn/2]).
+-export([postproc/2, postproc_gt/2, postproc_imsi/2, postproc_msisdn/2,
+ encode_op/3, decode_op/3, timer4op/1, class4op/1]).
postproc(M=#'UpdateLocationArg'{imsi = Imsi, 'msc-Number' = Msc, 'vlr-Number' = Vlr,
'v-gmlc-Address' = Gmlc}, Mode) ->
@@ -132,3 +134,108 @@ postproc_msisdn([], pre) ->
postproc_msisdn(In, pre) ->
map_codec:encode_map_tbcd(In).
+
+rec4op({local, ?MAP_OP_SEND_IDENTIFICATION}) -> 'UpdateLocation';
+rec4op({local, ?MAP_OP_CANCEL_LOCATION}) -> 'CancelLocation';
+rec4op({local, ?MAP_OP_PURGE_MS}) -> 'PurgeMS-';
+rec4op({local, ?MAP_OP_SEND_IDENTIFICATION}) -> 'SendIdentification';
+rec4op({local, ?MAP_OP_UPDATE_GRPS_LOCATION}) -> 'UpdateGprsLocation';
+rec4op({local, ?MAP_OP_PROVIDE_SUBSCR_INFO}) -> 'ProvideSubscriberInfo';
+rec4op({local, ?MAP_OP_ANYTIME_INTERROGATION}) -> 'AnyTimeInterrogation';
+rec4op({local, ?MAP_OP_ANYTIME_SUBSCR_INTERR}) -> 'AnyTimeSubscriptionInterrogation';
+rec4op({local, ?MAP_OP_ANYTIME_MODIFICATION}) -> 'AnyTimeModification';
+rec4op({local, ?MAP_OP_NOTE_SUBSCR_DAT_MODIF}) -> 'NoteSubscriberDataModified';
+rec4op({local, ?MAP_OP_PREPARE_HANDOVER}) -> 'PrepareHO-';
+rec4op({local, ?MAP_OP_SEND_END_SIGNAL}) -> 'SendEndSignal-';
+rec4op({local, ?MAP_OP_PROC_ACC_SIGNALLING}) -> 'ProcessAccessSignalling-';
+rec4op({local, ?MAP_OP_FWD_ACC_SIGNALLING}) -> 'ForwardAccessSignalling-';
+rec4op({local, ?MAP_OP_PREPARE_SUBSEQ_HO}) -> 'PrepareSubsequentHO-';
+rec4op({local, ?MAP_OP_SEND_AUTH_INFO}) -> 'SendAuthenticationInfo';
+rec4op({local, ?MAP_OP_AUTH_FAIL_REPORT}) -> 'AuthenticationFailureReport';
+rec4op({local, ?MAP_OP_CHECK_IMEI}) -> 'CheckIMEI-';
+rec4op({local, ?MAP_OP_INSERT_SUBSCR_DATA}) -> 'InsertSubscriberData';
+rec4op({local, ?MAP_OP_DELETE_SUBSCR_DATA}) -> 'DeleteSubscriberData';
+rec4op({local, ?MAP_OP_RESET}) -> 'Reset';
+rec4op({local, ?MAP_OP_FW_CHECK_SS}) -> {error, 'FIXME'};
+rec4op({local, ?MAP_OP_RESTORE_DATA}) -> 'RestoreData';
+rec4op({local, ?MAP_OP_SRI_FOR_GPRS}) -> 'SendRoutingInfoForGprs';
+rec4op({local, ?MAP_OP_FAILURE_REPORT}) -> 'FailureReport';
+rec4op({local, ?MAP_OP_NOTE_MS_PRESENT_GPRS}) -> 'NoteMsPresentForGprs';
+rec4op({local, ?MAP_OP_NOTE_MM_EVENT}) -> 'NoteMM-Event';
+rec4op({local, ?MAP_OP_SRI_FOR_SM}) -> 'SendRoutingInfo';
+rec4op({local, ?MAP_OP_MO_FORWARD_SM}) -> 'MO-ForwardSM-';
+rec4op({local, ?MAP_OP_MT_FORWARD_SM}) -> 'MT-ForwardSM-';
+rec4op({local, ?MAP_OP_REPORT_SM_DEL_STATUS}) -> 'ReportSM-DeliveryStatus';
+rec4op({local, ?MAP_OP_NOTE_SUBSCR_PRESENT}) -> {error, 'FIXME'};
+rec4op({local, ?MAP_OP_ALERT_SC_NO_RESULT}) -> {error, 'FIXME'};
+rec4op({local, ?MAP_OP_ALERT_SC}) -> 'AlertServiceCentre';
+rec4op({local, ?MAP_OP_INFORM_SC}) -> 'InformServiceCentre';
+rec4op({local, ?MAP_OP_READY_FOR_SM}) -> 'ReadyForSM-';
+rec4op({local, ?MAP_OP_MT_FW_SMS_VGCS}) -> 'MT-ForwardSM-VGCS-';
+% FIXME: SS-Operations.asn, SupplementaryServiceOperations, MAP-CallHandlingOperations, MAP-LocationServiceOperations
+
+argres(arg) -> "Arg";
+argres(argument) -> "Arg";
+argres(res) -> "Res";
+argres(result) -> "Res".
+
+decode_op(_, _, <<>>) ->
+ undefined;
+decode_op(_, _, []) ->
+ undefined;
+decode_op({local, Op}, ArgRes, Enc) when is_binary(Enc) or is_list(Enc) ->
+ case rec4op({local, Op}) of
+ {error, Err} ->
+ {error, Err};
+ TypePrefix ->
+ RecType = list_to_atom(TypePrefix ++ argres(ArgRes)),
+ map_only:decode(RecType, Enc)
+ end.
+
+encode_op({local, Op}, ArgRes, Dec) ->
+ case rec4op({local, Op}) of
+ {error, Err} ->
+ {error, Err};
+ TypePrefix ->
+ RecType = list_to_atom(TypePrefix ++ argres(ArgRes)),
+ map_only_encode(RecType, Dec)
+ end.
+
+timer4op({local, Op}) when is_integer(Op) ->
+ timer4op(Op);
+
+timer4op(?MAP_OP_SEND_IDENTIFICATION) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_SEND_END_SIGNAL) -> ?MAP_INV_TIMER_L;
+timer4op(?MAP_OP_PROC_ACC_SIGNALLING) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_FWD_ACC_SIGNALLING) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_FW_CHECK_SS) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_MO_FORWARD_SM) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_MT_FORWARD_SM) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_REPORT_SM_DEL_STATUS) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_ALERT_SC) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_INFORM_SC) -> ?MAP_INV_TIMER_S;
+timer4op(?MAP_OP_MT_FW_SMS_VGCS) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_PROC_USS_REQ) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_USS_REQ) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_USS_NOTIFY) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_REGISTER_PW) -> ?MAP_INV_TIMER_ML;
+timer4op(?MAP_OP_PROV_SUBSCR_LOC) -> ?MAP_INV_TIMER_ML;
+% FIXME: GroupCallOperations, OandMOperations, SecureTransportOperations
+timer4op(Op) when is_integer(Op) -> ?MAP_INV_TIMER_M.
+
+class4op({local, Op}) when is_integer(Op) ->
+ class4op(Op);
+class4op(?MAP_OP_SEND_END_SIGNAL) -> 3;
+class4op(?MAP_OP_PROC_ACC_SIGNALLING) -> 4;
+class4op(?MAP_OP_FWD_ACC_SIGNALLING) -> 4;
+class4op(?MAP_OP_RESET) -> 4;
+class4op(?MAP_OP_FW_CHECK_SS) -> 4;
+class4op(?MAP_OP_NOTE_SUBSCR_PRESENT) -> 4;
+class4op(?MAP_OP_ALERT_SC_NO_RESULT) -> 4;
+class4op(?MAP_OP_INFORM_SC) -> 4;
+class4op(?MAP_OP_NOTIFY_SS) -> 4;
+class4op(?MAP_OP_FW_CHG_ADVICE) -> 3;
+class4op(?MAP_OP_FW_CUG_INFO) -> 4;
+class4op(?MAP_OP_GET_PW) -> 3;
+% FIXME: GroupCallOperations, OandMOperations, SecureTransportOperations
+class4op(Op) when is_integer(Op) -> 1.