pespin submitted this change.

View Change


Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved
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(-)

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 change 35960. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: erlang/osmo-epdg
Gerrit-Branch: master
Gerrit-Change-Id: I43ad4f9e59cb80e0016d9163364d9f202d0d0fb3
Gerrit-Change-Number: 35960
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: pespin <pespin@sysmocom.de>
Gerrit-MessageType: merged