[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