MGW NAT: Propagate 'path' of preceding message headers down to mangling code
diff --git a/src/mgw_nat.erl b/src/mgw_nat.erl
index b76169d..d1d2e4c 100644
--- a/src/mgw_nat.erl
+++ b/src/mgw_nat.erl
@@ -20,7 +20,7 @@
 
 -module(mgw_nat).
 -author("Harald Welte <laforge@gnumonks.org>").
--export([mangle_rx_data/3]).
+-export([mangle_rx_data/3, mangle_rx_data/4]).
 
 % exports belwo needed by map_masq.erl
 -export([isup_party_internationalize/2, isup_party_nationalize/2, isup_party_replace_prefix/3]).
@@ -33,14 +33,17 @@
 -include_lib("osmo_ss7/include/isup.hrl").
 -include_lib("osmo_ss7/include/sccp.hrl").
 
-% mangle the received data
 mangle_rx_data(L, From, Data) when is_binary(Data) ->
+	mangle_rx_data(L, From, [], Data).
+
+% mangle the received data
+mangle_rx_data(L, From, Path, Data) when is_list(Path), is_binary(Data) ->
 	{ok, M2ua} = m2ua_codec:parse_m2ua_msg(Data),
 	%io:format("M2UA Decode: ~p~n", [M2ua]),
 	case M2ua of
 		#m2ua_msg{msg_class = ?M2UA_MSGC_MAUP,
 			  msg_type = ?M2UA_MAUP_MSGT_DATA} ->
-			M2ua_out = mangle_rx_m2ua_maup(L, From, M2ua);
+			M2ua_out = mangle_rx_m2ua_maup(L, From, Path, M2ua);
 		#m2ua_msg{} ->
 			% simply pass it along unmodified
 			M2ua_out = M2ua
@@ -50,11 +53,11 @@
 	m2ua_codec:encode_m2ua_msg(M2ua_out).
 
 % mangle the received M2UA
-mangle_rx_m2ua_maup(L, From, M2ua = #m2ua_msg{parameters = Params}) ->
+mangle_rx_m2ua_maup(L, From, Path, M2ua = #m2ua_msg{parameters = Params}) ->
 	{_Len, M2uaPayload} = proplists:get_value(16#300, Params),
 	Mtp3 = mtp3_codec:parse_mtp3_msg(M2uaPayload),
 	%io:format("MTP3 Decode: ~p~n", [Mtp3]),
-	Mtp3_out = mangle_rx_mtp3(L, From, Mtp3),
+	Mtp3_out = mangle_rx_mtp3(L, From, Path ++ [M2ua], Mtp3),
 	%io:format("MTP3 Encode: ~p~n", [Mtp3_out]),
 	Mtp3OutBin = mtp3_codec:encode_mtp3_msg(Mtp3_out),
 	Params2 = proplists:delete(16#300, Params),
@@ -63,16 +66,16 @@
 	M2ua#m2ua_msg{parameters = ParamsNew}.
 
 % mangle the MTP3 payload
-mangle_rx_mtp3(L, From, Mtp3 = #mtp3_msg{service_ind = Service}) ->
-	mangle_rx_mtp3_serv(L, From, Service, Mtp3).
+mangle_rx_mtp3(L, From, Path, Mtp3 = #mtp3_msg{service_ind = Service}) ->
+	mangle_rx_mtp3_serv(L, From, Path, Service, Mtp3).
 
 % mangle the ISUP content
-mangle_rx_mtp3_serv(_L, From, ?MTP3_SERV_ISUP, Mtp3 = #mtp3_msg{payload = Payload}) ->
+mangle_rx_mtp3_serv(_L, From, Path, ?MTP3_SERV_ISUP, Mtp3 = #mtp3_msg{payload = Payload}) ->
 	io:format("ISUP In: ~p~n", [Payload]),
 	Isup = isup_codec:parse_isup_msg(Payload),
 	io:format("ISUP Decode: ~p~n", [Isup]),
 	% FIXME
-	IsupMangled = mangle_rx_isup(From, Isup#isup_msg.msg_type, Isup),
+	IsupMangled = mangle_rx_isup(From, Path, Isup#isup_msg.msg_type, Isup),
 	if IsupMangled == Isup ->
 		Mtp3;
 	   true ->
@@ -83,11 +86,11 @@
 		Mtp3#mtp3_msg{payload = Payload_out}
 	end;
 % mangle the SCCP content
-mangle_rx_mtp3_serv(_L, From, ?MTP3_SERV_SCCP, Mtp3 = #mtp3_msg{payload = Payload}) ->
+mangle_rx_mtp3_serv(_L, From, Path, ?MTP3_SERV_SCCP, Mtp3 = #mtp3_msg{payload = Payload}) ->
 	io:format("SCCP In: ~p~n", [Payload]),
 	{ok, Sccp} = sccp_codec:parse_sccp_msg(Payload),
 	io:format("SCCP Decode: ~p~n", [Sccp]),
-	SccpMangled = mangle_rx_sccp(From, Sccp#sccp_msg.msg_type, Sccp),
+	SccpMangled = mangle_rx_sccp(From, Path ++ [Mtp3], Sccp#sccp_msg.msg_type, Sccp),
 	SccpMasqued = sccp_masq:sccp_masq_msg(From, SccpMangled#sccp_msg.msg_type,
 					      SccpMangled),
 	if SccpMasqued == Sccp ->
@@ -100,7 +103,7 @@
 		Mtp3#mtp3_msg{payload = Payload_out}
 	end;
 % default: do nothing
-mangle_rx_mtp3_serv(_L, _From, _, Mtp3) ->
+mangle_rx_mtp3_serv(_L, _From, _Path, _, Mtp3) ->
 	Mtp3.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -156,7 +159,7 @@
 maybe_re_encode(_DecOrig, DecNew, _MapEncOld) ->
 	map_codec:encode_tcap_msg(DecNew).
 
-mangle_rx_sccp(From, ?SCCP_MSGT_UDT, Msg = #sccp_msg{parameters = Opts}) ->
+mangle_rx_sccp(From, _Path, ?SCCP_MSGT_UDT, Msg = #sccp_msg{parameters = Opts}) ->
 	% Mangle the SCCP Calling / Called Addresses
 	CalledParty = proplists:get_value(called_party_addr, Opts),
 	CalledPartyNew = mangle_rx_called(From, CalledParty),
@@ -174,7 +177,7 @@
 	Opts3 = lists:keyreplace(user_data, 1, Opts2,
 				 {user_data, MapEncNew}),
 	Msg#sccp_msg{parameters = Opts3};
-mangle_rx_sccp(_From, _MsgType, Msg) ->
+mangle_rx_sccp(_From, _Path, _MsgType, Msg) ->
 	Msg.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -200,7 +203,7 @@
 	Par.
 
 % mangle an incoming ISUP message
-mangle_rx_isup(From, MsgType, Msg = #isup_msg{parameters = Params}) ->
+mangle_rx_isup(From, _Path, MsgType, Msg = #isup_msg{parameters = Params}) ->
 	ParamsOut = mangle_rx_isup_params(From, MsgType, Msg, [], Params),
 	% return message with modified parameter list
 	Msg#isup_msg{parameters = ParamsOut}.