lists.osmocom.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

gerrit-log

Thread Start a new thread
Download
Threads by month
  • ----- 2026 -----
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • 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
gerrit-log@lists.osmocom.org

October 2025

  • 1 participants
  • 631 discussions
[S] Change in ...osmo-s1gw[master]: doc/osmo-s1gw-cli.md: document {enb,erab}_delete
by fixeria 28 Oct '25

28 Oct '25
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41278?usp=email ) Change subject: doc/osmo-s1gw-cli.md: document {enb,erab}_delete ...................................................................... doc/osmo-s1gw-cli.md: document {enb,erab}_delete Change-Id: Iec93f90be4c3989fcb98341581d36f4650028f37 Related: 998a7e0f ("[REST] Implement {Enb,Erab}Delete") --- M doc/osmo-s1gw-cli.md 1 file changed, 36 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/78/41278/1 diff --git a/doc/osmo-s1gw-cli.md b/doc/osmo-s1gw-cli.md index e160ffa..4a0bd22 100644 --- a/doc/osmo-s1gw-cli.md +++ b/doc/osmo-s1gw-cli.md @@ -254,6 +254,26 @@ To enable full traceback, run the following command: 'set debug true' ``` +### `enb_delete` + +Force disconnect an eNB. + +``` +Usage: enb_delete [-h] (-H HANDLE | -P PID | -G GENBID | --enb-sctp-aid AID | --mme-sctp-aid AID) + +Force disconnect an eNB + +optional arguments: + -h, --help show this help message and exit + +eNB ID: + -H, --handle HANDLE eNB handle (example: 0) + -P, --pid PID eNB process ID (example: 0.33.1) + -G, --genbid GENBID Global-eNB-ID (example: 262-42-1337) + --enb-sctp-aid AID eNB association identifier (example: 42) + --mme-sctp-aid AID MME association identifier (example: 42) +``` + ### `enb_erab_list` Get E-RAB list for a specific eNB. @@ -349,3 +369,19 @@ | A2U F-TEID | 0x02020001(a)127.0.2.2 | | U2A F-TEID | 0x00020001(a)127.0.0.2 | ``` + +### `erab_delete` + +Terminate an E-RAB FSM process. + +``` +Usage: erab_delete -P PID [-h] + +Terminate an E-RAB FSM process + +required arguments: + -P, --pid PID E-RAB process ID (example: 0.33.1) + +optional arguments: + -h, --help show this help message and exit +``` -- To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41278?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: Iec93f90be4c3989fcb98341581d36f4650028f37 Gerrit-Change-Number: 41278 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
1 0
0 0
[XS] Change in ...osmo-s1gw[master]: config/sys.config: separate GTP-U KPI and REST params
by fixeria 28 Oct '25

28 Oct '25
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41279?usp=email ) Change subject: config/sys.config: separate GTP-U KPI and REST params ...................................................................... config/sys.config: separate GTP-U KPI and REST params Change-Id: I3804a0901e913e2be1c202d0e84372bc80621c1b --- M config/sys.config 1 file changed, 2 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/79/41279/1 diff --git a/config/sys.config b/config/sys.config index 5184ebb..920a30e 100644 --- a/config/sys.config +++ b/config/sys.config @@ -26,6 +26,8 @@ %% {gtpu_kpi_ul_addr, s1ap}, %% GTP-U UL address: s1ap | sctp (default: learn from S1AP) %% {gtpu_kpi_dl_addr, s1ap}, %% GTP-U DL address: s1ap | sctp (default: learn from S1AP) %% {gtpu_kpi_interval, 3000}, %% counter reporting interval (ms) +%% +%% REST interface configuration %% {rest_srv_port, 8080}, %% REST server port (default: 8080) %% {rest_srv_swagger_ui, true} %% REST Swagger UI (default: true) ]}, -- To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41279?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: I3804a0901e913e2be1c202d0e84372bc80621c1b Gerrit-Change-Number: 41279 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
1 0
0 0
[L] Change in ...osmo-s1gw[master]: mme_registry: the MME registry (pool) implementation
by fixeria 28 Oct '25

28 Oct '25
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41281?usp=email ) Change subject: mme_registry: the MME registry (pool) implementation ...................................................................... mme_registry: the MME registry (pool) implementation Change-Id: Id5480222439bf93eca2e994b291c619dff823b01 Related: SYS#7052 --- A src/mme_registry.erl M src/osmo_s1gw_sup.erl A test/mme_registry_test.erl 3 files changed, 424 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/81/41281/1 diff --git a/src/mme_registry.erl b/src/mme_registry.erl new file mode 100644 index 0000000..7867bec --- /dev/null +++ b/src/mme_registry.erl @@ -0,0 +1,280 @@ +%% 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(mme_registry). +-behaviour(gen_server). + +-export([init/1, + handle_info/2, + handle_call/3, + handle_cast/2, + terminate/2]). +-export([start_link/0, + mme_register/1, + mme_unregister/1, + mme_select/0, + mme_select/1, + fetch_mme_info/1, + fetch_mme_list/0, + shutdown/0]). + +-include_lib("kernel/include/logger.hrl"). + +-include("s1gw_metrics.hrl"). +-include("s1ap.hrl"). + + +-type mme_name() :: string(). + +-type mme_info() :: #{name := mme_name(), %% unique identifier of this MME + laddr => string() | inet:ip_address(), + raddr := string() | inet:ip_address(), + rport => inet:port_number() + }. + +-type mme_list() :: [mme_info()]. + +-export_type([mme_name/0, + mme_info/0]). + + +%% ------------------------------------------------------------------ +%% public API +%% ------------------------------------------------------------------ + +-spec start_link() -> {ok, pid()} | term(). +start_link() -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [], []). + + +-spec mme_register(mme_info()) -> ok | {error, term()}. +mme_register(MmeInfo) -> + gen_server:call(?MODULE, {?FUNCTION_NAME, MmeInfo}). + + +-spec mme_unregister(mme_name()) -> ok | {error, term()}. +mme_unregister(MmeName) -> + gen_server:call(?MODULE, {?FUNCTION_NAME, MmeName}). + + +-spec mme_select() -> {ok, mme_info()} | error. +mme_select() -> + gen_server:call(?MODULE, {?FUNCTION_NAME, undefined}). + + +-spec mme_select(mme_name()) -> {ok, mme_info()} | error. +mme_select(OldMmeName) -> + gen_server:call(?MODULE, {?FUNCTION_NAME, OldMmeName}). + + +-spec fetch_mme_info(mme_name()) -> {ok, mme_info()} | error. +fetch_mme_info(MmeName) -> + gen_server:call(?MODULE, {?FUNCTION_NAME, MmeName}). + + +-spec fetch_mme_list() -> mme_list(). +fetch_mme_list() -> + gen_server:call(?MODULE, ?FUNCTION_NAME). + + +-spec shutdown() -> ok. +shutdown() -> + gen_server:stop(?MODULE). + + +%% ------------------------------------------------------------------ +%% gen_server API +%% ------------------------------------------------------------------ + +init([]) -> + %% parse MMEs from the environment + MMEs = mme_list_from_env(), + {ok, MMEs}. + + +handle_call({mme_register, MmeInfo}, _From, MMEs0) -> + case mme_add(MmeInfo, MMEs0) of + {ok, MMEs1} -> + {reply, ok, MMEs1}; + {error, Error} -> + {reply, {error, Error}, MMEs0} + end; + +handle_call({mme_unregister, MmeName}, _From, MMEs0) -> + case mme_del(MmeName, MMEs0) of + {ok, MMEs1} -> + %% TODO: kill all eNB connections? + {reply, ok, MMEs1}; + {error, Error} -> + {reply, {error, Error}, MMEs0} + end; + +handle_call({mme_select, OldMmeName}, _From, MMEs) -> + Reply = mme_select(OldMmeName, MMEs), + {reply, Reply, MMEs}; + +handle_call({fetch_mme_info, MmeName}, _From, MMEs) -> + Reply = mme_find(MmeName, MMEs), + {reply, Reply, MMEs}; + +handle_call(fetch_mme_list, _From, MMEs) -> + {reply, MMEs, MMEs}; + +handle_call(Info, From, MMEs) -> + ?LOG_ERROR("unknown ~p() from ~p: ~p", [?FUNCTION_NAME, From, Info]), + {reply, {error, not_implemented}, MMEs}. + + +handle_cast(Info, MMEs) -> + ?LOG_ERROR("unknown ~p(): ~p", [?FUNCTION_NAME, Info]), + {noreply, MMEs}. + + +handle_info(Info, MMEs) -> + ?LOG_ERROR("unknown ~p(): ~p", [?FUNCTION_NAME, Info]), + {noreply, MMEs}. + + +terminate(Reason, _MMEs) -> + ?LOG_NOTICE("Terminating, reason ~p", [Reason]), + ok. + + +%% ------------------------------------------------------------------ +%% private API +%% ------------------------------------------------------------------ + +-spec mme_match(mme_info(), map()) -> true | false. +mme_match(#{name := Name}, + #{name := Name}) -> true; + +mme_match(#{raddr := Addr, rport := Port}, + #{raddr := Addr, rport := Port}) -> true; + +mme_match(_, _) -> false. + + +%% Add a new MME if it does not already exist +-spec mme_add(mme_info(), mme_list()) -> {ok, mme_list()} | {error, term()}. +mme_add(MmeInfo0, MMEs) -> + %% assign defaults, parse local/remote addresses + MmeName = maps:get(name, MmeInfo0), + LAddr = sctp_common:parse_addr(maps:get(laddr, MmeInfo0, "::")), + RAddr = sctp_common:parse_addr(maps:get(raddr, MmeInfo0)), + RPort = maps:get(rport, MmeInfo0, ?S1AP_PORT), + MmeInfo1 = MmeInfo0#{laddr => LAddr, + raddr => RAddr, + rport => RPort}, + %% check for duplicates + case lists:any(fun(E) -> mme_match(E, MmeInfo1) end, MMEs) of + true -> + ?LOG_ERROR("MME (name=~p / ~p:~p) is *already* registered", + [MmeName, RAddr, RPort]), + {error, already_registered}; + false -> + ?LOG_INFO("MME (name=~p, ~p:~p) registered", + [MmeName, RAddr, RPort]), + {ok, MMEs ++ [MmeInfo1]} + end. + + +%% Remove an MME by name +-spec mme_del(mme_name(), mme_list()) -> {ok, mme_list()} | {error, term()}. +mme_del(MmeName, MMEs0) -> + Fun = fun(E) -> not mme_match(E, #{name => MmeName}) end, + case lists:filter(Fun, MMEs0) of + MMEs0 -> %% unchanged list means nothing was filtered out + ?LOG_ERROR("MME (name=~p) is *not* registered", [MmeName]), + {error, not_registered}; + MMEs1 -> + ?LOG_INFO("MME (name=~p) unregistered", [MmeName]), + {ok, MMEs1} + end. + + +%% Select an MME from the pool +-spec mme_select(OldMmeName, MMEs) -> Result + when OldMmeName :: undefined | mme_name(), + MMEs :: mme_list(), + Result :: {ok, mme_info()} | error. +mme_select(_OldMmeName, []) -> + %% empty MME pool + error; + +mme_select(_OldMmeName, [MmeInfo]) -> + %% only one MME in the pool + {ok, MmeInfo}; + +mme_select(undefined, MMEs) -> + %% old MME unknown => fall back to the first entry + {ok, hd(MMEs)}; + +mme_select(OldMmeName, MMEs) -> + Fun = fun(E) -> maps:get(name, E) =/= OldMmeName end, + case lists:dropwhile(Fun, MMEs) of + [] -> + %% old MME is not registered, fall back to the first entry + {ok, hd(MMEs)}; + [_ | []] -> + %% old MME was the last entry, wrap around + {ok, hd(MMEs)}; + [_ | [MmeInfo | _]] -> + %% return MME following the old one + {ok, MmeInfo} + end. + + +%% Find an MME by name +-spec mme_find(mme_name(), mme_list()) -> {ok, mme_info()} | error. +mme_find(MmeName, MMEs) -> + Fun = fun(E) -> mme_match(E, #{name => MmeName}) end, + case lists:filter(Fun, MMEs) of + [MmeInfo] -> {ok, MmeInfo}; + [] -> error + end. + + +-spec mme_list_from_env() -> mme_list(). +mme_list_from_env() -> + MMEs = osmo_s1gw:get_env(mme_pool, []), + lists:foldl(fun mme_add_from_env/2, [], MMEs). + + +-spec mme_add_from_env(mme_info(), mme_list()) -> mme_list(). +mme_add_from_env(MmeInfo, MMEs0) -> + {ok, MMEs1} = mme_add(MmeInfo, MMEs0), + MMEs1. + + +%% vim:set ts=4 sw=4 et: diff --git a/src/osmo_s1gw_sup.erl b/src/osmo_s1gw_sup.erl index 1616fe5..86ecbda 100644 --- a/src/osmo_s1gw_sup.erl +++ b/src/osmo_s1gw_sup.erl @@ -73,6 +73,11 @@ 5000, worker, [enb_registry]}, + MmeRegistry = {mme_registry, {mme_registry, start_link, []}, + permanent, + 5000, + worker, + [mme_registry]}, SctpServer = {sctp_server, {sctp_server, start_link, [server_cfg()]}, permanent, 5000, @@ -96,7 +101,13 @@ [erf]}, s1gw_metrics:init(), - {ok, {{one_for_one, 5, 10}, [EnbRegistry, SctpServer, PfcpPeer, GtpuKpi, RestServer]}}. + {ok, {{one_for_one, 5, 10}, + [EnbRegistry, + MmeRegistry, + SctpServer, + PfcpPeer, + GtpuKpi, + RestServer]}}. %% ------------------------------------------------------------------ diff --git a/test/mme_registry_test.erl b/test/mme_registry_test.erl new file mode 100644 index 0000000..a327233 --- /dev/null +++ b/test/mme_registry_test.erl @@ -0,0 +1,132 @@ +-module(mme_registry_test). + +-include_lib("eunit/include/eunit.hrl"). + + +%% ------------------------------------------------------------------ +%% setup functions +%% ------------------------------------------------------------------ + +-define(TC(Fun), {setup, + fun start/0, + fun stop/1, + Fun}). + + +start() -> + MMEs = [#{name => "mme0", raddr => "127.0.0.10"}, + #{name => "mme1", raddr => "127.0.0.11"}], + osmo_s1gw:set_env(mme_pool, MMEs), + {ok, _} = mme_registry:start_link(). + + +stop(_) -> + mme_registry:shutdown(). + + +%% ------------------------------------------------------------------ +%% testcase descriptions +%% ------------------------------------------------------------------ + +mme_registry_test_() -> + [{"Test adding and deleting MMEs", + ?TC(fun test_add_del/1)}, + {"Test fetching MME info", + ?TC(fun test_fetch/1)}, + {"Test MME selection", + ?TC(fun test_select/1)}, + {"Test MME selection (empty pool)", + ?TC(fun test_select_empty/1)}]. + + +%% ------------------------------------------------------------------ +%% actual testcases +%% ------------------------------------------------------------------ + +test_add_del(_) -> + [%% "mme0" and "mme1" come pre-registered, register "mme2" + ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", + raddr => "127.0.0.12"})), + %% duplicate name + ?_assertEqual({error, already_registered}, + mme_registry:mme_register(#{name => "mme2", + raddr => "127.0.0.13"})), + %% duplicate raddr:rport + ?_assertEqual({error, already_registered}, + mme_registry:mme_register(#{name => "mme3", + raddr => "127.0.0.12"})), + %% deleting previously registered MMEs + ?_assertEqual(ok, mme_registry:mme_unregister("mme0")), + ?_assertEqual(ok, mme_registry:mme_unregister("mme1")), + ?_assertEqual(ok, mme_registry:mme_unregister("mme2")), + %% deleting non-existent MMEs + ?_assertEqual({error, not_registered}, + mme_registry:mme_unregister("mme0")), + ?_assertEqual({error, not_registered}, + mme_registry:mme_unregister("mme1")), + ?_assertEqual({error, not_registered}, + mme_registry:mme_unregister("mme42"))]. + + +test_fetch(_) -> + [%% "mme0" and "mme1" come pre-registered, register "mme2" + ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", + laddr => "192.168.1.100", + raddr => "192.168.1.101", + rport => 1337})), + %% test fetching a list of MMEs + ?_assertMatch([#{name := "mme0", raddr := {127,0,0,10}}, + #{name := "mme1", raddr := {127,0,0,11}}, + #{name := "mme2", raddr := {192,168,1,101}}], + mme_registry:fetch_mme_list()), + %% test fetching MMEs by name + ?_assertMatch({ok, #{name := "mme0", + laddr := {0,0,0,0,0,0,0,0}, %% "::" + raddr := {127,0,0,10}, + rport := 36412}}, + mme_registry:fetch_mme_info("mme0")), + ?_assertMatch({ok, #{name := "mme1", + laddr := {0,0,0,0,0,0,0,0}, %% "::" + raddr := {127,0,0,11}, + rport := 36412}}, + mme_registry:fetch_mme_info("mme1")), + ?_assertMatch({ok, #{name := "mme2", + laddr := {192,168,1,100}, + raddr := {192,168,1,101}, + rport := 1337}}, + mme_registry:fetch_mme_info("mme2")), + %% "mme3" is not registered + ?_assertEqual(error, + mme_registry:fetch_mme_info("mme3"))]. + + +test_select(_) -> + [%% "mme0" and "mme1" come pre-registered, register "mme2" + ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", + raddr => "127.0.0.12"})), + %% old MME unknown, fall back to the first entry ("mme0") + ?_assertMatch({ok, #{name := "mme0"}}, + mme_registry:mme_select()), + ?_assertMatch({ok, #{name := "mme0"}}, + mme_registry:mme_select("mme3")), + %% old MME known, expect the next MME to be selected + ?_assertMatch({ok, #{name := "mme1"}}, + mme_registry:mme_select("mme0")), + ?_assertMatch({ok, #{name := "mme2"}}, + mme_registry:mme_select("mme1")), + ?_assertMatch({ok, #{name := "mme0"}}, + mme_registry:mme_select("mme2"))]. + + +test_select_empty(_) -> + [%% "mme0" and "mme1" come pre-registered, unregister them + ?_assertEqual(ok, mme_registry:mme_unregister("mme0")), + ?_assertEqual(ok, mme_registry:mme_unregister("mme1")), + %% the MME pool is now empty, expect an error + ?_assertEqual(error, mme_registry:mme_select()), + ?_assertEqual(error, mme_registry:mme_select("mme0")), + ?_assertEqual(error, mme_registry:mme_select("mme1")), + ?_assertEqual(error, mme_registry:mme_select("mme2"))]. + + +%% vim:set ts=4 sw=4 et: -- To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41281?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: Id5480222439bf93eca2e994b291c619dff823b01 Gerrit-Change-Number: 41281 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
1 0
0 0
[L] Change in ...osmo-s1gw[master]: [REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete
by fixeria 28 Oct '25

28 Oct '25
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41282?usp=email ) Change subject: [REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete ...................................................................... [REST] Add MmeList, MmeAdd, MmeInfo, MmeDelete Change-Id: Iad249aed99face9e35fd19e0596cf2364ade4c77 Related: SYS#7052 --- M contrib/openapi.yaml M contrib/osmo-s1gw-cli.py M doc/osmo-s1gw-cli.md M priv/openapi.json M src/rest_server.erl 5 files changed, 518 insertions(+), 15 deletions(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/82/41282/1 diff --git a/contrib/openapi.yaml b/contrib/openapi.yaml index a56f876..b7e07ec 100644 --- a/contrib/openapi.yaml +++ b/contrib/openapi.yaml @@ -66,6 +66,58 @@ '200': $ref: '#/components/responses/OperationResult' + /mme-list: + get: + summary: Get a list of registered MMEs + operationId: MmeList + responses: + '200': + description: A list of registered MMEs + content: + application/json: + schema: + $ref: '#/components/schemas/MmeList' + post: + summary: Add an MME to the pool + operationId: MmeAdd + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/MmeItem' + responses: + '201': + description: Successful outcome (MME added) + '409': + description: Unsuccessful outcome (MME already registered?) + + /mme/{MmeId}: + get: + summary: Get information about a specific MME + operationId: MmeInfo + parameters: + - $ref: '#/components/parameters/MmeId' + responses: + '200': + description: Successful outcome (MME info) + content: + application/json: + schema: + $ref: '#/components/schemas/MmeItem' + '404': + description: Unsuccessful outcome (MME not found) + delete: + summary: Delete an MME from the pool + operationId: MmeDelete + parameters: + - $ref: '#/components/parameters/MmeId' + responses: + '200': + description: Successful outcome (MME deleted) + '404': + description: Unsuccessful outcome (MME not found) + /enb-list: get: summary: Get a list of eNB connections @@ -168,6 +220,22 @@ $ref: '#/components/schemas/OperationResult' parameters: + MmeId: + name: MmeId + in: path + description: MME identifier (selector) + required: true + schema: + oneOf: + - type: string + pattern: '^name:' + description: MME name + example: mme0 + - type: string + pattern: '^addr:[0-9a-f:.]+-[0-9]+$' + description: MME remote address/port + example: addr:192.168.1.1-36412 + EnbId: name: EnbId in: path @@ -271,6 +339,30 @@ type: integer description: Remote Recovery TimeStamp + MmeList: + type: array + items: + $ref: '#/components/schemas/MmeItem' + + MmeItem: + type: object + required: + - name + - raddr + properties: + name: + type: string + description: Unique, human-readable identifier + laddr: + type: string + description: Local (bind) IP address + raddr: + type: string + description: Remote (connect) IP address + rport: + type: integer + description: Remote port + EnbList: type: array items: diff --git a/contrib/osmo-s1gw-cli.py b/contrib/osmo-s1gw-cli.py index b51a667..2303a4a 100755 --- a/contrib/osmo-s1gw-cli.py +++ b/contrib/osmo-s1gw-cli.py @@ -102,6 +102,26 @@ with self.send_post_req('pfcp/heartbeat') as f: return json.load(f) + def mme_list(self) -> RESTResponse: + ''' MmeList :: Get a list of registered MMEs ''' + with self.send_get_req('mme-list') as f: + return json.load(f) + + def mme_add(self, mme_info: dict) -> int: + ''' MmeAdd :: Add an MME to the pool ''' + with self.send_post_req('mme-list', mme_info) as f: + return f.status + + def mme_info(self, name: str) -> RESTResponse: + ''' MmeInfo :: Get information about a specific MME ''' + with self.send_get_req(f'mme/name:{name}') as f: + return json.load(f) + + def mme_delete(self, name: str) -> int: + ''' MmeInfo :: Get information about a specific MME ''' + with self.send_delete_req(f'mme/name:{name}') as f: + return f.status + def enb_list(self) -> RESTResponse: ''' EnbList :: Get a list of eNB connections ''' with self.send_get_req('enb-list') as f: @@ -143,6 +163,7 @@ CAT_METRICS = 'Metrics commands' CAT_PFCP = 'PFCP related commands' + CAT_MME = 'MME related commands' CAT_ENB = 'eNB related commands' CAT_ERAB = 'E-RAB related commands' @@ -229,6 +250,107 @@ self.perror('Heartbeat failed: {message}'.format(**data)) @staticmethod + def add_sort_group(parser, + default: str, + choices: set[str]) -> None: + ''' Add argparse group with sorting params ''' + sort_group = parser.add_argument_group('Sorting options') + sort_group.add_argument('-S', '--sort-by', + type=str, + default=default, + choices=choices, + help='Sort by (default: %(default)s)') + sort_group.add_argument('--reverse', + action='store_true', + help='Reverse order (default: %(default)s)') + + @staticmethod + def mme_list_item(item: dict) -> dict: + ''' Generate a table row for the given MME ''' + return { + 'Name': item.get('name'), + 'Local address': item.get('laddr'), + 'Remote address/port': '{raddr}:{rport}'.format(**item), + } + + def mme_list_print(self, items: list[dict], + sort_by: str = 'none', + reverse: bool = False) -> None: + ''' Print a [sorted] list of MMEs in tabular form ''' + if sort_by != 'none': + items.sort(key=lambda item: item.get(sort_by), reverse=reverse) + self.poutput(tabulate.tabulate(map(self.mme_list_item, items), + headers='keys', tablefmt=self.tablefmt)) + + def mme_info_print(self, item: dict) -> None: + ''' Print MME info in tabular form ''' + self.poutput(tabulate.tabulate(self.mme_list_item(item).items(), + headers=['Parameter', 'Value'], + tablefmt=self.tablefmt)) + + mme_list_parser = cmd2.Cmd2ArgumentParser() + add_sort_group(mme_list_parser, default='none', + choices=('none', 'name', 'laddr', 'raddr')) + + @cmd2.with_argparser(mme_list_parser) + @cmd2.with_category(CAT_MME) + def do_mme_list(self, opts) -> None: + ''' Get a list of registered MMEs ''' + data = self.iface.mme_list() + self.mme_list_print(data, opts.sort_by, opts.reverse) + + mme_add_parser = cmd2.Cmd2ArgumentParser() + mme_add_parser.add_argument('-N', '--name', + type=str, required=True, + help='MME name (example: mme0)') + mme_add_parser.add_argument('-la', '--laddr', + type=str, default='::', + help='Local address (default: %(default)s)') + mme_add_parser.add_argument('-ra', '--raddr', + type=str, required=True, + help='Remote address (example: 192.168.1.101)') + mme_add_parser.add_argument('-rp', '--rport', + type=int, default=36412, + help='Remote port (default: %(default)s)') + + @cmd2.with_argparser(mme_add_parser) + @cmd2.with_category(CAT_MME) + def do_mme_add(self, opts) -> None: + ''' Add an MME to the pool ''' + mme_info = dict(name=opts.name, + laddr=opts.laddr, + raddr=opts.raddr, + rport=opts.rport) + self.iface.mme_add(mme_info) + + @staticmethod + def add_mme_id_group(parser): + ''' Add argparse group for the MmeId parameter ''' + mme_id_group = parser.add_argument_group('MME ID') + mme_id_group = mme_id_group.add_mutually_exclusive_group(required=True) + mme_id_group.add_argument('-N', '--name', + type=str, + help='MME name (example: mme0)') + # TODO: address/port + return mme_id_group + + mme_info_parser = cmd2.Cmd2ArgumentParser() + add_mme_id_group(mme_info_parser) + + @cmd2.with_argparser(mme_info_parser) + @cmd2.with_category(CAT_MME) + def do_mme_info(self, opts) -> None: + ''' Get information about a specific MME ''' + data = self.iface.mme_info(opts.name) + self.mme_info_print(data) + + @cmd2.with_argparser(mme_info_parser) + @cmd2.with_category(CAT_MME) + def do_mme_delete(self, opts) -> None: + ''' Delete an MME from the pool ''' + self.iface.mme_delete(opts.name) + + @staticmethod def enb_list_item(item: dict) -> dict: ''' Generate a table row for the given eNB ''' enb_addr = lambda item: '{enb_saddr}:{enb_sport} ({enb_sctp_aid})'.format(**item) @@ -258,21 +380,6 @@ headers=['Parameter', 'Value'], tablefmt=self.tablefmt)) - @staticmethod - def add_sort_group(parser, - default: str, - choices: set[str]) -> None: - ''' Add argparse group with sorting params ''' - sort_group = parser.add_argument_group('Sorting options') - sort_group.add_argument('-S', '--sort-by', - type=str, - default=default, - choices=choices, - help='Sort by (default: %(default)s)') - sort_group.add_argument('--reverse', - action='store_true', - help='Reverse order (default: %(default)s)') - enb_list_parser = cmd2.Cmd2ArgumentParser() add_sort_group(enb_list_parser, default='handle', choices=('handle', 'pid', 'state', 'genb_id', 'uptime')) diff --git a/doc/osmo-s1gw-cli.md b/doc/osmo-s1gw-cli.md index 4a0bd22..41114d5 100644 --- a/doc/osmo-s1gw-cli.md +++ b/doc/osmo-s1gw-cli.md @@ -151,6 +151,109 @@ Heartbeat failed: timeout ``` +### `mme_list` + +Get a list of registered MMEs. + +``` +Usage: mme_list [-h] [-S {none, name, laddr, raddr}] [--reverse] + +Get a list of registered MMEs + +optional arguments: + -h, --help show this help message and exit + +Sorting options: + -S, --sort-by {none, name, laddr, raddr} + Sort by (default: none) + --reverse Reverse order (default: False) +``` + +Example: getting a list of MMEs (not sorted by default). + +``` +OsmoS1GW# mme_list +| Name | Local address | Remote address/port | +|--------|-----------------|-----------------------| +| mme0 | :: | 127.0.2.10:36412 | +| mme1 | :: | 127.0.2.20:36412 | +| mme2 | :: | 127.0.2.30:36412 | +``` + +### `mme_add` + +Add an MME to the pool. + +``` +Usage: mme_add -N NAME -ra RADDR [-h] [-la LADDR] [-rp RPORT] + +Add an MME to the pool + +required arguments: + -N, --name NAME MME name (example: mme0) + -ra, --raddr RADDR Remote address (example: 192.168.1.101) + +optional arguments: + -h, --help show this help message and exit + -la, --laddr LADDR Local address (default: ::) + -rp, --rport RPORT Remote port (default: 36412) +``` + +Example: adding an MME with remote address "192.168.1.101". + +``` +OsmoS1GW# mme_add --name mme42 --raddr 192.168.1.101 +``` + +### `mme_info` + +Get information about a specific MME. + +``` +Usage: mme_info [-h] -N NAME + +Get information about a specific MME + +optional arguments: + -h, --help show this help message and exit + +MME ID: + -N, --name NAME MME name (example: mme0) +``` + +Example: getting information about an MME with name "mme0". + +``` +OsmoS1GW# mme_info --name mme0 +| Parameter | Value | +|---------------------|------------------| +| Name | mme0 | +| Local address | :: | +| Remote address/port | 127.0.2.10:36412 | +``` + +### `mme_delete` + +Delete an MME from the pool. + +``` +Usage: mme_delete [-h] -N NAME + +Delete an MME from the pool + +optional arguments: + -h, --help show this help message and exit + +MME ID: + -N, --name NAME MME name (example: mme0) +``` + +Example: deleting an MME with name "mme0". + +``` +OsmoS1GW# mme_delete --name mme0 +``` + ### `enb_list` Get a list of eNB connections. diff --git a/priv/openapi.json b/priv/openapi.json index 5422c03..262ad4d 100644 --- a/priv/openapi.json +++ b/priv/openapi.json @@ -100,6 +100,89 @@ } } }, + "/mme-list": { + "get": { + "summary": "Get a list of registered MMEs", + "operationId": "MmeList", + "responses": { + "200": { + "description": "A list of registered MMEs", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MmeList" + } + } + } + } + } + }, + "post": { + "summary": "Add an MME to the pool", + "operationId": "MmeAdd", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MmeItem" + } + } + } + }, + "responses": { + "201": { + "description": "Successful outcome (MME added)" + }, + "409": { + "description": "Unsuccessful outcome (MME already registered?)" + } + } + } + }, + "/mme/{MmeId}": { + "get": { + "summary": "Get information about a specific MME", + "operationId": "MmeInfo", + "parameters": [ + { + "$ref": "#/components/parameters/MmeId" + } + ], + "responses": { + "200": { + "description": "Successful outcome (MME info)", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MmeItem" + } + } + } + }, + "404": { + "description": "Unsuccessful outcome (MME not found)" + } + } + }, + "delete": { + "summary": "Delete an MME from the pool", + "operationId": "MmeDelete", + "parameters": [ + { + "$ref": "#/components/parameters/MmeId" + } + ], + "responses": { + "200": { + "description": "Successful outcome (MME deleted)" + }, + "404": { + "description": "Unsuccessful outcome (MME not found)" + } + } + } + }, "/enb-list": { "get": { "summary": "Get a list of eNB connections", @@ -263,6 +346,28 @@ } }, "parameters": { + "MmeId": { + "name": "MmeId", + "in": "path", + "description": "MME identifier (selector)", + "required": true, + "schema": { + "oneOf": [ + { + "type": "string", + "pattern": "^name:", + "description": "MME name", + "example": "mme0" + }, + { + "type": "string", + "pattern": "^addr:[0-9a-f:.]+-[0-9]+$", + "description": "MME remote address/port", + "example": "addr:192.168.1.1-36412" + } + ] + } + }, "EnbId": { "name": "EnbId", "in": "path", @@ -406,6 +511,37 @@ } } }, + "MmeList": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MmeItem" + } + }, + "MmeItem": { + "type": "object", + "required": [ + "name", + "raddr" + ], + "properties": { + "name": { + "type": "string", + "description": "Unique, human-readable identifier" + }, + "laddr": { + "type": "string", + "description": "Local (bind) IP address" + }, + "raddr": { + "type": "string", + "description": "Remote (connect) IP address" + }, + "rport": { + "type": "integer", + "description": "Remote port" + } + } + }, "EnbList": { "type": "array", "items": { diff --git a/src/rest_server.erl b/src/rest_server.erl index 6e1f892..a69c73c 100644 --- a/src/rest_server.erl +++ b/src/rest_server.erl @@ -37,6 +37,10 @@ -export([metrics_list/1, pfcp_assoc_state/1, pfcp_heartbeat/1, + mme_list/1, + mme_add/1, + mme_info/1, + mme_delete/1, enb_list/1, enb_info/1, enb_delete/1, @@ -95,6 +99,50 @@ end. +%% MmeList :: Get a list of registered MMEs +mme_list(#{}) -> + MmeList = mme_registry:fetch_mme_list(), + {200, [], lists:map(fun mme_item/1, MmeList)}. + + +%% MmeAdd :: Add an MME to the pool +mme_add(#{body := Body}) -> + MmeInfo = #{name => binary_to_list(maps:get(<< "name" >>, Body)), + laddr => binary_to_list(maps:get(<< "laddr" >>, Body, "::")), + raddr => binary_to_list(maps:get(<< "raddr" >>, Body)), + rport => maps:get(<< "rport" >>, Body, 36412) + }, + case mme_registry:mme_register(MmeInfo) of + ok -> {201, [], undefined}; + {error, _} -> {409, [], undefined} + end. + + +%% MmeInfo :: Get information about a specific MME +mme_info(#{path_parameters := PP}) -> + [{<< "MmeId" >>, << ID/bytes >>}] = PP, + case fetch_mme_info(ID) of + {ok, MmeInfo} -> + {200, [], mme_item(MmeInfo)}; + error -> + {404, [], undefined} + end. + + +%% MmeDelete :: Delete an MME from the pool +mme_delete(#{path_parameters := PP}) -> + [{<< "MmeId" >>, << ID/bytes >>}] = PP, + case fetch_mme_info(ID) of + {ok, #{name := MmeName}} -> + case mme_registry:mme_unregister(MmeName) of + ok -> {200, [], undefined}; + {error, _} -> {404, [], undefined} + end; + error -> + {404, [], undefined} + end. + + %% EnbList :: Get a list of eNB connections enb_list(#{}) -> EnbList = enb_registry:fetch_enb_list(), @@ -220,6 +268,23 @@ thing_to_list(X) when is_list(X) -> X. +-spec mme_item(mme_registry:mme_info()) -> map(). +mme_item(MmeInfo) -> + rsp_map(MmeInfo#{laddr => inet:ntoa(maps:get(laddr, MmeInfo)), + raddr => inet:ntoa(maps:get(raddr, MmeInfo))}). + + +-spec fetch_mme_info(binary()) -> {ok, mme_registry:mme_info()} | error. +fetch_mme_info(<< "name:", Val/bytes >>) -> + MmeName = binary_to_list(Val), + mme_registry:fetch_mme_info(MmeName); + +%% TODO: '^addr:[0-9a-f:.]+-[0-9]+$' +fetch_mme_info(ID) -> + ?LOG_ERROR("Unhandled MME ID ~p", [ID]), + error. + + -spec enb_item(enb_registry:enb_info()) -> map(). enb_item(EnbInfo) -> M0 = #{handle => maps:get(handle, EnbInfo), -- To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41282?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: Iad249aed99face9e35fd19e0596cf2364ade4c77 Gerrit-Change-Number: 41282 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
1 0
0 0
[XS] Change in ...osmo-s1gw[master]: osmo_s1gw: add set_env/2
by fixeria 28 Oct '25

28 Oct '25
fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41280?usp=email ) Change subject: osmo_s1gw: add set_env/2 ...................................................................... osmo_s1gw: add set_env/2 Change-Id: I6c88d004ad16d9bed5021f96a1cef2904c0a246a --- M src/osmo_s1gw.erl 1 file changed, 8 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/80/41280/1 diff --git a/src/osmo_s1gw.erl b/src/osmo_s1gw.erl index e90d927..4444fe0 100644 --- a/src/osmo_s1gw.erl +++ b/src/osmo_s1gw.erl @@ -35,6 +35,7 @@ -module(osmo_s1gw). -export([get_env/2, + set_env/2, get_priv/1, main/1]). @@ -53,6 +54,13 @@ application:get_env(?ENV_APP_NAME, Param, Default). +-spec set_env(Param, Value) -> ok + when Param :: atom(), + Value :: term(). +set_env(Param, Value) -> + application:set_env(?ENV_APP_NAME, Param, Value). + + -spec get_priv(Name) -> Path when Name :: file:filename_all(), Path :: file:filename_all(). -- To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41280?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: I6c88d004ad16d9bed5021f96a1cef2904c0a246a Gerrit-Change-Number: 41280 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
1 0
0 0
[XS] Change in osmo-ttcn3-hacks[master]: smdpp_Tests: remove excess newline
by dexter 28 Oct '25

28 Oct '25
dexter has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41274?usp=email ) Change subject: smdpp_Tests: remove excess newline ...................................................................... smdpp_Tests: remove excess newline Related: SYS#7339 Change-Id: Ice4d472eadf259204a4a849273bccbca8728f2ec --- M smdpp/smdpp_Tests.ttcn 1 file changed, 0 insertions(+), 1 deletion(-) Approvals: Jenkins Builder: Verified dexter: Looks good to me, approved diff --git a/smdpp/smdpp_Tests.ttcn b/smdpp/smdpp_Tests.ttcn index 9c453c2..339dfe3 100644 --- a/smdpp/smdpp_Tests.ttcn +++ b/smdpp/smdpp_Tests.ttcn @@ -487,7 +487,6 @@ return false; } - // Configure HTTP client var integer result := ext_RSPClient_configureHttpClient( g_rsp_client_handle, -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41274?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: Ice4d472eadf259204a4a849273bccbca8728f2ec Gerrit-Change-Number: 41274 Gerrit-PatchSet: 1 Gerrit-Owner: dexter <pmaier(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de>
1 0
0 0
[XS] Change in osmo-ttcn3-hacks[master]: smdpp_Tests: remove excess newline
by dexter 28 Oct '25

28 Oct '25
dexter has posted comments on this change by dexter. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41274?usp=email ) Change subject: smdpp_Tests: remove excess newline ...................................................................... Patch Set 1: Code-Review+2 -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41274?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: Ice4d472eadf259204a4a849273bccbca8728f2ec Gerrit-Change-Number: 41274 Gerrit-PatchSet: 1 Gerrit-Owner: dexter <pmaier(a)sysmocom.de> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: dexter <pmaier(a)sysmocom.de> Gerrit-Comment-Date: Tue, 28 Oct 2025 12:06:26 +0000 Gerrit-HasComments: No Gerrit-Has-Labels: Yes
1 0
0 0
[XS] Change in osmo-ttcn3-hacks[master]: smdpp_Tests: remove excess newline
by dexter 28 Oct '25

28 Oct '25
dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41274?usp=email ) Change subject: smdpp_Tests: remove excess newline ...................................................................... smdpp_Tests: remove excess newline Related: SYS#7339 Change-Id: Ice4d472eadf259204a4a849273bccbca8728f2ec --- M smdpp/smdpp_Tests.ttcn 1 file changed, 0 insertions(+), 1 deletion(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/74/41274/1 diff --git a/smdpp/smdpp_Tests.ttcn b/smdpp/smdpp_Tests.ttcn index 9c453c2..339dfe3 100644 --- a/smdpp/smdpp_Tests.ttcn +++ b/smdpp/smdpp_Tests.ttcn @@ -487,7 +487,6 @@ return false; } - // Configure HTTP client var integer result := ext_RSPClient_configureHttpClient( g_rsp_client_handle, -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41274?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: Ice4d472eadf259204a4a849273bccbca8728f2ec Gerrit-Change-Number: 41274 Gerrit-PatchSet: 1 Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
1 0
0 0
[XS] Change in osmo-ttcn3-hacks[master]: smdpp_Tests: improve messages when setting verdict in f_init_es9plus
by dexter 28 Oct '25

28 Oct '25
dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41275?usp=email ) Change subject: smdpp_Tests: improve messages when setting verdict in f_init_es9plus ...................................................................... smdpp_Tests: improve messages when setting verdict in f_init_es9plus It is important to tell that the failure happend in the context of the ES9+ initialization. Related: SYS#7339 Change-Id: I6b55d0bb6d5bd698241a990cf8388adc68a99543 --- M smdpp/smdpp_Tests.ttcn 1 file changed, 3 insertions(+), 3 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/75/41275/1 diff --git a/smdpp/smdpp_Tests.ttcn b/smdpp/smdpp_Tests.ttcn index 17ed4e1..c49187a 100644 --- a/smdpp/smdpp_Tests.ttcn +++ b/smdpp/smdpp_Tests.ttcn @@ -534,18 +534,18 @@ ); if (g_rsp_client_handle_es9p < 0) { - ext_logError("Failed to create RSP client"); + setverdict(fail, "Failed to initialize RSP client for ES9+"); return false; } if (ext_RSPClient_loadEUICCCertificate(g_rsp_client_handle_es9p, g_pars_smdpp.euicc_cert_path) != 0) { - ext_logError("Failed to load eUICC certificate"); + ext_logError("Failed to load eUICC certificate for ES9+"); f_rsp_client_cleanup(); return false; } if (ext_RSPClient_loadEUICCKeyPair(g_rsp_client_handle_es9p, g_pars_smdpp.euicc_key_path) != 0) { - ext_logError("Failed to load eUICC private key"); + ext_logError("Failed to load eUICC private key for ES9+"); f_rsp_client_cleanup(); return false; } -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41275?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I6b55d0bb6d5bd698241a990cf8388adc68a99543 Gerrit-Change-Number: 41275 Gerrit-PatchSet: 1 Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
1 0
0 0
[M] Change in osmo-ttcn3-hacks[master]: smdpp_Tests: rename f_rsp_client_init to f_init_es9plus
by dexter 28 Oct '25

28 Oct '25
dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41276?usp=email ) Change subject: smdpp_Tests: rename f_rsp_client_init to f_init_es9plus ...................................................................... smdpp_Tests: rename f_rsp_client_init to f_init_es9plus We already have an init function for ES2+ that is called f_init_es2plus, let's rename f_rsp_client_init to maintain consistency. Related: SYS#7339 Change-Id: I865b9dfc3597f9a962225880b7a5cda838b8377e --- M smdpp/smdpp_Tests.ttcn 1 file changed, 37 insertions(+), 36 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/76/41276/1 diff --git a/smdpp/smdpp_Tests.ttcn b/smdpp/smdpp_Tests.ttcn index c49187a..1210353 100644 --- a/smdpp/smdpp_Tests.ttcn +++ b/smdpp/smdpp_Tests.ttcn @@ -523,7 +523,8 @@ return true; } -private function f_rsp_client_init() runs on smdpp_ConnHdlr return boolean { +// Initialize RSP client for ES9+ +private function f_init_es9plus() runs on smdpp_ConnHdlr return boolean { ext_logInfo("Initializing RSP client"); g_rsp_client_handle_es9p := ext_RSPClient_create( @@ -1816,7 +1817,7 @@ ) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: " & params.testName & " ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2034,7 +2035,7 @@ ext_logInfo("=== Testing AuthenticateClient Error: " & test_name & " ==="); /* Initialize HTTP/TLS and RSP client */ - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2192,7 +2193,7 @@ ext_logInfo("=== Testing GetBoundProfilePackage Error: " & test_name & " ==="); /* Initialize RSP client */ - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2328,7 +2329,7 @@ private function f_initiateAuth_generic(charstring id, template (omit) octetstring version := omit, charstring testDescription, charstring successMessage, boolean checkPkid := false) runs on smdpp_ConnHdlr { ext_logInfo(testDescription); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2393,7 +2394,7 @@ private function f_TC_InitiateAuth_02_Uniqueness(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: InitiateAuthentication - Uniqueness of Transaction ID and Server Challenge ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2412,7 +2413,7 @@ /* Step 2: Re-initialize TLS connection (simulated by re-init) */ f_rsp_client_cleanup(); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client re-initialization failed"); return; } @@ -2456,7 +2457,7 @@ private function f_TC_InitiateAuth_03_InvalidServerAddress(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: InitiateAuthentication - Invalid Server Address Error ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2524,7 +2525,7 @@ ) runs on smdpp_ConnHdlr { ext_logInfo(params.testName); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2751,7 +2752,7 @@ ) runs on smdpp_ConnHdlr { ext_logInfo(testName); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -2886,7 +2887,7 @@ ext_logInfo("=== Testing AuthenticateClient Retry After Cancelled Session ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3036,7 +3037,7 @@ ) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: GetBoundProfilePackage Retry - " & test_description & " ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3220,7 +3221,7 @@ private function f_TC_GetBoundProfilePackage_Retry_09_ConfirmationCode(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: GetBoundProfilePackage - Confirmation Code Retry ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3318,7 +3319,7 @@ integer reason, charstring reason_name ) runs on smdpp_ConnHdlr { - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3400,7 +3401,7 @@ charstring id, CancelSessionReason reason ) runs on smdpp_ConnHdlr { - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3509,7 +3510,7 @@ CancelSessionErrorInjection err_injection, charstring test_description ) runs on smdpp_ConnHdlr { - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3594,7 +3595,7 @@ CancelSessionErrorInjection err_injection, charstring test_description ) runs on smdpp_ConnHdlr { - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -3777,7 +3778,7 @@ ext_logInfo("Starting complete RSP flow test"); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4045,7 +4046,7 @@ ) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: HandleNotification - " & test_description & " ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4177,7 +4178,7 @@ private function f_TC_HandleNotification_02_OtherSignedNotification(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: HandleNotification - OtherSignedNotification ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4218,7 +4219,7 @@ ) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: GetBoundProfilePackage - " & test_description & " ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4328,7 +4329,7 @@ private function f_TC_GetBoundProfilePackage_05_Metadata_Split(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: GetBoundProfilePackage - S-ENC/S-MAC with Metadata Split ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4367,7 +4368,7 @@ private function f_TC_InitiateAuth_04_UnsupportedPKID(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: InitiateAuthentication - Unsupported Public Key Identifiers Error ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4389,7 +4390,7 @@ private function f_TC_InitiateAuth_05_UnsupportedVersion(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: InitiateAuthentication - Unsupported Specification Version Error ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4419,7 +4420,7 @@ private function f_TC_InitiateAuth_06_UnavailableServerAuthCert(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: InitiateAuthentication - Unavailable Server Auth Certificate Error ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4594,7 +4595,7 @@ private function f_TC_AuthenticateClient_19_Extended_UICC_Capability(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Extended UICC Capability ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4627,7 +4628,7 @@ private function f_TC_AuthenticateClient_20_Extended_DeviceInfo(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Extended DeviceInfo ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4682,7 +4683,7 @@ private function f_TC_AuthenticateClient_21_Extended_eUICCInfo2(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Extended eUICCInfo2 ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4730,7 +4731,7 @@ private function f_TC_AuthenticateClient_Error_01_InvalidEUMCert(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Error: Invalid EUM Certificate ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4756,7 +4757,7 @@ private function f_TC_AuthenticateClient_Error_02_ExpiredEUMCert(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Error: Expired EUM Certificate ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4782,7 +4783,7 @@ private function f_TC_AuthenticateClient_Error_03_InvalidEUICCCert(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Error: Invalid eUICC Certificate ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4808,7 +4809,7 @@ private function f_TC_AuthenticateClient_Error_04_ExpiredEUICCCert(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Error: Expired eUICC Certificate ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4834,7 +4835,7 @@ private function f_TC_AuthenticateClient_Error_07_UnknownCIKey(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Error: Unknown CI Public Key ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -4917,7 +4918,7 @@ * The profile has PPR1 set (disabling not allowed) but the eUICC reports PPR1 as forbidden * because an operational profile is already installed */ - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -5038,7 +5039,7 @@ private function f_TC_AuthenticateClient_03_SecondAttempt_AfterInvalidMatchingID(charstring id) runs on smdpp_ConnHdlr { ext_logInfo("=== Test Case: AuthenticateClient - Second Attempt After Invalid MatchingID ==="); - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } @@ -5730,7 +5731,7 @@ const charstring c_cert_path := "./test_certs/CERT_MNO_ECDSA_NIST.pem"; const charstring c_key_path := "./test_certs/SK_MNO_ECDSA_NIST.pem"; - if (not f_rsp_client_init()) { + if (not f_init_es9plus()) { setverdict(fail, "RSP client initialization failed"); return; } -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41276?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: I865b9dfc3597f9a962225880b7a5cda838b8377e Gerrit-Change-Number: 41276 Gerrit-PatchSet: 1 Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • ...
  • 64
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.