From 12f95d393501cbe91c15c536b2d4c6dcf0b15fec Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 31 Jan 2012 20:54:24 +0100 Subject: [PATCH] TSM: use default QoS values if not provided in TR-* prim According to Q.771, it is a User option if QoS paramters are passed down. We simply use default paramters if none have been provided. --- TCAP/src/ITU/tcap_tsm_fsm.erl | 36 +++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/TCAP/src/ITU/tcap_tsm_fsm.erl b/TCAP/src/ITU/tcap_tsm_fsm.erl index 27bb5b4..729b38e 100644 --- a/TCAP/src/ITU/tcap_tsm_fsm.erl +++ b/TCAP/src/ITU/tcap_tsm_fsm.erl @@ -124,7 +124,7 @@ idle({'BEGIN', transaction, BeginParms}, State) %% Assemble TR-portion of BEGIN message io:format("Trying to encode ~p~n", [Begin]), {ok, TPDU} = 'TR':encode('TCMessage', {'begin', Begin}), - {SequenceControl, ReturnOption} = BeginParms#'TR-BEGIN'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(BeginParms), SccpParms = #'N-UNITDATA'{calledAddress = BeginParms#'TR-BEGIN'.destAddress, callingAddress = BeginParms#'TR-BEGIN'.origAddress, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -158,7 +158,7 @@ initiation_received({'CONTINUE', transaction, ContParms}, State) dialoguePortion = DialoguePortion, components = ComponentPortion}, %% Assemble TR-portion of CONTINUE message {ok, TPDU} = 'TR':encode('TCMessage', {continue, Continue}), - {SequenceControl, ReturnOption} = ContParms#'TR-CONTINUE'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(ContParms), SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address, callingAddress = NewState#state.local_address, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -181,7 +181,7 @@ initiation_received({'END', transaction, EndParms}, State) End = #'End'{dialoguePortion = DialoguePortion, components = ComponentPortion}, %% Assemble TR-portion of END message {ok, TPDU} = 'TR':encode('TCMessage', {'end', End}), - {SequenceControl, ReturnOption} = EndParms#'TR-END'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(EndParms), SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address, callingAddress = State#state.local_address, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -198,7 +198,7 @@ initiation_received({'ABORT', transaction, AbortParms}, State) Abort = #'Abort'{reason = {'u-abortCause', Cause}}, %% Assemble TR-portion of ABORT message {ok, TPDU} = 'TR':encode('TCMessage', {abort, Abort}), - {SequenceControl, ReturnOption} = AbortParms#'TR-U-ABORT'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(AbortParms), SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address, callingAddress = State#state.local_address, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -305,16 +305,21 @@ active({'CONTINUE', received, SccpParms}, State) gen_fsm:send_event(resolve_dha(State), {'TR', 'CONTINUE', indication, TrParms}), {next_state, active, State}; + %% Continue from TR-User active({'CONTINUE', transaction, ContParms}, State) when is_record(ContParms, 'TR-CONTINUE') -> TrUserData = process_undefined(ContParms#'TR-CONTINUE'.userData), DialoguePortion = TrUserData#'TR-user-data'.dialoguePortion, ComponentPortion = TrUserData#'TR-user-data'.componentPortion, - Continue = #'Continue'{dialoguePortion = DialoguePortion, components = ComponentPortion}, + Otid = State#state.localTID, + Dtid = State#state.remoteTID, + io:format("OTID ~p, DTID ~p~n", [Otid, Dtid]), + Continue = #'Continue'{otid = <>, dtid = <>, + dialoguePortion = DialoguePortion, components = ComponentPortion}, %% Assemble TR-portion of CONTINUE message {ok, TPDU} = 'TR':encode('TCMessage', {continue, Continue}), - {SequenceControl, ReturnOption} = ContParms#'TR-CONTINUE'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(ContParms), SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address, callingAddress = State#state.local_address, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -352,7 +357,7 @@ active({'END', transaction, EndParms}, State) End = #'End'{dialoguePortion = DialoguePortion, components = ComponentPortion}, %% Assemble TR-portion of END message {ok, TPDU} = 'TR':encode('TCMessage', {'end', End}), - {SequenceControl, ReturnOption} = EndParms#'TR-END'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(EndParms), SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address, callingAddress = State#state.local_address, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -400,7 +405,7 @@ active({'ABORT', transaction, AbortParms}, State) Abort = #'Abort'{reason = {'u-abortCause', Cause}}, %% Assemble TR-portion of ABORT message {ok, TPDU} = 'TR':encode('TCMessage', {abort, Abort}), - {SequenceControl, ReturnOption} = AbortParms#'TR-U-ABORT'.qos, + {SequenceControl, ReturnOption} = qos_from_tr_prim(AbortParms), SccpParms = #'N-UNITDATA'{calledAddress = State#state.remote_address, callingAddress = State#state.local_address, sequenceControl = SequenceControl, returnOption = ReturnOption, @@ -452,3 +457,18 @@ resolve_dha(DlgId) when is_integer(DlgId) -> DHA; resolve_dha(#state{localTID = TID}) -> resolve_dha(TID). + +% QoS from TR-* primitive to {SequenceControl, ReturnOpt} +qos_from_tr_qos(undefined) -> + {false, true}; +qos_from_tr_qos({Seq, Ret}) -> + {Seq, Ret}. + +qos_from_tr_prim(#'TR-CONTINUE'{qos=Qos}) -> + qos_from_tr_qos(Qos); +qos_from_tr_prim(#'TR-BEGIN'{qos=Qos}) -> + qos_from_tr_qos(Qos); +qos_from_tr_prim(#'TR-END'{qos=Qos}) -> + qos_from_tr_qos(Qos); +qos_from_tr_prim(#'TR-U-ABORT'{qos=Qos}) -> + qos_from_tr_qos(Qos).