[libpri-commits] rmudgett: branch 1.4 r794 - in /branches/1.4: pri_internal.h pri_q931.h q931.c

SVN commits to the libpri project libpri-commits at lists.digium.com
Thu May 7 11:21:28 CDT 2009


Author: rmudgett
Date: Thu May  7 11:21:24 2009
New Revision: 794

URL: http://svn.asterisk.org/svn-view/libpri?view=rev&rev=794
Log:
Minor code clean up.

Modified:
    branches/1.4/pri_internal.h
    branches/1.4/pri_q931.h
    branches/1.4/q931.c

Modified: branches/1.4/pri_internal.h
URL: http://svn.asterisk.org/svn-view/libpri/branches/1.4/pri_internal.h?view=diff&rev=794&r1=793&r2=794
==============================================================================
--- branches/1.4/pri_internal.h (original)
+++ branches/1.4/pri_internal.h Thu May  7 11:21:24 2009
@@ -177,7 +177,6 @@
 struct q931_call {
 	struct pri *pri;	/* PRI */
 	int cr;				/* Call Reference */
-	int forceinvert;	/* Force inversion of call number even if 0 */
 	q931_call *next;
 	/* Slotmap specified (bitmap of channels 31/24-1) (Channel Identifier IE) (-1 means not specified) */
 	int slotmap;
@@ -270,7 +269,7 @@
 	unsigned int rlt_call_id;	/* RLT call id */
 
 	/* Bridged call info */
-	q931_call *bridged_call;        /* Pointer to other leg of bridged call */
+	q931_call *bridged_call;        /* Pointer to other leg of bridged call (Used by Q.SIG when eliminating tromboned calls) */
 
 	int changestatus;		/* SERVICE message changestatus */
 };

Modified: branches/1.4/pri_q931.h
URL: http://svn.asterisk.org/svn-view/libpri/branches/1.4/pri_q931.h?view=diff&rev=794&r1=793&r2=794
==============================================================================
--- branches/1.4/pri_q931.h (original)
+++ branches/1.4/pri_q931.h Thu May  7 11:21:24 2009
@@ -29,44 +29,6 @@
  
 #ifndef _PRI_Q931_H
 #define _PRI_Q931_H
-
-typedef enum q931_state {
-	/* User states */
-	U0_NULL_STATE,
-	U1_CALL_INITIATED,
-	U2_OVERLAP_SENDING,
-	U3_OUTGOING_CALL_PROCEEDING,
-	U4_CALL_DELIVERED,
-	U6_CALL_PRESENT,
-	U7_CALL_RECEIVED,
-	U8_CONNECT_REQUEST,
-	U9_INCOMING_CALL_PROCEEDING,
-	U10_ACTIVE,
-	U11_DISCONNECT_REQUEST,
-	U12_DISCONNECT_INDICATION,
-	U15_SUSPEND_REQUEST,
-	U17_RESUME_REQUEST,
-	U19_RELEASE_REQUEST,
-	U25_OVERLAP_RECEIVING,
-	/* Network states */
-	N0_NULL_STATE,
-	N1_CALL_INITIATED,
-	N2_OVERLAP_SENDING,
-	N3_OUTGOING_CALL_PROCEEDING,
-	N4_CALL_DELIVERED,
-	N6_CALL_PRESENT,
-	N7_CALL_RECEIVED,
-	N8_CONNECT_REQUEST,
-	N9_INCOMING_CALL_PROCEEDING,
-	N10_ACTIVE,
-	N11_DISCONNECT_REQUEST,
-	N12_DISCONNECT_INDICATION,
-	N15_SUSPEND_REQUEST,
-	N17_RESUME_REQUEST,
-	N19_RELEASE_REQUEST,
-	N22_CALL_ABORT,
-	N25_OVERLAP_RECEIVING
-} q931_state;
 
 typedef enum q931_mode {
 	UNKNOWN_MODE,

Modified: branches/1.4/q931.c
URL: http://svn.asterisk.org/svn-view/libpri/branches/1.4/q931.c?view=diff&rev=794&r1=793&r2=794
==============================================================================
--- branches/1.4/q931.c (original)
+++ branches/1.4/q931.c Thu May  7 11:21:24 2009
@@ -274,17 +274,6 @@
 	default:
 		return "UNKNOWN";
 	}
-}
-
-static void call_init(struct q931_call *c)
-{
-	c->forceinvert = -1;	
-	c->cr = -1;
-	c->slotmap = -1;
-	c->channelno = -1;
-	c->newcall = 1;
-	c->ourcallstate = Q931_CALL_STATE_NULL;
-	c->peercallstate = Q931_CALL_STATE_NULL;
 }
 
 static char *binary(int b, int len) {
@@ -2352,52 +2341,65 @@
 	pri_error(pri, "!! %c Unknown IE %d (cs%d, len = %d)\n", prefix, Q931_IE_IE(base_ie), Q931_IE_CODESET(base_ie), ielen(ie));
 }
 
-static q931_call *q931_getcall(struct pri *pri, int cr, int outboundnew)
-{
-	q931_call *cur, *prev;
+static q931_call *q931_getcall(struct pri *ctrl, int cr)
+{
+	q931_call *cur;
+	q931_call *prev;
 	struct pri *master;
 
 	/* Find the master  - He has the call pool */
-	if (pri->master)
-		master = pri->master;
-	else
-		master = pri;
-	
+	if (ctrl->master) {
+		master = ctrl->master;
+	} else {
+		master = ctrl;
+	}
+
 	cur = *master->callpool;
 	prev = NULL;
-	while(cur) {
-		if (cur->cr == cr)
+	while (cur) {
+		if (cur->cr == cr) {
 			return cur;
+		}
 		prev = cur;
 		cur = cur->next;
 	}
+
 	/* No call exists, make a new one */
-	if (pri->debug & PRI_DEBUG_Q931_STATE)
-		pri_message(pri, "-- Making new call for cr %d\n", cr);
-	
-	if (!(cur = calloc(1, sizeof(*cur))))
+	if (ctrl->debug & PRI_DEBUG_Q931_STATE) {
+		pri_message(ctrl, "-- Making new call for cr %d\n", cr);
+	}
+
+	cur = calloc(1, sizeof(*cur));
+	if (!cur) {
 		return NULL;
-
-	call_init(cur);
-	/* Call reference */
+	}
+
+	/* Initialize call structure. */
 	cur->cr = cr;
+	cur->slotmap = -1;
+	cur->channelno = -1;
+	cur->newcall = 1;
+	cur->ourcallstate = Q931_CALL_STATE_NULL;
+	cur->peercallstate = Q931_CALL_STATE_NULL;
+
 	/* PRI is set to whoever called us */
-	if (pri->bri && (pri->localtype == PRI_CPE)) {
+	if (ctrl->bri && (ctrl->localtype == PRI_CPE)) {
 		/*
 		 * Point to the master to avoid stale pointer problems if
 		 * the TEI is removed later.
 		 */
 		cur->pri = master;
 	} else {
-		cur->pri = pri;
+		cur->pri = ctrl;
 	}
 
 	/* Append to end of list */
-	if (prev)
+	if (prev) {
 		prev->next = cur;
-	else
+	} else {
 		*master->callpool = cur;
-	
+	}
+
 	return cur;
 }
 
@@ -2422,7 +2424,7 @@
 		}
 	} while(cur);
 
-	return q931_getcall(pri, pri->cref | 0x8000, 1);
+	return q931_getcall(pri, pri->cref | 0x8000);
 }
 
 static void q931_destroy(struct pri *pri, int cr, q931_call *c)
@@ -2454,17 +2456,17 @@
 	pri_error(pri, "Can't destroy call %d!\n", cr);
 }
 
-static void q931_destroycall(struct pri *pri, int cr)
-{
-	return q931_destroy(pri, cr, NULL);
-}
-
-
-void __q931_destroycall(struct pri *pri, q931_call *c) 
-{
-	if (pri && c)
-		q931_destroy(pri,0, c);
-	return;
+static void q931_destroycall(struct pri *ctrl, int cr)
+{
+	q931_destroy(ctrl, cr, NULL);
+}
+
+
+void __q931_destroycall(struct pri *ctrl, q931_call *call) 
+{
+	if (ctrl && call) {
+		q931_destroy(ctrl, 0, call);
+	}
 }
 
 static int add_ie(struct pri *pri, q931_call *call, int msgtype, int ie, q931_ie *iet, int maxlen, int *codeset)
@@ -2540,9 +2542,15 @@
 	int x=0, r;
 	int cur_codeset;
 	int codeset;
+	int cref;
+
 	c = txrx ? '>' : '<';
 	pri_message(pri, "%c Protocol Discriminator: %s (%d)  len=%d\n", c, disc2str(h->pd), h->pd, len);
-	pri_message(pri, "%c Call Ref: len=%2d (reference %d/0x%X) (%s)\n", c, h->crlen, q931_cr(h) & 0x7FFF, q931_cr(h) & 0x7FFF, (h->crv[0] & 0x80) ? "Terminator" : "Originator");
+	cref = q931_cr(h);
+	pri_message(pri, "%c Call Ref: len=%2d (reference %d/0x%X) (%s)\n",
+		c, h->crlen, cref & 0x7FFF, cref & 0x7FFF,
+		(cref & 0x8000) ? "Terminator" : "Originator");
+
 	/* Message header begins at the end of the call reference number */
 	mh = (q931_mh *)(h->contents + h->crlen);
 	if ((h->pd == MAINTENANCE_PROTOCOL_DISCRIMINATOR_1) || (h->pd == MAINTENANCE_PROTOCOL_DISCRIMINATOR_2)) {
@@ -2595,49 +2603,44 @@
 	return -1;
 }
 
-static void init_header(struct pri *pri, q931_call *call, unsigned char *buf, q931_h **hb, q931_mh **mhb, int *len, int protodisc)
-{
-	/* Returns header and message header and modifies length in place */
-	q931_h *h = (q931_h *)buf;
-	q931_mh * mh;
+/* Returns header and message header and modifies length in place */
+static void init_header(struct pri *ctrl, q931_call *call, unsigned char *buf, q931_h **hb, q931_mh **mhb, int *len, int protodisc)
+{
+	q931_h *h = (q931_h *) buf;
+	q931_mh *mh;
+	unsigned crv;
+
 	if (protodisc) {
 		h->pd = protodisc;
 	} else {
-		h->pd = pri->protodisc;
+		h->pd = ctrl->protodisc;
 	}
 	h->x0 = 0;		/* Reserved 0 */
-	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 && !pri->bri) {
+	if (!ctrl->bri) {
+		/* Two bytes of Call Reference. */
+		h->crlen = 2;
+		/* Invert the top bit to make it from our sense */
+		crv = (unsigned) call->cr;
+		h->crv[0] = ((crv >> 8) ^ 0x80) & 0xff;
+		h->crv[1] = crv & 0xff;
+		if (ctrl->subchannel && !ctrl->bri) {
 			/* On GR-303, top bit is always 0 */
 			h->crv[0] &= 0x7f;
 		}
 	} else {
 		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);
+		/* Invert the top bit to make it from our sense */
+		crv = (unsigned) call->cr;
+		h->crv[0] = (((crv >> 8) ^ 0x80) & 0x80) | (crv & 0x7f);
+	}
+	*hb = h;
+
+	*len -= 3;/* Protocol discriminator, call reference length, message type id */
+	*len -= h->crlen;
+
+	mh = (q931_mh *) (h->contents + h->crlen);
 	mh->f = 0;
-	*hb = h;
 	*mhb = mh;
-	if (h->crlen == 2)
-		*len -= 5;
-	else
-		*len -= 4;
-	
 }
 
 static int q931_xmit(struct pri *pri, q931_h *h, int len, int cr)
@@ -2654,7 +2657,7 @@
 	return 0;
 }
 
-static int send_message(struct pri *pri, q931_call *c, int msgtype, int ies[])
+static int send_message(struct pri *ctrl, q931_call *call, int msgtype, int ies[])
 {
 	unsigned char buf[1024];
 	q931_h *h;
@@ -2664,18 +2667,17 @@
 	int offset=0;
 	int x;
 	int codeset;
-	
+
 	memset(buf, 0, sizeof(buf));
 	len = sizeof(buf);
-	init_header(pri, c, buf, &h, &mh, &len, (msgtype >> 8));
+	init_header(ctrl, call, buf, &h, &mh, &len, (msgtype >> 8));
 	mh->msg = msgtype & 0x00ff;
 	x=0;
 	codeset = 0;
 	while(ies[x] > -1) {
-		res = add_ie(pri, c, mh->msg, ies[x], (q931_ie *)(mh->data + offset), len, &codeset);
-
+		res = add_ie(ctrl, call, mh->msg, ies[x], (q931_ie *)(mh->data + offset), len, &codeset);
 		if (res < 0) {
-			pri_error(pri, "!! Unable to add IE '%s'\n", ie2str(ies[x]));
+			pri_error(ctrl, "!! Unable to add IE '%s'\n", ie2str(ies[x]));
 			return -1;
 		}
 
@@ -2686,19 +2688,19 @@
 	/* Invert the logic */
 	len = sizeof(buf) - len;
 
-	pri = c->pri;
-	if (pri->bri && (pri->localtype == PRI_CPE)) {
+	ctrl = call->pri;
+	if (ctrl->bri && (ctrl->localtype == PRI_CPE)) {
 		/*
 		 * Must use the BRI subchannel structure to send with the correct TEI.
 		 * Note: If the subchannel is NULL then there is no TEI assigned and
 		 * we should not be sending anything out at this time.
 		 */
-		pri = pri->subchannel;
-	}
-	if (pri) {
-		q931_xmit(pri, h, len, 1);
-	}
-	c->acked = 1;
+		ctrl = ctrl->subchannel;
+	}
+	if (ctrl) {
+		q931_xmit(ctrl, h, len, 1);
+	}
+	call->acked = 1;
 	return 0;
 }
 
@@ -2712,7 +2714,7 @@
 int maintenance_service(struct pri *pri, int span, int channel, int changestatus)
 {
 	struct q931_call *c;
-	c = q931_getcall(pri, 0x8000, 0);
+	c = q931_getcall(pri, 0 | 0x8000);
 	if (!c) {
 		return -1;
 	}
@@ -3055,7 +3057,7 @@
 int q931_restart(struct pri *pri, int channel)
 {
 	struct q931_call *c;
-	c = q931_getcall(pri, 0 | 0x8000, 1);
+	c = q931_getcall(pri, 0 | 0x8000);
 	if (!c)
 		return -1;
 	if (!channel)
@@ -3504,6 +3506,7 @@
 	int missingmand;
 	int codeset, cur_codeset;
 	int last_ie[8];
+	int cref;
 
 	memset(last_ie, 0, sizeof(last_ie));
 	if (pri->debug & PRI_DEBUG_Q931_DUMP)
@@ -3527,9 +3530,10 @@
 		q931_xmit(pri, h, len, 1);
 		return 0;
 	}
-	c = q931_getcall(pri, q931_cr(h), 0);
+	cref = q931_cr(h);
+	c = q931_getcall(pri, cref);
 	if (!c) {
-		pri_error(pri, "Unable to locate call %d\n", q931_cr(h));
+		pri_error(pri, "Unable to locate call %d\n", cref);
 		return -1;
 	}
 	/* Preliminary handling */




More information about the libpri-commits mailing list