[NAT MGW] actually rewrite the SCCP addresses
diff --git a/src/mgw_nat.erl b/src/mgw_nat.erl
index aa36c83..0518371 100644
--- a/src/mgw_nat.erl
+++ b/src/mgw_nat.erl
@@ -101,8 +101,47 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Actual mangling of the decoded SCCP messages
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-define(REAL_HLR_GT, [6,3,9,1,8,0,0,0,4,0,1,2]).
+-define(NAT_HLR_GT, [3,5,4,8,9,0,0,0,7,1]).
+
+mangle_rx_called(from_stp, Addr = #sccp_addr{ssn = SSN,
+ global_title = GT}) ->
+ case {SSN, GT#global_title.phone_number} of
+ {?SCCP_SSN_HLR, ?REAL_HLR_GT} ->
+ GTout = GT#global_title{phone_number = ?NAT_HLR_GT},
+ io:format("SCCP STP->MSC rewrite ~p~n", [GTout]),
+ Addr#sccp_addr{global_title = GTout};
+ _ ->
+ Addr
+ end;
+mangle_rx_called(_From, Addr) ->
+ Addr.
+
+mangle_rx_calling(from_msc, Addr = #sccp_addr{ssn = SSN,
+ global_title = GT}) ->
+ case {SSN, GT#global_title.phone_number} of
+ {?SCCP_SSN_MSC, ?NAT_HLR_GT} ->
+ GTout = GT#global_title{phone_number = ?REAL_HLR_GT},
+ io:format("SCCP MSC->STP rewrite ~p~n", [GTout]),
+ Addr#sccp_addr{global_title = GTout};
+ _ ->
+ Addr
+ end;
+mangle_rx_calling(_From, Addr) ->
+ Addr.
+
+mangle_rx_sccp(From, ?SCCP_MSGT_UDT, Msg = #sccp_msg{parameters = Opts}) ->
+ CalledParty = proplists:get_value(called_party_addr, Opts),
+ CalledPartyNew = mangle_rx_called(From, CalledParty),
+ CallingParty = proplists:get_value(calling_party_addr, Opts),
+ CallingPartyNew = mangle_rx_calling(From, CallingParty),
+ Opts1 = lists:keyreplace(called_party_addr, 1, Opts,
+ {called_party_addr, CalledPartyNew}),
+ Opts2 = lists:keyreplace(calling_party_addr, 1, Opts1,
+ {calling_party_addr, CallingPartyNew}),
+ Msg#sccp_msg{parameters = Opts2};
mangle_rx_sccp(_From, _MsgType, Msg) ->
- % FIXME
Msg.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%