pespin has uploaded this change for review. ( 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(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg refs/changes/60/35960/1
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.