[libpri-commits] mattf: trunk r486 - /trunk/

SVN commits to the libpri project libpri-commits at lists.digium.com
Wed Nov 21 15:49:30 CST 2007


Author: mattf
Date: Wed Nov 21 15:49:30 2007
New Revision: 486

URL: http://svn.digium.com/view/libpri?view=rev&rev=486
Log:
Add BRI support to libpri

Modified:
    trunk/libpri.h
    trunk/pri.c
    trunk/pri_internal.h
    trunk/pritest.c
    trunk/q921.c
    trunk/q931.c

Modified: trunk/libpri.h
URL: http://svn.digium.com/view/libpri/trunk/libpri.h?view=diff&rev=486&r1=485&r2=486
==============================================================================
--- trunk/libpri.h (original)
+++ trunk/libpri.h Wed Nov 21 15:49:30 2007
@@ -421,7 +421,7 @@
    must be NON-BLOCKING! Frames received on the fd should include FCS.  Nodetype 
    must be one of PRI_NETWORK or PRI_CPE.  switchtype should be PRI_SWITCH_* */
 extern struct pri *pri_new(int fd, int nodetype, int switchtype);
-extern struct pri *pri_new_bri(int fd, int nodetype, int switchtype);
+extern struct pri *pri_new_bri(int fd, int ptpmode, int nodetype, int switchtype);
 
 /* Create D-channel just as above with user defined I/O callbacks and data */
 extern struct pri *pri_new_cb(int fd, int nodetype, int switchtype, pri_io_cb io_read, pri_io_cb io_write, void *userdata);

Modified: trunk/pri.c
URL: http://svn.digium.com/view/libpri/trunk/pri.c?view=diff&rev=486&r1=485&r2=486
==============================================================================
--- trunk/pri.c (original)
+++ trunk/pri.c Wed Nov 21 15:49:30 2007
@@ -187,12 +187,13 @@
 	return res;
 }
 
-struct pri *__pri_new_tei(int fd, int node, int switchtype, struct pri *master, pri_io_cb rd, pri_io_cb wr, void *userdata, int tei)
+struct pri *__pri_new_tei(int fd, int node, int switchtype, struct pri *master, pri_io_cb rd, pri_io_cb wr, void *userdata, int tei, int bri)
 {
 	struct pri *p;
 	p = malloc(sizeof(struct pri));
 	if (p) {
 		memset(p, 0, sizeof(struct pri));
+		p->bri = bri;
 		p->fd = fd;
 		p->read_func = rd;
 		p->write_func = wr;
@@ -223,7 +224,7 @@
 			p->protodisc = GR303_PROTOCOL_DISCRIMINATOR;
 			p->sapi = Q921_SAPI_GR303_EOC;
 			p->tei = Q921_TEI_GR303_EOC_OPS;
-			p->subchannel = __pri_new_tei(-1, node, PRI_SWITCH_GR303_EOC_PATH, p, NULL, NULL, NULL, Q921_TEI_GR303_EOC_PATH);
+			p->subchannel = __pri_new_tei(-1, node, PRI_SWITCH_GR303_EOC_PATH, p, NULL, NULL, NULL, Q921_TEI_GR303_EOC_PATH, 0);
 			if (!p->subchannel) {
 				free(p);
 				p = NULL;
@@ -232,7 +233,7 @@
 			p->protodisc = GR303_PROTOCOL_DISCRIMINATOR;
 			p->sapi = Q921_SAPI_GR303_TMC_CALLPROC;
 			p->tei = Q921_TEI_GR303_TMC_CALLPROC;
-			p->subchannel = __pri_new_tei(-1, node, PRI_SWITCH_GR303_TMC_SWITCHING, p, NULL, NULL, NULL, Q921_TEI_GR303_TMC_SWITCHING);
+			p->subchannel = __pri_new_tei(-1, node, PRI_SWITCH_GR303_TMC_SWITCHING, p, NULL, NULL, NULL, Q921_TEI_GR303_TMC_SWITCHING, 0);
 			if (!p->subchannel) {
 				free(p);
 				p = NULL;
@@ -276,12 +277,15 @@
 
 struct pri *pri_new(int fd, int nodetype, int switchtype)
 {
-	return __pri_new_tei(fd, nodetype, switchtype, NULL, __pri_read, __pri_write, NULL, Q921_TEI_PRI);
-}
-
-struct pri *pri_new_bri(int fd, int nodetype, int switchtype)
-{
-	return __pri_new_tei(fd, nodetype, switchtype, NULL, __pri_read, __pri_write, NULL, Q921_TEI_GROUP);
+	return __pri_new_tei(fd, nodetype, switchtype, NULL, __pri_read, __pri_write, NULL, Q921_TEI_PRI, 0);
+}
+
+struct pri *pri_new_bri(int fd, int ptpmode, int nodetype, int switchtype)
+{
+	if (ptpmode)
+		return __pri_new_tei(fd, nodetype, switchtype, NULL, __pri_read, __pri_write, NULL, Q921_TEI_PRI, 1);
+	else
+		return __pri_new_tei(fd, nodetype, switchtype, NULL, __pri_read, __pri_write, NULL, Q921_TEI_GROUP, 1);
 }
 
 struct pri *pri_new_cb(int fd, int nodetype, int switchtype, pri_io_cb io_read, pri_io_cb io_write, void *userdata)
@@ -290,7 +294,7 @@
 		io_read = __pri_read;
 	if (!io_write)
 		io_write = __pri_write;
-	return __pri_new_tei(fd, nodetype, switchtype, NULL, io_read, io_write, userdata, Q921_TEI_PRI);
+	return __pri_new_tei(fd, nodetype, switchtype, NULL, io_read, io_write, userdata, Q921_TEI_PRI, 0);
 }
 
 void *pri_get_userdata(struct pri *pri)

Modified: trunk/pri_internal.h
URL: http://svn.digium.com/view/libpri/trunk/pri_internal.h?view=diff&rev=486&r1=485&r2=486
==============================================================================
--- trunk/pri_internal.h (original)
+++ trunk/pri_internal.h Wed Nov 21 15:49:30 2007
@@ -61,6 +61,7 @@
 	int localtype;		/* Local network type (unknown, network, cpe) */
 	int remotetype;		/* Remote network type (unknown, network, cpe) */
 
+	int bri;
 	int sapi;
 	int tei;
 	int protodisc;
@@ -269,6 +270,6 @@
 
 void libpri_copy_string(char *dst, const char *src, size_t size);
 
-struct pri *__pri_new_tei(int fd, int node, int switchtype, struct pri *master, pri_io_cb rd, pri_io_cb wr, void *userdata, int tei);
+struct pri *__pri_new_tei(int fd, int node, int switchtype, struct pri *master, pri_io_cb rd, pri_io_cb wr, void *userdata, int tei, int bri);
 
 #endif

Modified: trunk/pritest.c
URL: http://svn.digium.com/view/libpri/trunk/pritest.c?view=diff&rev=486&r1=485&r2=486
==============================================================================
--- trunk/pritest.c (original)
+++ trunk/pritest.c Wed Nov 21 15:49:30 2007
@@ -294,7 +294,7 @@
 	fd_set rfds, efds;
 	int res,x;
 
-	pri = pri_new(dfd, node, swtype);
+	pri = pri_new_bri(dfd, 1, node, swtype);
 	if (!pri) {
 		fprintf(stderr, "Unable to create PRI\n");
 		return -1;

Modified: trunk/q921.c
URL: http://svn.digium.com/view/libpri/trunk/q921.c?view=diff&rev=486&r1=485&r2=486
==============================================================================
--- trunk/q921.c (original)
+++ trunk/q921.c Wed Nov 21 15:49:30 2007
@@ -799,7 +799,7 @@
 			if(sub->subchannel->tei == tei)
 				++tei;
 		}
-		sub->subchannel = __pri_new_tei(-1, pri->localtype, pri->switchtype, pri, NULL, NULL, NULL, tei);
+		sub->subchannel = __pri_new_tei(-1, pri->localtype, pri->switchtype, pri, NULL, NULL, NULL, tei, 1);
 		if (!sub->subchannel) {
 			pri_error(pri, "Unable to allocate D-channel for new TEI %d\n", tei);
 			return NULL;
@@ -819,7 +819,7 @@
 			pri_error(pri, "TEI already assigned (new is %d, current is %d)\n", tei, pri->subchannel->tei);
 		}
 		pri_message(pri, "TEI assiged to %d\n", tei);
-		pri->subchannel = __pri_new_tei(-1, pri->localtype, pri->switchtype, pri, NULL, NULL, NULL, tei);
+		pri->subchannel = __pri_new_tei(-1, pri->localtype, pri->switchtype, pri, NULL, NULL, NULL, tei, 1);
 		if (!pri->subchannel) {
 			pri_error(pri, "Unable to allocate D-channel for new TEI %d\n", tei);
 			return NULL;

Modified: trunk/q931.c
URL: http://svn.digium.com/view/libpri/trunk/q931.c?view=diff&rev=486&r1=485&r2=486
==============================================================================
--- trunk/q931.c (original)
+++ trunk/q931.c Wed Nov 21 15:49:30 2007
@@ -294,15 +294,22 @@
  	}
 #endif
 #ifndef NOAUTO_CHANNEL_SELECTION_SUPPORT
-	switch (ie->data[0] & 3) {
-		case 0:
+	if (pri->bri) {
+		if (!(ie->data[0] & 3))
 			call->justsignalling = 1;
-			break;
-		case 1:
-			break;
-		default:
-			pri_error(pri, "!! Unexpected Channel selection %d\n", ie->data[0] & 3);
-			return -1;
+		else
+			call->channelno = ie->data[0] & 3;
+	} else {
+		switch (ie->data[0] & 3) {
+			case 0:
+				call->justsignalling = 1;
+				break;
+			case 1:
+				break;
+			default:
+				pri_error(pri, "!! Unexpected Channel selection %d\n", ie->data[0] & 3);
+				return -1;
+		}
 	}
 #endif
 	if (ie->data[0] & 0x08)
@@ -366,7 +373,11 @@
 	/* Start with standard stuff */
 	if (pri->switchtype == PRI_SWITCH_GR303_TMC)
 		ie->data[pos] = 0x69;
-	else
+	else if (pri->bri) {
+		ie->data[pos] = 0x80;
+		if (call->channelno > -1)
+			ie->data[pos] |= (call->channelno & 0x3);
+	} else
 		ie->data[pos] = 0xa1;
 	/* Add exclusive flag if necessary */
 	if (call->chanflags & FLAG_EXCLUSIVE)
@@ -383,6 +394,10 @@
 		ie->data[pos++] = 0x80 | call->ds1no;
 	} else
 		pos++;
+
+	if (pri->bri)
+		return pos + 2;
+
 	if ((call->channelno > -1) || (call->slotmap != -1)) {
 		/* We'll have the octet 8.2 and 8.3's present */
 		ie->data[pos++] = 0x83;
@@ -2375,26 +2390,40 @@
 {
 	/* Returns header and message header and modifies length in place */
 	q931_h *h = (q931_h *)buf;
-	q931_mh * mh = (q931_mh *)(h->contents + 2);
+	q931_mh * mh;
 	h->pd = pri->protodisc;
 	h->x0 = 0;		/* Reserved 0 */
-	h->crlen = 2;	/* Two bytes of Call Reference.  Invert the top bit to make it from our sense */
-	if (call->cr || call->forceinvert) {
-		h->crv[0] = ((call->cr ^ 0x8000) & 0xff00) >> 8;
-		h->crv[1] = (call->cr & 0xff);
+	if (!pri->bri) {
+		h->crlen = 2;	/* Two bytes of Call Reference.  Invert the top bit to make it from our sense */
+		if (call->cr || call->forceinvert) {
+			h->crv[0] = ((call->cr ^ 0x8000) & 0xff00) >> 8;
+			h->crv[1] = (call->cr & 0xff);
+		} else {
+			/* Unless of course this has no call reference */
+			h->crv[0] = 0;
+			h->crv[1] = 0;
+		}
+		if (pri->subchannel) {
+			/* On GR-303, top bit is always 0 */
+			h->crv[0] &= 0x7f;
+		}
 	} else {
-		/* Unless of course this has no call reference */
-		h->crv[0] = 0;
-		h->crv[1] = 0;
-	}
-	if (pri->subchannel) {
-		/* On GR-303, top bit is always 0 */
-		h->crv[0] &= 0x7f;
-	}
+		h->crlen = 1;
+		if (call->cr || call->forceinvert) {
+			h->crv[0] = (((call->cr ^ 0x8000) & 0x8000) >> 8) | (call->cr & 0x7f);
+		} else {
+			/* Unless of course this has no call reference */
+			h->crv[0] = 0;
+		}
+	}
+	mh = (q931_mh *)(h->contents + h->crlen);
 	mh->f = 0;
 	*hb = h;
 	*mhb = mh;
-	*len -= 5;
+	if (h->crlen == 2)
+		*len -= 5;
+	else
+		*len -= 4;
 	
 }
 




More information about the libpri-commits mailing list