tcap_user: resolve CCO/DHA for all TC- primitives

This commit is contained in:
Harald Welte 2012-01-31 22:10:53 +01:00
parent 77d0ee7b13
commit 148d299b28
1 changed files with 55 additions and 4 deletions

View File

@ -62,20 +62,71 @@ get_or_start_dha(TCO, DialgId) ->
DHA DHA
end. end.
get_dha(_TCO, DialgId) ->
case ets:lookup(tcap_dha, DialgId) of
[{DialgId, DHA}] ->
{ok, DHA};
_ ->
{error, notfound}
end.
get_dialg_id(#'TC-INVOKE'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-RESULT-L'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-RESULT-NL'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-BEGIN'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-CONTINUE'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-END'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-U-ERROR'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-U-REJECT'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-U-CANCEL'{dialogueID = DlgId}) ->
DlgId;
get_dialg_id(#'TC-U-ABORT'{dialogueID = DlgId}) ->
DlgId.
% the user (TCU) sends us a primitive. We decide where to route it % the user (TCU) sends us a primitive. We decide where to route it
send_prim(TCO, P={'TC', 'INVOKE', request, Param}) when send_prim(TCO, P={'TC', 'INVOKE', request, Param}) ->
is_record(Param, 'TC-INVOKE') -> % component primitive establishing new dialogue
DialgId = Param#'TC-INVOKE'.dialogueID, DialgId = get_dialg_id(Param),
DHA = get_or_start_dha(TCO, DialgId), DHA = get_or_start_dha(TCO, DialgId),
CCO = tcap_dha_fsm:get_cco_pid(DHA), CCO = tcap_dha_fsm:get_cco_pid(DHA),
gen_server:cast(CCO, P); gen_server:cast(CCO, P);
send_prim(TCO, P={'TC', What, request, Param}) when
What == 'RESULT-L';
What == 'INVOKE';
What == 'RESULT-NL';
What == 'U-ERROR';
What == 'U-CANCEL';
What == 'U-REJECT' ->
% component primitive relating to existing components
DialgId = get_dialg_id(Param),
{ok, DHA} = get_dha(TCO, DialgId),
CCO = tcap_dha_fsm:get_cco_pid(DHA),
gen_server:cast(CCO, P);
send_prim(TCO, P={'TC', 'BEGIN', request, Param}) when send_prim(TCO, P={'TC', 'BEGIN', request, Param}) when
is_record(Param, 'TC-BEGIN') -> is_record(Param, 'TC-BEGIN') ->
% dialogue primitives establishing new dialogue
DialgId = Param#'TC-BEGIN'.dialogueID, DialgId = Param#'TC-BEGIN'.dialogueID,
DHA = get_or_start_dha(TCO, DialgId), DHA = get_or_start_dha(TCO, DialgId),
gen_fsm:send_event(DHA, P); gen_fsm:send_event(DHA, P);
send_prim(TCO, P={'TC', What, request, Param}) when
What == 'CONTINUE';
What == 'END';
What == 'U-ABORT' ->
% dialogue primitives for already-existing dialogues
DialgId = get_dialg_id(Param),
{ok, DHA} = get_dha(TCO, DialgId),
gen_fsm:send_event(DHA, P);
send_prim(_TCO, P) -> send_prim(_TCO, P) ->
{errror, {unknown_prim, P}}. {error, {unknown_prim, P}}.
% high-level user API to start the TCAP SAP supervisor + TCO server for a given SAP % high-level user API to start the TCAP SAP supervisor + TCO server for a given SAP
start_sap(SccpModule, Args, Opts) -> start_sap(SccpModule, Args, Opts) ->