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().

--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/42485?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: Iba954746fe20e6b9eeaec3196e1f83e3fc3e7fc2
Gerrit-Change-Number: 42485
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <[email protected]>

Reply via email to