permit configuration of links, linksets and routes in app config

Links, Linksets and routes can now be configured in the applicaiton
configuration file.
diff --git a/src/osmo_ss7_app.erl b/src/osmo_ss7_app.erl
index 2bd8292..6da421d 100644
--- a/src/osmo_ss7_app.erl
+++ b/src/osmo_ss7_app.erl
@@ -8,7 +8,9 @@
 -export([reload_config/0]).
 
 start(normal, StartArgs) ->
-	supervisor:start_link({local, osmo_ss7_sup}, osmo_ss7_sup, StartArgs).
+	{ok, Pid} = supervisor:start_link({local, osmo_ss7_sup}, osmo_ss7_sup, StartArgs),
+	reload_config(),
+	{ok, Pid}.
 
 
 start_phase(_Phase, _StartType, _PhaseArgs) ->
@@ -27,5 +29,7 @@
 
 reload_config() ->
 	osmo_util:reload_config(),
-	% FIXME: do something
+	% fixme: why not in config/change/3 ?
+	ss7_links:reload_config(),
+	ss7_routes:reload_config(),
 	ok.
diff --git a/src/ss7_links.erl b/src/ss7_links.erl
index c713700..aa702fa 100644
--- a/src/ss7_links.erl
+++ b/src/ss7_links.erl
@@ -1,6 +1,6 @@
-% Internal SCCP link database keeping
+% Internal SS7 link database keeping
 
-% (C) 2011 by Harald Welte <laforge@gnumonks.org>
+% (C) 2011-2013 by Harald Welte <laforge@gnumonks.org>
 %
 % All Rights Reserved
 %
@@ -36,13 +36,14 @@
 
 -include_lib("osmo_ss7/include/mtp3.hrl").
 -include_lib("osmo_ss7/include/osmo_util.hrl").
+-include_lib("osmo_ss7/include/osmo_ss7.hrl").
 
 % gen_fsm callbacks
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2,
 	 terminate/2, code_change/3]).
 
 % our published API
--export([start_link/0]).
+-export([start_link/0, reload_config/0]).
 
 % client functions, may internally talk to our sccp_user server
 -export([register_linkset/3, unregister_linkset/1]).
@@ -471,3 +472,31 @@
 	active;
 role2sctp_role(sg) ->
 	passive.
+
+
+to_peer({Ip, Port, Pointcode}) ->
+	#sigtran_peer{ip=Ip, port=Port, point_code=Pointcode}.
+
+reconfig_linkset({Name, LocalPC, RemotePC}) ->
+	unregister_linkset(Name),
+	case register_linkset(LocalPC, RemotePC, Name) of
+		ok -> true;
+		_ -> false
+	end.
+
+reconfig_link({Name, {Lset, Sls}, Type, Local, Remote}) ->
+	% FIXME: not relaod safe!!
+	L = #sigtran_link{type=Type, name=Name, linkset_name=Lset,
+			  sls=Sls, local=to_peer(Local), remote=to_peer(Remote)},
+	case osmo_ss7_sup:add_mtp_link(L) of
+		{ok, _, _} -> true;
+		{ok, _} -> true;
+		{error, _} -> false
+	end.
+
+reload_config() ->
+	Linksets = osmo_util:get_env(osmo_ss7, linksets, []),
+	LinksetsRes =  lists:all(fun reconfig_linkset/1, Linksets),
+	Links = osmo_util:get_env(osmo_ss7, links, []),
+	LinksRes = lists:all(fun reconfig_link/1, Links),
+	LinksetsRes and LinksRes.
diff --git a/src/ss7_routes.erl b/src/ss7_routes.erl
index 92e65d2..8965de7 100644
--- a/src/ss7_routes.erl
+++ b/src/ss7_routes.erl
@@ -1,6 +1,6 @@
 % Internal SS7 route database keeping
 
-% (C) 2011 by Harald Welte <laforge@gnumonks.org>
+% (C) 2011-2013 by Harald Welte <laforge@gnumonks.org>
 %
 % All Rights Reserved
 %
@@ -54,9 +54,10 @@
 -export([start_link/0]).
 
 % client functions, may internally talk to our sccp_user server
--export([create_route/3, delete_route/3]).
+-export([create_route/3, delete_route/3, flush_routes/0]).
 -export([dump/0]).
 -export([route_dpc/1]).
+-export([reload_config/0]).
 
 -record(ss7route, {
 	remote_pc_mask,		% {remote_pc, remote_pc_mask}
@@ -91,6 +92,9 @@
 	RemotePc = osmo_util:pointcode2int(RemotePcIn),
 	gen_server:call(?MODULE, {delete_route, {RemotePc, RemoteMask, LinksetName}}).
 
+flush_routes() ->
+	gen_server:call(?MODULE, flush_routes).
+
 % the lookup functions can directly use the ets named_table from within
 % the client process, no need to go through a synchronous IPC
 
@@ -138,6 +142,11 @@
 		{reply, ok, S}
 	end;
 
+handle_call(flush_routes, {_FromPid, _FromRef}, S) ->
+	#sr_state{route_tbl = Tbl} = S,
+	ets:delete_all_objects(Tbl),
+	{reply, ok, S};
+
 handle_call({delete_route, {RemotePc, RemoteMask, _Name}},
 				{_FromPid, _FromRef}, S) ->
 	#sr_state{route_tbl = Tbl} = S,
@@ -154,5 +163,17 @@
 	io:format("terminating ~p with reason ~p", [?MODULE, Reason]),
 	ok.
 
+
 code_change(_OldVsn, State, _Extra) ->
 	{ok, State}.
+
+reconfig_route({Dpc, Mask, Dest}) ->
+	case create_route(Dpc, Mask, Dest) of
+		ok -> true;
+		_ -> false
+	end.
+
+reload_config() ->
+	flush_routes(),
+	Routes = osmo_util:get_env(osmo_ss7, routes, []),
+	lists:all(fun reconfig_route/1, Routes).