[asterisk-commits] jdixon: branch jdixon/chan_usbradio-1.4 r143467 - /team/jdixon/chan_usbradio-...

SVN commits to the Asterisk project asterisk-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 asterisk-commits mailing list