lists.osmocom.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
List overview
Download
gerrit-log
November 2024
----- 2025 -----
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
gerrit-log@lists.osmocom.org
1 participants
2209 discussions
Start a n
N
ew thread
[S] Change in ...osmo-s1gw[master]: sctp_server: pass MME addr/port to sctp_proxy as opaque data
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38786?usp=email
) Change subject: sctp_server: pass MME addr/port to sctp_proxy as opaque data ...................................................................... sctp_server: pass MME addr/port to sctp_proxy as opaque data This is the first step towards the goal of making the sctp_server module more generic and abstract from the client module's API. Change-Id: I1bd5f17d940173c4ec2d8d7a1d48778098008c84 --- M src/sctp_proxy.erl M src/sctp_server.erl 2 files changed, 25 insertions(+), 14 deletions(-) Approvals: fixeria: Looks good to me, approved laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve diff --git a/src/sctp_proxy.erl b/src/sctp_proxy.erl index 6503a9e..72f7980 100644 --- a/src/sctp_proxy.erl +++ b/src/sctp_proxy.erl @@ -41,7 +41,8 @@ connected/3, code_change/4, terminate/3]). --export([start_link/3, +-export([start_link/2, + start_link/3, send_data/2, shutdown/1]). @@ -55,9 +56,19 @@ %% public API %% ------------------------------------------------------------------ --spec start_link(gen_sctp:assoc_id(), - sctp_client:loc_rem_addr(), - inet:port_number()) -> gen_statem:start_ret(). +-spec start_link(Aid, {MmeAddr, MmePort}) -> Result + when Aid :: gen_sctp:assoc_id(), + MmeAddr :: sctp_client:loc_rem_addr(), + MmePort :: inet:port_number(), + Result :: gen_statem:start_ret(). +start_link(Aid, {MmeAddr, MmePort}) -> + start_link(Aid, MmeAddr, MmePort). + +-spec start_link(Aid, MmeAddr, MmePort) -> Result + when Aid :: gen_sctp:assoc_id(), + MmeAddr :: sctp_client:loc_rem_addr(), + MmePort :: inet:port_number(), + Result :: gen_statem:start_ret(). start_link(Aid, MmeAddr, MmePort) -> gen_statem:start_link(?MODULE, [Aid, MmeAddr, MmePort], []). diff --git a/src/sctp_server.erl b/src/sctp_server.erl index 0b741ad..7722436 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -56,7 +56,7 @@ -record(server_state, {sock :: gen_sctp:sctp_socket(), clients :: dict:dict(), - mme_addr_port :: term() + priv :: term() }). -record(client_state, {addr_port :: addr_port(), @@ -68,9 +68,9 @@ %% public API %% ------------------------------------------------------------------ -start_link(BindAddr, BindPort, MmeAddrPort) -> +start_link(BindAddr, BindPort, Priv) -> gen_server:start_link({local, ?MODULE}, ?MODULE, - [BindAddr, BindPort, MmeAddrPort], + [BindAddr, BindPort, Priv], []). @@ -86,11 +86,11 @@ %% gen_server API %% ------------------------------------------------------------------ -init([BindAddrStr, BindPort, MmeAddrPort]) when is_list(BindAddrStr) -> +init([BindAddrStr, BindPort, Priv]) when is_list(BindAddrStr) -> {ok, BindAddr} = inet:parse_address(BindAddrStr), - init([BindAddr, BindPort, MmeAddrPort]); + init([BindAddr, BindPort, Priv]); -init([BindAddr, BindPort, MmeAddrPort]) -> +init([BindAddr, BindPort, Priv]) -> process_flag(trap_exit, true), {ok, Sock} = gen_sctp:open([{ip, BindAddr}, {port, BindPort}, @@ -101,7 +101,7 @@ ok = gen_sctp:listen(Sock, true), {ok, #server_state{sock = Sock, clients = dict:new(), - mme_addr_port = MmeAddrPort}}. + priv = Priv}}. handle_call(Info, From, State) -> @@ -163,7 +163,7 @@ comm_up -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) established", [Aid, FromAddr, FromPort]), Clients = client_add(State#server_state.clients, Aid, FromAddr, FromPort, - State#server_state.mme_addr_port); + State#server_state.priv); shutdown_comp -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) closed", [Aid, FromAddr, FromPort]), Clients = client_del(State#server_state.clients, Aid); @@ -200,8 +200,8 @@ %% Add a new client to the list, spawning a proxy process -client_add(Clients, Aid, FromAddr, FromPort, {MmeAddr, MmePort}) -> - {ok, Pid} = sctp_proxy:start_link(Aid, MmeAddr, MmePort), +client_add(Clients, Aid, FromAddr, FromPort, Priv) -> + {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). -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38786?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I1bd5f17d940173c4ec2d8d7a1d48778098008c84 Gerrit-Change-Number: 38786 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[M] Change in ...osmo-s1gw[master]: sctp_server: cosmetic: rename State -> S
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38787?usp=email
) Change subject: sctp_server: cosmetic: rename State -> S ...................................................................... sctp_server: cosmetic: rename State -> S Using a shorter name makes the code more compact and beings it in consistency with other modules. Change-Id: I8dde744ac8b8798cdeed5d4eac47d4f650fe03f9 --- M src/sctp_server.erl 1 file changed, 35 insertions(+), 34 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, approved Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve diff --git a/src/sctp_server.erl b/src/sctp_server.erl index 7722436..3c7917e 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -104,51 +104,52 @@ priv = Priv}}. -handle_call(Info, From, State) -> +handle_call(Info, From, S) -> ?LOG_ERROR("unknown ~p() from ~p: ~p", [?FUNCTION_NAME, From, Info]), - {reply, {error, not_implemented}, State}. + {reply, {error, not_implemented}, S}. -handle_cast({send_data, Aid, Data}, State) -> - gen_sctp:send(State#server_state.sock, +handle_cast({send_data, Aid, Data}, S) -> + gen_sctp:send(S#server_state.sock, #sctp_sndrcvinfo{stream = ?S1AP_SCTP_STREAM, ppid = ?S1AP_SCTP_PPID, assoc_id = Aid}, Data), - {noreply, State}; + {noreply, S}; -handle_cast(Info, State) -> +handle_cast(Info, S) -> ?LOG_ERROR("unknown ~p(): ~p", [?FUNCTION_NAME, Info]), - {noreply, State}. + {noreply, S}. %% Handle SCTP events coming from gen_sctp module -handle_info({sctp, _Socket, FromAddr, FromPort, {AncData, Data}}, State) -> - NewState = sctp_recv(State, {FromAddr, FromPort, AncData, Data}), - {noreply, NewState}; +handle_info({sctp, _Socket, FromAddr, FromPort, {AncData, Data}}, S0) -> + S1 = sctp_recv(S0, {FromAddr, FromPort, AncData, Data}), + {noreply, S1}; %% Handle termination events of the child processes handle_info({'EXIT', Pid, Reason}, - #server_state{sock = Sock, clients = Clients} = State) -> + #server_state{sock = Sock, clients = Clients} = S0) -> ?LOG_DEBUG("Child process ~p terminated with reason ~p", [Pid, Reason]), - case client_find(State, Pid) of + case client_find(S0, Pid) of {ok, {Aid, _Client}} -> %% gracefully close the eNB connection gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}), - {noreply, State#server_state{clients = dict:erase(Aid, Clients)}}; + S1 = S0#server_state{clients = dict:erase(Aid, Clients)}, + {noreply, S1}; error -> - {noreply, State} + {noreply, S0} end; %% Catch-all for unknown messages -handle_info(Info, State) -> +handle_info(Info, S) -> ?LOG_ERROR("unknown ~p(): ~p", [?FUNCTION_NAME, Info]), - {noreply, State}. + {noreply, S}. -terminate(Reason, State) -> +terminate(Reason, S) -> ?LOG_NOTICE("Terminating, reason ~p", [Reason]), - close_conns(State), - gen_sctp:close(State#server_state.sock), + close_conns(S), + gen_sctp:close(S#server_state.sock), ok. %% ------------------------------------------------------------------ @@ -156,33 +157,33 @@ %% ------------------------------------------------------------------ %% Handle an #sctp_assoc_change event (connection state) -sctp_recv(State, {FromAddr, FromPort, [], - #sctp_assoc_change{state = ConnState, - assoc_id = Aid}}) -> +sctp_recv(S, {FromAddr, FromPort, [], + #sctp_assoc_change{state = ConnState, + assoc_id = Aid}}) -> case ConnState of comm_up -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) established", [Aid, FromAddr, FromPort]), - Clients = client_add(State#server_state.clients, Aid, FromAddr, FromPort, - State#server_state.priv); + Clients = client_add(S#server_state.clients, Aid, FromAddr, FromPort, + S#server_state.priv); shutdown_comp -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) closed", [Aid, FromAddr, FromPort]), - Clients = client_del(State#server_state.clients, Aid); + Clients = client_del(S#server_state.clients, Aid); comm_lost -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) lost", [Aid, FromAddr, FromPort]), - Clients = client_del(State#server_state.clients, Aid); + Clients = client_del(S#server_state.clients, Aid); _ -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) state ~p", [Aid, FromAddr, FromPort, ConnState]), - Clients = State#server_state.clients + Clients = S#server_state.clients end, - State#server_state{clients = Clients}; + S#server_state{clients = Clients}; %% Handle an #sctp_sndrcvinfo event (incoming data) -sctp_recv(State, {FromAddr, FromPort, - [#sctp_sndrcvinfo{assoc_id = Aid}], Data}) -> +sctp_recv(S, {FromAddr, FromPort, + [#sctp_sndrcvinfo{assoc_id = Aid}], Data}) -> ?LOG_DEBUG("eNB connection (id=~p, ~p:~p) -> MME: ~p", [Aid, FromAddr, FromPort, Data]), s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_ENB_ALL_RX), - case dict:find(Aid, State#server_state.clients) of + case dict:find(Aid, S#server_state.clients) of {ok, #client_state{pid = Pid}} -> sctp_proxy:send_data(Pid, Data); error -> @@ -190,13 +191,13 @@ [Aid, FromAddr, FromPort]), s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_ENB_ALL_RX_UNKNOWN_ENB) end, - State; + S; %% Catch-all for other kinds of SCTP events -sctp_recv(State, {FromAddr, FromPort, AncData, Data}) -> +sctp_recv(S, {FromAddr, FromPort, AncData, Data}) -> ?LOG_DEBUG("Unhandled SCTP event (~p:~p): ~p, ~p", [FromAddr, FromPort, AncData, Data]), - State. + S. %% Add a new client to the list, spawning a proxy process -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38787?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I8dde744ac8b8798cdeed5d4eac47d4f650fe03f9 Gerrit-Change-Number: 38787 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[S] Change in ...osmo-s1gw[master]: sctp_server: cosmetic: make #server_state last argument
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38788?usp=email
) Change subject: sctp_server: cosmetic: make #server_state last argument ...................................................................... sctp_server: cosmetic: make #server_state last argument Make it consistent with the gen_server and gen_statem API. Change-Id: I34bcdb818f58ccfa045d9fe17743523480e785f2 --- M src/sctp_server.erl 1 file changed, 18 insertions(+), 16 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 3c7917e..938b02a 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -123,14 +123,14 @@ %% Handle SCTP events coming from gen_sctp module handle_info({sctp, _Socket, FromAddr, FromPort, {AncData, Data}}, S0) -> - S1 = sctp_recv(S0, {FromAddr, FromPort, AncData, Data}), + S1 = sctp_recv({FromAddr, FromPort, AncData, Data}, S0), {noreply, S1}; %% Handle termination events of the child processes handle_info({'EXIT', Pid, Reason}, #server_state{sock = Sock, clients = Clients} = S0) -> ?LOG_DEBUG("Child process ~p terminated with reason ~p", [Pid, Reason]), - case client_find(S0, Pid) of + case client_find(Pid, S0) of {ok, {Aid, _Client}} -> %% gracefully close the eNB connection gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}), @@ -157,14 +157,14 @@ %% ------------------------------------------------------------------ %% Handle an #sctp_assoc_change event (connection state) -sctp_recv(S, {FromAddr, FromPort, [], - #sctp_assoc_change{state = ConnState, - assoc_id = Aid}}) -> +sctp_recv({FromAddr, FromPort, [], + #sctp_assoc_change{state = ConnState, + assoc_id = Aid}}, + #server_state{priv = Priv} = 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, - S#server_state.priv); + Clients = client_add(S#server_state.clients, Aid, FromAddr, FromPort, Priv); shutdown_comp -> ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) closed", [Aid, FromAddr, FromPort]), Clients = client_del(S#server_state.clients, Aid); @@ -179,11 +179,12 @@ S#server_state{clients = Clients}; %% Handle an #sctp_sndrcvinfo event (incoming data) -sctp_recv(S, {FromAddr, FromPort, - [#sctp_sndrcvinfo{assoc_id = Aid}], Data}) -> +sctp_recv({FromAddr, FromPort, + [#sctp_sndrcvinfo{assoc_id = Aid}], Data}, + #server_state{clients = Clients} = S) -> ?LOG_DEBUG("eNB connection (id=~p, ~p:~p) -> MME: ~p", [Aid, FromAddr, FromPort, Data]), s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_ENB_ALL_RX), - case dict:find(Aid, S#server_state.clients) of + case dict:find(Aid, Clients) of {ok, #client_state{pid = Pid}} -> sctp_proxy:send_data(Pid, Data); error -> @@ -194,7 +195,8 @@ S; %% Catch-all for other kinds of SCTP events -sctp_recv(S, {FromAddr, FromPort, AncData, Data}) -> +sctp_recv({FromAddr, FromPort, AncData, Data}, + #server_state{} = S) -> ?LOG_DEBUG("Unhandled SCTP event (~p:~p): ~p, ~p", [FromAddr, FromPort, AncData, Data]), S. @@ -223,18 +225,18 @@ %% Find a client by process ID -client_find(#server_state{clients = Clients}, Pid) -> - client_find(dict:to_list(Clients), Pid); +client_find(Pid, #server_state{clients = Clients}) -> + client_find(Pid, dict:to_list(Clients)); -client_find([{Aid, Client} | Clients], Pid) -> +client_find(Pid, [{Aid, Client} | Clients]) -> case Client of #client_state{pid = Pid} -> {ok, {Aid, Client}}; _ -> - client_find(Clients, Pid) + client_find(Pid, Clients) end; -client_find([], _Pid) -> +client_find(_Pid, []) -> error. -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38788?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I34bcdb818f58ccfa045d9fe17743523480e785f2 Gerrit-Change-Number: 38788 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[S] Change in ...osmo-s1gw[master]: sctp_server: pass #server_state to client_{add,del}()
by fixeria
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. -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38789?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I5f784617745a9ecec2cfa998dc70e176311d24b1 Gerrit-Change-Number: 38789 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[M] Change in ...osmo-s1gw[master]: sctp_server: make it abstract from sctp_proxy logic
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38790?usp=email
) Change subject: sctp_server: make it abstract from sctp_proxy logic ...................................................................... sctp_server: make it abstract from sctp_proxy logic Instead of using the sctp_proxy API directly, let the caller pass a module name (handler), which implements the sctp_client behavior. This makes the interaction between modules cleaner, allows to reuse the sctp_server module in other places, and makes testing easier. Change-Id: Iee4202dd4d4e9762fe74ead985aa43343ebdc524 --- M src/osmo_s1gw_sup.erl M src/sctp_client.erl M src/sctp_proxy.erl M src/sctp_server.erl 4 files changed, 53 insertions(+), 23 deletions(-) Approvals: fixeria: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve diff --git a/src/osmo_s1gw_sup.erl b/src/osmo_s1gw_sup.erl index 32272bf..5f332ed 100644 --- a/src/osmo_s1gw_sup.erl +++ b/src/osmo_s1gw_sup.erl @@ -68,7 +68,7 @@ PfcpRemAddr = get_env(pfcp_rem_addr, ?ENV_DEFAULT_PFCP_REM_ADDR), SctpServer = {sctp_server, {sctp_server, start_link, - [S1GWBindAddr, S1GWBindPort, + [S1GWBindAddr, S1GWBindPort, sctp_proxy, {{MmeLocAddr, MmeRemAddr}, MmeRemPort}]}, permanent, 5000, diff --git a/src/sctp_client.erl b/src/sctp_client.erl index ab02791..72d5bd1 100644 --- a/src/sctp_client.erl +++ b/src/sctp_client.erl @@ -60,6 +60,28 @@ connect_result/0, sock_aid/0]). + +%% ------------------------------------------------------------------ +%% behavior callbacks +%% ------------------------------------------------------------------ + +-callback start_link(AID, Priv) -> Result + when AID :: gen_sctp:assoc_id(), + Priv :: term(), + Result :: {ok, pid()} | term(). + + +-callback send_data(Pid, Data) -> Result + when Pid :: pid(), + Data :: binary(), + Result :: term(). + + +-callback shutdown(Pid) -> Result + when Pid :: pid(), + Result :: term(). + + %% ------------------------------------------------------------------ %% public API %% ------------------------------------------------------------------ diff --git a/src/sctp_proxy.erl b/src/sctp_proxy.erl index 72f7980..fc33f70 100644 --- a/src/sctp_proxy.erl +++ b/src/sctp_proxy.erl @@ -34,6 +34,7 @@ -module(sctp_proxy). -behaviour(gen_statem). +-behaviour(sctp_client). -export([init/1, callback_mode/0, diff --git a/src/sctp_server.erl b/src/sctp_server.erl index 2617375..68d1799 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -40,7 +40,7 @@ handle_call/3, handle_cast/2, terminate/2]). --export([start_link/3, +-export([start_link/4, send_data/2, shutdown/0]). @@ -56,6 +56,7 @@ -record(server_state, {sock :: gen_sctp:sctp_socket(), clients :: dict:dict(), + handler :: module(), priv :: term() }). @@ -68,9 +69,10 @@ %% public API %% ------------------------------------------------------------------ -start_link(BindAddr, BindPort, Priv) -> +start_link(BindAddr, BindPort, Handler, Priv) -> gen_server:start_link({local, ?MODULE}, ?MODULE, - [BindAddr, BindPort, Priv], + [BindAddr, BindPort, + Handler, Priv], []). @@ -86,11 +88,11 @@ %% gen_server API %% ------------------------------------------------------------------ -init([BindAddrStr, BindPort, Priv]) when is_list(BindAddrStr) -> +init([BindAddrStr, BindPort, Handler, Priv]) when is_list(BindAddrStr) -> {ok, BindAddr} = inet:parse_address(BindAddrStr), - init([BindAddr, BindPort, Priv]); + init([BindAddr, BindPort, Handler, Priv]); -init([BindAddr, BindPort, Priv]) -> +init([BindAddr, BindPort, Handler, Priv]) -> process_flag(trap_exit, true), {ok, Sock} = gen_sctp:open([{ip, BindAddr}, {port, BindPort}, @@ -101,6 +103,7 @@ ok = gen_sctp:listen(Sock, true), {ok, #server_state{sock = Sock, clients = dict:new(), + handler = Handler, priv = Priv}}. @@ -180,12 +183,13 @@ %% Handle an #sctp_sndrcvinfo event (incoming data) sctp_recv({FromAddr, FromPort, [#sctp_sndrcvinfo{assoc_id = Aid}], Data}, - #server_state{clients = Clients} = S) -> + #server_state{clients = Clients, + handler = Handler} = S) -> ?LOG_DEBUG("eNB connection (id=~p, ~p:~p) -> MME: ~p", [Aid, FromAddr, FromPort, Data]), s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_ENB_ALL_RX), case dict:find(Aid, Clients) of {ok, #client_state{pid = Pid}} -> - sctp_proxy:send_data(Pid, Data); + Handler:send_data(Pid, Data); error -> ?LOG_ERROR("eNB connection (id=~p, ~p:~p) is not known to us?!?", [Aid, FromAddr, FromPort]), @@ -201,24 +205,26 @@ S. -%% Add a new client to the list, spawning a proxy process +%% Add a new client to the list, spawning a handler process client_add(Aid, FromAddr, FromPort, #server_state{clients = Clients, + handler = Handler, priv = Priv} = S) -> - {ok, Pid} = sctp_proxy:start_link(Aid, Priv), + {ok, Pid} = Handler:start_link(Aid, Priv), s1gw_metrics:gauge_inc(?S1GW_GAUGE_S1AP_ENB_NUM_SCTP_CONNECTIONS), 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 +%% Delete an existing client from the list, stopping the handler process client_del(Aid, - #server_state{clients = Clients} = S) -> + #server_state{clients = Clients, + handler = Handler} = S) -> case dict:find(Aid, Clients) of {ok, Client} -> - %% the proxy process might be already dead, so we guard + %% the handler process might be already dead, so we guard %% against exceptions like noproc or {nodedown,Node}. - catch sctp_proxy:shutdown(Client#client_state.pid), + catch Handler:shutdown(Client#client_state.pid), s1gw_metrics:gauge_dec(?S1GW_GAUGE_S1AP_ENB_NUM_SCTP_CONNECTIONS), S#server_state{clients = dict:erase(Aid, Clients)}; error -> @@ -243,22 +249,23 @@ %% Gracefully terminate client connections -close_conns(#server_state{sock = Sock, clients = Clients}) -> - close_conns(Sock, dict:to_list(Clients)). +close_conns(#server_state{sock = Sock, + clients = Clients, + handler = Handler}) -> + close_conns(Sock, Handler, dict:to_list(Clients)). -close_conns(Sock, [{Aid, Client} | Clients]) -> +close_conns(Sock, Handler, [{Aid, Client} | Clients]) -> {FromAddr, FromPort} = Client#client_state.addr_port, ?LOG_NOTICE("Terminating eNB connection (id=~p, ~p:~p)", [Aid, FromAddr, FromPort]), - %% request to terminate an MME connection - %% the proxy process might be already dead, so we guard + %% the handler process might be already dead, so we guard %% against exceptions like noproc or {nodedown,Node}. - catch sctp_proxy:shutdown(Client#client_state.pid), + catch Handler:shutdown(Client#client_state.pid), %% gracefully close an eNB connection gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}), %% ... and so for the remaining clients - close_conns(Sock, Clients); + close_conns(Sock, Handler, Clients); -close_conns(_Sock, []) -> +close_conns(_Sock, _Handler, []) -> ok. %% vim:set ts=4 sw=4 et: -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38790?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: Iee4202dd4d4e9762fe74ead985aa43343ebdc524 Gerrit-Change-Number: 38790 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[S] Change in ...osmo-s1gw[master]: erab_fsm: add all-state event handler
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38780?usp=email
) Change subject: erab_fsm: add all-state event handler ...................................................................... erab_fsm: add all-state event handler This patch prepares for a follow-up commit adding a request (fetch_info) that must be handled in any state. Change-Id: I2673f18ddee0f1eee27bb0ed71ca9073d6dea3f2 --- M src/erab_fsm.erl 1 file changed, 12 insertions(+), 16 deletions(-) Approvals: laforge: Looks good to me, but someone else must approve fixeria: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified diff --git a/src/erab_fsm.erl b/src/erab_fsm.erl index ae661a1..736a2ce 100644 --- a/src/erab_fsm.erl +++ b/src/erab_fsm.erl @@ -182,8 +182,7 @@ u2c = U2C}}; erab_wait_setup_req(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), - {keep_state, S}. + handle_event(?FUNCTION_NAME, Event, EventData, S). %% state SESSION_ESTABLISH :: PFCP session establishment @@ -232,8 +231,7 @@ end; session_establish(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), - {keep_state, S}. + handle_event(?FUNCTION_NAME, Event, EventData, S). %% state WAIT_SETUP_RSP :: wait E-RAB SETUP Rsp from access @@ -253,10 +251,8 @@ S#erab_state{from = From, u2a = U2A}}; -%% Catch-all handler for this state erab_wait_setup_rsp(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), - {keep_state, S}. + handle_event(?FUNCTION_NAME, Event, EventData, S). %% state SESSION_MODIFY :: PFCP session modification @@ -293,8 +289,7 @@ end; session_modify(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), - {keep_state, S}. + handle_event(?FUNCTION_NAME, Event, EventData, S). %% state SETUP :: E-RAB is fully setup @@ -318,10 +313,8 @@ S#erab_state{from = From, rel_kind = ind}}; -%% Catch-all handler for this state erab_setup(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), - {keep_state, S}. + handle_event(?FUNCTION_NAME, Event, EventData, S). %% state SESSION_DELETE :: PFCP session deletion @@ -367,8 +360,7 @@ end; session_delete(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), - {keep_state, S}. + handle_event(?FUNCTION_NAME, Event, EventData, S). %% state WAIT_RELEASE_RSP :: wait E-RAB RELEASE Rsp @@ -385,9 +377,13 @@ ?LOG_DEBUG("Rx E-RAB RELEASE Rsp, we're done"), {stop, normal}; %% we're done! -%% Catch-all handler for this state erab_wait_release_rsp(Event, EventData, S) -> - ?LOG_ERROR("Unexpected event ~p: ~p", [Event, EventData]), + handle_event(?FUNCTION_NAME, Event, EventData, S). + + +%% Event handler for all states +handle_event(State, Event, EventData, S) -> + ?LOG_ERROR("Unexpected event ~p in state ~p: ~p", [Event, State, EventData]), {keep_state, S}. -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38780?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I2673f18ddee0f1eee27bb0ed71ca9073d6dea3f2 Gerrit-Change-Number: 38780 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[M] Change in ...osmo-s1gw[master]: erab_fsm: add fetch_info/1 for state introspection
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38781?usp=email
) Change subject: erab_fsm: add fetch_info/1 for state introspection ...................................................................... erab_fsm: add fetch_info/1 for state introspection This API will be used by the upcoming interactive VTY interface. Change-Id: I02d5d043d6eda67c5bf2a6cf6ec1b863030a05a9 Related: SYS#7066 --- M src/erab_fsm.erl M test/erab_fsm_test.erl 2 files changed, 58 insertions(+), 3 deletions(-) Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved laforge: Looks good to me, but someone else must approve pespin: Looks good to me, but someone else must approve diff --git a/src/erab_fsm.erl b/src/erab_fsm.erl index 736a2ce..2998c53 100644 --- a/src/erab_fsm.erl +++ b/src/erab_fsm.erl @@ -53,6 +53,7 @@ erab_release_cmd/1, erab_release_rsp/1, erab_release_ind/1, + fetch_info/1, shutdown/1]). -include_lib("kernel/include/logger.hrl"). @@ -147,6 +148,11 @@ gen_statem:call(Pid, ?FUNCTION_NAME). +-spec fetch_info(pid()) -> proplists:proplist(). +fetch_info(Pid) -> + gen_statem:call(Pid, ?FUNCTION_NAME). + + -spec shutdown(pid()) -> ok. shutdown(Pid) -> gen_statem:stop(Pid). @@ -382,9 +388,22 @@ %% Event handler for all states -handle_event(State, Event, EventData, S) -> +handle_event(State, {call, From}, fetch_info, + #erab_state{} = S) -> + Info = [{state, State}, + {f_teid_u2c, S#erab_state.u2c}, + {f_teid_c2u, S#erab_state.c2u}, + {f_teid_a2u, S#erab_state.a2u}, + {f_teid_u2a, S#erab_state.u2a}, + {seid_loc, S#erab_state.seid_loc}, + {seid_rem, S#erab_state.seid_rem}], + %% omit props with Value =:= undefined + Reply = lists:filter(fun({_, V}) -> V =/= undefined end, Info), + {keep_state_and_data, {reply, From, Reply}}; + +handle_event(State, Event, EventData, _S) -> ?LOG_ERROR("Unexpected event ~p in state ~p: ~p", [Event, State, EventData]), - {keep_state, S}. + {keep_state_and_data}. code_change(_Vsn, State, S, _Extra) -> diff --git a/test/erab_fsm_test.erl b/test/erab_fsm_test.erl index 0bd6b8b..e406e88 100644 --- a/test/erab_fsm_test.erl +++ b/test/erab_fsm_test.erl @@ -9,7 +9,7 @@ -define(U2A, {?TEID_U2A, ?ADDR_U2A}). %% ------------------------------------------------------------------ -%% setup functions +%% setup/misc functions %% ------------------------------------------------------------------ -define(TC(Fun), {setup, @@ -30,6 +30,11 @@ pfcp_mock:unmock_all(). +erab_fsm_info(Pid, Key) -> + Info = erab_fsm:fetch_info(Pid), + proplists:get_value(Key, Info). + + %% ------------------------------------------------------------------ %% testcase descriptions %% ------------------------------------------------------------------ @@ -52,6 +57,13 @@ ?TC(fun test_erab_release_pfcp_delete_error/1)}]. +erab_info_test_() -> + [{"E-RAB info :: state", + ?TC(fun test_erab_info_state/1)}, + {"E-RAB info :: F-TEIDs", + ?TC(fun test_erab_info_f_teid/1)}]. + + erab_shutdown_test_() -> [{"E-RAB shutdown (no session)", ?TC(fun test_erab_shutdown_no_session/1)}, @@ -120,6 +132,30 @@ ?_assertNot(erlang:is_process_alive(Pid))]. +test_erab_info_state(Pid) -> + [?_assertEqual(erab_wait_setup_req, erab_fsm_info(Pid, state)), + ?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), + ?_assertEqual(erab_wait_setup_rsp, erab_fsm_info(Pid, state)), + ?_assertEqual({ok, ?C2U}, erab_fsm:erab_setup_rsp(Pid, ?U2A)), + ?_assertEqual(erab_setup, erab_fsm_info(Pid, state)), + ?_assertEqual(ok, erab_fsm:erab_release_cmd(Pid)), + ?_assertEqual(erab_wait_release_rsp, erab_fsm_info(Pid, state)), + ?_assertEqual(ok, erab_fsm:erab_release_rsp(Pid)), + ?_assertNot(erlang:is_process_alive(Pid))]. + + +test_erab_info_f_teid(Pid) -> + [?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), + ?_assertEqual(?U2C, erab_fsm_info(Pid, f_teid_u2c)), + ?_assertEqual(?A2U, erab_fsm_info(Pid, f_teid_a2u)), + ?_assertEqual({ok, ?C2U}, erab_fsm:erab_setup_rsp(Pid, ?U2A)), + ?_assertEqual(?U2A, erab_fsm_info(Pid, f_teid_u2a)), + ?_assertEqual(?C2U, erab_fsm_info(Pid, f_teid_c2u)), + ?_assertEqual(ok, erab_fsm:erab_release_cmd(Pid)), + ?_assertEqual(ok, erab_fsm:erab_release_rsp(Pid)), + ?_assertNot(erlang:is_process_alive(Pid))]. + + test_erab_shutdown_no_session(Pid) -> %% pfcp_peer:session_delete_req/1 shall not be called ok = pfcp_mock:unmock_req(session_delete_req, 1), -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38781?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I02d5d043d6eda67c5bf2a6cf6ec1b863030a05a9 Gerrit-Change-Number: 38781 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[S] Change in ...osmo-s1gw[master]: sctp_server: add type hints
by fixeria
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38784?usp=email
) Change subject: sctp_server: add type hints ...................................................................... sctp_server: add type hints Change-Id: I0ddeccb81c52f1769fa0754c5628b53b1c9feb81 --- M src/sctp_server.erl 1 file changed, 12 insertions(+), 2 deletions(-) Approvals: fixeria: Looks good to me, approved pespin: Looks good to me, but someone else must approve Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve diff --git a/src/sctp_server.erl b/src/sctp_server.erl index 58d91ca..9de56f1 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -51,8 +51,18 @@ -include("s1gw_metrics.hrl"). -include("s1ap.hrl"). --record(server_state, {sock, clients, mme_addr_port}). --record(client_state, {addr_port, pid}). +-type addr_port() :: {inet:ip_address(), + inet:port_number()}. + +-record(server_state, {sock :: gen_sctp:sctp_socket(), + clients :: dict:dict(), + mme_addr_port :: term() + }). + +-record(client_state, {addr_port :: addr_port(), + pid :: pid() + }). + %% ------------------------------------------------------------------ %% public API -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38784?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I0ddeccb81c52f1769fa0754c5628b53b1c9feb81 Gerrit-Change-Number: 38784 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
7 months, 1 week
1
0
0
0
[S] Change in ...osmo-s1gw[master]: sctp_proxy: add fetch_info/1 for state introspection
by fixeria
fixeria has posted comments on this change by fixeria. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38793?usp=email
) Change subject: sctp_proxy: add fetch_info/1 for state introspection ...................................................................... Patch Set 2: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38793?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: Ifd495c3b5e6f036fca1fbb2a06330f06ddfbbe61 Gerrit-Change-Number: 38793 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Mon, 18 Nov 2024 19:51:46 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
7 months, 1 week
1
0
0
0
[S] Change in ...osmo-s1gw[master]: sctp_proxy: add all-state event handler
by fixeria
fixeria has posted comments on this change by fixeria. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38792?usp=email
) Change subject: sctp_proxy: add all-state event handler ...................................................................... Patch Set 2: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38792?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment Gerrit-Project: erlang/osmo-s1gw Gerrit-Branch: master Gerrit-Change-Id: I7b6acba7dd367fa28db8922a38ac10c00bd479fe Gerrit-Change-Number: 38792 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: laforge <laforge(a)osmocom.org> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Mon, 18 Nov 2024 19:51:44 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
7 months, 1 week
1
0
0
0
← Newer
1
...
93
94
95
96
97
98
99
...
221
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
Results per page:
10
25
50
100
200