fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/42485?usp=email )
Change subject: config/sys.config: group pfcp_peer params into a map ......................................................................
config/sys.config: group pfcp_peer params into a map
Following the same pattern as sctp_{client,server}, group the flat pfcp_loc_addr/pfcp_rem_addr environment variables into a pfcp_peer map. The old flat keys are still supported for backwards compat.
Changes: * osmo_s1gw_sup: add pfcp_cfg(), merging legacy flat keys with the new pfcp_peer map (new takes priority); store the resolved config back via set_env(pfcp_peer, ...) so all consumers see a single canonical map * pfcp_peer: change start_link/2 to start_link/1 taking a cfg() map; simplify init() using sctp_common:parse_addr/1; add cfg() type * rest_server: read pfcp laddr/raddr from the pfcp_peer map
Change-Id: Iba954746fe20e6b9eeaec3196e1f83e3fc3e7fc2 --- M config/sys.config M doc/manuals/chapters/configuration.adoc M src/osmo_s1gw_sup.erl M src/pfcp_peer.erl M src/rest_server.erl 5 files changed, 49 insertions(+), 28 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/85/42485/1
diff --git a/config/sys.config b/config/sys.config index d428765..af6480b 100644 --- a/config/sys.config +++ b/config/sys.config @@ -26,8 +26,13 @@ %% socket options (if omitted or left empty, defaults apply) - see above sockopts => #{ } }}, - {pfcp_loc_addr, "127.0.1.1"}, %% local address for incoming PFCP PDUs from the UPF - {pfcp_rem_addr, "127.0.1.2"} %% remote address for outgoing PFCP PDUs to the UPF + %% PFCP peer (UPF) configuration + {pfcp_peer, #{ + %% local address for incoming PFCP PDUs from the UPF + laddr => "127.0.1.1", + %% remote address for outgoing PFCP PDUs to the UPF + raddr => "127.0.1.2" + }} %% Optional PFCP Network Instance IEs (omitted if not configured) %% {pfcp_net_inst_core, "core-side"}, %% PFCP Network Instance IE value (to core) %% {pfcp_net_inst_access, "radio-side"} %% PFCP Network Instance IE value (to access) diff --git a/doc/manuals/chapters/configuration.adoc b/doc/manuals/chapters/configuration.adoc index 0d4315f..a43c9ad 100644 --- a/doc/manuals/chapters/configuration.adoc +++ b/doc/manuals/chapters/configuration.adoc @@ -134,21 +134,27 @@ These parameters control the PFCP session between OsmoS1GW and the UPF.
---- -{pfcp_loc_addr, "127.0.1.1"}, %% local address for PFCP (UDP) -{pfcp_rem_addr, "127.0.1.2"}, %% remote address of the UPF +{pfcp_peer, #{ + laddr => "127.0.1.1", %% local address for PFCP (UDP) + raddr => "127.0.1.2" %% remote address of the UPF +}},
%% Optional Network Instance IEs: %% {pfcp_net_inst_core, "core-side"}, %% {pfcp_net_inst_access, "radio-side"} ----
-`pfcp_loc_addr`:: +`laddr`:: Local IP address on which OsmoS1GW listens for PFCP messages from the UPF. Default: `"127.0.1.1"`.
-`pfcp_rem_addr`:: +`raddr`:: Remote IP address of the UPF. Default: `"127.0.1.2"`.
+NOTE: The legacy flat keys `pfcp_loc_addr` and `pfcp_rem_addr` are still +accepted for backwards compatibility. The `pfcp_peer` map takes priority +if both are present. + `pfcp_net_inst_core`:: Value for the PFCP Network Instance IE on the core-network side of each GTP-U session. Omit if the UPF does not require Network Instance IEs. diff --git a/src/osmo_s1gw_sup.erl b/src/osmo_s1gw_sup.erl index fd89b3c..573f2cb 100644 --- a/src/osmo_s1gw_sup.erl +++ b/src/osmo_s1gw_sup.erl @@ -52,16 +52,17 @@
init([]) -> - PfcpLocAddr = osmo_s1gw:get_env(pfcp_loc_addr, ?ENV_DEFAULT_PFCP_LOC_ADDR), - PfcpRemAddr = osmo_s1gw:get_env(pfcp_rem_addr, ?ENV_DEFAULT_PFCP_REM_ADDR), - ClientCfg = client_cfg(), ServerCfg = server_cfg(), + PfcpCfg = pfcp_cfg(),
%% Set a complete 'sctp_client' section with all fields populated. %% This may be used by mme_registry:mme_list_from_sctp_client/0 %% if the 'mme_pool' is missing in the configuration file. osmo_s1gw:set_env(sctp_client, ClientCfg), + %% Set a complete 'pfcp_peer' section with all fields populated. + %% This way the rest_server can read from it without legacy key handling. + osmo_s1gw:set_env(pfcp_peer, PfcpCfg),
EnbRegistry = {enb_registry, {enb_registry, start_link, []}, permanent, @@ -78,8 +79,7 @@ 5000, worker, [sctp_server]}, - PfcpPeer = {pfcp_peer, {pfcp_peer, start_link, - [PfcpLocAddr, PfcpRemAddr]}, + PfcpPeer = {pfcp_peer, {pfcp_peer, start_link, [PfcpCfg]}, permanent, 5000, worker, @@ -151,6 +151,17 @@ priv => undefined}.
+-spec pfcp_cfg() -> pfcp_peer:cfg(). +pfcp_cfg() -> + %% parse old/legacy environment options, if any + OldCfg = parse_env_map(#{laddr => pfcp_loc_addr, + raddr => pfcp_rem_addr}), + %% parse the new pfcp configuration block (takes priority) + Cfg = maps:merge(OldCfg, osmo_s1gw:get_env(pfcp_peer, #{ })), + #{laddr => maps:get(laddr, Cfg, ?ENV_DEFAULT_PFCP_LOC_ADDR), + raddr => maps:get(raddr, Cfg, ?ENV_DEFAULT_PFCP_REM_ADDR)}. + + -spec gtpu_kpi_cfg() -> gtpu_kpi:cfg(). gtpu_kpi_cfg() -> #{enable => osmo_s1gw:get_env(gtpu_kpi_enable, ?ENV_DEFAULT_GTPU_KPI_ENABLE), diff --git a/src/pfcp_peer.erl b/src/pfcp_peer.erl index aee679a..3423237 100644 --- a/src/pfcp_peer.erl +++ b/src/pfcp_peer.erl @@ -41,7 +41,7 @@ connected/3, code_change/4, terminate/3]). --export([start_link/2, +-export([start_link/1, assoc_setup/0, assoc_release/0, seid_alloc/0, @@ -74,13 +74,17 @@ -type pfcp_msg() :: {pfcp_msg_type(), pfcp_ies()}. -type pfcp_pdu() :: #pfcp{}.
+-type cfg() :: #{laddr := string() | inet:ip_address(), + raddr := string() | inet:ip_address()}. + -type peer_info() :: #{state := atom(), laddr := inet:ip_address(), raddr := inet:ip_address(), lrts := pos_integer(), rrts => pos_integer()}.
--export_type([peer_info/0, +-export_type([cfg/0, + peer_info/0, pfcp_session_rsp/0, pfcp_msg_type/0, pfcp_seq_nr/0, @@ -111,10 +115,9 @@ %% public API %% ------------------------------------------------------------------
-start_link(LocAddr, RemAddr) -> - gen_statem:start_link({local, ?MODULE}, ?MODULE, - [LocAddr, RemAddr], - []). +-spec start_link(cfg()) -> gen_statem:start_ret(). +start_link(Cfg) -> + gen_statem:start_link({local, ?MODULE}, ?MODULE, [Cfg], []).
%% Initiate the PFCP Association Setup procedure @@ -176,15 +179,10 @@ %% gen_statem API %% ------------------------------------------------------------------
-init([LocAddrStr, RemAddr]) when is_list(LocAddrStr) -> - {ok, LocAddr} = inet:parse_address(LocAddrStr), - init([LocAddr, RemAddr]); - -init([LocAddr, RemAddrStr]) when is_list(RemAddrStr) -> - {ok, RemAddr} = inet:parse_address(RemAddrStr), - init([LocAddr, RemAddr]); - -init([LocAddr, RemAddr]) -> +init([Cfg]) -> + %% XXX: sctp_common:parse_addr/1 is not specific to SCTP + LocAddr = sctp_common:parse_addr(maps:get(laddr, Cfg)), + RemAddr = sctp_common:parse_addr(maps:get(raddr, Cfg)), s1gw_metrics:gauge_set(?S1GW_GAUGE_PFCP_ASSOCIATED, 0), {ok, Sock} = gen_udp:open(?PFCP_PORT, [binary, {ip, LocAddr}, diff --git a/src/rest_server.erl b/src/rest_server.erl index f9176cb..24ca33b 100644 --- a/src/rest_server.erl +++ b/src/rest_server.erl @@ -279,8 +279,9 @@
-spec config_pfcp() -> map(). config_pfcp() -> - #{<<"laddr">> => bval(osmo_s1gw:get_env(pfcp_loc_addr, ?ENV_DEFAULT_PFCP_LOC_ADDR)), - <<"raddr">> => bval(osmo_s1gw:get_env(pfcp_rem_addr, ?ENV_DEFAULT_PFCP_REM_ADDR))}. + Cfg = osmo_s1gw:get_env(pfcp_peer, #{}), + #{<<"laddr">> => bval(maps:get(laddr, Cfg, ?ENV_DEFAULT_PFCP_LOC_ADDR)), + <<"raddr">> => bval(maps:get(raddr, Cfg, ?ENV_DEFAULT_PFCP_REM_ADDR))}.
-spec config_gtpu_kpi() -> map().