pespin has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/36109?usp=email )
Change subject: s2b: Spawn process for each received packet ......................................................................
s2b: Spawn process for each received packet
Change-Id: I460b382aedbc10b06d846131b4cd838e30668df4 --- M src/epdg_gtpc_s2b.erl 1 file changed, 35 insertions(+), 4 deletions(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved
diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl index a4ab573..cef9bab 100644 --- a/src/epdg_gtpc_s2b.erl +++ b/src/epdg_gtpc_s2b.erl @@ -179,10 +179,11 @@
%% @callback gen_server handle_info({udp, _Socket, IP, InPortNo, RxMsg}, State) -> - lager:info("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, RxMsg]), - Req = gtp_packet:decode(RxMsg), - lager:info("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, Req]), - rx_gtp(Req, State); + lager:debug("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, RxMsg]), + spawn_wait_ret(fun() -> + rx_udp(IP, InPortNo, RxMsg, State) + end, + {noreply, State}); handle_info(Info, State) -> lager:info("S2b handle_info: ~p ~n", [Info]), {noreply, State}. @@ -359,6 +360,27 @@ connect(Address) -> connect(?SVC_NAME, Address).
+%% Calls Fun on a spawned monitored process and returns Fun ret. +%% If spawned process crashes, return DefaultRet. +spawn_wait_ret(Fun, DefaultRet) -> + MyPID=self(), + {Pid, MRef} = spawn_monitor(fun() -> + Ret = Fun(), + MyPID ! {self(), Ret} + end), + receive + {'DOWN', MRef, process, _, _Reason} -> + DefaultRet; + {Pid, Ret} -> + erlang:demonitor(MRef, [flush]), + Ret + end. + +rx_udp(IP, InPortNo, RxMsg, State) -> + Req = gtp_packet:decode(RxMsg), + lager:debug("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, Req]), + rx_gtp(Req, State). + rx_gtp(Resp = #gtp{version = v2, type = create_session_response}, State0) -> Sess0 = find_gtp_session_by_local_teic(Resp#gtp.tei, State0), case Sess0 of