OsmocomBB MNCC socket implementation without LCR

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

OsmocomBB MNCC socket implementation without LCR

Gerard Pinto
This post has NOT been accepted by the mailing list yet.
Greetings,

I have been working with Layer23 stack of OsmocomBB since a couple of months.
I decided to try MNCC socket interface without LCR (I'm aware there is an implementation embedded in LCR gsm-ms).
I reverse engineered and wrote a simple C application taking mncc.h.

Problem: I'm unable to make a call on live network, although it does channel allocation, ciphering etc.
Flow:
1. Create MNCC struct and write on to the osmocomBB socket
2. OsmocomBB parses it well and request for channel, ciphering mode, init MM, sending SETUP etc works great.
3. However, in response to step.2 after sending SETUP it returns with (ms 1) Received 'RELEASE_COMPL' in CC state INITIATED. Why does it release CC?
4. I further debugged, the reason for release is in fn. gsm48_cc_rx_release_compl in (gsm8_cc.c) it says mncc-cause = GSM48_IE_CAUSE. with no description.

I really don't know whats causing this issue. Any help would be much appreciated.
Or It would be very kind if someone could guide me.

My mncc socket create code:
        struct gsm_mncc *mncc;
        int i = 0;
        int call_ref = new_callref++;
        mncc = create_mncc(MNCC_SETUP_REQ, call_ref);

        if (!strncasecmp(number, "emerg", 5)) {
                printf("Make emergency call\n");
                mncc->emergency = 1;
        } else {
                printf("make call to %s\n", number);
                mncc->fields |= MNCC_F_CALLED;

                if(number[0] == '+') {
                        number++;
                        mncc->called.type = 1; /*international*/
                } else {
                        mncc->called.type = 0; /*auto-unknown -prefix must be used*/
                }
                mncc->called.plan = 1;
                strncpy(mncc->called.number, number,
                sizeof(mncc->called.number) - 1);
                printf("Calling number %s\n", mncc->called.number);

                /* bearer capability (mandatory) */
                mncc->fields |= MNCC_F_BEARER_CAP;
                mncc->bearer_cap.coding = 0;
                mncc->bearer_cap.speech_ctm = 0;

                mncc->bearer_cap.radio = 3; /** Support TCH/H also*/
                /** Supported rates **/
                mncc->bearer_cap.speech_ver[i++] = 2; /* support full rate v2 */
                mncc->bearer_cap.speech_ver[i++] = 0; /* support full rate v1 */
                mncc->bearer_cap.speech_ver[i++] = 1; /* support half rate v2 */
                mncc->bearer_cap.speech_ver[i] = -1; /* end of list */
                /** END **/
               
                mncc->bearer_cap.transfer = 0;
                mncc->bearer_cap.mode = 0;

                /* CC capabilities (optional) DTMF */
                mncc->fields |= MNCC_F_CCCAP;
                mncc->cccap.dtmf = 1;

                mncc->fields |= MNCC_F_CCCAP;
                mncc->clir.inv = 1;
                mncc->clir.sup = 1;
        }

        return send_and_free_mncc(mncc->msg_type, mncc);


Looking forward to the reply,
Thanks,
Gerard
Loading...