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
November
October
September
August
July
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
September 2025
----- 2025 -----
November 2025
October 2025
September 2025
August 2025
July 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
1216 discussions
Start a n
N
ew thread
[M] Change in ...osmo-s1gw[master]: s1ap_proxy: remove eNB-ID from erab_uid()
by fixeria
03 Sep '25
03 Sep '25
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40994?usp=email
) Change subject: s1ap_proxy: remove eNB-ID from erab_uid() ...................................................................... s1ap_proxy: remove eNB-ID from erab_uid() This patch prepares for a follow-up change implementing handling of the HANDOVER related PDUs. The problem is that the HANDOVER REQUEST PDU contains MME-UE-S1AP-ID, but not eNB-UE-S1AP-ID, while the E-RAB registry requires both to be part of the erab_uid() tuple. In the scope of an S1-connection, a pair of MME-UE-S1AP-ID and E-RAB-ID values is enough to identify an E-RAB unambiguously, thus we can safely remove eNB-UE-S1AP-ID from erab_uid(). Change-Id: I7277d19080795600252306dbfa0c733f996e026e --- M src/s1ap_proxy.erl M test/s1ap_proxy_test.erl 2 files changed, 30 insertions(+), 43 deletions(-) Approvals: pespin: Looks good to me, but someone else must approve jolly: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, approved diff --git a/src/s1ap_proxy.erl b/src/s1ap_proxy.erl index 0195e39..0a08707 100644 --- a/src/s1ap_proxy.erl +++ b/src/s1ap_proxy.erl @@ -66,7 +66,8 @@ -type mme_ue_id() :: 0..16#ffffffff. -type enb_ue_id() :: 0..16#ffffff. -type erab_id() :: 0..16#ff. --type erab_uid() :: {mme_ue_id(), enb_ue_id(), erab_id()}. +-type erab_uid() :: {mme_ue_id(), erab_id()}. + -type plmn_id() :: {MCC :: nonempty_string(), MNC :: nonempty_string()}. @@ -185,30 +186,24 @@ -spec erab_uid(erab_id(), proxy_state()) -> erab_uid(). -erab_uid(ERABId, #proxy_state{mme_ue_id = MmeUeId, - enb_ue_id = EnbUeId}) -> - {MmeUeId, EnbUeId, ERABId}. +erab_uid(ERABId, #proxy_state{mme_ue_id = MmeUeId}) -> + {MmeUeId, ERABId}. --spec erab_for_each(UID, Fun, ERABs) -> ok - when UID :: {mme_ue_id(), enb_ue_id()} | {mme_ue_id()}, +-spec erab_for_each(MMEUeId, Fun, ERABs) -> ok + when MMEUeId :: mme_ue_id(), Fun :: fun((pid()) -> term()), ERABs :: [{erab_uid(), pid()}]. -erab_for_each({MMEUEId, ENBUEId} = UID, Fun, - [{{MMEUEId, ENBUEId, _}, Pid} | ERABs]) -> - Fun(Pid), %% matched by a pair of {MME,eNB}-UE-S1AP-ID - erab_for_each(UID, Fun, ERABs); +erab_for_each(MMEUEId, Fun, + [{{MMEUEId, _}, Pid} | ERABs]) -> + Fun(Pid), %% it's a match! + erab_for_each(MMEUEId, Fun, ERABs); -erab_for_each({MMEUEId} = UID, Fun, - [{{MMEUEId, _, _}, Pid} | ERABs]) -> - Fun(Pid), %% matched by an MME-UE-S1AP-ID - erab_for_each(UID, Fun, ERABs); - -erab_for_each(UID, Fun, +erab_for_each(MMEUeId, Fun, [_ERAB | ERABs]) -> - erab_for_each(UID, Fun, ERABs); + erab_for_each(MMEUeId, Fun, ERABs); -erab_for_each(_UID, _Fun, []) -> +erab_for_each(_MMEUeId, _Fun, []) -> ok. @@ -585,13 +580,11 @@ #proxy_state{erabs = ERABs} = S) -> ?LOG_DEBUG("Processing UE CONTEXT RELEASE REQUEST"), ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_RELEASE_CTX_REQ, S), - %% fetch {MME,eNB}-UE-S1AP-ID values (mandatory IEs) + %% fetch MME-UE-S1AP-ID value (mandatory IE) #'ProtocolIE-Field'{id = ?'id-MME-UE-S1AP-ID', value = MMEUEId} = lists:nth(1, IEs), - #'ProtocolIE-Field'{id = ?'id-eNB-UE-S1AP-ID', - value = ENBUEId} = lists:nth(2, IEs), - %% poke E-RAB FSMs with the matching {MME,eNB}-UE-S1AP-ID - erab_for_each({MMEUEId, ENBUEId}, + %% poke E-RAB FSMs with the matching MME-UE-S1AP-ID + erab_for_each(MMEUEId, fun erab_fsm:erab_release_ind/1, dict:to_list(ERABs)), {forward, S}; %% forward as-is, there's nothing to patch @@ -603,21 +596,17 @@ #proxy_state{erabs = ERABs} = S) -> ?LOG_DEBUG("Processing UE CONTEXT RELEASE COMMAND"), ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_RELEASE_CTX_CMD, S), + %% fetch MME-UE-S1AP-ID value from UE-S1AP-IDs (mandatory IE) #'ProtocolIE-Field'{id = ?'id-UE-S1AP-IDs', value = S1APIDs} = lists:nth(1, IEs), - case S1APIDs of - {'uE-S1AP-ID-pair', #'UE-S1AP-ID-pair'{'mME-UE-S1AP-ID' = MMEUEId, - 'eNB-UE-S1AP-ID' = ENBUEId}} -> - %% poke E-RAB FSMs with the matching {MME,eNB}-UE-S1AP-ID - erab_for_each({MMEUEId, ENBUEId}, - fun erab_fsm:erab_release_cmd/1, - dict:to_list(ERABs)); - {'mME-UE-S1AP-ID', MMEUEId} -> - %% poke E-RAB FSMs with the matching MME-UE-S1AP-ID - erab_for_each({MMEUEId}, - fun erab_fsm:erab_release_cmd/1, - dict:to_list(ERABs)) + MMEUEId = case S1APIDs of + {'uE-S1AP-ID-pair', #'UE-S1AP-ID-pair'{'mME-UE-S1AP-ID' = Val}} -> Val; + {'mME-UE-S1AP-ID', Val} -> Val end, + %% poke E-RAB FSMs with the matching MME-UE-S1AP-ID + erab_for_each(MMEUEId, + fun erab_fsm:erab_release_cmd/1, + dict:to_list(ERABs)), {forward, S}; %% forward as-is, there's nothing to patch %% 9.1.4.7 UE CONTEXT RELEASE COMPLETE @@ -627,13 +616,11 @@ #proxy_state{erabs = ERABs} = S) -> ?LOG_DEBUG("Processing UE CONTEXT RELEASE COMPLETE"), ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_RELEASE_CTX_COMPL, S), - %% fetch {MME,eNB}-UE-S1AP-ID values (mandatory IEs) + %% fetch MME-UE-S1AP-ID value (mandatory IE) #'ProtocolIE-Field'{id = ?'id-MME-UE-S1AP-ID', value = MMEUEId} = lists:nth(1, IEs), - #'ProtocolIE-Field'{id = ?'id-eNB-UE-S1AP-ID', - value = ENBUEId} = lists:nth(2, IEs), - %% poke E-RAB FSMs with the matching {MME,eNB}-UE-S1AP-ID - erab_for_each({MMEUEId, ENBUEId}, + %% poke E-RAB FSMs with the matching MME-UE-S1AP-ID + erab_for_each(MMEUEId, fun erab_fsm:erab_release_rsp/1, dict:to_list(ERABs)), {forward, S}; %% forward as-is, there's nothing to patch @@ -1079,7 +1066,7 @@ enb_ue_id = EnbUeId}) -> %% FIXME: Currently we respond with E-RAB-ID of the first E-RAB in the registry. %% Instead, we need to iterate over E-RABs in the REQUEST and reject them all. - [{_, _, FirstERABid}|_] = dict:fetch_keys(ERABs), + [{_, FirstERABid}|_] = dict:fetch_keys(ERABs), Cause = {transport, 'transport-resource-unavailable'}, ERABitem = #'E-RABItem'{'e-RAB-ID' = FirstERABid, cause = Cause}, diff --git a/test/s1ap_proxy_test.erl b/test/s1ap_proxy_test.erl index 8f338c9..60b09dc 100644 --- a/test/s1ap_proxy_test.erl +++ b/test/s1ap_proxy_test.erl @@ -128,7 +128,7 @@ ?_assertMetricENB(?S1GW_CTR_S1AP_PROXY_OUT_PKT_FWD_ALL, 2 + 2), ?_assertMetricENB(?S1GW_CTR_S1AP_PROXY_OUT_PKT_FWD_PROC, 2), ?_assertMetricENB(?S1GW_CTR_S1AP_PROXY_OUT_PKT_FWD_UNMODIFIED, 2), - ?_assertMatch({ok, _}, s1ap_proxy:fetch_erab(Pid, {7, 9, 6})), + ?_assertMatch({ok, _}, s1ap_proxy:fetch_erab(Pid, {7, 6})), ?_assertMatch([_], s1ap_proxy:fetch_erab_list(Pid))]. @@ -164,7 +164,7 @@ ?_assertMatch({forward, _}, s1ap_proxy:process_pdu(Pid, SetupRspIn)), %% duplicate E-RAB SETUP REQUEST triggers a reply ?_assertEqual({reply, SetupRspExp}, s1ap_proxy:process_pdu(Pid, SetupReqIn)), - ?_assertMatch({ok, _}, s1ap_proxy:fetch_erab(Pid, {7, 9, 6})), + ?_assertMatch({ok, _}, s1ap_proxy:fetch_erab(Pid, {7, 6})), ?_assertMatch([_], s1ap_proxy:fetch_erab_list(Pid))]. -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40994?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: I7277d19080795600252306dbfa0c733f996e026e Gerrit-Change-Number: 40994 Gerrit-PatchSet: 3 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: jolly <andreas(a)eversberg.eu> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
1
0
0
0
[XS] Change in ...osmo-s1gw[master]: s1ap_proxy: add type hints for #proxy_state.erabs
by fixeria
03 Sep '25
03 Sep '25
fixeria has submitted this change. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41003?usp=email
) Change subject: s1ap_proxy: add type hints for #proxy_state.erabs ...................................................................... s1ap_proxy: add type hints for #proxy_state.erabs Change-Id: I08e0339bf401067eaf8ace32da619d5016fe98d7 --- M src/s1ap_proxy.erl 1 file changed, 2 insertions(+), 1 deletion(-) Approvals: pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, approved Jenkins Builder: Verified jolly: Looks good to me, but someone else must approve diff --git a/src/s1ap_proxy.erl b/src/s1ap_proxy.erl index 0a08707..a08f61d 100644 --- a/src/s1ap_proxy.erl +++ b/src/s1ap_proxy.erl @@ -72,7 +72,8 @@ MNC :: nonempty_string()}. -record(proxy_state, {conn_info :: sctp_server:conn_info(), - erabs :: dict:dict(), + erabs :: dict:dict(K :: erab_uid(), + V :: pid()), enb_id :: undefined | non_neg_integer(), plmn_id :: undefined | plmn_id(), genb_id_str :: undefined | string(), -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41003?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: I08e0339bf401067eaf8ace32da619d5016fe98d7 Gerrit-Change-Number: 41003 Gerrit-PatchSet: 2 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: jolly <andreas(a)eversberg.eu> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
1
0
0
0
[M] Change in ...osmo-s1gw[master]: s1ap_proxy: remove eNB-ID from erab_uid()
by fixeria
03 Sep '25
03 Sep '25
fixeria has posted comments on this change by fixeria. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40994?usp=email
) Change subject: s1ap_proxy: remove eNB-ID from erab_uid() ...................................................................... Patch Set 3: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40994?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: I7277d19080795600252306dbfa0c733f996e026e Gerrit-Change-Number: 40994 Gerrit-PatchSet: 3 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: jolly <andreas(a)eversberg.eu> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Comment-Date: Wed, 03 Sep 2025 18:20:23 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1
0
0
0
[XS] Change in ...osmo-epdg[master]: rebar.config: Update rebar3_diameter_compiler from 0.8.0 to v0.8.1
by fixeria
03 Sep '25
03 Sep '25
Attention is currently required from: lynxis lazus, pespin. fixeria has posted comments on this change by pespin. (
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/41010?usp=email
) Change subject: rebar.config: Update rebar3_diameter_compiler from 0.8.0 to v0.8.1 ...................................................................... Patch Set 1: Code-Review+1 -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/41010?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-epdg Gerrit-Branch: master Gerrit-Change-Id: Ic67581435a06052b0e3159172a2324dd1c1e58fc Gerrit-Change-Number: 41010 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Attention: pespin <pespin(a)sysmocom.de> Gerrit-Attention: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Comment-Date: Wed, 03 Sep 2025 16:52:02 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1
0
0
0
[XS] Change in ...osmo-epdg[master]: rebar.config: Update rebar3_diameter_compiler from 0.8.0 to v0.8.1
by pespin
03 Sep '25
03 Sep '25
pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/41010?usp=email
) Change subject: rebar.config: Update rebar3_diameter_compiler from 0.8.0 to v0.8.1 ...................................................................... rebar.config: Update rebar3_diameter_compiler from 0.8.0 to v0.8.1 There's a new patch release of rebar3_diameter_compiler with multiple fixes and improvements, use it. Change-Id: Ic67581435a06052b0e3159172a2324dd1c1e58fc --- M rebar.config 1 file changed, 1 insertion(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/10/41010/1 diff --git a/rebar.config b/rebar.config index 7b85d5b..68092a7 100644 --- a/rebar.config +++ b/rebar.config @@ -13,7 +13,7 @@ {minimum_otp_vsn, "25.2.3"}. {plugins, [ {rebar3_diameter_compiler, - {git, "
https://github.com/carlosedp/rebar3_diameter_compiler.git
", {tag, "0.8.0"}}} + {git, "
https://github.com/carlosedp/rebar3_diameter_compiler.git
", {tag, "v0.8.1"}}} ]}. {xref_checks, [undefined_function_calls, undefined_functions, -- To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/41010?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-epdg Gerrit-Branch: master Gerrit-Change-Id: Ic67581435a06052b0e3159172a2324dd1c1e58fc Gerrit-Change-Number: 41010 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de>
1
0
0
0
[S] Change in osmo-ttcn3-hacks[master]: sgsn: TC_stat_bsc_sctp_disconnected: validate using StatsD
by pespin
03 Sep '25
03 Sep '25
pespin has submitted this change. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40992?usp=email
) Change subject: sgsn: TC_stat_bsc_sctp_disconnected: validate using StatsD ...................................................................... sgsn: TC_stat_bsc_sctp_disconnected: validate using StatsD Similar to what we alreay do in counterpart MSC_Tests_iu.TC_stat_bsc_sctp_disconnected. Related: OS#3403 Depends: osmo-sgsn.git Change-Id I51b5227d92027f1251dc4debbbf59737e7c1a9ba Change-Id: I1ff8c51a73556357c5a5e97bc2a0edec30f1cf03 --- M sgsn/SGSN_Tests.ttcn M sgsn/SGSN_Tests_Iu.ttcn 2 files changed, 32 insertions(+), 2 deletions(-) Approvals: pespin: Looks good to me, approved Jenkins Builder: Verified lynxis lazus: Looks good to me, but someone else must approve osmith: Looks good to me, but someone else must approve diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn index 1b339cf..7364dc4 100644 --- a/sgsn/SGSN_Tests.ttcn +++ b/sgsn/SGSN_Tests.ttcn @@ -566,6 +566,11 @@ return vc_conn; } +friend function f_sgsn_stats_prefix() return charstring +{ + return mp_statsd_prefix & "sgsn.0."; +} + /* TODO: * Detach without Attach * SM procedures without attach / RAU diff --git a/sgsn/SGSN_Tests_Iu.ttcn b/sgsn/SGSN_Tests_Iu.ttcn index 6e8b5b6..71c20ef 100644 --- a/sgsn/SGSN_Tests_Iu.ttcn +++ b/sgsn/SGSN_Tests_Iu.ttcn @@ -4,6 +4,11 @@ import from Osmocom_VTY_Functions all; import from Misc_Helpers all; +import from StatsD_Types all; +import from StatsD_CodecPort all; +import from StatsD_CodecPort_CtrlFunct all; +import from StatsD_Checker all; + import from SGSN_Tests all; import from BSSGP_Emulation all; @@ -432,12 +437,28 @@ */ testcase TC_stat_rnc_sctp_disconnected() runs on test_CT { var BSSGP_ConnHdlr vc_conn; + var charstring sgsn_stats_prefix := f_sgsn_stats_prefix(); + var StatsDExpects expect_connected := { + {name := sgsn_stats_prefix & "iu_peers.total", mtype := "g", min := 1, max := 1}, + {name := sgsn_stats_prefix & "iu_peers.active", mtype := "g", min := 1, max := 1} + }; + var StatsDExpects expect_disconnected := { + {name := sgsn_stats_prefix & "iu_peers.total", mtype := "g", min := 1, max := 1}, + {name := sgsn_stats_prefix & "iu_peers.active", mtype := "g", min := 0, max := 0} + }; + + g_statd_timeout := 15.0; f_init(); f_init_vty_stp(); f_sleep(1.0); f_vty_config(SGSNVTY, "sgsn", "encryption uea 0"); + connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC); + f_statsd_reset(); + f_statsd_expect(expect_connected, wait_converge := true); + disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC); + vc_conn := f_start_handler(refers(f_TC_iu_attach), testcasename(), g_gb, 1008); vc_conn.done; @@ -445,12 +466,16 @@ f_vty_stp_sgsn_asp_cmd("shutdown"); /* Wait for AS PENDING->INACTIVE transition (T(r) timeout after 2000msec): */ - f_sleep(3.0); + connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC); + f_statsd_expect(expect_disconnected, wait_converge := true); + disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC); f_logp(SGSNVTY, "Restarting SGSN ASP in STP"); f_vty_stp_sgsn_asp_cmd("no shutdown"); - f_sleep(15.0); + connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC); + f_statsd_expect(expect_connected, wait_converge := true); + disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC); vc_conn := f_start_handler(refers(f_TC_iu_attach), testcasename(), g_gb, 1009); vc_conn.done; -- To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40992?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I1ff8c51a73556357c5a5e97bc2a0edec30f1cf03 Gerrit-Change-Number: 40992 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
1
0
0
0
[S] Change in osmo-ttcn3-hacks[master]: sgsn: TC_stat_bsc_sctp_disconnected: validate using StatsD
by pespin
03 Sep '25
03 Sep '25
Attention is currently required from: fixeria. pespin has posted comments on this change by pespin. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40992?usp=email
) Change subject: sgsn: TC_stat_bsc_sctp_disconnected: validate using StatsD ...................................................................... Patch Set 1: Code-Review+2 -- To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40992?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I1ff8c51a73556357c5a5e97bc2a0edec30f1cf03 Gerrit-Change-Number: 40992 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de> Gerrit-Reviewer: pespin <pespin(a)sysmocom.de> Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Comment-Date: Wed, 03 Sep 2025 14:17:13 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1
0
0
0
[M] Change in osmo-sgsn[master]: stats: Introduce stats sgsn.iu_peers.{total,active}
by lynxis lazus
03 Sep '25
03 Sep '25
lynxis lazus has submitted this change. (
https://gerrit.osmocom.org/c/osmo-sgsn/+/40990?usp=email
) Change subject: stats: Introduce stats sgsn.iu_peers.{total,active} ...................................................................... stats: Introduce stats sgsn.iu_peers.{total,active} Change-Id: I51b5227d92027f1251dc4debbbf59737e7c1a9ba --- M include/osmocom/sgsn/sgsn.h M src/sgsn/iu_rnc.c M src/sgsn/iu_rnc_fsm.c M src/sgsn/sgsn.c 4 files changed, 53 insertions(+), 0 deletions(-) Approvals: Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve lynxis lazus: Looks good to me, approved diff --git a/include/osmocom/sgsn/sgsn.h b/include/osmocom/sgsn/sgsn.h index 8fc97b0..8524dd7 100644 --- a/include/osmocom/sgsn/sgsn.h +++ b/include/osmocom/sgsn/sgsn.h @@ -5,6 +5,7 @@ #include <osmocom/core/msgb.h> #include <osmocom/core/select.h> +#include <osmocom/core/stat_item.h> #include <osmocom/crypt/gprs_cipher.h> #include <osmocom/gprs/gprs_ns2.h> #include <osmocom/gprs/gprs_bssgp.h> @@ -159,6 +160,7 @@ struct sgsn_ra_global *routing_area; struct rate_ctr_group *rate_ctrs; + struct osmo_stat_item_group *statg; struct llist_head apn_list; /* list of struct sgsn_apn_ctx */ struct llist_head ggsn_list; /* list of struct sgsn_ggsn_ctx */ @@ -184,6 +186,21 @@ extern struct sgsn_instance *sgsn; extern void *tall_sgsn_ctx; +enum { + SGSN_STAT_IU_PEERS_TOTAL, + SGSN_STAT_IU_PEERS_ACTIVE, +}; +static inline void sgsn_stat_inc(unsigned int idx, int32_t value) +{ + osmo_stat_item_inc(osmo_stat_item_group_get_item(sgsn->statg, idx), value); +} + +static inline void sgsn_stat_dec(unsigned int idx, int32_t value) +{ + osmo_stat_item_dec(osmo_stat_item_group_get_item(sgsn->statg, idx), value); +} + + /* * ctrl interface related work (sgsn_ctrl.c) */ diff --git a/src/sgsn/iu_rnc.c b/src/sgsn/iu_rnc.c index abe6f61..38cddb5 100644 --- a/src/sgsn/iu_rnc.c +++ b/src/sgsn/iu_rnc.c @@ -76,6 +76,7 @@ osmo_rnc_id_name(rnc_id), addr_str); llist_add(&rnc->entry, &sgsn->rnc_list); + sgsn_stat_inc(SGSN_STAT_IU_PEERS_TOTAL, 1); LOGP(DRANAP, LOGL_NOTICE, "New RNC %s at %s\n", osmo_rnc_id_name(&rnc->rnc_id), osmo_sccp_addr_dump(rnc_sccp_addr)); diff --git a/src/sgsn/iu_rnc_fsm.c b/src/sgsn/iu_rnc_fsm.c index 4085586..6f610b4 100644 --- a/src/sgsn/iu_rnc_fsm.c +++ b/src/sgsn/iu_rnc_fsm.c @@ -216,6 +216,12 @@ } } +static void iu_rnc_st_ready_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + if (prev_state != IU_RNC_ST_READY) + sgsn_stat_inc(SGSN_STAT_IU_PEERS_ACTIVE, 1); +} + static void iu_rnc_st_ready(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct ranap_iu_rnc *rnc = fi->priv; @@ -261,6 +267,12 @@ } } +static void iu_rnc_st_ready_onleave(struct osmo_fsm_inst *fi, uint32_t next_state) +{ + if (next_state != IU_RNC_ST_READY) + sgsn_stat_dec(SGSN_STAT_IU_PEERS_ACTIVE, 1); +} + static int iu_rnc_fsm_timer_cb(struct osmo_fsm_inst *fi) { struct ranap_iu_rnc *rnc = fi->priv; @@ -273,6 +285,10 @@ struct ranap_iu_rnc *rnc = fi->priv; iu_rnc_discard_all_ue_ctx(rnc); + + if (rnc->fi->state == IU_RNC_ST_READY) + sgsn_stat_dec(SGSN_STAT_IU_PEERS_ACTIVE, 1); + sgsn_stat_dec(SGSN_STAT_IU_PEERS_TOTAL, 1); } static const struct osmo_fsm_state iu_rnc_fsm_states[] = { @@ -314,6 +330,8 @@ [IU_RNC_ST_READY] = { .name = "READY", .action = iu_rnc_st_ready, + .onenter = iu_rnc_st_ready_onenter, + .onleave = iu_rnc_st_ready_onleave, .in_event_mask = 0 | S(IU_RNC_EV_RX_RESET) | S(IU_RNC_EV_MSG_UP_CO_INITIAL) diff --git a/src/sgsn/sgsn.c b/src/sgsn/sgsn.c index 1b02f76..fe52e6c 100644 --- a/src/sgsn/sgsn.c +++ b/src/sgsn/sgsn.c @@ -103,6 +103,20 @@ sgsn_ctr_description, }; + +static const struct osmo_stat_item_desc sgsn_stat_item_description[] = { + [SGSN_STAT_IU_PEERS_TOTAL] = { "iu_peers:total", "Total Iu peers (RNC, HNBGW) seen since startup", OSMO_STAT_ITEM_NO_UNIT, 4, 0}, + [SGSN_STAT_IU_PEERS_ACTIVE] = { "iu_peers:active", "Currently active Iu peers (RANAP ready)", OSMO_STAT_ITEM_NO_UNIT, 4, 0}, +}; + +static const struct osmo_stat_item_group_desc sgsn_statg_desc = { + "sgsn", + "serving GPRS support node statistics", + OSMO_STATS_CLASS_GLOBAL, + ARRAY_SIZE(sgsn_stat_item_description), + sgsn_stat_item_description, +}; + static void sgsn_llme_cleanup_free(struct gprs_llc_llme *llme) { struct sgsn_mm_ctx *mmctx = NULL; @@ -161,6 +175,7 @@ #endif /* #if BUILD_IU */ osmo_timer_del(&sgi->llme_timer); rate_ctr_group_free(sgi->rate_ctrs); + osmo_stat_item_group_free(sgi->statg); return 0; } @@ -185,6 +200,8 @@ inst->rate_ctrs = rate_ctr_group_alloc(inst, &sgsn_ctrg_desc, 0); OSMO_ASSERT(inst->rate_ctrs); + inst->statg = osmo_stat_item_group_alloc(inst, &sgsn_statg_desc, 0); + OSMO_ASSERT(inst->statg); INIT_LLIST_HEAD(&inst->apn_list); INIT_LLIST_HEAD(&inst->ggsn_list); -- To view, visit
https://gerrit.osmocom.org/c/osmo-sgsn/+/40990?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: I51b5227d92027f1251dc4debbbf59737e7c1a9ba Gerrit-Change-Number: 40990 Gerrit-PatchSet: 2 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
1
0
0
0
[L] Change in osmo-sgsn[master]: ranap: Take into account RNC availability during paging
by lynxis lazus
03 Sep '25
03 Sep '25
lynxis lazus has submitted this change. (
https://gerrit.osmocom.org/c/osmo-sgsn/+/41001?usp=email
) Change subject: ranap: Take into account RNC availability during paging ...................................................................... ranap: Take into account RNC availability during paging Avoid transmitting a RANAP paging message to an RNC if we already know it's not currently available over SCCP. Take into account that information when deciding/printing whether the paging could be sent or not. Take the chance to clean up the iu paging function helpers inherited from osmo-iuh iu_client.c to better fit the data domain in osmo-sgsn (iu_rnc). Change-Id: I24e5446bcf4c958028577230b231960acea9e5b9 --- M include/osmocom/sgsn/gprs_ranap.h M include/osmocom/sgsn/iu_rnc.h M include/osmocom/sgsn/iu_rnc_fsm.h M src/sgsn/gprs_ranap.c M src/sgsn/iu_client.c M src/sgsn/iu_rnc.c M src/sgsn/iu_rnc_fsm.c 7 files changed, 144 insertions(+), 115 deletions(-) Approvals: lynxis lazus: Looks good to me, approved Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve diff --git a/include/osmocom/sgsn/gprs_ranap.h b/include/osmocom/sgsn/gprs_ranap.h index 62914ba..b959b57 100644 --- a/include/osmocom/sgsn/gprs_ranap.h +++ b/include/osmocom/sgsn/gprs_ranap.h @@ -30,9 +30,6 @@ int sgsn_ranap_iu_tx_sec_mode_cmd(struct ranap_ue_conn_ctx *uectx, struct osmo_auth_vector *vec, int send_ck, int new_key); int sgsn_ranap_iu_tx_common_id(struct ranap_ue_conn_ctx *ue_ctx, const char *imsi); -int sgsn_ranap_iu_tx_paging_cmd(struct osmo_sccp_addr *called_addr, - const char *imsi, const uint32_t *tmsi, - bool is_ps, uint32_t paging_cause); int sgsn_ranap_iu_tx_release(struct ranap_ue_conn_ctx *ctx, const struct RANAP_Cause *cause); /* Transmit a Iu Release Command and submit event RANAP_IU_EVENT_IU_RELEASE upon diff --git a/include/osmocom/sgsn/iu_rnc.h b/include/osmocom/sgsn/iu_rnc.h index b0e5be3..0382b74 100644 --- a/include/osmocom/sgsn/iu_rnc.h +++ b/include/osmocom/sgsn/iu_rnc.h @@ -1,6 +1,7 @@ #pragma once #include <stdbool.h> +#include <stdint.h> #include <osmocom/core/defs.h> #include <osmocom/core/linuxlist.h> @@ -43,6 +44,12 @@ void iu_rnc_discard_all_ue_ctx(struct ranap_iu_rnc *rnc); +int iu_rnc_tx_paging_cmd(struct ranap_iu_rnc *rnc, + const char *imsi, + const uint32_t *tmsi, + bool is_ps, + uint32_t paging_cause); + #define LOG_RNC_CAT(IU_RNC, subsys, loglevel, fmt, args ...) \ LOGPFSMSL((IU_RNC)->fi, subsys, loglevel, fmt, ## args) diff --git a/include/osmocom/sgsn/iu_rnc_fsm.h b/include/osmocom/sgsn/iu_rnc_fsm.h index d9be576..f69d82e 100644 --- a/include/osmocom/sgsn/iu_rnc_fsm.h +++ b/include/osmocom/sgsn/iu_rnc_fsm.h @@ -29,6 +29,7 @@ IU_RNC_EV_MSG_UP_CO, /* struct iu_rnc_ev_msg_up_co_ctx* */ IU_RNC_EV_RX_RESET, /* no param */ IU_RNC_EV_RX_RESET_ACK, /* no param */ + IU_RNC_EV_MSG_DOWN_CL, /* struct msgb* */ IU_RNC_EV_AVAILABLE, IU_RNC_EV_UNAVAILABLE }; diff --git a/src/sgsn/gprs_ranap.c b/src/sgsn/gprs_ranap.c index df9cc9e..1cdb72b 100644 --- a/src/sgsn/gprs_ranap.c +++ b/src/sgsn/gprs_ranap.c @@ -287,22 +287,6 @@ return sgsn_scu_iups_tx_data_req(uectx->rnc->scu_iups, uectx->conn_id, msg); } -/* Send a paging command down a given SCCP User. tmsi and paging_cause are - * optional and may be passed NULL and 0, respectively, to disable their use. - * See enum RANAP_PagingCause. - * - * If TMSI is given, the IMSI is not sent over the air interface. Nevertheless, - * the IMSI is still required for resolution in the HNB-GW and/or(?) RNC. */ -int sgsn_ranap_iu_tx_paging_cmd(struct osmo_sccp_addr *called_addr, - const char *imsi, const uint32_t *tmsi, - bool is_ps, uint32_t paging_cause) -{ - struct msgb *msg; - msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps ? 1 : 0, paging_cause); - msg->l2h = msg->data; - return osmo_sccp_tx_unitdata_msg(sgsn->sccp.scu_iups->scu, &sgsn->sccp.scu_iups->local_sccp_addr, called_addr, msg); -} - int sgsn_ranap_iu_tx(struct msgb *msg_nas, uint8_t sapi) { struct ranap_ue_conn_ctx *uectx = msg_nas->dst; diff --git a/src/sgsn/iu_client.c b/src/sgsn/iu_client.c index cb5d096..164ff71 100644 --- a/src/sgsn/iu_client.c +++ b/src/sgsn/iu_client.c @@ -43,12 +43,6 @@ #include <osmocom/sgsn/sccp.h> #include <osmocom/sgsn/sgsn.h> -#define LOGPIU(level, fmt, args...) \ - LOGP(DRANAP, level, fmt, ## args) - -#define LOGPIUC(level, fmt, args...) \ - LOGPC(DRANAP, level, fmt, ## args) - const struct value_string iu_client_event_type_names[] = { OSMO_VALUE_STRING(RANAP_IU_EVENT_RAB_ASSIGN), OSMO_VALUE_STRING(RANAP_IU_EVENT_SECURITY_MODE_COMPLETE), @@ -66,7 +60,7 @@ if (ue_ctx && !ue_ctx->notification) return 0; - LOGPIU(LOGL_DEBUG, "Submit Iu event to upper layer: %s\n", iu_client_event_type_str(type)); + LOGP(DRANAP, LOGL_DEBUG, "Submit Iu event to upper layer: %s\n", iu_client_event_type_str(type)); return sgsn_ranap_iu_event(ue_ctx, type, data); } @@ -126,78 +120,74 @@ ***********************************************************************/ /* legacy, do a first match with ignoring PLMN */ -static bool iu_rnc_lac_rac_find_legacy(struct ranap_iu_rnc **rnc, struct iu_lac_rac_entry **lre, - uint16_t lac, uint8_t rac) -{ - struct ranap_iu_rnc *r; - struct iu_lac_rac_entry *e; - - if (rnc) - *rnc = NULL; - if (lre) - *lre = NULL; - - llist_for_each_entry(r, &sgsn->rnc_list, entry) { - llist_for_each_entry(e, &r->lac_rac_list, entry) { - if (e->rai.lac.lac == lac && e->rai.rac == rac) { - if (rnc) - *rnc = r; - if (lre) - *lre = e; - return true; - } - } - } - return false; -} - -static int iu_page(const char *imsi, const uint32_t *tmsi_or_ptmsi, - uint16_t lac, uint8_t rac, bool is_ps) +static struct ranap_iu_rnc *iu_rnc_lac_rac_find_legacy(uint16_t lac, uint8_t rac) { struct ranap_iu_rnc *rnc; - const char *log_msg; - int log_level; - int paged = 0; + struct iu_lac_rac_entry *e; - iu_rnc_lac_rac_find_legacy(&rnc, NULL, lac, rac); - if (rnc) { - if (sgsn_ranap_iu_tx_paging_cmd(&rnc->sccp_addr, imsi, tmsi_or_ptmsi, is_ps, 0) == 0) { - log_msg = "Paging"; - log_level = LOGL_DEBUG; - paged = 1; - } else { - log_msg = "Paging failed"; - log_level = LOGL_ERROR; + llist_for_each_entry(rnc, &sgsn->rnc_list, entry) { + llist_for_each_entry(e, &rnc->lac_rac_list, entry) { + if (e->rai.lac.lac == lac && e->rai.rac == rac) + return rnc; } - } else { - log_msg = "Found no RNC to Page"; - log_level = LOGL_ERROR; } - - if (is_ps) - LOGPIU(log_level, "IuPS: %s on LAC %d RAC %d", log_msg, lac, rac); - else - LOGPIU(log_level, "IuCS: %s on LAC %d", log_msg, lac); - if (rnc) - LOGPIUC(log_level, " at SCCP-addr %s", osmo_sccp_addr_dump(&rnc->sccp_addr)); - if (tmsi_or_ptmsi) - LOGPIUC(log_level, ", for %s %08x\n", is_ps ? "PTMSI" : "TMSI", *tmsi_or_ptmsi); - else - LOGPIUC(log_level, ", for IMSI %s\n", imsi); - - return paged; + return NULL; } /*! Old paging() doesn't use PLMN and transmit paging command only to the first RNC */ int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac) { - return iu_page(imsi, tmsi, lac, 0, false); + struct ranap_iu_rnc *rnc; + char log_msg[32] = {}; + int rc; + + if (tmsi) + snprintf(log_msg, sizeof(log_msg), "TMSI %08x\n", *tmsi); + else + snprintf(log_msg, sizeof(log_msg), "IMSI %s\n", imsi); + + rnc = iu_rnc_lac_rac_find_legacy(lac, 0); + if (!rnc) { + LOGP(DRANAP, LOGL_INFO, "Found no RNC to Page CS on LAC %u for %s", + lac, log_msg); + return 0; + } + + rc = iu_rnc_tx_paging_cmd(rnc, imsi, tmsi, false, 0); + if (rc != 0) { + LOG_RNC(rnc, LOGL_ERROR, "Failed to tx Paging CS for LAC %u for %s", + lac, log_msg); + return 0; + } + return 1; } /*! Old paging() doesn't use PLMN and transmit paging command only to the first RNC */ int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac) { - return iu_page(imsi, ptmsi, lac, rac, true); + struct ranap_iu_rnc *rnc; + char log_msg[32] = {}; + int rc; + + if (ptmsi) + snprintf(log_msg, sizeof(log_msg), "P-TMSI %08x\n", *ptmsi); + else + snprintf(log_msg, sizeof(log_msg), "IMSI %s\n", imsi); + + rnc = iu_rnc_lac_rac_find_legacy(lac, rac); + if (!rnc) { + LOGP(DRANAP, LOGL_INFO, "Found no RNC to Page PS on LAC %u RAC %u for %s", + lac, rac, log_msg); + return 0; + } + + rc = iu_rnc_tx_paging_cmd(rnc, imsi, ptmsi, true, 0); + if (rc != 0) { + LOG_RNC(rnc, LOGL_ERROR, "Failed to tx Paging PS for LAC %u RAC %u for %s", + lac, rac, log_msg); + return 0; + } + return 1; } /*! Transmit a single page request towards all RNCs serving the specific LAI (no page retransmission). @@ -212,8 +202,13 @@ struct ranap_iu_rnc *rnc; struct iu_lac_rac_entry *entry; char log_msg[32] = {}; - int paged = 0; - int rc = 0; + unsigned int paged = 0; + int rc; + + if (tmsi) + snprintf(log_msg, sizeof(log_msg), "TMSI %08x\n", *tmsi); + else + snprintf(log_msg, sizeof(log_msg), "IMSI %s\n", imsi); /* find all RNCs which are serving this LA */ llist_for_each_entry(rnc, &sgsn->rnc_list, entry) { @@ -221,27 +216,23 @@ if (osmo_lai_cmp(&entry->rai.lac, lai)) continue; - rc = sgsn_ranap_iu_tx_paging_cmd(&rnc->sccp_addr, imsi, tmsi, false, 0); - if (rc > 0) { - LOGPIU(LOGL_ERROR, "IuCS: Failed to tx Paging RNC %s for LAC %s for IMSI %s / TMSI %08x", - osmo_rnc_id_name(&rnc->rnc_id), - osmo_lai_name(lai), imsi, tmsi ? *tmsi : GSM_RESERVED_TMSI); + rc = iu_rnc_tx_paging_cmd(rnc, imsi, tmsi, false, 0); + if (rc != 0) { + LOG_RNC(rnc, LOGL_ERROR, "Failed to tx Paging CS for LAI %s for %s", + osmo_lai_name(lai), log_msg); + } else { + paged++; } - paged++; break; } } - if (tmsi) - snprintf(log_msg, sizeof(log_msg), "for TMSI %08x\n", *tmsi); - else - snprintf(log_msg, sizeof(log_msg) - 1, "for IMSI %s\n", imsi); - if (paged) - LOGPIU(LOGL_DEBUG, "IuPS: Paged %d RNCs on LAI %s for %s", paged, osmo_lai_name(lai), log_msg); + LOGP(DRANAP, LOGL_DEBUG, "Paged CS %u RNCs on LAI %s for %s", + paged, osmo_lai_name(lai), log_msg); else - LOGPIU(LOGL_INFO, "IuPS: Found no RNC to Page on LAI %s for %s", osmo_lai_name(lai), log_msg); - + LOGP(DRANAP, LOGL_INFO, "Found no RNC to Page CS on LAI %s for %s", + osmo_lai_name(lai), log_msg); return paged; } @@ -249,7 +240,7 @@ /*! Transmit a single page request towards all RNCs serving the specific RAI (no page retransmission). * * \param imsi the imsi as human readable string - * \param ptmsi NULL or pointer to the tmsi + * \param ptmsi NULL or pointer to the ptmsi * \param rai full Location Area Identifier * \return amount of paged RNCs. 0 when no RNC found. */ @@ -258,8 +249,13 @@ struct ranap_iu_rnc *rnc; struct iu_lac_rac_entry *entry; char log_msg[32] = {}; - int paged = 0; - int rc = 0; + unsigned int paged = 0; + int rc; + + if (ptmsi) + snprintf(log_msg, sizeof(log_msg), "P-TMSI %08x\n", *ptmsi); + else + snprintf(log_msg, sizeof(log_msg), "IMSI %s\n", imsi); /* find all RNCs which are serving this RAC */ llist_for_each_entry(rnc, &sgsn->rnc_list, entry) { @@ -267,26 +263,23 @@ if (osmo_rai_cmp(&entry->rai, rai)) continue; - rc = sgsn_ranap_iu_tx_paging_cmd(&rnc->sccp_addr, imsi, ptmsi, true, 0); - if (rc > 0) { - LOGPIU(LOGL_ERROR, "IuPS: Failed to tx Paging RNC %s for RAC %s for IMSI %s / P-TMSI %08x", - osmo_rnc_id_name(&rnc->rnc_id), - osmo_rai_name2(rai), imsi, ptmsi ? *ptmsi : GSM_RESERVED_TMSI); + rc = iu_rnc_tx_paging_cmd(rnc, imsi, ptmsi, true, 0); + if (rc != 0) { + LOG_RNC(rnc, LOGL_ERROR, "Failed to tx Paging PS for RAI %s for %s", + osmo_rai_name2(rai), log_msg); + } else { + paged++; } - paged++; break; } } - if (ptmsi) - snprintf(log_msg, sizeof(log_msg) - 1, "for PTMSI %08x\n", *ptmsi); - else - snprintf(log_msg, sizeof(log_msg) - 1, "for IMSI %s\n", imsi); - if (paged) - LOGPIU(LOGL_DEBUG, "IuPS: Paged %d RNCs on RAI %s for %s", paged, osmo_rai_name2(rai), log_msg); + LOGP(DRANAP, LOGL_DEBUG, "Paged PS %u RNCs on RAI %s for %s", + paged, osmo_rai_name2(rai), log_msg); else - LOGPIU(LOGL_INFO, "IuPS: Found no RNC to Page on RAI %s for %s", osmo_rai_name2(rai), log_msg); + LOGP(DRANAP, LOGL_INFO, "Found no RNC to Page PS on RAI %s for %s", + osmo_rai_name2(rai), log_msg); return paged; } diff --git a/src/sgsn/iu_rnc.c b/src/sgsn/iu_rnc.c index 38cddb5..1a15df1 100644 --- a/src/sgsn/iu_rnc.c +++ b/src/sgsn/iu_rnc.c @@ -213,3 +213,43 @@ ue_conn_ctx_link_invalidated_free(ue_ctx); } } + +/* Send a paging command down a given SCCP User. tmsi_or_ptmsi and paging_cause are + * optional and may be passed NULL and 0, respectively, to disable their use. + * See enum RANAP_PagingCause. + * + * If tmsi_or_ptmsi is given, the imsi is not sent over the air interface. + * Nevertheless, the IMSI is still required for resolution in the HNB-GW + * and/or(?) RNC. + * + * returns negative if paging couldn't be sent (eg. because RNC is currently + * unreachable in lower layers). + **/ +int iu_rnc_tx_paging_cmd(struct ranap_iu_rnc *rnc, + const char *imsi, + const uint32_t *tmsi_or_ptmsi, + bool is_ps, + uint32_t paging_cause) +{ + struct msgb *ranap_msg; + int rc; + + /* rnc is not ready for paging (link not ready). */ + if (rnc->fi->state != IU_RNC_ST_READY) + return -ENOLINK; + + LOG_RNC(rnc, LOGL_DEBUG, "Paging %s for %s=%08x IMSI=%s\n", + is_ps ? "PS" : "CS", + is_ps ? "P-TMSI" : "TMSI", + tmsi_or_ptmsi ? *tmsi_or_ptmsi : GSM_RESERVED_TMSI, + imsi); + + ranap_msg = ranap_new_msg_paging_cmd(imsi, tmsi_or_ptmsi, is_ps ? 1 : 0, paging_cause); + if (!ranap_msg) + return -EINVAL; + + rc = osmo_fsm_inst_dispatch(rnc->fi, IU_RNC_EV_MSG_DOWN_CL, ranap_msg); + if (rc != 0) + msgb_free(ranap_msg); + return rc; +} diff --git a/src/sgsn/iu_rnc_fsm.c b/src/sgsn/iu_rnc_fsm.c index 6f610b4..6b0ad41 100644 --- a/src/sgsn/iu_rnc_fsm.c +++ b/src/sgsn/iu_rnc_fsm.c @@ -57,6 +57,7 @@ OSMO_VALUE_STRING(IU_RNC_EV_MSG_UP_CO), OSMO_VALUE_STRING(IU_RNC_EV_RX_RESET), OSMO_VALUE_STRING(IU_RNC_EV_RX_RESET_ACK), + OSMO_VALUE_STRING(IU_RNC_EV_MSG_DOWN_CL), OSMO_VALUE_STRING(IU_RNC_EV_AVAILABLE), OSMO_VALUE_STRING(IU_RNC_EV_UNAVAILABLE), {} @@ -252,6 +253,11 @@ iu_rnc_rx_reset(rnc); return; + case IU_RNC_EV_MSG_DOWN_CL: + OSMO_ASSERT(data); + sgsn_ranap_iu_tx_cl(rnc->scu_iups, &rnc->sccp_addr, (struct msgb *)data); + return; + case IU_RNC_EV_AVAILABLE: /* Do nothing, we were already up. */ return; @@ -336,6 +342,7 @@ | S(IU_RNC_EV_RX_RESET) | S(IU_RNC_EV_MSG_UP_CO_INITIAL) | S(IU_RNC_EV_MSG_UP_CO) + | S(IU_RNC_EV_MSG_DOWN_CL) | S(IU_RNC_EV_AVAILABLE) | S(IU_RNC_EV_UNAVAILABLE) , -- To view, visit
https://gerrit.osmocom.org/c/osmo-sgsn/+/41001?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: I24e5446bcf4c958028577230b231960acea9e5b9 Gerrit-Change-Number: 41001 Gerrit-PatchSet: 1 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu> Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
1
0
0
0
[M] Change in osmo-sgsn[master]: ranap: Clean up RANAP rx path param passing
by lynxis lazus
03 Sep '25
03 Sep '25
lynxis lazus has submitted this change. (
https://gerrit.osmocom.org/c/osmo-sgsn/+/40960?usp=email
) ( 2 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: ranap: Clean up RANAP rx path param passing ...................................................................... ranap: Clean up RANAP rx path param passing Use the osmo-iuh ranap_cn_rx_*_decode2() APIs directly. This allows getting rid of extra "ctx" temporary structs and another level of cb indirection. Take the chance to update most pointers consitfying them. Depends: osmo-iuh.git Change-Id I667dc2ef377c1ceb5b11315458f00b282c143c81 Change-Id: Ib3c00b5105b7ba4bb1a2dad1a14bea233a03c358 --- M TODO-RELEASE M include/osmocom/sgsn/gprs_ranap.h M src/sgsn/gprs_ranap.c 3 files changed, 102 insertions(+), 61 deletions(-) Approvals: Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve lynxis lazus: Looks good to me, approved diff --git a/TODO-RELEASE b/TODO-RELEASE index 662cdb5..1dfbdb0 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -11,3 +11,4 @@ libgtp >1.12.0 gtp_set_cb_update_context_ind(), gtp_update_context_resp() libosmocore >1.10.0 enum gsm48_gprs_ie_mm: GSM48_IE_GMM_UE_NET_CAP, GSM48_IE_GMM_VD_PREF_UE_USAGE libosmo-gsup-client >1.8.0 osmo_gsup_client_is_connected(), osmo_gsup_client_get_rem_addr(), osmo_gsup_client_get_rem_port() +osmo-iuh >1.7.0 ranap multiple params are constified, see osmo-iuh Change-Id I667dc2ef377c1ceb5b11315458f00b282c143c81 diff --git a/include/osmocom/sgsn/gprs_ranap.h b/include/osmocom/sgsn/gprs_ranap.h index 8a6c189..80b57e6 100644 --- a/include/osmocom/sgsn/gprs_ranap.h +++ b/include/osmocom/sgsn/gprs_ranap.h @@ -39,11 +39,14 @@ void sgsn_ranap_iu_release_free(struct sgsn_mm_ctx *ctx, const struct RANAP_Cause *cause); -int sgsn_ranap_iu_rx_cl_msg(struct sgsn_sccp_user_iups *scu_iups, struct osmo_scu_unitdata_param *ud_prim, - uint8_t *data, size_t len); -int sgsn_ranap_iu_rx_co_initial_msg(struct sgsn_sccp_user_iups *scu_iups, const struct osmo_sccp_addr *rem_sccp_addr, - uint32_t conn_id, uint8_t *data, size_t len); -int sgsn_ranap_iu_rx_co_msg(struct ranap_ue_conn_ctx *ue_ctx, uint8_t *data, size_t len); +int sgsn_ranap_iu_rx_cl_msg(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_scu_unitdata_param *ud_prim, + const uint8_t *data, size_t len); +int sgsn_ranap_iu_rx_co_initial_msg(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_sccp_addr *rem_sccp_addr, + uint32_t conn_id, + const uint8_t *data, size_t len); +int sgsn_ranap_iu_rx_co_msg(struct ranap_ue_conn_ctx *ue_ctx, const uint8_t *data, size_t len); #else /* ifndef BUILD_IU */ inline static void sgsn_ranap_iu_free(void *ctx) {}; diff --git a/src/sgsn/gprs_ranap.c b/src/sgsn/gprs_ranap.c index 376fcac..f71db50 100644 --- a/src/sgsn/gprs_ranap.c +++ b/src/sgsn/gprs_ranap.c @@ -60,7 +60,7 @@ uint16_t rnc_id; }; -static int iu_grnc_id_parse(struct osmo_rnc_id *dst, struct RANAP_GlobalRNC_ID *src) +static int iu_grnc_id_parse(struct osmo_rnc_id *dst, const struct RANAP_GlobalRNC_ID *src) { /* The size is coming from arbitrary sender, check it gracefully */ if (src->pLMNidentity.size != 3) { @@ -86,17 +86,6 @@ } #endif -struct ranap_iu_event_sccp_new_ue_context { - struct sgsn_sccp_user_iups *scu_iups; - struct osmo_sccp_addr rem_sccp_addr; - uint32_t conn_id; -}; - -struct ranap_iu_event_cl_msg_ind { - struct sgsn_sccp_user_iups *scu_iups; - struct osmo_scu_unitdata_param *ud_prim; -}; - /* Send RAB activation requests for all PDP contexts */ void activate_pdp_rabs(struct sgsn_mm_ctx *ctx) { @@ -430,9 +419,11 @@ osmo_timer_schedule(&ctx->release_timeout, timeout, 0); } -static int ranap_handle_co_initial_ue(void *ctx, RANAP_InitialUE_MessageIEs_t *ies) +static int ranap_handle_co_initial_ue(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_sccp_addr *rem_sccp_addr, + uint32_t conn_id, + const RANAP_InitialUE_MessageIEs_t *ies) { - struct ranap_iu_event_sccp_new_ue_context *new_ctx = ctx; struct gprs_ra_id ra_id = {}; struct osmo_routing_area_id ra_id2 = {}; struct osmo_rnc_id rnc_id = {}; @@ -470,9 +461,9 @@ gprs_rai_to_osmo(&ra_id2, &ra_id); /* Make sure we know the RNC Id and LAC+RAC coming in on this connection. */ - rnc = iu_rnc_register(&rnc_id, &ra_id2, &new_ctx->rem_sccp_addr); + rnc = iu_rnc_register(&rnc_id, &ra_id2, rem_sccp_addr); - ue = ue_conn_ctx_alloc(rnc, new_ctx->scu_iups, new_ctx->conn_id); + ue = ue_conn_ctx_alloc(rnc, scu_iups, conn_id); OSMO_ASSERT(ue); ue->ra_id = ra_id; @@ -485,7 +476,10 @@ return 0; } -static void cn_ranap_handle_co_initial(void *ctx, ranap_message *message) +static void cn_ranap_handle_co_initial(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_sccp_addr *rem_sccp_addr, + uint32_t conn_id, + const ranap_message *message) { int rc; @@ -498,7 +492,7 @@ message->direction, message->procedureCode); rc = -1; } else - rc = ranap_handle_co_initial_ue(ctx, &message->msg.initialUE_MessageIEs); + rc = ranap_handle_co_initial_ue(scu_iups, rem_sccp_addr, conn_id, &message->msg.initialUE_MessageIEs); if (rc) { LOGP(DRANAP, LOGL_ERROR, "Error in %s (%d)\n", __func__, rc); @@ -506,17 +500,29 @@ } } -int sgsn_ranap_iu_rx_co_initial_msg(struct sgsn_sccp_user_iups *scu_iups, const struct osmo_sccp_addr *rem_sccp_addr, uint32_t conn_id, uint8_t *data, size_t len) +int sgsn_ranap_iu_rx_co_initial_msg(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_sccp_addr *rem_sccp_addr, + uint32_t conn_id, + const uint8_t *data, size_t len) { - struct ranap_iu_event_sccp_new_ue_context new_ctx = { - .scu_iups = scu_iups, - .conn_id = conn_id, - .rem_sccp_addr = *rem_sccp_addr, - }; - return ranap_cn_rx_co(cn_ranap_handle_co_initial, &new_ctx, data, len); + ranap_message message; + int rc; + + rc = ranap_cn_rx_co_decode2(&message, data, len); + if (rc != 0) { + LOGP(DRANAP, LOGL_ERROR, "Not calling cn_ranap_handle_co_initial() due to rc=%d\n", rc); + goto free_ret; + } + + cn_ranap_handle_co_initial(scu_iups, rem_sccp_addr, conn_id, &message); + +free_ret: + /* Free the asn1 structs in message */ + ranap_cn_rx_co_free(&message); + return rc; } -static int ranap_handle_co_dt(void *ctx, RANAP_DirectTransferIEs_t *ies) +static int ranap_handle_co_dt(struct ranap_ue_conn_ctx *ue_ctx, const RANAP_DirectTransferIEs_t *ies) { struct gprs_ra_id _ra_id, *ra_id = NULL; uint16_t _sai, *sai = NULL; @@ -541,7 +547,7 @@ memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size); /* Feed into the MM/CC/SMS-CP layer */ - msg->dst = ctx; + msg->dst = ue_ctx; gsm0408_gprs_rcvmsg_iu(msg, ra_id, sai); msgb_free(msg); @@ -549,7 +555,7 @@ return 0; } -static int ranap_handle_co_err_ind(void *ctx, RANAP_ErrorIndicationIEs_t *ies) +static int ranap_handle_co_err_ind(struct ranap_ue_conn_ctx *ue_ctx, const RANAP_ErrorIndicationIEs_t *ies) { if (ies->presenceMask & ERRORINDICATIONIES_RANAP_CAUSE_PRESENT) LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication (%s)\n", @@ -560,19 +566,19 @@ return 0; } -static int ranap_handle_co_iu_rel_req(struct ranap_ue_conn_ctx *ctx, RANAP_Iu_ReleaseRequestIEs_t *ies) +static int ranap_handle_co_iu_rel_req(struct ranap_ue_conn_ctx *ue_ctx, const RANAP_Iu_ReleaseRequestIEs_t *ies) { LOGP(DRANAP, LOGL_INFO, "Received Iu Release Request, Sending Release Command\n"); - ranap_iu_tx_release(ctx, &ies->cause); + ranap_iu_tx_release(ue_ctx, &ies->cause); return 0; } -static int ranap_handle_co_rab_ass_resp(struct ranap_ue_conn_ctx *ctx, RANAP_RAB_AssignmentResponseIEs_t *ies) +static int ranap_handle_co_rab_ass_resp(struct ranap_ue_conn_ctx *ue_ctx, const RANAP_RAB_AssignmentResponseIEs_t *ies) { int rc = -1; LOGP(DRANAP, LOGL_INFO, - "Rx RAB Assignment Response for UE conn_id %u\n", ctx->conn_id); + "Rx RAB Assignment Response for UE conn_id %u\n", ue_ctx->conn_id); if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) { /* TODO: Iterate over list of SetupOrModifiedList IEs and handle each one */ RANAP_IE_t *ranap_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.array[0]; @@ -584,7 +590,7 @@ return rc; } - rc = global_iu_event(ctx, RANAP_IU_EVENT_RAB_ASSIGN, &setup_ies); + rc = global_iu_event(ue_ctx, RANAP_IU_EVENT_RAB_ASSIGN, &setup_ies); ranap_free_rab_setupormodifieditemies(&setup_ies); } @@ -594,7 +600,7 @@ } /* Entry point for connection-oriented RANAP message */ -static void cn_ranap_handle_co(void *ctx, ranap_message *message) +static void cn_ranap_handle_co(struct ranap_ue_conn_ctx *ue_ctx, const ranap_message *message) { int rc; @@ -608,14 +614,14 @@ rc = -1; break; case RANAP_ProcedureCode_id_DirectTransfer: - rc = ranap_handle_co_dt(ctx, &message->msg.directTransferIEs); + rc = ranap_handle_co_dt(ue_ctx, &message->msg.directTransferIEs); break; case RANAP_ProcedureCode_id_ErrorIndication: - rc = ranap_handle_co_err_ind(ctx, &message->msg.errorIndicationIEs); + rc = ranap_handle_co_err_ind(ue_ctx, &message->msg.errorIndicationIEs); break; case RANAP_ProcedureCode_id_Iu_ReleaseRequest: /* Iu Release Request */ - rc = ranap_handle_co_iu_rel_req(ctx, &message->msg.iu_ReleaseRequestIEs); + rc = ranap_handle_co_iu_rel_req(ue_ctx, &message->msg.iu_ReleaseRequestIEs); break; default: LOGP(DRANAP, LOGL_ERROR, "Received Initiating Message: unknown Procedure Code %d\n", @@ -628,11 +634,11 @@ switch (message->procedureCode) { case RANAP_ProcedureCode_id_SecurityModeControl: /* Security Mode Complete */ - rc = global_iu_event(ctx, RANAP_IU_EVENT_SECURITY_MODE_COMPLETE, NULL); + rc = global_iu_event(ue_ctx, RANAP_IU_EVENT_SECURITY_MODE_COMPLETE, NULL); break; case RANAP_ProcedureCode_id_Iu_Release: /* Iu Release Complete */ - rc = global_iu_event(ctx, RANAP_IU_EVENT_IU_RELEASE, NULL); + rc = global_iu_event(ue_ctx, RANAP_IU_EVENT_IU_RELEASE, NULL); if (rc) { LOGP(DRANAP, LOGL_ERROR, "Iu Release event: Iu Event callback returned %d\n", rc); @@ -649,7 +655,7 @@ switch (message->procedureCode) { case RANAP_ProcedureCode_id_RAB_Assignment: /* RAB Assignment Response */ - rc = ranap_handle_co_rab_ass_resp(ctx, &message->msg.raB_AssignmentResponseIEs); + rc = ranap_handle_co_rab_ass_resp(ue_ctx, &message->msg.raB_AssignmentResponseIEs); break; default: LOGP(DRANAP, LOGL_ERROR, "Received Outcome: unknown Procedure Code %d\n", @@ -672,14 +678,30 @@ } } -int sgsn_ranap_iu_rx_co_msg(struct ranap_ue_conn_ctx *ue_ctx, uint8_t *data, size_t len) +int sgsn_ranap_iu_rx_co_msg(struct ranap_ue_conn_ctx *ue_ctx, const uint8_t *data, size_t len) { - return ranap_cn_rx_co(cn_ranap_handle_co, ue_ctx, data, len); + ranap_message message; + int rc; + + rc = ranap_cn_rx_co_decode2(&message, data, len); + if (rc != 0) { + LOGP(DRANAP, LOGL_ERROR, "Not calling cn_ranap_handle_co() due to rc=%d\n", rc); + goto free_ret; + } + + cn_ranap_handle_co(ue_ctx, &message); + +free_ret: + /* Free the asn1 structs in message */ + ranap_cn_rx_co_free(&message); + return rc; } -static int ranap_handle_cl_reset_req(struct ranap_iu_event_cl_msg_ind *cl_msg_ind, RANAP_ResetIEs_t *ies) +static int ranap_handle_cl_reset_req(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_scu_unitdata_param *ud_prim, + const RANAP_ResetIEs_t *ies) { - RANAP_GlobalRNC_ID_t *grnc_id = NULL; + const RANAP_GlobalRNC_ID_t *grnc_id = NULL; struct msgb *resp; /* FIXME: verify ies.cN_DomainIndicator */ @@ -692,10 +714,12 @@ if (!resp) return -ENOMEM; resp->l2h = resp->data; - return osmo_sccp_tx_unitdata_msg(cl_msg_ind->scu_iups->scu, &cl_msg_ind->scu_iups->local_sccp_addr, &cl_msg_ind->ud_prim->calling_addr, resp); + return osmo_sccp_tx_unitdata_msg(scu_iups->scu, &scu_iups->local_sccp_addr, &ud_prim->calling_addr, resp); } -static int ranap_handle_cl_err_ind(struct ranap_iu_event_cl_msg_ind *cl_msg_ind, RANAP_ErrorIndicationIEs_t *ies) +static int ranap_handle_cl_err_ind(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_scu_unitdata_param *ud_prim, + const RANAP_ErrorIndicationIEs_t *ies) { if (ies->presenceMask & ERRORINDICATIONIES_RANAP_CAUSE_PRESENT) LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication (%s)\n", @@ -707,9 +731,10 @@ } /* Entry point for connection-less RANAP message */ -static void cn_ranap_handle_cl(void *ctx, ranap_message *message) +static void cn_ranap_handle_cl(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_scu_unitdata_param *ud_prim, + const ranap_message *message) { - struct ranap_iu_event_cl_msg_ind *cl_msg_ind = ctx; int rc; switch (message->direction) { @@ -717,10 +742,10 @@ switch (message->procedureCode) { case RANAP_ProcedureCode_id_Reset: /* received reset.req, send reset.resp */ - rc = ranap_handle_cl_reset_req(cl_msg_ind, &message->msg.resetIEs); + rc = ranap_handle_cl_reset_req(scu_iups, ud_prim, &message->msg.resetIEs); break; case RANAP_ProcedureCode_id_ErrorIndication: - rc = ranap_handle_cl_err_ind(cl_msg_ind, &message->msg.errorIndicationIEs); + rc = ranap_handle_cl_err_ind(scu_iups, ud_prim, &message->msg.errorIndicationIEs); break; default: rc = -1; @@ -741,11 +766,23 @@ } } -int sgsn_ranap_iu_rx_cl_msg(struct sgsn_sccp_user_iups *scu_iups, struct osmo_scu_unitdata_param *ud_prim, uint8_t *data, size_t len) +int sgsn_ranap_iu_rx_cl_msg(struct sgsn_sccp_user_iups *scu_iups, + const struct osmo_scu_unitdata_param *ud_prim, + const uint8_t *data, size_t len) { - struct ranap_iu_event_cl_msg_ind cl_msg_ind = { - .scu_iups = scu_iups, - .ud_prim = ud_prim, - }; - return ranap_cn_rx_cl(cn_ranap_handle_cl, &cl_msg_ind, data, len); + ranap_message message; + int rc; + + rc = ranap_cn_rx_cl_decode2(&message, data, len); + if (rc != 0) { + LOGP(DRANAP, LOGL_ERROR, "Not calling cn_ranap_handle_cl() due to rc=%d\n", rc); + goto free_ret; + } + + cn_ranap_handle_cl(scu_iups, ud_prim, &message); + +free_ret: + /* Free the asn1 structs in message */ + ranap_cn_rx_cl_free(&message); + return rc; } -- To view, visit
https://gerrit.osmocom.org/c/osmo-sgsn/+/40960?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged Gerrit-Project: osmo-sgsn Gerrit-Branch: master Gerrit-Change-Id: Ib3c00b5105b7ba4bb1a2dad1a14bea233a03c358 Gerrit-Change-Number: 40960 Gerrit-PatchSet: 3 Gerrit-Owner: pespin <pespin(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de> Gerrit-Reviewer: lynxis lazus <lynxis(a)fe80.eu>
1
0
0
0
← Newer
1
...
102
103
104
105
106
107
108
...
122
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
Results per page:
10
25
50
100
200