[svn-commits] rmudgett: branch 1.4 r1012 - /branches/1.4/q931.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Mon Aug 24 18:06:42 CDT 2009
Author: rmudgett
Date: Mon Aug 24 18:06:39 2009
New Revision: 1012
URL: http://svn.asterisk.org/svn-view/libpri?view=rev&rev=1012
Log:
Make dump_channel_id() handle variable length fields.
Also did some other minor miscellaneous changes.
Modified:
branches/1.4/q931.c
Modified: branches/1.4/q931.c
URL: http://svn.asterisk.org/svn-view/libpri/branches/1.4/q931.c?view=diff&rev=1012&r1=1011&r2=1012
==============================================================================
--- branches/1.4/q931.c (original)
+++ branches/1.4/q931.c Mon Aug 24 18:06:39 2009
@@ -781,49 +781,72 @@
static void dump_channel_id(int full_ie, struct pri *ctrl, q931_ie *ie, int len, char prefix)
{
- int pos=0;
+ int pos;
int x;
- int res = 0;
- static const char* msg_chan_sel[] = {
- "No channel selected", "B1 channel", "B2 channel","Any channel selected",
- "No channel selected", "As indicated in following octets", "Reserved","Any channel selected"
+ int res;
+
+ static const char *msg_chan_sel[] = {
+ "No channel selected", "B1 channel", "B2 channel", "Any channel selected",
+ "No channel selected", "As indicated in following octets", "Reserved", "Any channel selected"
};
- pri_message(ctrl, "%c Channel ID (len=%2d) [ Ext: %d IntID: %s %s Spare: %d %s Dchan: %d\n",
- prefix, len, (ie->data[0] & 0x80) ? 1 : 0, (ie->data[0] & 0x40) ? "Explicit" : "Implicit",
- (ie->data[0] & 0x20) ? "PRI" : "Other", (ie->data[0] & 0x10) ? 1 : 0,
- (ie->data[0] & 0x08) ? "Exclusive" : "Preferred", (ie->data[0] & 0x04) ? 1 : 0);
+ pri_message(ctrl,
+ "%c Channel ID (len=%2d) [ Ext: %d IntID: %s %s Spare: %d %s Dchan: %d\n",
+ prefix, len,
+ (ie->data[0] & 0x80) ? 1 : 0,
+ (ie->data[0] & 0x40) ? "Explicit" : "Implicit",
+ (ie->data[0] & 0x20) ? "Other(PRI)" : "BRI",
+ (ie->data[0] & 0x10) ? 1 : 0,
+ (ie->data[0] & 0x08) ? "Exclusive" : "Preferred",
+ (ie->data[0] & 0x04) ? 1 : 0);
pri_message(ctrl, "%c ChanSel: %s\n",
- prefix, msg_chan_sel[(ie->data[0] & 0x3) + ((ie->data[0]>>3) & 0x4)]);
- pos++;
- len--;
- if (ie->data[0] & 0x40) {
+ prefix, msg_chan_sel[(ie->data[0] & 0x03) | ((ie->data[0] >> 3) & 0x04)]);
+ pos = 1;
+ len -= 2;
+ if (ie->data[0] & 0x40) {
/* Explicitly defined DS1 */
- pri_message(ctrl, "%c Ext: %d DS1 Identifier: %d \n", prefix, (ie->data[pos] & 0x80) >> 7, ie->data[pos] & 0x7f);
- pos++;
+ do {
+ pri_message(ctrl, "%c Ext: %d DS1 Identifier: %d \n",
+ prefix, (ie->data[pos] & 0x80) >> 7, ie->data[pos] & 0x7f);
+ ++pos;
+ } while (!(ie->data[pos - 1] & 0x80) && pos < len);
} else {
/* Implicitly defined DS1 */
}
- if (pos+2 < len) {
+ if (pos < len) {
/* Still more information here */
- pri_message(ctrl, "%c Ext: %d Coding: %d %s Specified Channel Type: %d\n",
- prefix, (ie->data[pos] & 0x80) >> 7, (ie->data[pos] & 60) >> 5,
- (ie->data[pos] & 0x10) ? "Slot Map" : "Number", ie->data[pos] & 0x0f);
- if (!(ie->data[pos] & 0x10)) {
+ pri_message(ctrl,
+ "%c Ext: %d Coding: %d %s Specified Channel Type: %d\n",
+ prefix, (ie->data[pos] & 0x80) >> 7, (ie->data[pos] & 60) >> 5,
+ (ie->data[pos] & 0x10) ? "Slot Map" : "Number", ie->data[pos] & 0x0f);
+ ++pos;
+ }
+ if (pos < len) {
+ if (!(ie->data[pos - 1] & 0x10)) {
/* Number specified */
- pos++;
- pri_message(ctrl, "%c Ext: %d Channel: %d Type: %s]\n", prefix, (ie->data[pos] & 0x80) >> 7,
- (ie->data[pos]) & 0x7f, pritype(ctrl->localtype));
+ do {
+ pri_message(ctrl,
+ "%c Ext: %d Channel: %d Type: %s%c\n",
+ prefix, (ie->data[pos] & 0x80) >> 7,
+ (ie->data[pos]) & 0x7f, pritype(ctrl->localtype),
+ (pos + 1 < len) ? ' ' : ']');
+ ++pos;
+ } while (pos < len);
} else {
- pos++;
/* Map specified */
- for (x=0;x<3;x++) {
+ res = 0;
+ x = 0;
+ do {
res <<= 8;
res |= ie->data[pos++];
- }
- pri_message(ctrl, "%c Map: %s ]\n", prefix, binary(res, 24));
- }
- } else pri_message(ctrl, " ]\n");
+ ++x;
+ } while (pos < len);
+ pri_message(ctrl, "%c Map len: %d Map: %s ]\n", prefix,
+ x, binary(res, x << 3));
+ }
+ } else {
+ pri_message(ctrl, " ]\n");
+ }
}
static char *ri2str(int ri)
@@ -3296,6 +3319,7 @@
int maintenance_service(struct pri *ctrl, int span, int channel, int changestatus)
{
struct q931_call *c;
+
c = q931_getcall(ctrl, 0 | 0x8000);
if (!c) {
return -1;
@@ -3435,8 +3459,7 @@
if (channel) {
c->ds1no = (channel & 0xff00) >> 8;
c->ds1explicit = (channel & 0x10000) >> 16;
- channel &= 0xff;
- c->channelno = channel;
+ c->channelno = channel & 0xff;
}
if (info) {
@@ -3458,8 +3481,7 @@
if (channel) {
c->ds1no = (channel & 0xff00) >> 8;
c->ds1explicit = (channel & 0x10000) >> 16;
- channel &= 0xff;
- c->channelno = channel;
+ c->channelno = channel & 0xff;
}
if (info) {
@@ -3491,8 +3513,7 @@
if (channel) {
c->ds1no = (channel & 0xff00) >> 8;
c->ds1explicit = (channel & 0x10000) >> 16;
- channel &= 0xff;
- c->channelno = channel;
+ c->channelno = channel & 0xff;
}
c->chanflags &= ~FLAG_PREFERRED;
c->chanflags |= FLAG_EXCLUSIVE;
@@ -3549,8 +3570,7 @@
if (channel) {
c->ds1no = (channel & 0xff00) >> 8;
c->ds1explicit = (channel & 0x10000) >> 16;
- channel &= 0xff;
- c->channelno = channel;
+ c->channelno = channel & 0xff;
}
c->chanflags &= ~FLAG_PREFERRED;
c->chanflags |= FLAG_EXCLUSIVE;
@@ -3630,8 +3650,7 @@
if (channel) {
c->ds1no = (channel & 0xff00) >> 8;
c->ds1explicit = (channel & 0x10000) >> 16;
- channel &= 0xff;
- c->channelno = channel;
+ c->channelno = channel & 0xff;
}
c->chanflags &= ~FLAG_PREFERRED;
c->chanflags |= FLAG_EXCLUSIVE;
@@ -3710,6 +3729,7 @@
int q931_restart(struct pri *ctrl, int channel)
{
struct q931_call *c;
+
c = q931_getcall(ctrl, 0 | 0x8000);
if (!c)
return -1;
@@ -3718,8 +3738,7 @@
c->ri = 0;
c->ds1no = (channel & 0xff00) >> 8;
c->ds1explicit = (channel & 0x10000) >> 16;
- channel &= 0xff;
- c->channelno = channel;
+ c->channelno = channel & 0xff;
c->chanflags &= ~FLAG_PREFERRED;
c->chanflags |= FLAG_EXCLUSIVE;
UPDATE_OURCALLSTATE(ctrl, c, Q931_CALL_STATE_RESTART);
@@ -3874,6 +3893,7 @@
{
int disconnect = 1;
int release_compl = 0;
+
if (ctrl->debug & PRI_DEBUG_Q931_STATE)
pri_message(ctrl,
"NEW_HANGUP DEBUG: Calling q931_hangup, ourstate %s, peerstate %s\n",
More information about the svn-commits
mailing list