Attention is currently required from: fixeria.
laforge has posted comments on this change by fixeria. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39665?usp=email )
Change subject: s1gw_metrics: use lists:filter/2 to create counters/gauges
......................................................................
Patch Set 1: Code-Review+1
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39665?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: I5aa1ab8c95820e4e5e3233c92a6c1b8b3190a30c
Gerrit-Change-Number: 39665
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Mon, 03 Mar 2025 22:36:49 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Attention is currently required from: fixeria.
laforge has posted comments on this change by fixeria. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39664?usp=email )
Change subject: sctp_common: new module with common SCTP/S1AP API
......................................................................
Patch Set 1: Code-Review+1
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39664?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: I49511b0860f45ff1410f1b6fe2f027606c7f0ae8
Gerrit-Change-Number: 39664
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Mon, 03 Mar 2025 22:36:23 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Attention is currently required from: fixeria.
laforge has posted comments on this change by fixeria. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39663?usp=email )
Change subject: sctp_{server,proxy}: log SCTP TSN, SID, SSN, and data len
......................................................................
Patch Set 2: Code-Review+2
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39663?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: I3692e3bfccdb2ab0a705b1f0903181197c0a2237
Gerrit-Change-Number: 39663
Gerrit-PatchSet: 2
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Mon, 03 Mar 2025 22:35:55 +0000
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39664?usp=email )
Change subject: sctp_common: new module with common SCTP/S1AP API
......................................................................
sctp_common: new module with common SCTP/S1AP API
Move send_data/2 and shutdown/1 from sctp_client into their own module.
Make use of this API from sctp_server to avoid code duplication.
Change-Id: I49511b0860f45ff1410f1b6fe2f027606c7f0ae8
---
M src/sctp_client.erl
A src/sctp_common.erl
M src/sctp_proxy.erl
M src/sctp_server.erl
4 files changed, 78 insertions(+), 30 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/64/39664/1
diff --git a/src/sctp_client.erl b/src/sctp_client.erl
index 72d5bd1..5875f61 100644
--- a/src/sctp_client.erl
+++ b/src/sctp_client.erl
@@ -36,9 +36,7 @@
-export([connect/0,
connect/1,
- connect/2,
- send_data/2,
- disconnect/1]).
+ connect/2]).
-include_lib("kernel/include/logger.hrl").
-include_lib("kernel/include/inet.hrl").
@@ -51,14 +49,11 @@
-type rem_addr() :: localhost | list() | inet:ip_address().
-type loc_rem_addr() :: {loc_addr(), rem_addr()}.
-type connect_result() :: {ok, gen_sctp:sctp_socket()}.
--type sock_aid() :: {gen_sctp:sctp_socket(),
- gen_sctp:assoc_id()}.
-export_type([loc_addr/0,
rem_addr/0,
loc_rem_addr/0,
- connect_result/0,
- sock_aid/0]).
+ connect_result/0]).
%% ------------------------------------------------------------------
@@ -111,15 +106,4 @@
{ok, Sock}.
--spec send_data(sock_aid(), binary()) -> ok | {error, term()}.
-send_data({Sock, Aid}, Data) ->
- gen_sctp:send(Sock, #sctp_sndrcvinfo{stream = ?S1AP_SCTP_STREAM,
- ppid = ?S1AP_SCTP_PPID,
- assoc_id = Aid}, Data).
-
-
--spec disconnect(sock_aid()) -> ok | {error, term()}.
-disconnect({Sock, Aid}) ->
- gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}).
-
%% vim:set ts=4 sw=4 et:
diff --git a/src/sctp_common.erl b/src/sctp_common.erl
new file mode 100644
index 0000000..0d28f81
--- /dev/null
+++ b/src/sctp_common.erl
@@ -0,0 +1,66 @@
+%% Copyright (C) 2025 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+%% Author: Vadim Yanitskiy <vyanitskiy(a)sysmocom.de>
+%%
+%% All Rights Reserved
+%%
+%% SPDX-License-Identifier: AGPL-3.0-or-later
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU Affero General Public License as
+%% published by the Free Software Foundation; either version 3 of the
+%% License, or (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU Affero General Public License
+%% along with this program. If not, see <https://www.gnu.org/licenses/>.
+%%
+%% Additional Permission under GNU AGPL version 3 section 7:
+%%
+%% If you modify this Program, or any covered work, by linking or
+%% combining it with runtime libraries of Erlang/OTP as released by
+%% Ericsson on https://www.erlang.org (or a modified version of these
+%% libraries), containing parts covered by the terms of the Erlang Public
+%% License (https://www.erlang.org/EPLICENSE), the licensors of this
+%% Program grant you additional permission to convey the resulting work
+%% without the need to license the runtime libraries of Erlang/OTP under
+%% the GNU Affero General Public License. Corresponding Source for a
+%% non-source form of such a combination shall include the source code
+%% for the parts of the runtime libraries of Erlang/OTP used as well as
+%% that of the covered work.
+
+-module(sctp_common).
+
+-export([send_data/2,
+ shutdown/1]).
+
+-include_lib("kernel/include/logger.hrl").
+-include_lib("kernel/include/inet_sctp.hrl").
+
+-include("s1ap.hrl").
+
+
+-type sock_aid() :: {gen_sctp:sctp_socket(),
+ gen_sctp:assoc_id()}.
+
+
+%% ------------------------------------------------------------------
+%% public API
+%% ------------------------------------------------------------------
+
+-spec send_data(sock_aid(), binary()) -> ok | {error, term()}.
+send_data({Sock, Aid}, Data) ->
+ gen_sctp:send(Sock, #sctp_sndrcvinfo{stream = ?S1AP_SCTP_STREAM,
+ ppid = ?S1AP_SCTP_PPID,
+ assoc_id = Aid}, Data).
+
+
+-spec shutdown(sock_aid()) -> ok | {error, term()}.
+shutdown({Sock, Aid}) ->
+ gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}).
+
+
+%% vim:set ts=4 sw=4 et:
diff --git a/src/sctp_proxy.erl b/src/sctp_proxy.erl
index 4ea5e19..94ff36a 100644
--- a/src/sctp_proxy.erl
+++ b/src/sctp_proxy.erl
@@ -197,7 +197,7 @@
{forward, FwdData} ->
sctp_server:send_data(EnbAid, FwdData);
{reply, ReData} ->
- ok = sctp_client:send_data({Sock, Aid}, ReData)
+ ok = sctp_common:send_data({Sock, Aid}, ReData)
end,
{keep_state, S};
@@ -240,7 +240,7 @@
case S of
#{sock := Sock,
mme_aid := Aid} ->
- sctp_client:disconnect({Sock, Aid}),
+ sctp_common:shutdown({Sock, Aid}),
gen_sctp:close(Sock);
#{sock := Sock} ->
gen_sctp:close(Sock);
@@ -260,7 +260,7 @@
handler := Pid}) ->
case s1ap_proxy:process_pdu(Pid, Data) of
{forward, FwdData} ->
- ok = sctp_client:send_data({Sock, Aid}, FwdData);
+ ok = sctp_common:send_data({Sock, Aid}, FwdData);
{reply, ReData} ->
sctp_server:send_data(EnbAid, ReData)
end.
diff --git a/src/sctp_server.erl b/src/sctp_server.erl
index f269afe..27752d8 100644
--- a/src/sctp_server.erl
+++ b/src/sctp_server.erl
@@ -131,11 +131,9 @@
{reply, {error, not_implemented}, S}.
-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),
+handle_cast({send_data, Aid, Data},
+ #server_state{sock = Sock} = S) ->
+ sctp_common:send_data({Sock, Aid}, Data),
{noreply, S};
handle_cast(Info, S) ->
@@ -154,8 +152,8 @@
?LOG_DEBUG("Child process ~p terminated with reason ~p", [Pid, Reason]),
case client_find(Pid, S0) of
{ok, {Aid, C0}} ->
- %% gracefully close the eNB connection
- gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}),
+ %% shutdown the eNB connection gracefully
+ sctp_common:shutdown({Sock, Aid}),
%% invalidate pid in the client's state
C1 = C0#client_state{pid = undefined},
S1 = S0#server_state{clients = dict:store(Aid, C1, Clients)},
@@ -291,8 +289,8 @@
%% the handler process might be already dead, so we guard
%% against exceptions like noproc or {nodedown,Node}.
catch Handler:shutdown(Client#client_state.pid),
- %% gracefully close an eNB connection
- gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}),
+ %% shutdown an eNB connection gracefully
+ sctp_common:shutdown({Sock, Aid}),
%% ... and so for the remaining clients
close_conns(Sock, Handler, Clients);
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39664?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: I49511b0860f45ff1410f1b6fe2f027606c7f0ae8
Gerrit-Change-Number: 39664
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39631?usp=email )
Change subject: sctp_server: invalidate handler's Pid on 'EXIT'
......................................................................
sctp_server: invalidate handler's Pid on 'EXIT'
An 'EXIT' signal indicates that a connection handling process is dead,
so the respective pid shall not be referenced anymore. When this
happens, the current implementation shuts the eNB association down
gracefully and simply erases the respective client state from the
clients dictionary.
The problem with this approach is that we're bypassing the logic
in client_del/2 and, as a result, never decrementing the
?S1GW_GAUGE_S1AP_ENB_NUM_SCTP_CONNECTIONS. When in sctp_recv/2 we
receive a 'shutdown_comp' event and call client_del/2, the client
state is already gone.
Instead of erasing the client state on 'EXIT', invalidate handler's
pid by setting it to undefined and keep the clients dictionary intact.
Leave the task of dictionary manipulation up to client_{add,del} API.
Change-Id: I21fedf8579baa54dc1e7ade348abffd7ee9b04c4
Related: SYS#7288
---
M src/sctp_server.erl
1 file changed, 9 insertions(+), 3 deletions(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, approved
diff --git a/src/sctp_server.erl b/src/sctp_server.erl
index 9b10bbe..0a42011 100644
--- a/src/sctp_server.erl
+++ b/src/sctp_server.erl
@@ -69,7 +69,7 @@
}).
-record(client_state, {addr_port :: addr_port(),
- pid :: pid()
+ pid :: pid() | undefined
}).
@@ -153,10 +153,12 @@
#server_state{sock = Sock, clients = Clients} = S0) ->
?LOG_DEBUG("Child process ~p terminated with reason ~p", [Pid, Reason]),
case client_find(Pid, S0) of
- {ok, {Aid, _Client}} ->
+ {ok, {Aid, C0}} ->
%% gracefully close the eNB connection
gen_sctp:eof(Sock, #sctp_assoc_change{assoc_id = Aid}),
- S1 = S0#server_state{clients = dict:erase(Aid, Clients)},
+ %% invalidate pid in the client's state
+ C1 = C0#client_state{pid = undefined},
+ S1 = S0#server_state{clients = dict:store(Aid, C1, Clients)},
{noreply, S1};
error ->
{noreply, S0}
@@ -207,6 +209,9 @@
?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 = undefined}} ->
+ ?LOG_NOTICE("eNB connection (id=~p, ~p:~p) -> MME data ignored (no handler)",
+ [Aid, FromAddr, FromPort]);
{ok, #client_state{pid = Pid}} ->
Handler:send_data(Pid, Data);
error ->
@@ -247,6 +252,7 @@
s1gw_metrics:gauge_dec(?S1GW_GAUGE_S1AP_ENB_NUM_SCTP_CONNECTIONS),
S#server_state{clients = dict:erase(Aid, Clients)};
error ->
+ ?LOG_ERROR("eNB connection (id=~p) is not known to us?!?", [Aid]),
S
end.
--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39631?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: I21fedf8579baa54dc1e7ade348abffd7ee9b04c4
Gerrit-Change-Number: 39631
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>
Attention is currently required from: fixeria, laforge, osmith, pespin.
Hello Jenkins Builder, fixeria, laforge, osmith,
I'd like you to reexamine a change. Please visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/39651?usp=email
to look at the new patch set (#6).
Change subject: stp: Fix brokeness in STP_Tests_M3UA.TC_tmt_loadshare
......................................................................
stp: Fix brokeness in STP_Tests_M3UA.TC_tmt_loadshare
The test was not even setting the traffic-mode in the IUT.
Furthermore, it was expecting pure round-robin behavior, which was the
older behavior of osmo-stp when loadshare traffic-mode was selected.
Actually split the test into 2, naming them properly (since round robin
is not a AS traffic mode in itself, but a possible implementation of the
loadshare traffic-mode.
The new test validates the usual loadshare traffic-mode based on SLS
distribution.
Related: SYS#7112
Depends: libosmo-sigtran.git Change-Id I61340549c596f1c04bc2269dbc165c327bf72037
Change-Id: I16d81cb2f88bb2927f248182ad4f8f27c8c24859
---
M stp/STP_Tests_M3UA.ttcn
M stp/expected-results.xml
2 files changed, 107 insertions(+), 9 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/51/39651/6
--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/39651?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newpatchset
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I16d81cb2f88bb2927f248182ad4f8f27c8c24859
Gerrit-Change-Number: 39651
Gerrit-PatchSet: 6
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Attention: osmith <osmith(a)sysmocom.de>
Gerrit-Attention: laforge <laforge(a)osmocom.org>
Gerrit-Attention: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>