ofono/drivers/isimodem/isi-call-debug.c

346 lines
7.6 KiB
C

/*
* This file is part of oFono - Open Source Telephony
*
* Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
*
* Contact: <Pekka.Pessi@nokia.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <glib.h>
#include <gisi/client.h>
#include <gisi/iter.h>
#include "isi-call.h"
#include <ofono/log.h>
#define DUMP(fmt, arg...) ofono_debug(fmt, ## arg)
char const *isi_call_status_name(enum isi_call_status value)
{
switch (value) {
#define _(X) case CALL_STATUS_ ## X: return #X
_(IDLE);
_(CREATE);
_(COMING);
_(PROCEEDING);
_(MO_ALERTING);
_(MT_ALERTING);
_(WAITING);
_(ANSWERED);
_(ACTIVE);
_(MO_RELEASE);
_(MT_RELEASE);
_(HOLD_INITIATED);
_(HOLD);
_(RETRIEVE_INITIATED);
_(RECONNECT_PENDING);
_(TERMINATED);
_(SWAP_INITIATED);
#undef _
}
return "<UNKNOWN>";
}
char const *isi_call_message_id_name(enum isi_call_message_id value)
{
switch (value) {
#define _(X) case X: return #X
_(CALL_CREATE_REQ);
_(CALL_CREATE_RESP);
_(CALL_COMING_IND);
_(CALL_MO_ALERT_IND);
_(CALL_MT_ALERT_IND);
_(CALL_WAITING_IND);
_(CALL_ANSWER_REQ);
_(CALL_ANSWER_RESP);
_(CALL_RELEASE_REQ);
_(CALL_RELEASE_RESP);
_(CALL_RELEASE_IND);
_(CALL_TERMINATED_IND);
_(CALL_STATUS_REQ);
_(CALL_STATUS_RESP);
_(CALL_STATUS_IND);
_(CALL_SERVER_STATUS_IND);
_(CALL_CONTROL_REQ);
_(CALL_CONTROL_RESP);
_(CALL_CONTROL_IND);
_(CALL_MODE_SWITCH_REQ);
_(CALL_MODE_SWITCH_RESP);
_(CALL_MODE_SWITCH_IND);
_(CALL_DTMF_SEND_REQ);
_(CALL_DTMF_SEND_RESP);
_(CALL_DTMF_STOP_REQ);
_(CALL_DTMF_STOP_RESP);
_(CALL_DTMF_STATUS_IND);
_(CALL_DTMF_TONE_IND);
_(CALL_RECONNECT_IND);
_(CALL_PROPERTY_GET_REQ);
_(CALL_PROPERTY_GET_RESP);
_(CALL_PROPERTY_SET_REQ);
_(CALL_PROPERTY_SET_RESP);
_(CALL_PROPERTY_SET_IND);
_(CALL_EMERGENCY_NBR_CHECK_REQ);
_(CALL_EMERGENCY_NBR_CHECK_RESP);
_(CALL_EMERGENCY_NBR_GET_REQ);
_(CALL_EMERGENCY_NBR_GET_RESP);
_(CALL_EMERGENCY_NBR_MODIFY_REQ);
_(CALL_EMERGENCY_NBR_MODIFY_RESP);
_(CALL_GSM_NOTIFICATION_IND);
_(CALL_GSM_USER_TO_USER_REQ);
_(CALL_GSM_USER_TO_USER_RESP);
_(CALL_GSM_USER_TO_USER_IND);
_(CALL_GSM_BLACKLIST_CLEAR_REQ);
_(CALL_GSM_BLACKLIST_CLEAR_RESP);
_(CALL_GSM_BLACKLIST_TIMER_IND);
_(CALL_GSM_DATA_CH_INFO_IND);
_(CALL_GSM_CCP_GET_REQ);
_(CALL_GSM_CCP_GET_RESP);
_(CALL_GSM_CCP_CHECK_REQ);
_(CALL_GSM_CCP_CHECK_RESP);
_(CALL_GSM_COMING_REJ_IND);
_(CALL_GSM_RAB_IND);
_(CALL_GSM_IMMEDIATE_MODIFY_IND);
_(CALL_CREATE_NO_SIMATK_REQ);
_(CALL_GSM_SS_DATA_IND);
_(CALL_TIMER_REQ);
_(CALL_TIMER_RESP);
_(CALL_TIMER_NTF);
_(CALL_TIMER_IND);
_(CALL_TIMER_RESET_REQ);
_(CALL_TIMER_RESET_RESP);
_(CALL_EMERGENCY_NBR_IND);
_(CALL_SERVICE_DENIED_IND);
_(CALL_RELEASE_END_REQ);
_(CALL_RELEASE_END_RESP);
_(CALL_USER_CONNECT_IND);
_(CALL_AUDIO_CONNECT_IND);
_(CALL_KODIAK_ALLOW_CTRL_REQ);
_(CALL_KODIAK_ALLOW_CTRL_RESP);
_(CALL_SERVICE_ACTIVATE_IND);
_(CALL_SERVICE_ACTIVATE_REQ);
_(CALL_SERVICE_ACTIVATE_RESP);
_(CALL_SIM_ATK_IND);
_(CALL_CONTROL_OPER_IND);
_(CALL_TEST_CALL_STATUS_IND);
_(CALL_SIM_ATK_INFO_IND);
_(CALL_SECURITY_IND);
_(CALL_MEDIA_HANDLE_REQ);
_(CALL_MEDIA_HANDLE_RESP);
_(COMMON_MESSAGE);
#undef _
}
return "<UNKNOWN>";
}
char const *isi_call_isi_cause_name(enum isi_call_isi_cause value)
{
switch (value)
{
#define _(X) case CALL_CAUSE_ ## X: return "CAUSE_" #X
_(NO_CAUSE);
_(NO_CALL);
_(TIMEOUT);
_(RELEASE_BY_USER);
_(BUSY_USER_REQUEST);
_(ERROR_REQUEST);
_(COST_LIMIT_REACHED);
_(CALL_ACTIVE);
_(NO_CALL_ACTIVE);
_(INVALID_CALL_MODE);
_(SIGNALLING_FAILURE);
_(TOO_LONG_ADDRESS);
_(INVALID_ADDRESS);
_(EMERGENCY);
_(NO_TRAFFIC_CHANNEL);
_(NO_COVERAGE);
_(CODE_REQUIRED);
_(NOT_ALLOWED);
_(NO_DTMF);
_(CHANNEL_LOSS);
_(FDN_NOT_OK);
_(USER_TERMINATED);
_(BLACKLIST_BLOCKED);
_(BLACKLIST_DELAYED);
_(NUMBER_NOT_FOUND);
_(NUMBER_CANNOT_REMOVE);
_(EMERGENCY_FAILURE);
_(CS_SUSPENDED);
_(DCM_DRIVE_MODE);
_(MULTIMEDIA_NOT_ALLOWED);
_(SIM_REJECTED);
_(NO_SIM);
_(SIM_LOCK_OPERATIVE);
_(SIMATKCC_REJECTED);
_(SIMATKCC_MODIFIED);
_(DTMF_INVALID_DIGIT);
_(DTMF_SEND_ONGOING);
_(CS_INACTIVE);
_(SECURITY_MODE);
_(TRACFONE_FAILED);
_(TRACFONE_WAIT_FAILED);
_(TRACFONE_CONF_FAILED);
_(TEMPERATURE_LIMIT);
_(KODIAK_POC_FAILED);
_(NOT_REGISTERED);
_(CS_CALLS_ONLY);
_(VOIP_CALLS_ONLY);
_(LIMITED_CALL_ACTIVE);
_(LIMITED_CALL_NOT_ALLOWED);
_(SECURE_CALL_NOT_POSSIBLE);
_(INTERCEPT);
#undef _
}
return "<UNKNOWN>";
}
char const *isi_call_gsm_cause_name(enum isi_call_gsm_cause value)
{
switch (value)
{
#define _(X) case CALL_GSM_CAUSE_ ## X: return "GSM_CAUSE_" #X
_(UNASSIGNED_NUMBER);
_(NO_ROUTE);
_(CH_UNACCEPTABLE);
_(OPER_BARRING);
_(NORMAL);
_(USER_BUSY);
_(NO_USER_RESPONSE);
_(ALERT_NO_ANSWER);
_(CALL_REJECTED);
_(NUMBER_CHANGED);
_(NON_SELECT_CLEAR);
_(DEST_OUT_OF_ORDER);
_(INVALID_NUMBER);
_(FACILITY_REJECTED);
_(RESP_TO_STATUS);
_(NORMAL_UNSPECIFIED);
_(NO_CHANNEL);
_(NETW_OUT_OF_ORDER);
_(TEMPORARY_FAILURE);
_(CONGESTION);
_(ACCESS_INFO_DISC);
_(CHANNEL_NA);
_(RESOURCES_NA);
_(QOS_NA);
_(FACILITY_UNSUBS);
_(COMING_BARRED_CUG);
_(BC_UNAUTHORIZED);
_(BC_NA);
_(SERVICE_NA);
_(BEARER_NOT_IMPL);
_(ACM_MAX);
_(FACILITY_NOT_IMPL);
_(ONLY_RDI_BC);
_(SERVICE_NOT_IMPL);
_(INVALID_TI);
_(NOT_IN_CUG);
_(INCOMPATIBLE_DEST);
_(INV_TRANS_NET_SEL);
_(SEMANTICAL_ERR);
_(INVALID_MANDATORY);
_(MSG_TYPE_INEXIST);
_(MSG_TYPE_INCOMPAT);
_(IE_NON_EXISTENT);
_(COND_IE_ERROR);
_(MSG_INCOMPATIBLE);
_(TIMER_EXPIRY);
_(PROTOCOL_ERROR);
_(INTERWORKING);
#undef _
}
return "<UNKNOWN>";
}
char const *isi_call_cause_name(uint8_t cause_type, uint8_t cause)
{
switch (cause_type)
{
case CALL_CAUSE_TYPE_DEFAULT:
case CALL_CAUSE_TYPE_CLIENT:
case CALL_CAUSE_TYPE_SERVER:
return isi_call_isi_cause_name(cause);
case CALL_CAUSE_TYPE_NETWORK:
return isi_call_gsm_cause_name(cause);
}
return "<UNKNOWN>";
}
static void isi_call_hex_dump(uint8_t const m[],
size_t len,
char const *name)
{
char const *prefix;
char hex[3 * 16 + 1];
char ascii[16 + 1];
size_t i, j, k;
if (strncmp(name, "CALL_", 5))
prefix = "CALL ";
else
prefix = "";
DUMP("%s%s [%s=0x%02X len=%zu]:",
prefix, name, "message_id", m[1], len);
strcpy(hex, " **"), j = 3;
strcpy(ascii, "."), k = 1;
for (i = 1; i < len; i++) {
sprintf(hex + j, " %02X", m[i]), j += 3;
ascii[k++] = g_ascii_isgraph(m[i]) ? m[i] : '.';
if ((i & 15) == 15) {
DUMP(" *%-48s : %.*s", hex, (int)k, ascii);
j = 0, k = 0;
}
}
if (j) {
DUMP(" *%-48s : %.*s", hex, (int)k, ascii);
}
}
void isi_call_debug(const void *restrict buf, size_t len, void *data)
{
uint8_t const *m = buf;
char const *name;
m = buf, m--, len++, buf = m;
if (len < 4) {
DUMP("CALL: %s [len=%zu]", "RUNT", len);
return;
}
name = isi_call_message_id_name(m[1]);
isi_call_hex_dump(m, len, name);
}