dect
/
libdect
Archived
13
0
Fork 0

cc: add completion timer

Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
Patrick McHardy 2010-09-14 23:04:59 +02:00
parent cb378b3333
commit 2dc7accdbb
2 changed files with 41 additions and 4 deletions

View File

@ -326,6 +326,7 @@ enum dect_cc_states {
* @overlap_sending_timer: overlap sending timer (<CC.01>)
* @release_timer: call release timer (<CC.02>)
* @setup_timer: call setup timer (<CC.03>)
* @completion_timer: call setup completion timer (<CC.04>)
* @lu_sap: U-Plane file descriptor
* @qstats_timer: LU1 queue statistics debugging timer
* @priv: libdect user private storage
@ -338,6 +339,7 @@ struct dect_call {
struct dect_timer *overlap_sending_timer;
struct dect_timer *release_timer;
struct dect_timer *setup_timer;
struct dect_timer *completion_timer;
struct dect_fd *lu_sap;
#ifdef DEBUG
struct dect_timer *qstats_timer;
@ -348,6 +350,7 @@ struct dect_call {
#define DECT_CC_OVERLAP_SENDING_TIMEOUT 20 /* <CC.01>: 20 seconds */
#define DECT_CC_RELEASE_TIMEOUT 36 /* <CC.02>: 36 seconds */
#define DECT_CC_SETUP_TIMEOUT 20 /* <CC.03>: 20 seconds */
#define DECT_CC_COMPLETION_TIMEOUT 100 /* <CC.04>: 100 seconds */
#define DECT_CC_QUEUE_STATS_TIMER 1 /* 1 second */
extern const struct dect_nwk_protocol dect_cc_protocol;

View File

@ -506,6 +506,7 @@ static void dect_call_disconnect_uplane(const struct dect_handle *dh,
static void dect_cc_overlap_sending_timer(struct dect_handle *dh, struct dect_timer *timer);
static void dect_cc_release_timer(struct dect_handle *dh, struct dect_timer *timer);
static void dect_cc_setup_timer(struct dect_handle *dh, struct dect_timer *timer);
static void dect_cc_completion_timer(struct dect_handle *dh, struct dect_timer *timer);
/* All CC timers should be stopped upon starting the release timer, receiving
* or sending a {RELEASE-COM} message or a data link failure indication from
@ -518,6 +519,8 @@ static void dect_cc_stop_timers(const struct dect_handle *dh,
dect_timer_stop(dh, call->overlap_sending_timer);
if (dect_timer_running(call->setup_timer))
dect_timer_stop(dh, call->setup_timer);
if (dect_timer_running(call->completion_timer))
dect_timer_stop(dh, call->completion_timer);
}
struct dect_call *dect_call_alloc(const struct dect_handle *dh)
@ -543,9 +546,16 @@ struct dect_call *dect_call_alloc(const struct dect_handle *dh)
goto err4;
dect_timer_setup(call->setup_timer, dect_cc_setup_timer, call);
call->completion_timer = dect_timer_alloc(dh);
if (call->completion_timer == NULL)
goto err5;
dect_timer_setup(call->completion_timer, dect_cc_completion_timer, call);
call->state = DECT_CC_NULL;
return call;
err5:
dect_timer_free(dh, call->setup_timer);
err4:
dect_timer_free(dh, call->release_timer);
err3:
@ -567,6 +577,7 @@ static void dect_call_destroy(const struct dect_handle *dh,
dect_timer_free(dh, call->overlap_sending_timer);
dect_timer_free(dh, call->release_timer);
dect_timer_free(dh, call->setup_timer);
dect_timer_free(dh, call->completion_timer);
dect_free(dh, call);
}
@ -659,6 +670,14 @@ static void dect_cc_setup_timer(struct dect_handle *dh, struct dect_timer *timer
dect_call_destroy(dh, call);
}
static void dect_cc_completion_timer(struct dect_handle *dh, struct dect_timer *timer)
{
struct dect_call *call = timer->data;
cc_debug(call, "<CC.04>: completion timer");
dect_cc_timer_release(dh, call);
}
/**
* MNCC_SETUP-req primitive
*
@ -846,6 +865,7 @@ int dect_mncc_call_proc_req(struct dect_handle *dh, struct dect_call *call,
.escape_to_proprietary = param->escape_to_proprietary,
.codec_list = param->codec_list,
};
int err;
cc_debug_entry(call, "MNCC_CALL_PROC-req");
@ -854,8 +874,13 @@ int dect_mncc_call_proc_req(struct dect_handle *dh, struct dect_call *call,
dect_timer_stop(dh, call->overlap_sending_timer);
call->state = DECT_CC_CALL_PROCEEDING;
return dect_cc_send_msg(dh, call, &cc_call_proc_msg_desc,
&msg.common, DECT_CC_CALL_PROC);
err = dect_cc_send_msg(dh, call, &cc_call_proc_msg_desc,
&msg.common, DECT_CC_CALL_PROC);
if (err < 0)
return err;
dect_timer_start(dh, call->completion_timer, DECT_CC_COMPLETION_TIMEOUT);
return 0;
}
EXPORT_SYMBOL(dect_mncc_call_proc_req);
@ -901,6 +926,7 @@ int dect_mncc_alert_req(struct dect_handle *dh, struct dect_call *call,
} else
call->state = DECT_CC_CALL_RECEIVED;
dect_timer_start(dh, call->completion_timer, DECT_CC_COMPLETION_TIMEOUT);
return 0;
}
EXPORT_SYMBOL(dect_mncc_alert_req);
@ -945,9 +971,11 @@ int dect_mncc_connect_req(struct dect_handle *dh, struct dect_call *call,
&msg.common, DECT_CC_CONNECT) < 0)
goto err1;
if (dh->mode == DECT_MODE_FP)
if (dh->mode == DECT_MODE_FP) {
if (dect_timer_running(call->completion_timer))
dect_timer_stop(dh, call->completion_timer);
call->state = DECT_CC_ACTIVE;
else
} else
call->state = DECT_CC_CONNECT_PENDING;
return 0;
@ -1276,6 +1304,10 @@ static void dect_cc_rcv_alerting(struct dect_handle *dh, struct dect_call *call,
if (dect_timer_running(call->setup_timer))
dect_timer_stop(dh, call->setup_timer);
if (dh->mode == DECT_MODE_FP)
dect_timer_start(dh, call->completion_timer,
DECT_CC_COMPLETION_TIMEOUT);
dect_mncc_alert_ind(dh, call, &msg);
dect_msg_free(dh, &cc_alerting_msg_desc, &msg.common);
@ -1322,6 +1354,7 @@ static void dect_cc_rcv_call_proc(struct dect_handle *dh, struct dect_call *call
if (dect_timer_running(call->setup_timer))
dect_timer_stop(dh, call->setup_timer);
dect_timer_start(dh, call->completion_timer, DECT_CC_COMPLETION_TIMEOUT);
dect_mncc_call_proc_ind(dh, call, &msg);
call->state = DECT_CC_CALL_PROCEEDING;
@ -1371,6 +1404,7 @@ static void dect_cc_rcv_connect(struct dect_handle *dh, struct dect_call *call,
if (dect_timer_running(call->setup_timer))
dect_timer_stop(dh, call->setup_timer);
dect_timer_stop(dh, call->completion_timer);
if (dh->mode == DECT_MODE_PP)
call->state = DECT_CC_ACTIVE;