45
45
%%-----------------------------------------------------------------
47
47
start_transport/0, %% Start TPKT transport service
48
stop_transport/1, %% Stop TPKT transport service
48
49
listen/2, %% Starts a new listener socket
49
50
connect/2, %% Used on client side to connect server
50
51
socket/1, %% Returns the inet socket
84
85
%%-----------------------------------------------------------------
85
86
-record(state, {supervisor_pid, linkdb}).
87
89
%%-----------------------------------------------------------------
88
90
%% External interface functions
89
91
%%-----------------------------------------------------------------
122
124
(catch megaco_stats:init(megaco_tcp_stats)),
123
125
megaco_tcp_sup:start_link().
128
%%-----------------------------------------------------------------
129
%% Func: stop_transport/1, 2
130
%% Description: Stop the TPKT transport service
131
%%-----------------------------------------------------------------
132
stop_transport(Pid) ->
134
stop_transport(Pid, shutdown).
136
stop_transport(Pid, Reason) ->
137
?d1("stop_transport -> entry with"
139
"~n Reason: ~p", [Pid, Reason]),
125
143
%%-----------------------------------------------------------------
126
144
%% Func: listen/2
127
145
%% Description: Starts new TPKT listener sockets
151
170
"~n Parameters: ~p", [SupPid, Parameters]),
152
171
Mand = [host, port, receive_handle],
153
172
case parse_options(Parameters, #megaco_tcp{}, Mand) of
155
175
?d1("connect -> options parsed: "
156
"~n TcpRec: ~p", [TcpRec]),
157
IpOpt = [binary, {packet, tpkt}, {active, once} |
158
TcpRec#megaco_tcp.options],
176
"~n Rec: ~p", [Rec]),
178
#megaco_tcp{host = Host,
180
options = Options} = Rec,
182
IpOpt = [binary, {packet, tpkt}, {active, once} | Options],
160
184
%%------------------------------------------------------
161
185
%% Connect the other side
162
case catch gen_tcp:connect(TcpRec#megaco_tcp.host,
163
TcpRec#megaco_tcp.port,
186
case (catch gen_tcp:connect(Host, Port, IpOpt)) of
166
188
?d1("connect -> connected: "
167
189
"~n Socket: ~p", [Socket]),
168
190
%%----------------------------------------------
169
191
%% Socket up start a new control process
170
Rec2 = TcpRec#megaco_tcp{socket = Socket},
192
Rec2 = Rec#megaco_tcp{socket = Socket},
171
193
case start_connection(SupPid, Rec2) of
173
195
?d1("connect -> connection started: "
180
202
"~n Reason: ~p", [Reason]),
183
206
{error, Reason} ->
184
207
?d1("connect -> failed connecting: "
185
208
"~n Reason: ~p", [Reason]),
186
209
Error = {error, {gen_tcp_connect, Reason}},
187
?tcp_debug(TcpRec, "tcp connect failed", [Error]),
210
?tcp_debug(Rec, "tcp connect failed", [Error]),
189
213
{'EXIT', _Reason} = Exit ->
190
214
?d1("connect -> connect exited: "
191
215
"~n Exit: ~p", [Exit]),
192
216
Error = {error, {gen_tcp_connect, Exit}},
193
?tcp_debug(TcpRec, "tcp connect failed", [Error]),
217
?tcp_debug(Rec, "tcp connect failed", [Error]),
196
222
{error, _Reason} = Error ->
197
223
?d1("connect -> failed parsing options: "
198
224
"~n Error: ~p", [Error]),
208
235
send_message(Socket, Data) ->
209
236
?d1("send_message -> entry with"
211
"~n size(Data): ~p", [Socket, size(Data)]),
238
"~n size(Data): ~p", [Socket, sz(Data)]),
212
239
{Size, NewData} = add_tpkt_header(Data),
213
240
Res = gen_tcp:send(Socket, NewData),
231
264
?tcp_debug({socket, Socket}, "tcp block", []),
232
265
inet:setopts(Socket, [{active, false}]).
234
268
%%-----------------------------------------------------------------
236
270
%% Description: Function is used for blocking incomming messages
240
274
?tcp_debug({socket, Socket}, "tcp unblock", []),
241
275
inet:setopts(Socket, [{active, once}]).
243
278
%%-----------------------------------------------------------------
245
280
%% Description: Function is used for closing the TCP socket
248
283
?tcp_debug({socket, Socket}, "tcp close", []),
249
284
gen_tcp:close(Socket).
251
287
%%-----------------------------------------------------------------
253
289
%% Description: Returns the inet socket
270
306
start_link(Args) ->
271
307
gen_server:start_link(?MODULE, Args, []).
273
310
%%-----------------------------------------------------------------
274
311
%% Func: start_connection
275
312
%% Description: Function is used for starting up a connection
281
318
"~n Socket: ~p", [SupPid, Socket]),
283
ProcList = supervisor:which_children(SupPid),
284
case lists:keysearch(megaco_tcp_connection_sup, 1, ProcList) of
285
{value, {_Name, ConnSupPid, _Type, _Modules}} ->
320
case connection_sup(SupPid) of
286
322
?d1("start_connection -> found connection supervisor: "
287
323
"~n ConnSupPid: ~p", [ConnSupPid]),
288
324
?tcp_debug(TcpRec, "tcp connect", []),
289
case megaco_tcp_connection_sup:start_child(ConnSupPid, TcpRec) of
325
case create_connection(ConnSupPid, TcpRec) of
291
327
?d1("start_connection -> started: "
292
328
"~n Pid: ~p", [Pid]),
300
336
?tcp_debug(TcpRec, "tcp connect failed", [Error]),
304
340
?d2("start_connection -> could not find connection supervisor"),
305
341
Error = {error, no_connection_supervisor},
306
342
?tcp_debug(TcpRec, "tcp connect failed", [Error]),
346
connection_sup(Pid) ->
347
megaco_tcp_sup:which_connection_sup(Pid).
349
create_connection(Pid, Rec) ->
350
megaco_tcp_connection_sup:start_child(Pid, Rec).
310
352
create_snmp_counters(Socket) ->
311
353
Counters = [medGwyGatewayNumInMessages,
312
354
medGwyGatewayNumInOctets,
538
580
"~n Reason: ~p", [SupPid, TcpRec, Listen]),
539
case get_pid_from_supervisor(SupPid, megaco_tcp_accept_sup) of
581
case accept_sup(SupPid) of
540
582
{ok, AcceptSupPid} ->
541
583
?d1("start_accept -> found accept supervisor"
542
584
"~n AcceptSupPid: ~p", [AcceptSupPid]),
543
case supervisor:start_child(AcceptSupPid,
544
[{TcpRec, SupPid, Listen}]) of
585
case create_acceptor(AcceptSupPid, TcpRec, SupPid, Listen) of
546
587
?d1("start_accept -> accept process started"
547
588
"~n Pid: ~p", [Pid]),
557
598
{error, {no_tcp_accept_sup, Reason}}
602
megaco_tcp_sup:which_accept_sup(Pid).
604
create_acceptor(Pid, Rec, TopSup, Listen) ->
605
megaco_tcp_accept_sup:start_child(Pid, Rec, TopSup, Listen).
560
608
%%-----------------------------------------------------------------
561
609
%% Func: add_tpkt_header
562
610
%% Description: Function is used to add the TPKT header
613
661
%%-----------------------------------------------------------------
614
%% Func: get_pid_from_supervisor
615
%% Description: Function that get a pid form a supervisor
616
%% with the help of the name.
617
%%-----------------------------------------------------------------
618
get_pid_from_supervisor(SupPid, ProcName) ->
619
ProcList = supervisor:which_children(SupPid),
620
%% ProcList of type [{Name, Pid, Type, Modules}| Rest]
621
case lists:keysearch(ProcName, 1, ProcList) of
622
{value, {_Name, Pid, _Type, _Modules}} ->
625
{error, no_such_process}
629
%%-----------------------------------------------------------------
630
662
%% Func: incNumOutMessages/1, incNumOutOctets/2, incNumErrors/1
631
663
%% Description: SNMP counter increment functions