[svn-commits] jdixon: branch jdixon/chan_usbradio-1.4 r143467 - /team/jdixon/chan_usbradio-...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Wed Sep 17 23:04:41 CDT 2008
Author: jdixon
Date: Wed Sep 17 23:04:40 2008
New Revision: 143467
URL: http://svn.digium.com/view/asterisk?view=rev&rev=143467
Log:
Fixed weird problem with 2 asterisks talking over IRLP
Modified:
team/jdixon/chan_usbradio-1.4/channels/chan_irlp.c
Modified: team/jdixon/chan_usbradio-1.4/channels/chan_irlp.c
URL: http://svn.digium.com/view/asterisk/team/jdixon/chan_usbradio-1.4/channels/chan_irlp.c?view=diff&rev=143467&r1=143466&r2=143467
==============================================================================
--- team/jdixon/chan_usbradio-1.4/channels/chan_irlp.c (original)
+++ team/jdixon/chan_usbradio-1.4/channels/chan_irlp.c Wed Sep 17 23:04:40 2008
@@ -31,7 +31,7 @@
/*** MODULEINFO
***/
-/* Version 0.12, 9/15/2008
+/* Version 0.13, 9/17/2008
irlp channel driver for Asterisk/app_rpt.
I wish to thank the following people for the immeasurable amount of
@@ -449,6 +449,85 @@
return 0;
memcpy(pkt,zp,l);
return l;
+}
+
+static int rtcp_make_bye(unsigned char *p, char *reason)
+{
+ struct rtcp_t *rp;
+ unsigned char *ap, *zp;
+ int l, hl, pl;
+
+ zp = p;
+ hl = 0;
+
+ *p++ = 0x40;
+ *p++ = 201;
+ *p++ = 0;
+ *p++ = 1;
+ *((long *) p) = htonl(0x0310f987);
+ p += 4;
+ hl = 8;
+
+ rp = (struct rtcp_t *)p;
+ *((short *) p) = htons((2 << 14) | 203 | (1 << 8));
+ rp->r.bye.src[0] = htonl(0x0310f987);
+ ap = (unsigned char *) rp->r.sdes.item;
+ l = 0;
+ if (reason != NULL) {
+ l = strlen(reason);
+ if (l > 0) {
+ *ap++ = l;
+ memcpy(ap,reason,l);
+ ap += l;
+ }
+ }
+ while ((ap - p) & 3)
+ *ap++ = 0;
+ l = ap - p;
+ rp->common.length = htons((l / 4) - 1);
+ l = hl + ((ntohs(rp->common.length) + 1) * 4);
+
+ pl = (l & 4) ? l : l + 4;
+ if (pl > l) {
+ int pad = pl - l;
+ memset(zp + l, '\0', pad);
+ zp[pl - 1] = pad;
+ p[0] |= 0x20;
+ rp->common.length = htons(ntohs(rp->common.length) + ((pad) / 4));
+ l = pl;
+ }
+ return l;
+}
+
+static void send_bye(char *reason)
+{
+char buf[200],*cp,ipbuf[100];
+int len,x;
+struct sockaddr_in sin;
+
+ if (!*remote_irlp_node_ip)
+ {
+ cp = irlp_read_file(IRLP_ROOT,"calledip");
+ if (!cp) return;
+ if (cp[strlen(cp) - 1] == '\n')
+ cp[strlen(cp) - 1] = 0;
+ strncpy(ipbuf,cp,sizeof(ipbuf) - 1);
+ free(cp);
+ }
+ else
+ {
+ strncpy(ipbuf,remote_irlp_node_ip,sizeof(buf) - 1);
+ }
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = inet_addr(ipbuf);
+ sin.sin_port = htons(tx_audio_port + 1);
+ len = rtcp_make_bye((unsigned char *)buf,reason);
+ for(x = 0; x < 1; x++)
+ {
+ sendto((alt_ctrl_sock != -1) ? alt_ctrl_sock : ctrl_sock,buf,len,
+ 0,(struct sockaddr *)&sin,sizeof(struct sockaddr));
+ }
+ return;
}
static void send_keepalive(void)
@@ -907,6 +986,7 @@
{
struct irlp_pvt *p;
p = ast->tech_pvt;
+
if (option_debug)
ast_log(LOG_DEBUG, "irlp_hangup(%s)\n", ast->name);
if (!ast->tech_pvt) {
@@ -914,11 +994,15 @@
return 0;
}
reset_stuff();
+ irlp_destroy(p);
+ curcall = 0;
+ if (ast)
+ {
+ ast->tech_pvt = NULL;
+ ast_setstate(ast, AST_STATE_DOWN);
+ }
ast_safe_system(IRLP_END);
- irlp_destroy(p);
- ast->tech_pvt = NULL;
- ast_setstate(ast, AST_STATE_DOWN);
- curcall = 0;
+ send_bye("disconnected");
return 0;
}
More information about the svn-commits
mailing list