From e21959884399480a3c60f157cd601c78aa3e6049 Mon Sep 17 00:00:00 2001 From: Michiel van Baak Date: Thu, 4 Dec 2008 16:37:13 +0000 Subject: [PATCH] Add debug flag so skinny debug will show information about packets. We dont want to scare users with this, so we added a devmode compile flag (closes issue #13952) Reported by: wedhorn Patches: packetdebug3.diff uploaded by wedhorn (license 30) Tested by: mvanbaak, wedhorn git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@160938 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- build_tools/cflags-devmode.xml | 2 + channels/chan_skinny.c | 167 ++++++++++++++++++++++++++++++++- 2 files changed, 165 insertions(+), 4 deletions(-) diff --git a/build_tools/cflags-devmode.xml b/build_tools/cflags-devmode.xml index 0836a85e0c..0b0f5e9078 100644 --- a/build_tools/cflags-devmode.xml +++ b/build_tools/cflags-devmode.xml @@ -18,4 +18,6 @@ + + diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index fa861e97e4..f61f1b0b3d 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -70,6 +70,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/indications.h" #include "asterisk/linkedlists.h" +#ifdef SKINNY_DEVMODE +#define SKINNY_DEVONLY(code) \ + code +#else +#define SKINNY_DEVONLY(code) +#endif + /************************************* * Skinny/Asterisk Protocol Settings * *************************************/ @@ -159,6 +166,11 @@ static struct ast_jb_conf default_jbconf = }; static struct ast_jb_conf global_jbconf; +#ifdef SKINNY_DEVMODE +AST_THREADSTORAGE(message2str_threadbuf); +#define MESSAGE2STR_BUFSIZE 35 +#endif + AST_THREADSTORAGE(device2str_threadbuf); #define DEVICE2STR_BUFSIZE 15 @@ -1874,6 +1886,137 @@ static int skinny_unregister(struct skinny_req *req, struct skinnysession *s) return -1; /* main loop will destroy the session */ } +#ifdef SKINNY_DEVMODE +static char *message2str(int type) +{ + char *tmp; + + switch (type) { + case KEEP_ALIVE_MESSAGE: + return "KEEP_ALIVE_MESSAGE"; + case REGISTER_MESSAGE: + return "REGISTER_MESSAGE"; + case IP_PORT_MESSAGE: + return "IP_PORT_MESSAGE"; + case KEYPAD_BUTTON_MESSAGE: + return "KEYPAD_BUTTON_MESSAGE"; + case ENBLOC_CALL_MESSAGE: + return "ENBLOC_CALL_MESSAGE"; + case STIMULUS_MESSAGE: + return "STIMULUS_MESSAGE"; + case OFFHOOK_MESSAGE: + return "OFFHOOK_MESSAGE"; + case ONHOOK_MESSAGE: + return "ONHOOK_MESSAGE"; + case CAPABILITIES_RES_MESSAGE: + return "CAPABILITIES_RES_MESSAGE"; + case SPEED_DIAL_STAT_REQ_MESSAGE: + return "SPEED_DIAL_STAT_REQ_MESSAGE"; + case LINE_STATE_REQ_MESSAGE: + return "LINE_STATE_REQ_MESSAGE"; + case TIME_DATE_REQ_MESSAGE: + return "TIME_DATE_REQ_MESSAGE"; + case BUTTON_TEMPLATE_REQ_MESSAGE: + return "BUTTON_TEMPLATE_REQ_MESSAGE"; + case VERSION_REQ_MESSAGE: + return "VERSION_REQ_MESSAGE"; + case SERVER_REQUEST_MESSAGE: + return "SERVER_REQUEST_MESSAGE"; + case ALARM_MESSAGE: + return "ALARM_MESSAGE"; + case OPEN_RECEIVE_CHANNEL_ACK_MESSAGE: + return "OPEN_RECEIVE_CHANNEL_ACK_MESSAGE"; + case SOFT_KEY_SET_REQ_MESSAGE: + return "SOFT_KEY_SET_REQ_MESSAGE"; + case SOFT_KEY_EVENT_MESSAGE: + return "SOFT_KEY_EVENT_MESSAGE"; + case UNREGISTER_MESSAGE: + return "UNREGISTER_MESSAGE"; + case SOFT_KEY_TEMPLATE_REQ_MESSAGE: + return "SOFT_KEY_TEMPLATE_REQ_MESSAGE"; + case HEADSET_STATUS_MESSAGE: + return "HEADSET_STATUS_MESSAGE"; + case REGISTER_AVAILABLE_LINES_MESSAGE: + return "REGISTER_AVAILABLE_LINES_MESSAGE"; + case REGISTER_ACK_MESSAGE: + return "REGISTER_ACK_MESSAGE"; + case START_TONE_MESSAGE: + return "START_TONE_MESSAGE"; + case STOP_TONE_MESSAGE: + return "STOP_TONE_MESSAGE"; + case SET_RINGER_MESSAGE: + return "SET_RINGER_MESSAGE"; + case SET_LAMP_MESSAGE: + return "SET_LAMP_MESSAGE"; + case SET_SPEAKER_MESSAGE: + return "SET_SPEAKER_MESSAGE"; + case SET_MICROPHONE_MESSAGE: + return "SET_MICROPHONE_MESSAGE"; + case START_MEDIA_TRANSMISSION_MESSAGE: + return "START_MEDIA_TRANSMISSION_MESSAGE"; + case STOP_MEDIA_TRANSMISSION_MESSAGE: + return "STOP_MEDIA_TRANSMISSION_MESSAGE"; + case CALL_INFO_MESSAGE: + return "CALL_INFO_MESSAGE"; + case FORWARD_STAT_MESSAGE: + return "FORWARD_STAT_MESSAGE"; + case SPEED_DIAL_STAT_RES_MESSAGE: + return "SPEED_DIAL_STAT_RES_MESSAGE"; + case LINE_STAT_RES_MESSAGE: + return "LINE_STAT_RES_MESSAGE"; + case DEFINETIMEDATE_MESSAGE: + return "DEFINETIMEDATE_MESSAGE"; + case BUTTON_TEMPLATE_RES_MESSAGE: + return "BUTTON_TEMPLATE_RES_MESSAGE"; + case VERSION_RES_MESSAGE: + return "VERSION_RES_MESSAGE"; + case DISPLAYTEXT_MESSAGE: + return "DISPLAYTEXT_MESSAGE"; + case CLEAR_NOTIFY_MESSAGE: + return "CLEAR_NOTIFY_MESSAGE"; + case CLEAR_DISPLAY_MESSAGE: + return "CLEAR_DISPLAY_MESSAGE"; + case CAPABILITIES_REQ_MESSAGE: + return "CAPABILITIES_REQ_MESSAGE"; + case REGISTER_REJ_MESSAGE: + return "REGISTER_REJ_MESSAGE"; + case SERVER_RES_MESSAGE: + return "SERVER_RES_MESSAGE"; + case RESET_MESSAGE: + return "RESET_MESSAGE"; + case KEEP_ALIVE_ACK_MESSAGE: + return "KEEP_ALIVE_ACK_MESSAGE"; + case OPEN_RECEIVE_CHANNEL_MESSAGE: + return "OPEN_RECEIVE_CHANNEL_MESSAGE"; + case CLOSE_RECEIVE_CHANNEL_MESSAGE: + return "CLOSE_RECEIVE_CHANNEL_MESSAGE"; + case SOFT_KEY_TEMPLATE_RES_MESSAGE: + return "SOFT_KEY_TEMPLATE_RES_MESSAGE"; + case SOFT_KEY_SET_RES_MESSAGE: + return "SOFT_KEY_SET_RES_MESSAGE"; + case SELECT_SOFT_KEYS_MESSAGE: + return "SELECT_SOFT_KEYS_MESSAGE"; + case CALL_STATE_MESSAGE: + return "CALL_STATE_MESSAGE"; + case DISPLAY_PROMPT_STATUS_MESSAGE: + return "DISPLAY_PROMPT_STATUS_MESSAGE"; + case CLEAR_PROMPT_MESSAGE: + return "CLEAR_PROMPT_MESSAGE"; + case DISPLAY_NOTIFY_MESSAGE: + return "DISPLAY_NOTIFY_MESSAGE"; + case ACTIVATE_CALL_PLANE_MESSAGE: + return "ACTIVATE_CALL_PLANE_MESSAGE"; + case DIALED_NUMBER_MESSAGE: + return "DIALED_NUMBER_MESSAGE"; + default: + if (!(tmp = ast_threadstorage_get(&message2str_threadbuf, MESSAGE2STR_BUFSIZE))) + return "Unknown"; + snprintf(tmp, MESSAGE2STR_BUFSIZE, "UNKNOWN_MESSAGE-%d", type); + return tmp; + } +} +#endif + static int transmit_response(struct skinny_device *d, struct skinny_req *req) { struct skinnysession *s = d->session; @@ -1886,8 +2029,7 @@ static int transmit_response(struct skinny_device *d, struct skinny_req *req) ast_mutex_lock(&s->lock); - if (skinnydebug) - ast_log(LOG_VERBOSE, "writing packet type %04X (%d bytes) to socket %d\n", letohl(req->e), letohl(req->len)+8, s->fd); + SKINNY_DEVONLY(if (skinnydebug>1) ast_verb(4, "Transmitting %s to %s\n", message2str(req->e), d->name);) if (letohl(req->len > SKINNY_MAX_PACKET) || letohl(req->len < 0)) { ast_log(LOG_WARNING, "transmit_response: the length of the request is out of bounds\n"); @@ -2544,10 +2686,17 @@ static char *handle_skinny_set_debug(struct ast_cli_entry *e, int cmd, struct as { switch (cmd) { case CLI_INIT: - e->command = "skinny set debug {on|off}"; +#ifdef SKINNY_DEVMODE + e->command = "skinny set debug {off|on|packet}"; e->usage = - "Usage: skinny set debug {on|off}\n" + "Usage: skinny set debug {off|on|packet}\n" " Enables/Disables dumping of Skinny packets for debugging purposes\n"; +#else + e->command = "skinny set debug {off|on}"; + e->usage = + "Usage: skinny set debug {off|on}\n" + " Enables/Disables dumping of Skinny packets for debugging purposes\n"; +#endif return NULL; case CLI_GENERATE: return NULL; @@ -2564,6 +2713,12 @@ static char *handle_skinny_set_debug(struct ast_cli_entry *e, int cmd, struct as skinnydebug = 0; ast_cli(a->fd, "Skinny Debugging Disabled\n"); return CLI_SUCCESS; +#ifdef SKINNY_DEVMODE + } else if (!strncasecmp(a->argv[e->args - 1], "packet", 6)) { + skinnydebug = 2; + ast_cli(a->fd, "Skinny Debugging Enabled including Packets\n"); + return CLI_SUCCESS; +#endif } else { return CLI_SHOWUSAGE; } @@ -5552,6 +5707,10 @@ static int handle_message(struct skinny_req *req, struct skinnysession *s) return 0; } + SKINNY_DEVONLY(if (skinnydebug > 1) { + ast_verb(4, "Received %s from %s\n", message2str(req->e), s->device->name); + }) + switch(letohl(req->e)) { case KEEP_ALIVE_MESSAGE: res = handle_keep_alive_message(req, s);