summaryrefslogtreecommitdiff
path: root/net/asterisk/files/dtmf_debug.diff
diff options
context:
space:
mode:
Diffstat (limited to 'net/asterisk/files/dtmf_debug.diff')
-rw-r--r--net/asterisk/files/dtmf_debug.diff225
1 files changed, 225 insertions, 0 deletions
diff --git a/net/asterisk/files/dtmf_debug.diff b/net/asterisk/files/dtmf_debug.diff
new file mode 100644
index 000000000000..81205d40dd46
--- /dev/null
+++ b/net/asterisk/files/dtmf_debug.diff
@@ -0,0 +1,225 @@
+--- channels/chan_sip.c.orig 2008-03-18 16:42:59.000000000 +0200
++++ channels/chan_sip.c 2008-03-18 17:08:34.000000000 +0200
+@@ -3768,6 +3768,7 @@
+ ast_log(LOG_WARNING, "old channel wasn't %p but was %p\n", oldchan, p->owner);
+ else {
+ p->owner = newchan;
++ ast_rtp_set_chan_name(p->rtp, newchan->name);
+ ret = 0;
+ }
+ if (option_debug > 2)
+@@ -4032,6 +4035,7 @@
+ if (i->rtp) {
+ tmp->fds[0] = ast_rtp_fd(i->rtp);
+ tmp->fds[1] = ast_rtcp_fd(i->rtp);
++ ast_rtp_set_chan_id(i->rtp, i->callid);
+ }
+ if (needvideo && i->vrtp) {
+ tmp->fds[2] = ast_rtp_fd(i->vrtp);
+@@ -4059,6 +4063,8 @@
+ if (!ast_strlen_zero(i->language))
+ ast_string_field_set(tmp, language, i->language);
+ i->owner = tmp;
++ ast_rtp_set_chan_name(i->rtp, tmp->name);
++
+ ast_module_ref(ast_module_info->self);
+ ast_copy_string(tmp->context, i->context, sizeof(tmp->context));
+ /*Since it is valid to have extensions in the dialplan that have unescaped characters in them
+@@ -4479,8 +4485,10 @@
+ build_via(p);
+ if (!callid)
+ build_callid_pvt(p);
+- else
++ else {
+ ast_string_field_set(p, callid, callid);
++ ast_rtp_set_chan_id(p->rtp, p->callid);
++ }
+ /* Assign default music on hold class */
+ ast_string_field_set(p, mohinterpret, default_mohinterpret);
+ ast_string_field_set(p, mohsuggest, default_mohsuggest);
+--- include/asterisk/rtp.h.orig 2008-03-18 13:35:42.000000000 +0200
++++ include/asterisk/rtp.h 2008-03-18 13:35:58.000000000 +0200
+@@ -251,6 +251,9 @@
+
+ int ast_rtp_codec_getformat(int pt);
+
++void ast_rtp_set_chan_name(struct ast_rtp *, const char *);
++void ast_rtp_set_chan_id(struct ast_rtp *, const char *);
++
+ /*! \brief Set rtp timeout */
+ void ast_rtp_set_rtptimeout(struct ast_rtp *rtp, int timeout);
+ /*! \brief Set rtp hold timeout */
+--- main/rtp.c.orig 2008-04-08 14:53:18.000000000 +0300
++++ main/rtp.c 2008-04-08 14:54:14.000000000 +0300
+@@ -81,6 +81,7 @@
+ static int rtpstart; /*!< First port for RTP sessions (set in rtp.conf) */
+ static int rtpend; /*!< Last port for RTP sessions (set in rtp.conf) */
+ static int rtpdebug; /*!< Are we debugging? */
++static int rtpdebugdtmf; /*!< Are we debugging DTMFs? */
+ static int rtcpdebug; /*!< Are we debugging RTCP? */
+ static int rtcpstats; /*!< Are we debugging RTCP? */
+ static int rtcpinterval = RTCP_DEFAULT_INTERVALMS; /*!< Time between rtcp reports in millisecs */
+@@ -168,6 +169,8 @@
+ struct ast_codec_pref pref;
+ struct ast_rtp *bridged; /*!< Who we are Packet bridged to */
+ int set_marker_bit:1; /*!< Whether to set the marker bit or not */
++ char chan_name[100];
++ char chan_id[100];
+ };
+
+ /* Forward declarations */
+@@ -669,8 +672,8 @@
+ struct ast_frame *f = NULL;
+ event = ntohl(*((unsigned int *)(data)));
+ event &= 0x001F;
+- if (option_debug > 2 || rtpdebug)
+- ast_log(LOG_DEBUG, "Cisco DTMF Digit: %08x (len = %d)\n", event, len);
++ if (option_debug > 2 || rtpdebug || rtpdebugdtmf)
++ ast_log(LOG_DEBUG, "Channel: %s %s Cisco DTMF packet: %08x (len = %d)\n", rtp->chan_name, rtp->chan_id, event, len);
+ if (event < 10) {
+ resp = '0' + event;
+ } else if (event < 11) {
+@@ -684,12 +687,24 @@
+ }
+ if (rtp->resp && (rtp->resp != resp)) {
+ f = send_dtmf(rtp, AST_FRAME_DTMF_END);
++ ast_log(LOG_DEBUG, "Channel: %s %s Cisco DTMF event: %c\n", rtp->chan_name, rtp->chan_id, rtp->resp);
+ }
+ rtp->resp = resp;
+ rtp->dtmfcount = dtmftimeout;
+ return f;
+ }
+
++void ast_rtp_set_chan_id(struct ast_rtp *rtp, const char *chan_id) {
++ if (rtp == NULL || chan_id == NULL)
++ return;
++ snprintf(rtp->chan_id, sizeof(rtp->chan_id), "%s", chan_id);
++}
++
++void ast_rtp_set_chan_name(struct ast_rtp *rtp, const char *chan_name) {
++ if (rtp == NULL || chan_name == NULL)
++ return;
++ snprintf(rtp->chan_name, sizeof(rtp->chan_name), "%s", chan_name);
++}
+ /*!
+ * \brief Process RTP DTMF and events according to RFC 2833.
+ *
+@@ -1051,6 +1066,10 @@
+ struct rtpPayloadType rtpPT;
+ int reconstruct = ntohl(rtpheader[0]);
+
++ /* If we are listening for DTMF - then feed all packets into the core to keep the RTP stream consistent when relaying DTMFs */
++ if (ast_test_flag(rtp, FLAG_P2P_NEED_DTMF))
++ return -1;
++
+ /* Get fields from packet */
+ payload = (reconstruct & 0x7f0000) >> 16;
+ mark = (((reconstruct & 0x800000) >> 23) != 0);
+@@ -1062,10 +1081,6 @@
+ if (!bridged->current_RTP_PT[payload].code)
+ return -1;
+
+- /* If the payload is DTMF, and we are listening for DTMF - then feed it into the core */
+- if (ast_test_flag(rtp, FLAG_P2P_NEED_DTMF) && !rtpPT.isAstFormat && rtpPT.code == AST_RTP_DTMF)
+- return -1;
+-
+ /* Otherwise adjust bridged payload to match */
+ bridged_payload = ast_rtp_lookup_code(bridged, rtpPT.isAstFormat, rtpPT.code);
+
+@@ -1254,11 +1269,12 @@
+ /* This is special in-band data that's not one of our codecs */
+ if (rtpPT.code == AST_RTP_DTMF) {
+ /* It's special -- rfc2833 process it */
+- if (rtp_debug_test_addr(&sin)) {
++ if (rtp_debug_test_addr(&sin) || rtpdebugdtmf) {
+ unsigned char *data;
+ unsigned int event;
+ unsigned int event_end;
+ unsigned int duration;
++
+ data = rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen;
+ event = ntohl(*((unsigned int *)(data)));
+ event >>= 24;
+@@ -1267,9 +1283,12 @@
+ event_end >>= 24;
+ duration = ntohl(*((unsigned int *)(data)));
+ duration &= 0xFFFF;
+- ast_verbose("Got RTP RFC2833 from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d) \n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), payloadtype, seqno, timestamp, res - hdrlen, (mark?1:0), event, ((event_end & 0x80)?1:0), duration);
++
++ ast_verbose("Channel: %s %s Got RTP RFC2833 from %s:%u to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u, mark %d, event %08x, end %d, duration %-5.5d)\n", rtp->chan_name, rtp->chan_id, ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), ast_inet_ntoa(rtp->us.sin_addr), ntohs(rtp->us.sin_port), payloadtype, seqno, timestamp, res - hdrlen, (mark?1:0), event, ((event_end & 0x80)?1:0), duration);
+ }
+ f = process_rfc2833(rtp, rtp->rawdata + AST_FRIENDLY_OFFSET + hdrlen, res - hdrlen, seqno, timestamp);
++ if (rtpdebugdtmf && f)
++ ast_verbose("Channel: %s %s Got RFC2833 DTMF event %c of type %s\n", rtp->chan_name, rtp->chan_id, f->subclass, (f->frametype == AST_FRAME_DTMF_BEGIN ? "DTMF BEGIN" : (f->frametype == AST_FRAME_DTMF_END ? "DTMF_END" : "UNKNOWN")));
+ } else if (rtpPT.code == AST_RTP_CISCO_DTMF) {
+ /* It's really special -- process it the Cisco way */
+ if (rtp->lastevent <= seqno || (rtp->lastevent >= 65530 && seqno <= 6)) {
+@@ -2198,8 +2217,9 @@
+ ast_log(LOG_ERROR, "RTP Transmission error to %s:%u: %s\n",
+ ast_inet_ntoa(rtp->them.sin_addr),
+ ntohs(rtp->them.sin_port), strerror(errno));
+- if (rtp_debug_test_addr(&rtp->them))
+- ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
++ if (rtp_debug_test_addr(&rtp->them) || rtpdebugdtmf)
++ ast_verbose("Channel: %s %s Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
++ rtp->chan_name, rtp->chan_id,
+ ast_inet_ntoa(rtp->them.sin_addr),
+ ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
+ /* Increment sequence number */
+@@ -2242,8 +2262,9 @@
+ ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n",
+ ast_inet_ntoa(rtp->them.sin_addr),
+ ntohs(rtp->them.sin_port), strerror(errno));
+- if (rtp_debug_test_addr(&rtp->them))
+- ast_verbose("Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
++ if (rtp_debug_test_addr(&rtp->them) || rtpdebugdtmf)
++ ast_verbose("Channel: %s %s Sent RTP DTMF packet to %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
++ rtp->chan_name, rtp->chan_id,
+ ast_inet_ntoa(rtp->them.sin_addr),
+ ntohs(rtp->them.sin_port), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
+
+@@ -3481,6 +3502,16 @@
+ return RESULT_SUCCESS;
+ }
+
++static int rtp_do_debug_dtmf(int fd, int argc, char *argv[])
++{
++ if (argc != 3)
++ return RESULT_SHOWUSAGE;
++
++ rtpdebugdtmf = 1;
++ ast_cli(fd, "RTP DTMF debugging enabled\n");
++ return RESULT_SUCCESS;
++}
++
+ static int rtp_do_debug(int fd, int argc, char *argv[])
+ {
+ if (argc != 2) {
+@@ -3541,6 +3572,7 @@
+ if (argc != 3)
+ return RESULT_SHOWUSAGE;
+ rtpdebug = 0;
++ rtpdebugdtmf = 0;
+ ast_cli(fd,"RTP Debugging Disabled\n");
+ return RESULT_SUCCESS;
+ }
+@@ -3601,7 +3633,7 @@
+ }
+
+ static char debug_usage[] =
+- "Usage: rtp debug [ip host[:port]]\n"
++ "Usage: rtp debug [ip host[:port] | dtmf]\n"
+ " Enable dumping of all RTP packets to and from host.\n";
+
+ static char no_debug_usage[] =
+@@ -3676,6 +3708,10 @@
+ rtp_do_debug, "Enable RTP debugging",
+ debug_usage },
+
++ { { "rtp", "debug", "dtmf", NULL },
++ rtp_do_debug_dtmf, "Enable RTP debugging on DTMFs",
++ debug_usage },
++
+ { { "rtp", "debug", "off", NULL },
+ rtp_no_debug, "Disable RTP debugging",
+ no_debug_usage, NULL, &cli_rtp_no_debug_deprecated },