summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg2010-11-28 08:53:32 +0100
committerAndreas Eversberg2010-12-13 09:11:56 +0100
commita24ae098bdd5dd4687d984095c18acc284b6ab26 (patch)
treecf52c64d47d3ee1c0d6eaf89098a22f98f4150f8
parentRemove the last commit, because it was in the wrong branch. (diff)
downloadlcr-a24ae098bdd5dd4687d984095c18acc284b6ab26.tar.gz
lcr-a24ae098bdd5dd4687d984095c18acc284b6ab26.tar.xz
lcr-a24ae098bdd5dd4687d984095c18acc284b6ab26.zip
Fixed channel selection on outgoing calls on NT-mode multipoint
On a multipoint bus, it is required to assign a channel with no other alternative allowed. This is required, because an individual phone on the bus may not choose a different channel, while other phones accept the indicated channel. Also an individual phone does not have the information about other available channels. On a point-to-point configuration it is possible anyway. In this multipoint case, the channel assignment is now forced automatically, even if the 'force' keyword is not specified in the "out-channel" of interface.conf. Additionally "lcradmin portinfo" shows the channel selection settings now.
-rw-r--r--interface.c6
-rw-r--r--lcradmin.c2
-rw-r--r--lcrsocket.h2
-rw-r--r--socket_server.c36
4 files changed, 44 insertions, 2 deletions
diff --git a/interface.c b/interface.c
index 1495d3b..a312e4e 100644
--- a/interface.c
+++ b/interface.c
@@ -1127,7 +1127,8 @@ struct interface_param interface_param[] = {
"Channel selection list for all outgoing calls to the interface.\n"
"A free channels is searched in order of appearance.\n"
"This parameter must follow a 'port' parameter.\n"
- " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
+ " force - Forces the selected port with no acceptable alternative (see Q.931).\n"
+ " -> this will be automatically set for multipoint (ptmp) NT-mode ports\n"
" <number>[,...] - List of channels to search.\n"
" free - Select any free channel\n"
" any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
@@ -1434,6 +1435,9 @@ static void set_defaults(struct interface_port *ifport)
default_out_channel(ifport);
if (!ifport->in_channel)
default_in_channel(ifport);
+ /* must force the channel on PTMP/NT ports */
+ if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
+ ifport->channel_force = 1;
/* default is_tones */
if (ifport->interface->is_tones)
ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
diff --git a/lcradmin.c b/lcradmin.c
index 882105b..2483a9b 100644
--- a/lcradmin.c
+++ b/lcradmin.c
@@ -1301,6 +1301,8 @@ const char *admin_portinfo(int sock, int argc, char *argv[])
else
printf("\t status = unblocked\n");
printf("\t mode = %s %s%s%s\n", (m[i].u.i.ntmode)?"NT-mode":"TE-mode", (m[i].u.i.ptp)?"ptp":"ptmp", (m[i].u.i.l1hold)?" l1hold":"", (m[i].u.i.l2hold)?" l2hold":"");
+ printf("\t out-channel = %s\n", m[i].u.i.out_channel);
+ printf("\t in-channel = %s\n", m[i].u.i.in_channel);
if (m[i].u.i.l1link < 0)
printf("\t l1 link = unknown\n");
else
diff --git a/lcrsocket.h b/lcrsocket.h
index 7ecf7ad..931afb8 100644
--- a/lcrsocket.h
+++ b/lcrsocket.h
@@ -83,6 +83,8 @@ struct admin_response_interface {
char busy[256]; /* if port is idle(0) busy(1) */
unsigned int port[256]; /* current port */
int mode[256];
+ char out_channel[256];
+ char in_channel[256];
};
struct admin_response_remote {
diff --git a/socket_server.c b/socket_server.c
index 47626c4..e84fa5e 100644
--- a/socket_server.c
+++ b/socket_server.c
@@ -740,6 +740,7 @@ int admin_state(struct admin_queue **responsep)
struct interface *interface;
struct interface_port *ifport;
struct mISDNport *mISDNport;
+ struct select_channel *selchannel;
int i;
int num;
int anybusy;
@@ -872,7 +873,40 @@ int admin_state(struct admin_queue **responsep)
response->am[num].u.i.slip_rx = mISDNport->slip_rx;
/* channels */
response->am[num].u.i.channels = mISDNport->b_num;
- /* channel info */
+ /* channel selection */
+ selchannel = ifport->out_channel;
+ if (ifport->channel_force)
+ SCAT(response->am[num].u.i.out_channel, "force");
+ while (selchannel) {
+ if (response->am[num].u.i.out_channel[0])
+ SCAT(response->am[num].u.i.out_channel, ",");
+ switch (selchannel->channel) {
+ case CHANNEL_NO:
+ SCAT(response->am[num].u.i.out_channel, "no");
+ break;
+ case CHANNEL_ANY:
+ SCAT(response->am[num].u.i.out_channel, "any");
+ break;
+ case CHANNEL_FREE:
+ SCAT(response->am[num].u.i.out_channel, "free");
+ break;
+ default:
+ SPRINT(strchr(response->am[num].u.i.out_channel, '\0'), "%d", selchannel->channel);
+ }
+ selchannel = selchannel->next;
+ }
+ selchannel = ifport->in_channel;
+ while (selchannel) {
+ switch (selchannel->channel) {
+ case CHANNEL_FREE:
+ SCAT(response->am[num].u.i.in_channel, "free");
+ break;
+ default:
+ SPRINT(strchr(response->am[num].u.i.in_channel, '\0'), "%d", selchannel->channel);
+ }
+ selchannel = selchannel->next;
+ }
+ /* channel state */
i = 0;
anybusy = 0;
while(i < mISDNport->b_num) {