[asterisk-commits] moy: branch 1.8 r394106 - /branches/1.8/channels/chan_dahdi.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Jul 11 11:25:40 CDT 2013
Author: moy
Date: Thu Jul 11 11:25:39 2013
New Revision: 394106
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=394106
Log:
Fix a longstanding issue with MFC-R2 configuration that prevented users
from mixing different variants or general MFC-R2 settings within the same E1 line.
Most users do not have a problem with this since MFC-R2 lines are usually fractional E1s, or
the whole E1 has the same country variant and R2 settings.
In Venezuela however is common to have inbound MFC-R2 and outbound DTMF-R2 within the same E1.
This fix now properly parses the chan_dahdi.conf file to generate a new openr2 context every
time a new channel => section is found and the configuration was changed.
(closes issue ASTERISK-21117)
Reported by: Rafael Angulo
Related Elastix issue: http://bugs.elastix.org/view.php?id=1612
Modified:
branches/1.8/channels/chan_dahdi.c
Modified: branches/1.8/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_dahdi.c?view=diff&rev=394106&r1=394105&r2=394106
==============================================================================
--- branches/1.8/channels/chan_dahdi.c (original)
+++ branches/1.8/channels/chan_dahdi.c Thu Jul 11 11:25:39 2013
@@ -551,14 +551,6 @@
#endif /* defined(HAVE_SS7) */
#ifdef HAVE_OPENR2
-struct dahdi_mfcr2 {
- pthread_t r2master; /*!< Thread of master */
- openr2_context_t *protocol_context; /*!< OpenR2 context handle */
- struct dahdi_pvt *pvts[SIG_MFCR2_MAX_CHANNELS]; /*!< Member channel pvt structs */
- int numchans; /*!< Number of channels in this R2 block */
- int monitored_count; /*!< Number of channels being monitored */
-};
-
struct dahdi_mfcr2_conf {
openr2_variant_t variant;
int mfback_timeout;
@@ -580,6 +572,15 @@
char r2proto_file[OR2_MAX_PATH];
openr2_log_level_t loglevel;
openr2_calling_party_category_t category;
+};
+
+/* MFC-R2 pseudo-link structure */
+struct dahdi_mfcr2 {
+ pthread_t r2master; /*!< Thread of master */
+ openr2_context_t *protocol_context; /*!< OpenR2 context handle */
+ struct dahdi_pvt *pvts[SIG_MFCR2_MAX_CHANNELS]; /*!< Member channel pvt structs */
+ int numchans; /*!< Number of channels in this R2 block */
+ struct dahdi_mfcr2_conf conf; /*!< Configuration used to setup this pseudo-link */
};
/* malloc'd array of malloc'd r2links */
@@ -12185,14 +12186,20 @@
r2links_count = 0;
}
-#define R2_LINK_CAPACITY 10
-static struct dahdi_mfcr2 *dahdi_r2_get_link(void)
+/* This is an artificial convenient capacity, to keep at most a full E1 of channels in a single thread */
+#define R2_LINK_CAPACITY 30
+static struct dahdi_mfcr2 *dahdi_r2_get_link(const struct dahdi_chan_conf *conf)
{
struct dahdi_mfcr2 *new_r2link = NULL;
struct dahdi_mfcr2 **new_r2links = NULL;
- /* this function is called just when starting up and no monitor threads have been launched,
- no need to lock monitored_count member */
- if (!r2links_count || (r2links[r2links_count - 1]->monitored_count == R2_LINK_CAPACITY)) {
+
+ /* Only create a new R2 link if
+ 1. This is the first link requested
+ 2. Configuration changed
+ 3. We got more channels than supported per link */
+ if (!r2links_count ||
+ memcmp(&conf->mfcr2, &r2links[r2links_count - 1]->conf, sizeof(conf->mfcr2)) ||
+ (r2links[r2links_count - 1]->numchans == R2_LINK_CAPACITY)) {
new_r2link = ast_calloc(1, sizeof(**r2links));
if (!new_r2link) {
ast_log(LOG_ERROR, "Cannot allocate R2 link!\n");
@@ -12257,7 +12264,8 @@
ast_log(LOG_ERROR, "Failed to configure r2context from advanced configuration file %s\n", conf->mfcr2.r2proto_file);
}
}
- r2_link->monitored_count = 0;
+ /* Save the configuration used to setup this link */
+ memcpy(&r2_link->conf, conf, sizeof(r2_link->conf));
return 0;
}
#endif
@@ -12489,7 +12497,7 @@
#ifdef HAVE_OPENR2
if (chan_sig == SIG_MFCR2) {
struct dahdi_mfcr2 *r2_link;
- r2_link = dahdi_r2_get_link();
+ r2_link = dahdi_r2_get_link(conf);
if (!r2_link) {
ast_log(LOG_WARNING, "Cannot get another R2 DAHDI context!\n");
destroy_dahdi_pvt(tmp);
@@ -12531,7 +12539,6 @@
tmp->mfcr2call = 0;
tmp->mfcr2_dnis_index = 0;
tmp->mfcr2_ani_index = 0;
- r2_link->monitored_count++;
}
#endif
#ifdef HAVE_PRI
More information about the asterisk-commits
mailing list