diff options
Diffstat (limited to 'drivers/isimodem/isi-call-debug.c')
-rw-r--r-- | drivers/isimodem/isi-call-debug.c | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/drivers/isimodem/isi-call-debug.c b/drivers/isimodem/isi-call-debug.c new file mode 100644 index 00000000..5d6483c4 --- /dev/null +++ b/drivers/isimodem/isi-call-debug.c @@ -0,0 +1,345 @@ +/* + * 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); +} |