224
224
update_user_info(UserMid, Item, Val) ->
225
225
call({update_user_info, UserMid, Item, Val}).
228
when is_record(CH, megaco_conn_handle) andalso (Item /= cancel) ->
233
CH#megaco_conn_handle.local_mid;
235
CH#megaco_conn_handle.local_mid;
237
CH#megaco_conn_handle.remote_mid;
239
case lookup_local_conn(CH) of
241
exit({no_such_connection, CH});
246
case lookup_local_conn(CH) of
248
exit({no_such_connection, CH});
250
conn_info(ConnData, Item)
253
conn_info(#conn_data{conn_handle = CH}, cancel) ->
254
%% To minimise raise-condition propabillity,
255
%% we always look in the table instead of
256
%% in the record for this one
257
ets:lookup_element(megaco_local_conn, CH, #conn_data.cancel);
259
conn_info(CD, Item) when is_record(CD, conn_data) ->
262
Tags0 = record_info(fields, conn_data),
263
Tags1 = replace(serial, trans_id, Tags0),
264
Tags = [mid, local_mid, remote_mid] ++
265
replace(max_serial, max_trans_id, Tags1),
266
[{Tag, conn_info(CD,Tag)} || Tag <- Tags,
271
conn_handle -> CD#conn_data.conn_handle;
272
mid -> (CD#conn_data.conn_handle)#megaco_conn_handle.local_mid;
273
local_mid -> (CD#conn_data.conn_handle)#megaco_conn_handle.local_mid;
274
remote_mid -> (CD#conn_data.conn_handle)#megaco_conn_handle.remote_mid;
275
trans_id -> CH = CD#conn_data.conn_handle,
276
LocalMid = CH#megaco_conn_handle.local_mid,
277
Item2 = {LocalMid, trans_id_counter},
278
case (catch ets:lookup(megaco_config, Item2)) of
282
user_info(LocalMid, min_trans_id);
284
Max = CD#conn_data.max_serial,
286
((Max =:= infinity) andalso
287
is_integer(Serial) andalso
288
(Serial < 4294967295)) ->
290
(Max =:= infinity) andalso
291
is_integer(Serial) andalso
292
(Serial =:= 4294967295) ->
300
Serial =:= 4294967295 ->
307
max_trans_id -> CD#conn_data.max_serial;
308
request_timer -> CD#conn_data.request_timer;
309
long_request_timer -> CD#conn_data.long_request_timer;
311
auto_ack -> CD#conn_data.auto_ack;
313
trans_ack -> CD#conn_data.trans_ack;
314
trans_ack_maxcount -> CD#conn_data.trans_ack_maxcount;
316
trans_req -> CD#conn_data.trans_req;
317
trans_req_maxcount -> CD#conn_data.trans_req_maxcount;
318
trans_req_maxsize -> CD#conn_data.trans_req_maxsize;
320
trans_timer -> CD#conn_data.trans_timer;
322
pending_timer -> CD#conn_data.pending_timer;
323
orig_pending_limit -> CD#conn_data.sent_pending_limit;
324
sent_pending_limit -> CD#conn_data.sent_pending_limit;
325
recv_pending_limit -> CD#conn_data.recv_pending_limit;
326
reply_timer -> CD#conn_data.reply_timer;
327
control_pid -> CD#conn_data.control_pid;
328
monitor_ref -> CD#conn_data.monitor_ref;
329
send_mod -> CD#conn_data.send_mod;
330
send_handle -> CD#conn_data.send_handle;
331
encoding_mod -> CD#conn_data.encoding_mod;
332
encoding_config -> CD#conn_data.encoding_config;
333
protocol_version -> CD#conn_data.protocol_version;
334
auth_data -> CD#conn_data.auth_data;
335
user_mod -> CD#conn_data.user_mod;
336
user_args -> CD#conn_data.user_args;
337
reply_action -> CD#conn_data.reply_action;
338
reply_data -> CD#conn_data.reply_data;
339
threaded -> CD#conn_data.threaded;
340
strict_version -> CD#conn_data.strict_version;
341
long_request_resend -> CD#conn_data.long_request_resend;
342
call_proxy_gc_timeout -> CD#conn_data.call_proxy_gc_timeout;
343
cancel -> CD#conn_data.cancel;
344
resend_indication -> CD#conn_data.resend_indication;
345
segment_reply_ind -> CD#conn_data.segment_reply_ind;
346
segment_recv_acc -> CD#conn_data.segment_recv_acc;
347
segment_recv_timer -> CD#conn_data.segment_recv_timer;
348
segment_send -> CD#conn_data.segment_send;
349
segment_send_timer -> CD#conn_data.segment_send_timer;
350
max_pdu_size -> CD#conn_data.max_pdu_size;
351
request_keep_alive_timeout -> CD#conn_data.request_keep_alive_timeout;
353
LocalMid = (CD#conn_data.conn_handle)#megaco_conn_handle.local_mid,
354
#megaco_receive_handle{local_mid = LocalMid,
355
encoding_mod = CD#conn_data.encoding_mod,
356
encoding_config = CD#conn_data.encoding_config,
357
send_mod = CD#conn_data.send_mod};
359
exit({no_such_item, Item})
361
conn_info(BadHandle, _Item) ->
362
{error, {no_such_connection, BadHandle}}.
366
replace(Item, WithItem, [Item|List]) ->
368
replace(Item, WithItem, [OtherItem|List]) ->
369
[OtherItem | replace(Item, WithItem, List)].
228
conn_info(Data, Item) ->
229
%% The purpose of this is a compiler optimization...
230
%% Args are processed from left to right.
231
do_conn_info(Item, Data).
233
do_conn_info(mid = _Item, #megaco_conn_handle{local_mid = Mid}) ->
235
do_conn_info(local_mid = _Item, #megaco_conn_handle{local_mid = LMid}) ->
237
do_conn_info(remote_mid = _Item, #megaco_conn_handle{remote_mid = RMid}) ->
239
do_conn_info(conn_handle = _Item, CH) when is_record(CH, megaco_conn_handle) ->
241
do_conn_info(conn_data = _Item, CH) when is_record(CH, megaco_conn_handle) ->
242
case lookup_local_conn(CH) of
244
exit({no_such_connection, CH});
248
do_conn_info(Item, CH) when is_record(CH, megaco_conn_handle) ->
249
case lookup_local_conn(CH) of
251
exit({no_such_connection, CH});
253
do_conn_info(Item, ConnData)
256
do_conn_info(cancel = _Item, #conn_data{conn_handle = CH}) ->
257
%% To minimise raise-condition propabillity,
258
%% we always look in the table instead of
259
%% in the record for this one
260
ets:lookup_element(megaco_local_conn, CH, #conn_data.cancel);
261
do_conn_info(cancel = _Item, CH) when is_record(CH, megaco_conn_handle) ->
262
%% To minimise raise-condition propabillity,
263
%% we always look in the table instead of
264
%% in the record for this one
265
ets:lookup_element(megaco_local_conn, CH, #conn_data.cancel);
267
do_conn_info(all = _Item,
268
#conn_data{conn_handle = CH,
270
max_serial = MaxTransId,
271
request_timer = ReqTmr,
272
long_request_timer = LongReqTmr,
274
trans_ack = TransAck,
275
trans_ack_maxcount = TransAckMaxCount,
276
trans_req = TransReq,
277
trans_req_maxcount = TransReqMaxCount,
278
trans_req_maxsize = TransReqMaxSz,
279
trans_timer = TransTmr,
281
pending_timer = PendingTmr,
282
sent_pending_limit = SentPendingLimit,
283
recv_pending_limit = RecvPendingLimit,
284
reply_timer = ReplyTmr,
285
control_pid = CtrlPid,
286
monitor_ref = MonRef,
288
send_handle = SendHandle,
289
encoding_mod = EncodingMod,
290
encoding_config = EncodingConf,
291
protocol_version = ProtoVersion,
292
auth_data = AuthData,
294
user_args = UserArgs,
295
reply_action = ReplyAction,
296
reply_data = ReplyData,
298
strict_version = StrictVersion,
299
long_request_resend = LongReqResend,
300
call_proxy_gc_timeout = CallProxyGCTimeout,
302
resend_indication = ResendInd,
303
segment_reply_ind = SegReplyInd,
304
segment_recv_acc = SegRecvAcc,
305
segment_recv_timer = SegRecvTmr,
306
segment_send = SegSend,
307
segment_send_timer = SegSendTmr,
308
max_pdu_size = MaxPduSz,
309
request_keep_alive_timeout = RequestKeepAliveTmr}) ->
312
{max_trans_id, MaxTransId},
313
{request_timer, ReqTmr},
314
{long_request_timer, LongReqTmr},
315
{mid, CH#megaco_conn_handle.local_mid},
316
{local_mid, CH#megaco_conn_handle.local_mid},
317
{remote_mid, CH#megaco_conn_handle.remote_mid},
319
{trans_ack, TransAck},
320
{trans_ack_maxcount, TransAckMaxCount},
321
{trans_req, TransReq},
322
{trans_req_maxcount, TransReqMaxCount},
323
{trans_req_maxsize, TransReqMaxSz},
324
{trans_timer, TransTmr},
325
{pending_timer, PendingTmr},
326
{sent_pending_limit, SentPendingLimit},
327
{recv_pending_limit, RecvPendingLimit},
328
{reply_timer, ReplyTmr},
329
{control_pid, CtrlPid},
330
{monitor_ref, MonRef},
332
{send_handle, SendHandle},
333
{encoding_mod, EncodingMod},
334
{encoding_config, EncodingConf},
335
{protocol_version, ProtoVersion},
336
{auth_data, AuthData},
338
{user_args, UserArgs},
339
{reply_action, ReplyAction},
340
{reply_data, ReplyData},
341
{threaded, Threaded},
342
{strict_version, StrictVersion},
343
{long_request_resend, LongReqResend},
344
{call_proxy_gc_timeout, CallProxyGCTimeout},
345
{resend_indication, ResendInd},
346
{segment_reply_ind, SegReplyInd},
347
{segment_recv_acc, SegRecvAcc},
348
{segment_recv_timer, SegRecvTmr},
349
{segment_send, SegSend},
350
{segment_send_timer, SegSendTmr},
351
{max_pdu_size, MaxPduSz},
352
{request_keep_alive_timeout, RequestKeepAliveTmr}];
354
do_conn_info(conn_data = _Item, CD) ->
356
do_conn_info(conn_handle = _Item, #conn_data{conn_handle = Val}) ->
358
do_conn_info(mid = _Item,
359
#conn_data{conn_handle = #megaco_conn_handle{local_mid = Val}}) ->
361
do_conn_info(local_mid = _Item,
362
#conn_data{conn_handle = #megaco_conn_handle{local_mid = Val}}) ->
364
do_conn_info(remote_mid = _Item,
365
#conn_data{conn_handle = #megaco_conn_handle{remote_mid = Val}}) ->
367
do_conn_info(trans_id = _Item,
368
#conn_data{conn_handle = #megaco_conn_handle{local_mid = LMid},
369
max_serial = Max}) ->
370
Item2 = {LMid, trans_id_counter},
371
case (catch ets:lookup(megaco_config, Item2)) of
375
user_info(LMid, min_trans_id);
378
((Max =:= infinity) andalso
379
is_integer(Serial) andalso
380
(Serial < 4294967295)) ->
382
((Max =:= infinity) andalso
383
is_integer(Serial) andalso
384
(Serial =:= 4294967295)) ->
385
user_info(LMid, min_trans_id);
389
user_info(LMid, min_trans_id);
390
Serial =:= 4294967295 ->
391
user_info(LMid, min_trans_id);
396
do_conn_info(max_trans_id = _Item, #conn_data{max_serial = Val}) ->
398
do_conn_info(request_timer = _Item, #conn_data{request_timer = Val}) ->
400
do_conn_info(long_request_timer = _Item, #conn_data{long_request_timer = Val}) ->
402
do_conn_info(auto_ack = _Item, #conn_data{auto_ack = Val}) ->
404
do_conn_info(trans_ack = _Item, #conn_data{trans_ack = Val}) ->
406
do_conn_info(trans_ack_maxcount = _Item, #conn_data{trans_ack_maxcount = Val}) ->
408
do_conn_info(trans_req = _Item, #conn_data{trans_req = Val}) ->
410
do_conn_info(trans_req_maxcount = _Item, #conn_data{trans_req_maxcount = Val}) ->
412
do_conn_info(trans_req_maxsize = _Item, #conn_data{trans_req_maxsize = Val}) ->
414
do_conn_info(trans_timer = _Item, #conn_data{trans_timer = Val}) ->
416
do_conn_info(pending_timer = _Item, #conn_data{pending_timer = Val}) ->
418
do_conn_info(orig_pending_limit = _Item, #conn_data{sent_pending_limit = Val}) ->
420
do_conn_info(sent_pending_limit = _Item, #conn_data{sent_pending_limit = Val}) ->
422
do_conn_info(recv_pending_limit = _Item, #conn_data{recv_pending_limit = Val}) ->
424
do_conn_info(reply_timer = _Item, #conn_data{reply_timer = Val}) ->
426
do_conn_info(control_pid = _Item, #conn_data{control_pid = Val}) ->
428
do_conn_info(send_mod = _Item, #conn_data{send_mod = Val}) ->
430
do_conn_info(send_handle = _Item, #conn_data{send_handle = Val}) ->
432
do_conn_info(encoding_mod = _Item, #conn_data{encoding_mod = Val}) ->
434
do_conn_info(encoding_config = _Item, #conn_data{encoding_config = Val}) ->
436
do_conn_info(protocol_version = _Item, #conn_data{protocol_version = Val}) ->
438
do_conn_info(auth_data = _Item, #conn_data{auth_data = Val}) ->
440
do_conn_info(user_mod = _Item, #conn_data{user_mod = Val}) ->
442
do_conn_info(user_args = _Item, #conn_data{user_args = Val}) ->
444
do_conn_info(reply_action = _Item, #conn_data{reply_action = Val}) ->
446
do_conn_info(reply_data = _Item, #conn_data{reply_data = Val}) ->
448
do_conn_info(threaded = _Item, #conn_data{threaded = Val}) ->
450
do_conn_info(strict_version = _Item, #conn_data{strict_version = Val}) ->
452
do_conn_info(long_request_resend = _Item,
453
#conn_data{long_request_resend = Val}) ->
455
do_conn_info(call_proxy_gc_timeout = _Item,
456
#conn_data{call_proxy_gc_timeout = Val}) ->
458
do_conn_info(resend_indication = _Item, #conn_data{resend_indication = Val}) ->
460
do_conn_info(segment_reply_ind = _Item, #conn_data{segment_reply_ind = Val}) ->
462
do_conn_info(segment_recv_acc = _Item, #conn_data{segment_recv_acc = Val}) ->
464
do_conn_info(segment_recv_timer = _Item,
465
#conn_data{segment_recv_timer = Val}) ->
467
do_conn_info(segment_send = _Item, #conn_data{segment_send = Val}) ->
469
do_conn_info(segment_send_timer = _Item,
470
#conn_data{segment_send_timer = Val}) ->
472
do_conn_info(max_pdu_size = _Item, #conn_data{max_pdu_size = Val}) ->
474
do_conn_info(request_keep_alive_timeout = _Item,
475
#conn_data{request_keep_alive_timeout = Val}) ->
477
do_conn_info(receive_handle = _Item,
478
#conn_data{conn_handle = #megaco_conn_handle{local_mid = LMid},
480
encoding_config = EC,
482
#megaco_receive_handle{local_mid = LMid,
484
encoding_config = EC,
486
do_conn_info(Item, Data)
487
when is_record(Data, conn_data) orelse is_record(Data, megaco_conn_handle) ->
488
exit({no_such_item, Item});
489
do_conn_info(_Item, BadData) ->
490
{error, {no_such_connection, BadData}}.
493
%% replace(_, _, []) ->
495
%% replace(Item, WithItem, [Item|List]) ->
497
%% replace(Item, WithItem, [OtherItem|List]) ->
498
%% [OtherItem | replace(Item, WithItem, List)].
372
501
update_conn_info(#conn_data{conn_handle = CH}, Item, Val) ->
1413
1539
send_handle -> true;
1414
1540
encoding_mod when is_atom(Val) -> true;
1415
1541
encoding_config when is_list(Val) -> true;
1416
protocol_version -> verify_strict_uint(Val);
1543
megaco_config_misc:verify_strict_uint(Val);
1417
1544
auth_data -> true;
1418
1545
user_mod when is_atom(Val) -> true;
1419
1546
user_args when is_list(Val) -> true;
1420
1547
reply_data -> true;
1421
threaded -> verify_bool(Val);
1422
strict_version -> verify_bool(Val);
1423
long_request_resend -> verify_bool(Val);
1424
call_proxy_gc_timeout -> verify_strict_uint(Val);
1425
cancel -> verify_bool(Val);
1549
megaco_config_misc:verify_bool(Val);
1551
megaco_config_misc:verify_bool(Val);
1552
long_request_resend ->
1553
megaco_config_misc:verify_bool(Val);
1554
call_proxy_gc_timeout ->
1555
megaco_config_misc:verify_strict_uint(Val);
1557
megaco_config_misc:verify_bool(Val);
1426
1558
resend_indication -> verify_resend_indication(Val);
1428
segment_reply_ind -> verify_bool(Val);
1429
segment_recv_acc -> verify_bool(Val);
1560
segment_reply_ind ->
1561
megaco_config_misc:verify_bool(Val);
1563
megaco_config_misc:verify_bool(Val);
1430
1564
segment_recv_timer -> verify_timer(Val);
1431
1565
segment_send -> verify_segmentation_window(Val);
1432
1566
segment_send_timer -> verify_timer(Val);
1433
max_pdu_size -> verify_int(Val) andalso (Val > 0);
1568
megaco_config_misc:verify_int(Val) andalso (Val > 0);
1434
1569
request_keep_alive_timeout ->
1435
(verify_int(Val) andalso (Val >= 0)) orelse (Val =:= plain);
1570
(megaco_config_misc:verify_uint(Val) orelse (Val =:= plain));
1442
verify_bool(true) -> true;
1443
verify_bool(false) -> true;
1444
verify_bool(_) -> false.
1446
1577
verify_resend_indication(flag) -> true;
1447
verify_resend_indication(Val) -> verify_bool(Val).
1449
-spec verify_strict_int(Int :: integer()) -> boolean().
1450
verify_strict_int(Int) when is_integer(Int) -> true;
1451
verify_strict_int(_) -> false.
1453
-spec verify_strict_int(Int :: integer(),
1454
Max :: integer() | 'infinity') -> boolean().
1455
verify_strict_int(Int, infinity) ->
1456
verify_strict_int(Int);
1457
verify_strict_int(Int, Max) ->
1458
verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max).
1460
-spec verify_strict_uint(Int :: non_neg_integer()) -> boolean().
1461
verify_strict_uint(Int) when is_integer(Int) andalso (Int >= 0) -> true;
1462
verify_strict_uint(_) -> false.
1464
-spec verify_strict_uint(Int :: non_neg_integer(),
1465
Max :: non_neg_integer() | 'infinity') -> boolean().
1466
verify_strict_uint(Int, infinity) ->
1467
verify_strict_uint(Int);
1468
verify_strict_uint(Int, Max) ->
1469
verify_strict_int(Int, 0, Max).
1471
-spec verify_uint(Val :: non_neg_integer() | 'infinity') -> boolean().
1472
verify_uint(infinity) -> true;
1473
verify_uint(Val) -> verify_strict_uint(Val).
1475
-spec verify_int(Val :: integer() | 'infinity') -> boolean().
1476
verify_int(infinity) -> true;
1477
verify_int(Val) -> verify_strict_int(Val).
1479
-spec verify_int(Int :: integer() | 'infinity',
1480
Max :: integer() | 'infinity') -> boolean().
1481
verify_int(Int, infinity) ->
1483
verify_int(infinity, _Max) ->
1485
verify_int(Int, Max) ->
1486
verify_strict_int(Int) andalso verify_strict_int(Max) andalso (Int =< Max).
1488
-spec verify_uint(Int :: non_neg_integer() | 'infinity',
1489
Max :: non_neg_integer() | 'infinity') -> boolean().
1490
verify_uint(Int, infinity) ->
1492
verify_uint(infinity, _Max) ->
1494
verify_uint(Int, Max) ->
1495
verify_strict_int(Int, 0, Max).
1497
-spec verify_strict_int(Int :: integer(),
1499
Max :: integer()) -> boolean().
1500
verify_strict_int(Val, Min, Max)
1501
when (is_integer(Val) andalso
1502
is_integer(Min) andalso
1503
is_integer(Max) andalso
1504
(Val >= Min) andalso
1507
verify_strict_int(_Val, _Min, _Max) ->
1510
-spec verify_int(Val :: integer() | 'infinity',
1512
Max :: integer() | 'infinity') -> boolean().
1513
verify_int(infinity, Min, infinity) ->
1514
verify_strict_int(Min);
1515
verify_int(Val, Min, infinity) ->
1516
verify_strict_int(Val) andalso
1517
verify_strict_int(Min) andalso (Val >= Min);
1518
verify_int(Int, Min, Max) ->
1519
verify_strict_int(Int, Min, Max).
1578
verify_resend_indication(Val) -> megaco_config_misc:verify_bool(Val).
1521
1580
verify_timer(Timer) ->
1522
1581
megaco_timer:verify(Timer).