mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Handle multiple span memberships properly
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3160 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -295,7 +295,7 @@ static int r2prot = -1;
|
||||
|
||||
#ifdef ZAPATA_PRI
|
||||
|
||||
#define PVT_TO_CHANNEL(p) (((p)->prioffset) | ((p)->pri->logicalspan << 8))
|
||||
#define PVT_TO_CHANNEL(p) (((p)->prioffset) | ((p)->logicalspan << 8))
|
||||
#define PRI_CHANNEL(p) ((p) & 0xff)
|
||||
#define PRI_SPAN(p) (((p) >> 8) & 0xff)
|
||||
|
||||
@@ -313,7 +313,7 @@ struct zt_pri {
|
||||
int dchannel; /* What channel the dchannel is on */
|
||||
int trunkgroup; /* What our trunkgroup is */
|
||||
int mastertrunkgroup; /* What trunk group is our master */
|
||||
int logicalspan; /* Logical span number within trunk group */
|
||||
int prilogicalspan; /* Logical span number within trunk group */
|
||||
int numchans; /* Num of channels we represent */
|
||||
int overlapdial; /* In overlap dialing mode */
|
||||
struct pri *pri;
|
||||
@@ -519,6 +519,7 @@ static struct zt_pvt {
|
||||
int isidlecall;
|
||||
int resetting;
|
||||
int prioffset;
|
||||
int logicalspan;
|
||||
int alreadyhungup;
|
||||
int proceeding;
|
||||
int setup_ack; /* wheter we received SETUP_ACKNOWLEDGE or not */
|
||||
@@ -1680,7 +1681,7 @@ static int zt_call(struct ast_channel *ast, char *rdest, int timeout)
|
||||
return -1;
|
||||
}
|
||||
if (p->bearer) {
|
||||
ast_log(LOG_DEBUG, "Oooh, I have a bearer on %d\n", PVT_TO_CHANNEL(p->bearer));
|
||||
ast_log(LOG_DEBUG, "Oooh, I have a bearer on %d (%d:%d)\n", PVT_TO_CHANNEL(p->bearer), p->bearer->logicalspan, p->bearer->channel);
|
||||
pri_set_crv(p->pri->pri, p->call, p->channel, 0);
|
||||
p->bearer->call = p->call;
|
||||
}
|
||||
@@ -5534,7 +5535,7 @@ static int pri_create_spanmap(int span, int trunkgroup, int logicalspan)
|
||||
return -1;
|
||||
}
|
||||
pris[span].mastertrunkgroup = trunkgroup;
|
||||
pris[span].logicalspan = logicalspan;
|
||||
pris[span].prilogicalspan = logicalspan;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -5702,7 +5703,9 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio, struct zt_p
|
||||
ast_log(LOG_ERROR, "Unable to get span status: %s\n", strerror(errno));
|
||||
free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
/* Store the logical span first based upon the real span */
|
||||
tmp->logicalspan = pris[span].prilogicalspan;
|
||||
pri_resolve_span(&span, channel, (channel - p.chanpos), &si);
|
||||
if (span < 0) {
|
||||
ast_log(LOG_WARNING, "Channel %d: Unable to find locate channel/trunk group!\n", channel);
|
||||
@@ -6308,7 +6311,7 @@ static int pri_find_principle(struct zt_pri *pri, int channel)
|
||||
channel = PRI_CHANNEL(channel);
|
||||
|
||||
for (x=0;x<pri->numchans;x++) {
|
||||
if (pri->pvts[x] && (pri->pvts[x]->prioffset == channel) && (pri->logicalspan == span)) {
|
||||
if (pri->pvts[x] && (pri->pvts[x]->prioffset == channel) && (pri->pvts[x]->logicalspan == span)) {
|
||||
principle = x;
|
||||
break;
|
||||
}
|
||||
@@ -6871,10 +6874,10 @@ static void *pri_dchannel(void *vpri)
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "Accepting overlap call from '%s' to '%s' on channel %d/%d, span %d\n",
|
||||
e->ring.callingnum, !ast_strlen_zero(pri->pvts[chanpos]->exten) ? pri->pvts[chanpos]->exten : "<unspecified>",
|
||||
pri->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Unable to start PBX on channel %d/%d, span %d\n",
|
||||
pri->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
if (c)
|
||||
ast_hangup(c);
|
||||
else {
|
||||
@@ -6891,11 +6894,11 @@ static void *pri_dchannel(void *vpri)
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "Accepting call from '%s' to '%s' on channel %d/%d, span %d\n",
|
||||
e->ring.callingnum, pri->pvts[chanpos]->exten,
|
||||
pri->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
zt_enable_ec(pri->pvts[chanpos]);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Unable to start PBX on channel %d/%d, span %d\n",
|
||||
pri->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_SWITCH_CONGESTION);
|
||||
pri->pvts[chanpos]->call = NULL;
|
||||
}
|
||||
@@ -6903,7 +6906,7 @@ static void *pri_dchannel(void *vpri)
|
||||
} else {
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "Extension '%s' in context '%s' from '%s' does not exist. Rejecting call on channel %d/%d, span %d\n",
|
||||
pri->pvts[chanpos]->exten, pri->pvts[chanpos]->context, pri->pvts[chanpos]->callerid, pri->logicalspan,
|
||||
pri->pvts[chanpos]->exten, pri->pvts[chanpos]->context, pri->pvts[chanpos]->callerid, pri->pvts[chanpos]->logicalspan,
|
||||
pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri_hangup(pri->pri, e->ring.call, PRI_CAUSE_UNALLOCATED);
|
||||
pri->pvts[chanpos]->call = NULL;
|
||||
@@ -6941,7 +6944,7 @@ static void *pri_dchannel(void *vpri)
|
||||
if (pri->overlapdial && !pri->pvts[chanpos]->proceeding) {
|
||||
struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_PROGRESS, };
|
||||
ast_log(LOG_DEBUG, "Queuing frame from PRI_EVENT_PROCEEDING on channel %d/%d span %d\n",
|
||||
pri->logicalspan, pri->pvts[chanpos]->prioffset,pri->span);
|
||||
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset,pri->span);
|
||||
if (pri->pvts[chanpos]->owner)
|
||||
ast_queue_frame(pri->pvts[chanpos]->owner, &f);
|
||||
|
||||
@@ -7038,7 +7041,7 @@ static void *pri_dchannel(void *vpri)
|
||||
}
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "Channel %d/%d, span %d got hangup\n",
|
||||
pri->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri->pvts[chanpos]->logicalspan, pri->pvts[chanpos]->prioffset, pri->span);
|
||||
} else {
|
||||
pri_hangup(pri->pri, pri->pvts[chanpos]->call, e->hangup.cause);
|
||||
pri->pvts[chanpos]->call = NULL;
|
||||
@@ -7143,18 +7146,18 @@ static void *pri_dchannel(void *vpri)
|
||||
if (pri->pvts[x] && pri->pvts[x]->resetting) {
|
||||
chanpos = x;
|
||||
ast_mutex_lock(&pri->pvts[chanpos]->lock);
|
||||
ast_log(LOG_DEBUG, "Assuming restart ack is really for channel %d/%d span %d\n", pri->logicalspan,
|
||||
ast_log(LOG_DEBUG, "Assuming restart ack is really for channel %d/%d span %d\n", pri->pvts[chanpos]->logicalspan,
|
||||
pri->pvts[chanpos]->prioffset, pri->span);
|
||||
if (pri->pvts[chanpos]->master)
|
||||
pri_hangup_all(pri->pvts[chanpos]->master);
|
||||
else if (pri->pvts[chanpos]->owner) {
|
||||
ast_log(LOG_WARNING, "Got restart ack on channel %d/%d with owner on span %d\n", pri->logicalspan,
|
||||
ast_log(LOG_WARNING, "Got restart ack on channel %d/%d with owner on span %d\n", pri->pvts[chanpos]->logicalspan,
|
||||
pri->pvts[chanpos]->prioffset, pri->span);
|
||||
pri->pvts[chanpos]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
|
||||
}
|
||||
pri->pvts[chanpos]->resetting = 0;
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "B-channel %d/%d successfully restarted on span %d\n", pri->logicalspan,
|
||||
ast_verbose(VERBOSE_PREFIX_3 "B-channel %d/%d successfully restarted on span %d\n", pri->pvts[chanpos]->logicalspan,
|
||||
pri->pvts[chanpos]->prioffset, pri->span);
|
||||
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
||||
if (pri->resetting)
|
||||
@@ -7180,7 +7183,7 @@ static void *pri_dchannel(void *vpri)
|
||||
}
|
||||
pri->pvts[chanpos]->resetting = 0;
|
||||
if (option_verbose > 2)
|
||||
ast_verbose(VERBOSE_PREFIX_3 "B-channel %d/%d successfully restarted on span %d\n", pri->logicalspan,
|
||||
ast_verbose(VERBOSE_PREFIX_3 "B-channel %d/%d successfully restarted on span %d\n", pri->pvts[chanpos]->logicalspan,
|
||||
pri->pvts[chanpos]->prioffset, pri->span);
|
||||
ast_mutex_unlock(&pri->pvts[chanpos]->lock);
|
||||
if (pri->resetting)
|
||||
@@ -7647,10 +7650,10 @@ static int zap_show_channel(int fd, int argc, char **argv)
|
||||
if (tmp->call)
|
||||
ast_cli(fd, "Call ");
|
||||
ast_cli(fd, "\n");
|
||||
if (tmp->pri->logicalspan)
|
||||
ast_cli(fd, "PRI Span: %d\n", tmp->pri->logicalspan);
|
||||
if (tmp->logicalspan)
|
||||
ast_cli(fd, "PRI Logical Span: %d\n", tmp->logicalspan);
|
||||
else
|
||||
ast_cli(fd, "PRI Span: Implicit\n");
|
||||
ast_cli(fd, "PRI Logical Span: Implicit\n");
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user