return;
switch (frame->msg_type) {
+ case ANALOG_8000HZ:
+ if (p_g_media_type != MEDIA_TYPE_ANALOG) {
+ PERROR("'Analog' frame, but current media type mismatches.\n");
+ return;
+ }
+ for (i = 0; i < 160; i++) {
+ data[i] = audio_s16_to_law[((int16_t *)frame->data)[i] & 0xffff];
+ }
+ break;
case GSM_TCHF_FRAME:
if (p_g_media_type != MEDIA_TYPE_GSM) {
PERROR("FR frame, but current media type mismatches.\n");
p_g_rxpos = 0;
switch (p_g_media_type) {
+ case MEDIA_TYPE_ANALOG:
+ frame_send(p_g_rxdata, 320, ANALOG_8000HZ);
+ break;
case MEDIA_TYPE_GSM:
if (!p_g_fr_encoder) {
PERROR("FR frame, but encoder not created.\n");
/* FIXME: the caller should provide this */
switch (msg_type) {
+ case ANALOG_8000HZ:
+ len = sizeof(struct gsm_data_frame) + 320;
+ break;
case GSM_TCHF_FRAME:
len = sizeof(struct gsm_data_frame) + 33;
break;
decoder = p_g_amr_decoder;
half = 1;
break;
+ case 0x80:
+ add_trace("speech", "version", "Analog 8000Hz given");
+ media_type = MEDIA_TYPE_ANALOG;
+ payload_type = dynamic_type++;
+ encoder = (void *)1;
+ decoder = (void *)1;
+ break;
default:
add_trace("speech", "version", "%d given", mncc->bearer_cap.speech_ver[i]);
media_type = 0;
if (p_g_callref) {
/* release in case the ID is already in use */
add_trace("error", NULL, "callref already in use");
+reject:
end_trace();
mncc = create_mncc(MNCC_REJ_REQ, callref);
gsm_trace_header(p_interface_name, this, MNCC_REJ_REQ, DIRECTION_OUT);
trigger_work(&p_g_delete);
return;
}
+ if (callref < 0x40000000) {
+ /* release in case the ID is invalid */
+ add_trace("error", NULL, "callref invalid, not of BSC type");
+ goto reject;
+ }
p_g_callref = callref;
end_trace();
gsm_trace_header(p_interface_name, this, msg_type, DIRECTION_IN);
if (p_callerinfo.id[0])
add_trace("calling", "number", "%s", p_callerinfo.id);
- else
+ else if (p_callerinfo.imsi[0])
SPRINT(p_callerinfo.id, "imsi-%s", p_callerinfo.imsi);
add_trace("calling", "imsi", "%s", p_callerinfo.imsi);
add_trace("dialing", "number", "%s", p_dialinginfo.id);
|| msg_type == GSM_TCHF_FRAME_EFR
|| msg_type == GSM_TCHH_FRAME
|| msg_type == GSM_TCH_FRAME_AMR
+ || msg_type == ANALOG_8000HZ
|| msg_type == GSM_BAD_FRAME) {
if (port) {
/* inject DTMF, if enabled */
if (p_g_callref) {
/* release in case the ID is already in use */
add_trace("error", NULL, "callref already in use");
+reject:
end_trace();
mncc = create_mncc(MNCC_REJ_REQ, callref);
gsm_trace_header(p_interface_name, this, MNCC_REJ_REQ, DIRECTION_OUT);
trigger_work(&p_g_delete);
return;
}
+ if (callref < 0x40000000) {
+ /* release in case the ID is invalid */
+ add_trace("error", NULL, "callref invalid, not of MS type");
+ goto reject;
+ }
+
p_g_callref = callref;
end_trace();
#define GSM_TCHF_FRAME_EFR 0x0301
#define GSM_TCHH_FRAME 0x0302
#define GSM_TCH_FRAME_AMR 0x0303
+#define ANALOG_8000HZ 0x0380
#define GSM_BAD_FRAME 0x03ff
#define MNCC_SOCKET_HELLO 0x0400
GSM48_BCAP_SV_EFR = 2,
GSM48_BCAP_SV_AMR_F = 4,
GSM48_BCAP_SV_AMR_H = 5,
+ BCAP_SV_ANALOG_8000HZ = 0x80,
};
/* Expanded fields from GSM TS 04.08, Table 10.5.102 */