fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38789?usp=email )
Change subject: sctp_server: pass #server_state to client_{add,del}() ......................................................................
sctp_server: pass #server_state to client_{add,del}()
Prepare for a follow-up patch, in which functions client_{add,del}() will need to access more fields from the #server_state.
Change-Id: I5f784617745a9ecec2cfa998dc70e176311d24b1 --- M src/sctp_server.erl 1 file changed, 15 insertions(+), 13 deletions(-)
Approvals: pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, approved
diff --git a/src/sctp_server.erl b/src/sctp_server.erl index 938b02a..2617375 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -160,23 +160,22 @@ sctp_recv({FromAddr, FromPort, [], #sctp_assoc_change{state = ConnState, assoc_id = Aid}}, - #server_state{priv = Priv} = S) -> + #server_state{} = S) -> case ConnState of comm_up -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) established", [Aid, FromAddr, FromPort]), - Clients = client_add(S#server_state.clients, Aid, FromAddr, FromPort, Priv); + client_add(Aid, FromAddr, FromPort, S); shutdown_comp -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) closed", [Aid, FromAddr, FromPort]), - Clients = client_del(S#server_state.clients, Aid); + client_del(Aid, S); comm_lost -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) lost", [Aid, FromAddr, FromPort]), - Clients = client_del(S#server_state.clients, Aid); + client_del(Aid, S); _ -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) state ~p", [Aid, FromAddr, FromPort, ConnState]), - Clients = S#server_state.clients - end, - S#server_state{clients = Clients}; + S + end;
%% Handle an #sctp_sndrcvinfo event (incoming data) sctp_recv({FromAddr, FromPort, @@ -203,24 +202,27 @@
%% Add a new client to the list, spawning a proxy process -client_add(Clients, Aid, FromAddr, FromPort, Priv) -> +client_add(Aid, FromAddr, FromPort, + #server_state{clients = Clients, + priv = Priv} = S) -> {ok, Pid} = sctp_proxy:start_link(Aid, Priv), - NewClient = #client_state{addr_port = {FromAddr, FromPort}, pid = Pid}, s1gw_metrics:gauge_inc(?S1GW_GAUGE_S1AP_ENB_NUM_SCTP_CONNECTIONS), - dict:store(Aid, NewClient, Clients). + NewClient = #client_state{addr_port = {FromAddr, FromPort}, pid = Pid}, + S#server_state{clients = dict:store(Aid, NewClient, Clients)}.
%% Delete an existing client from the list, stopping the proxy process -client_del(Clients, Aid) -> +client_del(Aid, + #server_state{clients = Clients} = S) -> case dict:find(Aid, Clients) of {ok, Client} -> %% the proxy process might be already dead, so we guard %% against exceptions like noproc or {nodedown,Node}. catch sctp_proxy:shutdown(Client#client_state.pid), s1gw_metrics:gauge_dec(?S1GW_GAUGE_S1AP_ENB_NUM_SCTP_CONNECTIONS), - dict:erase(Aid, Clients); + S#server_state{clients = dict:erase(Aid, Clients)}; error -> - Clients + S end.