fixeria submitted this change.
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(-)
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().
To view, visit change 42485. To unsubscribe, or for help writing mail filters, visit settings.