Minor fix for GSM HR codec negotiation: Add missing 'break'.
[lcr.git] / gsm.cpp
diff --git a/gsm.cpp b/gsm.cpp
index 5d4b64d..6063a9b 100644 (file)
--- a/gsm.cpp
+++ b/gsm.cpp
@@ -286,9 +286,6 @@ void Pgsm::frame_receive(void *arg)
        unsigned char data[160];
        int i, cmr;
 
-       if (!p_g_fr_decoder)
-               return;
-
        switch (frame->msg_type) {
        case GSM_TCHF_FRAME:
                if (p_g_media_type != MEDIA_TYPE_GSM) {
@@ -412,6 +409,11 @@ bfi:
 /* send traffic to gsm */
 int Pgsm::bridge_rx(unsigned char *data, int len)
 {
+       int ret;
+
+       if ((ret = Port::bridge_rx(data, len)))
+               return ret;
+
        if (p_tone_name[0])
                return -EINVAL;
 
@@ -429,10 +431,6 @@ int Pgsm::audio_send(unsigned char *data, int len)
        if (p_tap)
                tap(data, len, 1); // from up
 
-       /* encoder init failed */
-       if (!p_g_fr_encoder)
-               return -EINVAL;
-
        /* (currently) not connected, so don't flood tch! */
        if (!p_g_tch_connected)
                return -EINVAL;
@@ -571,16 +569,24 @@ void Pgsm::modify_lchan(int media_type)
        case MEDIA_TYPE_GSM_EFR:
                add_trace("speech", "version", "EFR given");
                mode->lchan_mode = 0x21; /* GSM V2 */
+               mode->lchan_type = 0x02; /* TCH/F */
                break;
        case MEDIA_TYPE_AMR:
                add_trace("speech", "version", "AMR given");
                mode->lchan_mode = 0x41; /* GSM V3 */
+               /* as we don't know the available channels, this type will be set by openbsc automatically */
+               mode->lchan_type = 0x02; /* TCH/F */
+               break;
+       case MEDIA_TYPE_GSM_HR:
+               add_trace("speech", "version", "Half Rate given");
+               mode->lchan_mode = 0x01; /* GSM V1 */
+               mode->lchan_type = 0x03; /* TCH/H */
                break;
        default:
-               add_trace("speech", "version", "Full/Half Rate given");
+               add_trace("speech", "version", "Full Rate given");
                mode->lchan_mode = 0x01; /* GSM V1 */
+               mode->lchan_type = 0x02; /* TCH/F */
        }
-       mode->lchan_type = 0x02; /* FIXME: unused */
        add_trace("mode", NULL, "0x%02x", mode->lchan_mode);
        end_trace();
        send_and_free_mncc(p_g_lcr_gsm, mode->msg_type, mode);
@@ -833,6 +839,9 @@ void Pgsm::message_notify(unsigned int epoint_id, int message_id, union paramete
 //     printf("if = %d\n", param->notifyinfo.notify);
        if (param->notifyinfo.notify>INFO_NOTIFY_NONE) {
                notify = param->notifyinfo.notify & 0x7f;
+               /* skip all notifiy ids that are not 0, 1, 2 */
+               if (notify > 2)
+                       return;
                if (p_state!=PORT_STATE_CONNECT /*&& p_state!=PORT_STATE_IN_PROCEEDING*/ && p_state!=PORT_STATE_IN_ALERTING) {
                        /* queue notification */
                        if (p_g_notify_pending)
@@ -1052,6 +1061,13 @@ void Pgsm::message_disconnect(unsigned int epoint_id, int message_id, union para
        add_trace("cause", "coding", "%d", mncc->cause.coding);
        add_trace("cause", "location", "%d", mncc->cause.location);
        add_trace("cause", "value", "%d", mncc->cause.value);
+#ifdef WITH_GSM_MS
+       /* special case for BS mode */
+       if (param->disconnectinfo.transfer.result && (p_type & PORT_CLASS_GSM_MASK) == PORT_CLASS_GSM_BS) {
+               ((class Pgsm_bs *)this)->enc_ie_facility_ect(mncc, &param->disconnectinfo.transfer);
+               gsm_trace_facility((unsigned char *)mncc->facility.info, mncc->facility.len);
+       }
+#endif
        end_trace();
        send_and_free_mncc(p_g_lcr_gsm, mncc->msg_type, mncc);
 
@@ -1275,7 +1291,7 @@ static int mncc_fd_close(struct lcr_gsm *lcr_gsm, struct lcr_fd *lfd)
        /* free all the calls that were running through the MNCC interface */
        port = port_first;
        while(port) {
-               if ((port->p_type & PORT_CLASS_mISDN_MASK) == PORT_CLASS_GSM) {
+               if ((port->p_type & PORT_CLASS_MASK) == PORT_CLASS_GSM) {
                        pgsm = (class Pgsm *)port;
                        if (pgsm->p_g_lcr_gsm == lcr_gsm) {
                                message = message_create(pgsm->p_serial, ACTIVE_EPOINT(pgsm->p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);