If no specific interface is given for the 'extern' rule in the
routing.conf, or if call is forwarded (settings), then only
interfaces marked with 'extern' flag are used.
You need to set this flag when upgrading to this version. See
default/interface.conf for hint.
modified: README
modified: apppbx.cpp
modified: default/interface.conf
modified: interface.c
modified: interface.h
-Changes after Version 1.5
+Changes after Version 1.6
- Fixed bad call/conference bug in joinpbx.c
- Fixed bad call/conference bug in joinpbx.c
+- External interfaces must now be specified using 'extern' keyword.
+ -> This prevents from selecting other interfaces when dialing out.
+ -> Just add 'extern' right below your external interface, or define
+ external interface name in routing.conf: ": extern interfaces=XXXXX"
struct select_channel *selchannel;
struct mISDNport *mISDNport;
int index, i;
struct select_channel *selchannel;
struct mISDNport *mISDNport;
int index, i;
+ int there_is_an_external = 0;
interface = interface_first;
/* first find the given interface or, if not given, one with no extension */
checknext:
interface = interface_first;
/* first find the given interface or, if not given, one with no extension */
checknext:
+ if (!interface) {
+ if (!there_is_an_external && !(ifname && ifname[0])) {
+ trace_header("CHANNEL SELECTION (no external interface specified)", DIRECTION_NONE);
+ add_trace("info", NULL, "Add 'external' parameter to interface.conf.");
+ end_trace();
+ }
/* check for given interface */
/* check for given interface */
+ if (ifname && ifname[0]) {
if (!strcasecmp(interface->name, ifname)) {
/* found explicit interface */
if (!strcasecmp(interface->name, ifname)) {
/* found explicit interface */
- trace_header("CHANNEL SELECTION (found interface)", DIRECTION_NONE);
+ trace_header("CHANNEL SELECTION (found given interface)", DIRECTION_NONE);
add_trace("interface", NULL, "%s", ifname);
end_trace();
goto foundif;
}
} else {
add_trace("interface", NULL, "%s", ifname);
end_trace();
goto foundif;
}
} else {
- if (!interface->extension) {
+ if (interface->external) {
+ there_is_an_external = 1;
/* found non extension */
/* found non extension */
- trace_header("CHANNEL SELECTION (found non extension interface)", DIRECTION_NONE);
+ trace_header("CHANNEL SELECTION (found external interface)", DIRECTION_NONE);
add_trace("interface", NULL, "%s", interface->name);
end_trace();
goto foundif;
add_trace("interface", NULL, "%s", interface->name);
end_trace();
goto foundif;
# Example of an ISDN interface on port 0
#[Ext]
# Example of an ISDN interface on port 0
#[Ext]
#portnum 0
# Example of a multilink ISDN interface (Anlagenanschluss) on port 2
# and 3
#[Ext]
#portnum 0
# Example of a multilink ISDN interface (Anlagenanschluss) on port 2
# and 3
#[Ext]
# Layer-2-Hold is required to keep link alive.
#[Ext]
# Layer-2-Hold is required to keep link alive.
#[Ext]
#portnum 0
#ptp
#layer2hold yes
#portnum 0
#ptp
#layer2hold yes
#screen-out unknown 300 national 21250993300
#screen-out unknown 2* national 212509932*
#tones yes
#screen-out unknown 300 national 21250993300
#screen-out unknown 2* national 212509932*
#tones yes
# (Siemens EWSD will select bot-way-channels when indicated that way.)
#[Ext]
# (Siemens EWSD will select bot-way-channels when indicated that way.)
#[Ext]
#portnum 0
#layer2hold
#channel-in 1,2,3,4,5,6,7,8,9,10,22,23,24,25,26,27,28,29,30,31
#portnum 0
#layer2hold
#channel-in 1,2,3,4,5,6,7,8,9,10,22,23,24,25,26,27,28,29,30,31
# Now all information elements can be transmitted in both directions.
#[Ext]
# Now all information elements can be transmitted in both directions.
#[Ext]
# digits will be dialed after setup via overlap dialing.
#[Ext]
# digits will be dialed after setup via overlap dialing.
#[Ext]
}
static int inter_extension(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
}
static int inter_extension(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
+ if (interface->external) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed, because interface is external interface.\n", filename, line, parameter);
+ return(-1);
+ }
if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
if (value[0]) {
SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
return(-1);
interface->extension = 1;
return(0);
}
interface->extension = 1;
return(0);
}
+static int inter_extern(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+ if (interface->extension) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed, because interface is an extension.\n", filename, line, parameter);
+ return(-1);
+ }
+ if (value[0]) {
+ SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
+ return(-1);
+ }
+ interface->external = 1;
+ return(0);
+}
static int inter_ptp(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
struct interface_port *ifport;
static int inter_ptp(struct interface *interface, char *filename, int line, char *parameter, char *value)
{
struct interface_port *ifport;
struct interface_param interface_param[] = {
{ "extension", &inter_extension, "",
"If keyword is given, calls to interface are handled as internal extensions."},
struct interface_param interface_param[] = {
{ "extension", &inter_extension, "",
"If keyword is given, calls to interface are handled as internal extensions."},
+
+ { "extern", &inter_extern, "",
+ "If keyword is given, this interface will be used for external calls.\n"
+ "Calls require an external interface, if the routing action 'extern' is used\nwithout specific interface given.\n"
+ "Calls forwarded by extension's 'settings' also require an external interface."},
+
{"tones", &inter_tones, "yes | no",
"Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
{"tones", &inter_tones, "yes | no",
"Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
struct interface {
struct interface *next;
char name[64]; /* name of interface */
struct interface {
struct interface *next;
char name[64]; /* name of interface */
+ int external; /* interface used for extranl calls */
int extension; /* calls are handled as extension */
int is_tones; /* generate tones */
int is_earlyb; /* bridge tones during call setup */
int extension; /* calls are handled as extension */
int is_tones; /* generate tones */
int is_earlyb; /* bridge tones during call setup */