~rdoering/ubuntu/karmic/erlang/fix-535090

« back to all changes in this revision

Viewing changes to lib/megaco/src/tcp/megaco_tcp.erl

  • Committer: Bazaar Package Importer
  • Author(s): Sergei Golovan
  • Date: 2009-02-15 16:42:52 UTC
  • mfrom: (3.1.2 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090215164252-q5x4rcf8a5pbesb1
Tags: 1:12.b.5-dfsg-2
Upload to unstable after lenny is released.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
%%-----------------------------------------------------------------
46
46
-export([
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}).
86
87
 
 
88
 
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().
124
126
 
 
127
 
 
128
%%-----------------------------------------------------------------
 
129
%% Func: stop_transport/1, 2
 
130
%% Description: Stop the TPKT transport service
 
131
%%-----------------------------------------------------------------
 
132
stop_transport(Pid) ->
 
133
    (catch unlink(Pid)), 
 
134
    stop_transport(Pid, shutdown).
 
135
 
 
136
stop_transport(Pid, Reason) ->
 
137
    ?d1("stop_transport -> entry with"
 
138
        "~n   Pid:    ~p"
 
139
        "~n   Reason: ~p", [Pid, Reason]),
 
140
    exit(Pid, Reason).
 
141
 
 
142
 
125
143
%%-----------------------------------------------------------------
126
144
%% Func: listen/2
127
145
%% Description: Starts new TPKT listener sockets
140
158
            {error, no_tcp_server}
141
159
    end.            
142
160
 
 
161
 
143
162
%%-----------------------------------------------------------------
144
163
%% Func: connect
145
164
%% Description: Function is used when opening an TCP socket 
151
170
        "~n   Parameters: ~p", [SupPid, Parameters]),
152
171
    Mand = [host, port, receive_handle],
153
172
    case parse_options(Parameters, #megaco_tcp{}, Mand) of
154
 
        {ok, TcpRec} ->
 
173
        {ok, Rec} ->
 
174
 
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]),
 
177
 
 
178
            #megaco_tcp{host    = Host,
 
179
                        port    = Port,
 
180
                        options = Options} = Rec,
 
181
            
 
182
            IpOpt = [binary, {packet, tpkt}, {active, once} | Options], 
159
183
 
160
184
            %%------------------------------------------------------
161
185
            %% Connect the other side
162
 
            case catch gen_tcp:connect(TcpRec#megaco_tcp.host, 
163
 
                                       TcpRec#megaco_tcp.port, 
164
 
                                       IpOpt) of
 
186
            case (catch gen_tcp:connect(Host, Port, IpOpt)) of
165
187
                {ok, Socket} ->
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
172
194
                        {ok, Pid} ->
173
195
                            ?d1("connect -> connection started: "
180
202
                                "~n   Reason: ~p", [Reason]),
181
203
                            {error, Reason}
182
204
                    end;
 
205
 
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]),
188
211
                    Error;
 
212
 
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]),
194
218
                    Error
 
219
 
195
220
            end;
 
221
 
196
222
        {error, _Reason} = Error ->
197
223
            ?d1("connect -> failed parsing options: "
198
224
                "~n   Error: ~p", [Error]),
201
227
            Error
202
228
    end.
203
229
 
 
230
 
204
231
%%-----------------------------------------------------------------
205
232
%% Func: send_message
206
233
%% Description: Function is used for sending data on the TCP socket
208
235
send_message(Socket, Data) ->
209
236
    ?d1("send_message -> entry with"
210
237
        "~n   Socket:     ~p"
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),
214
241
    case Res of
220
247
    end,
221
248
    Res.
222
249
            
 
250
-ifdef(megaco_debug).
 
251
sz(Bin) when is_binary(Bin) ->
 
252
    size(Bin);
 
253
sz(List) when is_list(List) ->
 
254
    length(List).
 
255
-endif.
223
256
 
224
257
 
225
258
%%-----------------------------------------------------------------
231
264
    ?tcp_debug({socket, Socket}, "tcp block", []),
232
265
    inet:setopts(Socket, [{active, false}]).
233
266
 
 
267
 
234
268
%%-----------------------------------------------------------------
235
269
%% Func: unblock
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}]).
242
276
 
 
277
 
243
278
%%-----------------------------------------------------------------
244
279
%% Func: close
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).
250
285
 
 
286
 
251
287
%%-----------------------------------------------------------------
252
288
%% Func: socket
253
289
%% Description: Returns the inet socket
270
306
start_link(Args) ->
271
307
    gen_server:start_link(?MODULE, Args, []).
272
308
 
 
309
 
273
310
%%-----------------------------------------------------------------
274
311
%% Func: start_connection
275
312
%% Description: Function is used for starting up a connection
280
317
        "~n   SupPid: ~p" 
281
318
        "~n   Socket: ~p", [SupPid, Socket]),
282
319
    
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
 
321
        {ok, ConnSupPid} ->
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
290
326
                {ok, Pid} ->
291
327
                    ?d1("start_connection -> started: "
292
328
                        "~n   Pid: ~p", [Pid]),
300
336
                    ?tcp_debug(TcpRec, "tcp connect failed", [Error]),
301
337
                    Error
302
338
            end;
303
 
        false ->
 
339
        {error, _Reason} ->
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]),
307
343
            Error
308
344
    end.
309
345
 
 
346
connection_sup(Pid) ->
 
347
    megaco_tcp_sup:which_connection_sup(Pid).
 
348
 
 
349
create_connection(Pid, Rec) ->
 
350
    megaco_tcp_connection_sup:start_child(Pid, Rec).
 
351
 
310
352
create_snmp_counters(Socket) ->
311
353
    Counters = [medGwyGatewayNumInMessages, 
312
354
                medGwyGatewayNumInOctets, 
536
578
        "~n   SupPid: ~p"
537
579
        "~n   TcpRec: ~p"
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
545
586
                {ok, Pid} ->
546
587
                    ?d1("start_accept -> accept process started"
547
588
                        "~n   Pid: ~p", [Pid]),
557
598
            {error, {no_tcp_accept_sup, Reason}}
558
599
    end.
559
600
 
 
601
accept_sup(Pid) ->
 
602
    megaco_tcp_sup:which_accept_sup(Pid).
 
603
 
 
604
create_acceptor(Pid, Rec, TopSup, Listen) ->
 
605
    megaco_tcp_accept_sup:start_child(Pid, Rec, TopSup, Listen).
 
606
 
 
607
 
560
608
%%-----------------------------------------------------------------
561
609
%% Func: add_tpkt_header
562
610
%% Description: Function is used to add the TPKT header
611
659
 
612
660
 
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}} ->
623
 
            {ok, Pid};
624
 
        false ->
625
 
            {error, no_such_process}
626
 
    end.
627
 
 
628
 
 
629
 
%%-----------------------------------------------------------------
630
662
%% Func: incNumOutMessages/1, incNumOutOctets/2, incNumErrors/1
631
663
%% Description: SNMP counter increment functions
632
664
%%