ss7_links: add type annotations
diff --git a/src/ss7_links.erl b/src/ss7_links.erl
index 499b918..0c13358 100644
--- a/src/ss7_links.erl
+++ b/src/ss7_links.erl
@@ -40,34 +40,39 @@
 	 get_linkset_for_dpc/1, get_opc_for_linkset/1, is_pc_local/1,
 	 get_user_pid_for_service/1, mtp3_rx/1, dump/0]).
 
+-type link_state() :: down | up_inactive | active.
+-opaque tid()      :: integer().
+-type error()	   :: { error, term() }.
+-type osmo_point_code() :: non_neg_integer().
+
 -record(slink, {
 	key,		% {linkset_name, sls}
 	name,		% name of the link
 	linkset_name,	% name of the linkset to which we belong
 	sls,
-	user_pid,	% Pid handling MTP-TRANSFER primitives
-	state		% (down | up | active)
+	user_pid :: pid(), % Pid handling MTP-TRANSFER primitives
+	state :: link_state()
 }).
 
 -record(slinkset, {
-	name,		% name of the linkset
-	local_pc,	% local point code
-	remote_pc,	% remote point code
-	user_pid,
-	state,		% (down | up_inactive | active)
-	active_sls	% list of Sls of currently active links
+	name :: string(),		% name of the linkset
+	local_pc :: non_neg_integer(),	% local point code
+	remote_pc :: non_neg_integer(),	% remote point code
+	user_pid :: pid(),
+	state :: link_state(),
+	active_sls :: list()	% list of Sls of currently active links
 }).
 
 -record(service, {
-	name,
-	service_nr,
-	user_pid
+	name :: string(),
+	service_nr :: non_neg_integer(),
+	user_pid :: pid()
 }).
 
 -record(su_state, {
-	linkset_tbl,
-	link_tbl,
-	service_tbl
+	linkset_tbl :: tid(),
+	link_tbl :: tid(),
+	service_tbl :: tid()
 }).
 
 
@@ -95,25 +100,45 @@
 % all write operations go through gen_server:call(), as only the ?MODULE
 % process has permission to modify the table content
 
+-spec register_linkset(non_neg_integer(), non_neg_integer(), string())
+						-> ok | error().
+
 register_linkset(LocalPc, RemotePc, Name) ->
 	gen_server:call(?MODULE, {register_linkset, {LocalPc, RemotePc, Name}}).
 
+-spec unregister_linkset(string()) -> ok | error().
+
 unregister_linkset(Name) ->
 	gen_server:call(?MODULE, {unregister_linkset, {Name}}).
 
+-spec register_link(string(), non_neg_integer(), string()) ->
+					ok | error().
+
 register_link(LinksetName, Sls, Name) ->
 	gen_server:call(?MODULE, {register_link, {LinksetName, Sls, Name}}).
 
+-spec unregister_link(string(), non_neg_integer()) ->
+					ok | error().
+
 unregister_link(LinksetName, Sls) ->
 	gen_server:call(?MODULE, {unregister_link, {LinksetName, Sls}}).
 
+-spec set_link_state(string(), non_neg_integer(), link_state()) ->
+					ok | error().
+
 set_link_state(LinksetName, Sls, State) ->
 	gen_server:call(?MODULE, {set_link_state, {LinksetName, Sls, State}}).
 
+-spec bind_service(non_neg_integer(), string()) ->
+					ok | error().
+
 % bind a service (such as ISUP, SCCP) to the MTP3 link manager
 bind_service(ServiceNum, ServiceName) ->
 	gen_server:call(?MODULE, {bind_service, {ServiceNum, ServiceName}}).
 
+-spec unbind_service(non_neg_integer()) ->
+					ok | error().
+
 % unbind a service (such as ISUP, SCCP) from the MTP3 link manager
 unbind_service(ServiceNum) ->
 	gen_server:call(?MODULE, {unbind_service, {ServiceNum}}).
@@ -121,6 +146,9 @@
 % the lookup functions can directly use the ets named_table from within
 % the client process, no need to go through a synchronous IPC
 
+-spec get_user_pid_for_service(non_neg_integer()) ->
+	{ok, pid()} | error().
+
 get_user_pid_for_service(Service) when is_integer(Service) ->
 	case ets:lookup(mtp3_services, Service) of
 	    [#service{user_pid=Pid}] ->
@@ -129,6 +157,9 @@
 		{error, no_such_service}
 	end.
 
+-spec get_pid_for_link(string(), non_neg_integer()) ->
+	{ok, pid()} | error().
+
 get_pid_for_link(LinksetName, Sls) when is_list(LinksetName), is_integer(Sls) ->
 	case ets:lookup(ss7_link_table, {LinksetName, Sls}) of
 	    [#slink{user_pid = Pid}] ->	
@@ -138,6 +169,9 @@
 		{error, no_such_link}
 	end.
 
+-spec get_linkset_for_dpc(osmo_point_code()) ->
+	{ok, string()} | error().
+
 % Resolve linkset name directly connected to given point code
 get_linkset_for_dpc(DpcIn) ->
 	Dpc = osmo_util:pointcode2int(DpcIn),
@@ -150,6 +184,9 @@
 		{ok, Name}
 	end.
 
+-spec get_pid_for_dpc_sls(osmo_point_code(), non_neg_integer()) ->
+	{ok, string()} | error().
+
 % resolve link-handler Pid for given (directly connected) point code/sls
 get_pid_for_dpc_sls(DpcIn, Sls) when is_integer(Sls) ->
 	Dpc = osmo_util:pointcode2int(DpcIn),
@@ -160,6 +197,8 @@
 		get_pid_for_link(LinksetName, Sls)
 	end.
 
+-spec get_opc_for_linkset(string()) -> non_neg_integer() | undefined.
+
 % the the local point code for a given linkset
 get_opc_for_linkset(LsName) when is_list(LsName) ->
 	case ets:lookup(ss7_linksets, LsName) of