diff options
author | Andreas.Eversberg <jolly@eversberg.eu> | 2010-08-01 10:42:11 +0000 |
---|---|---|
committer | Andreas.Eversberg <jolly@eversberg.eu> | 2010-08-01 10:42:11 +0000 |
commit | 85253cf06d038cc7083dae9b71e0e0124ceda80e (patch) | |
tree | ca62a6c516b232cc9142dbb82f8f46668d88598d | |
parent | ef0377b11cac3a432238af03686ad16e0926d580 (diff) |
[layer23] Correctly release a call, if not yet acknowledged by the network
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/mncc.h | 1 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/mnccms.c | 7 |
2 files changed, 7 insertions, 1 deletions
diff --git a/src/host/layer23/include/osmocom/bb/mobile/mncc.h b/src/host/layer23/include/osmocom/bb/mobile/mncc.h index d1d4d38f..37e1affc 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/mncc.h +++ b/src/host/layer23/include/osmocom/bb/mobile/mncc.h @@ -36,6 +36,7 @@ struct gsm_call { uint32_t callref; + uint8_t init; /* call has been initiated, no response yet */ uint8_t hold; /* call on hold */ uint8_t ring; /* call is ringing/knocking */ }; diff --git a/src/host/layer23/src/mobile/mnccms.c b/src/host/layer23/src/mobile/mnccms.c index 70c33c89..12f198e2 100644 --- a/src/host/layer23/src/mobile/mnccms.c +++ b/src/host/layer23/src/mobile/mnccms.c @@ -123,6 +123,9 @@ int mncc_recv_mobile(struct osmocom_ms *ms, int msg_type, void *arg) llist_add_tail(&call->entry, &call_list); } + /* not in initiated state anymore */ + call->init = 0; + switch (msg_type) { case MNCC_DISC_IND: vty_notify(ms, NULL); @@ -302,6 +305,7 @@ int mncc_call(struct osmocom_ms *ms, char *number) if (!call) return -ENOMEM; call->callref = new_callref++; + call->init = 1; llist_add_tail(&call->entry, &call_list); memset(&setup, 0, sizeof(struct gsm_mncc)); @@ -358,7 +362,8 @@ int mncc_hangup(struct osmocom_ms *ms) disc.callref = found->callref; mncc_set_cause(&disc, GSM48_CAUSE_LOC_USER, GSM48_CC_CAUSE_NORM_CALL_CLEAR); - return mncc_send(ms, MNCC_DISC_REQ, &disc); + return mncc_send(ms, (call->init) ? MNCC_REL_REQ : MNCC_DISC_REQ, + &disc); } int mncc_answer(struct osmocom_ms *ms) |