[asterisk-commits] tzafrir: branch tzafrir/monitor-rtp r214077 - /team/tzafrir/monitor-rtp/res/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Aug 25 14:56:12 CDT 2009
Author: tzafrir
Date: Tue Aug 25 14:56:08 2009
New Revision: 214077
URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=214077
Log:
send dummy SIP packet with metadata on startup/end
On stream startup send a SIP INVITE message and on stream end send a BYE
message.
Each of those include practically the same data and are intended to pass
information about the stream to the remote party. The remote recording
server is not expected to respond to those messages.
This method is used to pass CDR information to the remote side.
Currrently
only src, dst, and clid are passed along.
Also note that unlike any standard SIP call, a separate INVITE/BYE pair
will be used for any separate direction (tx, rx) of the channel.
Modified:
team/tzafrir/monitor-rtp/res/res_monitor.c
Modified: team/tzafrir/monitor-rtp/res/res_monitor.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/tzafrir/monitor-rtp/res/res_monitor.c?view=diff&rev=214077&r1=214076&r2=214077
==============================================================================
--- team/tzafrir/monitor-rtp/res/res_monitor.c (original)
+++ team/tzafrir/monitor-rtp/res/res_monitor.c Tue Aug 25 14:56:08 2009
@@ -358,6 +358,126 @@
return fs;
}
+#ifdef RTP_MONITOR_DEBUG
+static const char *cdr_readonly_vars[] = { "clid", "src", "dst", "dcontext", "channel", "dstchannel",
+ "lastapp", "lastdata", "start", "answer", "end", "duration",
+ "billsec", "disposition", "amaflags", "accountcode", "uniqueid",
+ "userfield", NULL };
+#endif /* ifdef RTP_MONITOR_DEBUG */
+
+static int send_cdr(struct ast_channel *chan, int begin, int is_rx, struct monitor_rtp_state *rtp_state)
+{
+ char *src;
+ char *dst;
+ char *clid;
+ char srcbuf[BUFSIZ];
+ char dstbuf[BUFSIZ];
+ char clidbuf[BUFSIZ];
+ char header[BUFSIZ];
+ char payload[BUFSIZ];
+ char packet[BUFSIZ];
+ struct sockaddr_in my_addr;
+ char my_ip[INET_ADDRSTRLEN + 1];
+ in_port_t rtp_port = rtp_state->dest.sin_port;
+ struct ast_cdr *cdr = chan ? chan->cdr : NULL;
+ int content_length;
+ int i;
+
+ if (!cdr)
+ return -1;
+ ast_log(LOG_NOTICE, "%s-%s(%d): %s\n",
+ (begin) ? "BEGIN" : "END",
+ (is_rx) ? "RX" : "TX",
+ ntohs(rtp_port),
+ chan->uniqueid);
+#if 0
+ /* Debugging code */
+ {
+ char buf[BUFSIZ];
+
+ buf[0] = '\0';
+ ast_cdr_serialize_variables(cdr, buf, sizeof(buf), '\t', '\n', 1);
+ ast_log(LOG_NOTICE, "%s\n", buf);
+ }
+#endif
+#ifdef RTP_MONITOR_DEBUG
+ {
+ char buf[BUFSIZ];
+ int len = sizeof(buf);
+
+ for(i = 0; cdr_readonly_vars[i]; i++) {
+ buf[0] = '\0';
+ ast_cdr_getvar(cdr, cdr_readonly_vars[i], &ret, buf, len, 0, 0);
+ if(ret) {
+ ast_log(LOG_NOTICE, "%-20s - '%s'\n",
+ cdr_readonly_vars[i], ret);
+ }
+ }
+ }
+#endif /* ifdef RTP_MONITOR_DEBUG */
+ if(!get_ipaddr(reporting_host, &(my_addr.sin_addr))) {
+ ast_log(LOG_WARNING, "Bad reporting_host: '%s'\n", reporting_host);
+ return -1;
+ }
+ if(inet_ntop(AF_INET, &my_addr.sin_addr, my_ip, sizeof(my_ip)) == NULL) {
+ ast_log(LOG_WARNING, "Cannot convert ip address: %s\n", strerror(errno));
+ return -1;
+ }
+ ast_cdr_getvar(cdr, "src", &src, srcbuf, sizeof(srcbuf), 0, 0);
+ ast_cdr_getvar(cdr, "dst", &dst, dstbuf, sizeof(dstbuf), 0, 0);
+ ast_cdr_getvar(cdr, "clid", &clid, clidbuf, sizeof(clidbuf), 0, 0);
+ if(begin) {
+ snprintf(payload, sizeof(payload),
+ "v=0\r\n"
+ "o=asterisk %s 1 IN IP4 %s\r\n"
+ "c=IN IP4 %s\r\n"
+ "s=Phone recording (%s)\r\n"
+ "i=Asterisk Monitor (pid=%d)\r\n"
+ "m=audio %d RTP/AVP 0 \r\n"
+ "a=rtpmap:0 PCMU/8000\r\n",
+ chan->uniqueid, my_ip,
+ my_ip,
+ (is_rx) ? "RX" : "TX",
+ getpid(),
+ ntohs(rtp_port));
+ } else
+ payload[0] = '\0';
+ content_length = strlen(payload);
+ i = 0;
+ i += snprintf(header + i, sizeof(header) - i,
+ "%s sip:%s@%s:5060 SIP/2.0\r\n",
+ (begin) ? "INVITE" : "BYE",
+ srcbuf, my_ip);
+ i += snprintf(header + i, sizeof(header) - i,
+ "Via: SIP/2.0/UDP %s:5061;branch=z9hG4bK-%s\r\n",
+ my_ip, chan->uniqueid);
+ i += snprintf(header + i, sizeof(header) - i, "From: <sip:%s@%s:5061>;tag=1\r\n", src, my_ip);
+ i += snprintf(header + i, sizeof(header) - i, "To: <sip:%s@%s:5060>\r\n", dst, my_ip);
+ i += snprintf(header + i, sizeof(header) - i, "Call-ID: %s\r\n", chan->uniqueid);
+ i += snprintf(header + i, sizeof(header) - i, "CSeq: 1 %s\r\n", (begin) ? "INVITE" : "BYE");
+ i += snprintf(header + i, sizeof(header) - i,
+ "Contact: sip:asterisk@%s:5061\r\n"
+ "Max-Forwards: 70\r\n"
+ "Subject: %s %s recording of %s\r\n",
+ my_ip,
+ (begin) ? "BEGIN" : "END",
+ (is_rx) ? "RX" : "TX",
+ clid);
+ if(begin) {
+ i += snprintf(header + i, sizeof(header) - i, "Content-Type: application/sdp\r\n");
+ }
+ i += snprintf(header + i, sizeof(header) - i, "Content-Length: %d\r\n", content_length);
+ i = snprintf(packet, sizeof(packet), "%s\r\n%s", header, payload);
+ ast_log(LOG_WARNING, "SIP header: %s\n", header);
+ ast_log(LOG_WARNING, "SIP payload: %s\n", payload);
+ ast_log(LOG_WARNING, "SIP packet: %s\n", packet);
+ if(sendto(sip_socket, packet, i, 0, &sip_server_addr, sizeof(sip_server_addr)) < 0) {
+ ast_log(LOG_WARNING, "Bad SIP sendto (%d bytes): %s\n", i, strerror(errno));
+ return -1;
+ }
+ return 0;
+}
+
/*! \brief Start monitoring a channel
* \param chan ast_channel struct to record
* \param format_spec file format to use for recording
More information about the asterisk-commits
mailing list