pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/35960?usp=email )

Change subject: s2b: Announce proper GTPU Local Address during CreateSessionReq
......................................................................

s2b: Announce proper GTPU Local Address during CreateSessionReq

Change-Id: I43ad4f9e59cb80e0016d9163364d9f202d0d0fb3
---
M config/sys.config
M src/epdg_gtpc_s2b.erl
M src/osmo_epdg_sup.erl
3 files changed, 45 insertions(+), 12 deletions(-)

Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved




diff --git a/config/sys.config b/config/sys.config
index 6183daf..660aded 100755
--- a/config/sys.config
+++ b/config/sys.config
@@ -42,8 +42,8 @@
  %% ===========================================
   {gtp_u_kmod, [
     %% grx: Name used to log by the module.
-    {sockets, [{grx, [%% ip: IP Address assigned at the tunnel. TODO: not 
currently applied?
-                      {ip, {192,0,2,16}},
+    {sockets, [{grx, [%% ip: IP Address assigned at the tunnel, used as local 
GTP-U IP Address.
+                      {ip, {127,0,0,2}},
                       %% Create the tun socket on a given netns:
                       %%{netns, "mynetns"},
                       %% Bind tun socket to a particular interface 
(SO_BINDTODEVICE):
diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl
index e795cd2..9b6d9ed 100644
--- a/src/epdg_gtpc_s2b.erl
+++ b/src/epdg_gtpc_s2b.erl
@@ -43,7 +43,7 @@
 -include_lib("gtplib/include/gtp_packet.hrl").

 %% API Function Exports
--export([start_link/5]).
+-export([start_link/6]).
 -export([terminate/2]).
 %% gen_server Function Exports
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2]).
@@ -63,12 +63,14 @@

 -record(gtp_state, {
         socket,
-        laddr_str,
+        laddr_str       :: string(),
         laddr           :: inet:ip_address(),
         lport           :: non_neg_integer(),
-        raddr_str,
+        raddr_str       :: string(),
         raddr           :: inet:ip_address(),
         rport           :: non_neg_integer(),
+        laddr_gtpu_str  :: string(),
+        laddr_gtpu      :: inet:ip_address(),
         restart_counter :: 0..255,
         seq_no          :: 0..16#ffffff,
         next_local_control_tei :: 0..16#ffffffff,
@@ -93,8 +95,8 @@
     bearers = sets:new()    :: sets:set()
 }).

-start_link(LocalAddr, LocalPort, RemoteAddr, RemotePort, Options) ->
-    gen_server:start_link({local, ?SERVER}, ?MODULE, [LocalAddr, LocalPort, 
RemoteAddr, RemotePort, Options], []).
+start_link(LocalAddr, LocalPort, RemoteAddr, RemotePort, GtpuLocalIp, Options) 
->
+    gen_server:start_link({local, ?SERVER}, ?MODULE, [LocalAddr, LocalPort, 
RemoteAddr, RemotePort, GtpuLocalIp, Options], []).

 peer_down(API, SvcName, {PeerRef, _} = Peer) ->
     % fixme: why do we still have ets here?
@@ -104,10 +106,11 @@

 init(State) ->
     lager:info("epdg_gtpc_s2b: init(): ~p", [State]),
-    [LocalAddr | [LocalPort | [RemoteAddr | [RemotePort | _]]]] = State,
+    [LocalAddr | [LocalPort | [RemoteAddr | [RemotePort | [GtpuLocalAddr | 
_]]]]] = State,
     lager:info("epdg_gtpc_s2b: Binding to IP ~s port ~p~n", [LocalAddr, 
LocalPort]),
     {ok, LocalAddrInet} = inet_parse:address(LocalAddr),
     {ok, RemoteAddrInet} = inet_parse:address(RemoteAddr),
+    {ok, GtpuLocalAddrInet} = inet_parse:address(GtpuLocalAddr),
     Opts = [
         binary,
         {ip, LocalAddrInet},
@@ -127,6 +130,8 @@
                     raddr_str = RemoteAddr,
                     raddr = RemoteAddrInet,
                     rport = RemotePort,
+                    laddr_gtpu_str = GtpuLocalAddr,
+                    laddr_gtpu = GtpuLocalAddrInet,
                     restart_counter = 0,
                     seq_no = rand:uniform(16#FFFFFF),
                     next_local_control_tei = rand:uniform(16#FFFFFFFE),
@@ -457,6 +462,7 @@
                                     apn = Apn,
                                     local_control_tei = LocalCtlTEI} = Sess,
                            #gtp_state{laddr = LocalAddr,
+                                      laddr_gtpu = LocalAddrGtpu,
                                       restart_counter = RCnt,
                                       seq_no = SeqNo}) ->
     Bearer = gtp_session_default_bearer(Sess),
@@ -472,7 +478,7 @@
                     instance = Bearer#gtp_bearer.ebi,
                     interface_type = 31, %% "S2b-U ePDG GTP-U"
                     key = Bearer#gtp_bearer.local_data_tei,
-                    ipv4 = conv:ip_to_bin(LocalAddr)
+                    ipv4 = conv:ip_to_bin(LocalAddrGtpu)
                   }
                 ],
     IEs = [#v2_recovery{restart_counter = RCnt},
@@ -512,7 +518,7 @@
 gen_create_bearer_response(Req = #gtp{version = v2, type = 
create_bearer_request},
                            Sess = #gtp_session{remote_control_tei = 
RemoteCtlTEI},
                            GtpCause,
-                           #gtp_state{laddr = LocalAddr,
+                           #gtp_state{laddr_gtpu = LocalAddrGtpu,
                                       restart_counter = RCnt}) ->
     Bearer = gtp_session_default_bearer(Sess),
     BearersIE = [#v2_bearer_level_quality_of_service{
@@ -527,7 +533,7 @@
         instance = 0,
         interface_type = 31, %% "S2b-U ePDG GTP-U"
         key = Bearer#gtp_bearer.local_data_tei,
-        ipv4 = conv:ip_to_bin(LocalAddr)
+        ipv4 = conv:ip_to_bin(LocalAddrGtpu)
         }
     ],
     IEs = [#v2_cause{v2_cause = GtpCause},
diff --git a/src/osmo_epdg_sup.erl b/src/osmo_epdg_sup.erl
index 4d004e2..871a277 100644
--- a/src/osmo_epdg_sup.erl
+++ b/src/osmo_epdg_sup.erl
@@ -23,6 +23,7 @@
        GtpcLocalPort = application:get_env(?ENV_APP_NAME, gtpc_local_port, 
?ENV_DEFAULT_GTPC_LOCAL_PORT),
        GtpcRemoteIp = application:get_env(?ENV_APP_NAME, gtpc_remote_ip, 
?ENV_DEFAULT_GTPC_REMOTE_IP),
        GtpcRemotePort = application:get_env(?ENV_APP_NAME, gtpc_remote_port, 
?ENV_DEFAULT_GTPC_REMOTE_PORT),
+       GtpuLocalIp = get_config_gtpu_local_ip_addr(),
        %% AAA Server processes:
        AAADiaSWxServer = {aaa_diameter_swx, {aaa_diameter_swx,start_link,[]},
                           permanent,
@@ -40,7 +41,7 @@
                           worker,
                           [aaa_diameter_swm]},
        %% ePDG processes:
-       GtpcServer = {epdg_gtpc_s2b, {epdg_gtpc_s2b,start_link, [GtpcLocalIp, 
GtpcLocalPort, GtpcRemoteIp, GtpcRemotePort, []]},
+       GtpcServer = {epdg_gtpc_s2b, {epdg_gtpc_s2b,start_link, [GtpcLocalIp, 
GtpcLocalPort, GtpcRemoteIp, GtpcRemotePort, GtpuLocalIp, []]},
                      permanent,
                      5000,
                      worker,
@@ -56,3 +57,20 @@
                        worker,
                        [epdg_diameter_swm]},
        {ok, { {one_for_all, 5, 10}, [AAADiaSWxServer, AAADiaS6bServer, 
AAADiaSWmServer, GtpcServer, GsupServer, DiaSWmServer]} }.
+
+% Returns GTP-U local IP address to use, as a string.
+get_config_gtpu_local_ip_addr() ->
+       GtpuKmodSockets = application:get_env(gtp_u_kmod, sockets, []),
+       [GtpuKmodSocket | _] = GtpuKmodSockets,
+       {_GtpuKmodName, GtpuKmodSockOpts} = GtpuKmodSocket,
+       case proplists:get_value(ip, GtpuKmodSockOpts, undefined) of
+       undefined ->
+               GtpcLocalIp = application:get_env(?ENV_APP_NAME, gtpc_local_ip, 
?ENV_DEFAULT_GTPC_LOCAL_IP),
+               lager:notice("Config for GTP-U Local IP Address not found, 
using GTP-C ~p as fallback~n", [GtpcLocalIp]),
+               GtpcLocalIp;
+       IP ->
+               % GtpuLocalIp is in format {A,B,C,D}, convert it to string:
+               GtpuLocalIp = inet:ntoa(IP),
+               lager:info("Config for GTP-U Local IP Address: ~p~n", 
[GtpuLocalIp]),
+               GtpuLocalIp
+       end.

--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/35960?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: erlang/osmo-epdg
Gerrit-Branch: master
Gerrit-Change-Id: I43ad4f9e59cb80e0016d9163364d9f202d0d0fb3
Gerrit-Change-Number: 35960
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to