[layer23] Correctly release a call, if not yet acknowledged by the network
authorAndreas.Eversberg <jolly@eversberg.eu>
Sun, 1 Aug 2010 10:42:11 +0000 (10:42 +0000)
committerAndreas.Eversberg <jolly@eversberg.eu>
Sun, 1 Aug 2010 10:42:11 +0000 (10:42 +0000)
src/host/layer23/include/osmocom/bb/mobile/mncc.h
src/host/layer23/src/mobile/mnccms.c

index d1d4d38..37e1aff 100644 (file)
@@ -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 */
 };
index 70c33c8..12f198e 100644 (file)
@@ -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)