[asterisk-commits] rmudgett: branch rmudgett/sig_ss7 r260799 - /team/rmudgett/sig_ss7/channels/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon May 3 18:26:13 CDT 2010
Author: rmudgett
Date: Mon May 3 18:26:09 2010
New Revision: 260799
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=260799
Log:
SS7 extraction work in progress.
Modified:
team/rmudgett/sig_ss7/channels/chan_dahdi.c
team/rmudgett/sig_ss7/channels/sig_ss7.h
Modified: team/rmudgett/sig_ss7/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/sig_ss7/channels/chan_dahdi.c?view=diff&rev=260799&r1=260798&r2=260799
==============================================================================
--- team/rmudgett/sig_ss7/channels/chan_dahdi.c (original)
+++ team/rmudgett/sig_ss7/channels/chan_dahdi.c Mon May 3 18:26:09 2010
@@ -514,37 +514,102 @@
static int ringt_base = DEFAULT_RINGT;
#ifdef HAVE_SS7
-
-#define LINKSTATE_INALARM (1 << 0)
-#define LINKSTATE_STARTING (1 << 1)
-#define LINKSTATE_UP (1 << 2)
-#define LINKSTATE_DOWN (1 << 3)
-
-#define SS7_NAI_DYNAMIC -1
-
-#define LINKSET_FLAG_EXPLICITACM (1 << 0)
+/* BUGBUG sig_ss7 callback functions ----v*/
+/*!
+ * \internal
+ * \brief Set the caller id information in the parent module.
+ * \since 1.8
+ *
+ * \param p sig_ss7 channel structure.
+ *
+ * \return Nothing
+ */
+static void sig_ss7_set_caller_id(struct sig_ss7_chan *p)
+{
+#if 0
+ struct ast_party_caller caller;
+
+ if (p->calls->set_callerid) {
+ ast_party_caller_init(&caller);
+ caller.id.number = p->cid_num;
+ caller.id.name = p->cid_name;
+ if (!ast_strlen_zero(p->cid_subaddr)) {
+ caller.id.subaddress.valid = 1;
+ //caller.id.subaddress.type = 0;/* nsap */
+ //caller.id.subaddress.odd_even_indicator = 0;
+ caller.id.subaddress.str = p->cid_subaddr;
+ }
+ caller.id.number_type = p->cid_ton;
+ caller.id.number_presentation = p->callingpres;
+ caller.ani = p->cid_ani;
+ caller.ani2 = p->cid_ani2;
+ p->calls->set_callerid(p->chan_pvt, &caller);
+ }
+#endif
+ /* BUGBUG sig_ss7_set_caller_id() not written */
+}
+
+/*!
+ * \internal
+ * \brief Set the Dialed Number Identifier.
+ * \since 1.8
+ *
+ * \param p sig_ss7 channel structure.
+ * \param dnid Dialed Number Identifier string.
+ *
+ * \return Nothing
+ */
+static void sig_ss7_set_dnid(struct sig_ss7_chan *p, const char *dnid)
+{
+ if (p->calls->set_dnid) {
+ p->calls->set_dnid(p->chan_pvt, dnid);
+ }
+}
+
+/*!
+ * \internal
+ * \brief Set the Redirecting Directory Number Information Service (RDNIS).
+ * \since 1.8
+ *
+ * \param p sig_ss7 channel structure.
+ * \param rdnis Redirecting Directory Number Information Service (RDNIS) string.
+ *
+ * \return Nothing
+ */
+static void sig_ss7_set_rdnis(struct sig_ss7_chan *p, const char *rdnis)
+{
+ if (p->calls->set_rdnis) {
+ p->calls->set_rdnis(p->chan_pvt, rdnis);
+ }
+}
+
+static void sig_ss7_unlock_private(struct sig_ss7_chan *p)
+{
+ if (p->calls->unlock_private) {
+ p->calls->unlock_private(p->chan_pvt);
+ }
+}
+
+static void sig_ss7_lock_private(struct sig_ss7_chan *p)
+{
+ if (p->calls->lock_private) {
+ p->calls->lock_private(p->chan_pvt);
+ }
+}
+
+static void sig_ss7_loopback(struct sig_ss7_chan *p, int enable)
+{
+ if (p->loopedback != enable) {
+ p->loopedback = enable;
+ if (p->calls->set_loopback) {
+ p->calls->set_loopback(p->chan_pvt, enable);
+ }
+ }
+}
+/* BUGBUG sig_ss7 callback functions ----^*/
struct dahdi_ss7 {
- pthread_t master; /*!< Thread of master */
- ast_mutex_t lock;
- int fds[SIG_SS7_NUM_DCHANS];
- int numsigchans;
- int linkstate[SIG_SS7_NUM_DCHANS];
- int numchans;
- int type;
- enum {
- LINKSET_STATE_DOWN = 0,
- LINKSET_STATE_UP
- } state;
- char called_nai; /*!< Called Nature of Address Indicator */
- char calling_nai; /*!< Calling Nature of Address Indicator */
- char internationalprefix[10]; /*!< country access code ('00' for european dialplans) */
- char nationalprefix[10]; /*!< area access code ('0' for european dialplans) */
- char subscriberprefix[20]; /*!< area access code + area code ('0'+area code for european dialplans) */
- char unknownprefix[20]; /*!< for unknown dialplans */
- struct ss7 *ss7;
- struct dahdi_pvt *pvts[SIG_SS7_MAX_CHANNELS]; /*!< Member channel pvt structs */
- int flags; /*!< Linkset flags */
+ struct sig_ss7_linkset ss7;
};
static struct dahdi_ss7 linksets[NUM_SPANS];
@@ -1208,33 +1273,7 @@
int dsp_features;
#ifdef HAVE_SS7
/*! \brief SS7 control parameters */
- struct dahdi_ss7 *ss7;
- /*! \brief Opaque libss7 call control structure */
- struct isup_call *ss7call;
- char charge_number[50];
- char gen_add_number[50];
- char gen_dig_number[50];
- char orig_called_num[50];
- char redirecting_num[50];
- char generic_name[50];
- unsigned char gen_add_num_plan;
- unsigned char gen_add_nai;
- unsigned char gen_add_pres_ind;
- unsigned char gen_add_type;
- unsigned char gen_dig_type;
- unsigned char gen_dig_scheme;
- char jip_number[50];
- unsigned char lspi_type;
- unsigned char lspi_scheme;
- unsigned char lspi_context;
- char lspi_ident[50];
- unsigned int call_ref_ident;
- unsigned int call_ref_pc;
- unsigned char calling_party_cat;
- int transcap;
- int cic; /*!< CIC associated with channel */
- unsigned int dpc; /*!< CIC's DPC */
- unsigned int loopedback:1;
+ struct sig_ss7_linkset *ss7;
#endif
#ifdef HAVE_OPENR2
struct dahdi_mfcr2 *mfcr2;
@@ -1346,7 +1385,7 @@
},
#endif
#ifdef HAVE_SS7
- .ss7 = {
+ .ss7.ss7 = {
.called_nai = SS7_NAI_NATIONAL,
.calling_nai = SS7_NAI_NATIONAL,
.internationalprefix = "",
@@ -2345,7 +2384,7 @@
return;
}
-static struct ast_channel *dahdi_new(struct dahdi_pvt *, int, int, int, int, int, const char *);
+static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpbx, int idx, int law, int transfercapability, const char *linkedid);
static struct ast_channel *my_new_analog_ast_channel(void *pvt, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
{
@@ -2717,7 +2756,9 @@
old_chan->dsp = NULL;
old_chan->dsp_features = 0;
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
static int sig_pri_tone_to_dahditone(enum sig_pri_tone tone)
{
switch (tone) {
@@ -2739,7 +2780,9 @@
return -1;
}
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
static void my_handle_dchan_exception(struct sig_pri_pri *pri, int index)
{
int x, res;
@@ -2755,14 +2798,18 @@
pri_event_noalarm(pri, index, 0);
}
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
static int my_pri_play_tone(void *pvt, enum sig_pri_tone tone)
{
struct dahdi_pvt *p = pvt;
return tone_zone_play_tone(p->subs[SUB_REAL].dfd, sig_pri_tone_to_dahditone(tone));
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI) || defined(HAVE_SS7)
/*!
* \internal
* \brief Set the caller id information.
@@ -2773,7 +2820,7 @@
*
* \return Nothing
*/
-static void my_pri_set_callerid(void *pvt, const struct ast_party_caller *caller)
+static void my_set_callerid(void *pvt, const struct ast_party_caller *caller)
{
struct dahdi_pvt *p = pvt;
@@ -2790,7 +2837,9 @@
ast_copy_string(p->cid_ani, S_OR(caller->ani, ""), sizeof(p->cid_ani));
p->cid_ani2 = caller->ani2;
}
-
+#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */
+
+#if defined(HAVE_PRI) || defined(HAVE_SS7)
/*!
* \internal
* \brief Set the Dialed Number Identifier.
@@ -2801,13 +2850,15 @@
*
* \return Nothing
*/
-static void my_pri_set_dnid(void *pvt, const char *dnid)
+static void my_set_dnid(void *pvt, const char *dnid)
{
struct dahdi_pvt *p = pvt;
ast_copy_string(p->dnid, dnid, sizeof(p->dnid));
}
-
+#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */
+
+#if defined(HAVE_PRI) || defined(HAVE_SS7)
/*!
* \internal
* \brief Set the Redirecting Directory Number Information Service (RDNIS).
@@ -2818,13 +2869,15 @@
*
* \return Nothing
*/
-static void my_pri_set_rdnis(void *pvt, const char *rdnis)
+static void my_set_rdnis(void *pvt, const char *rdnis)
{
struct dahdi_pvt *p = pvt;
ast_copy_string(p->rdnis, rdnis, sizeof(p->rdnis));
}
-
+#endif /* defined(HAVE_PRI) || defined(HAVE_SS7) */
+
+#if defined(HAVE_PRI)
/*!
* \internal
* \brief Make a dialstring for native ISDN CC to recall properly.
@@ -2883,7 +2936,9 @@
/* Insert the ISDN span channel restriction into the dialstring. */
snprintf(buf, buf_size, "%s/i%d-%s", args.tech, pvt->pri->span, args.group);
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
/*!
* \internal
* \brief Reevaluate the PRI span device state.
@@ -2954,7 +3009,9 @@
}
#endif /* defined(THRESHOLD_DEVSTATE_PLACEHOLDER) */
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
/*!
* \internal
* \brief Reference this module.
@@ -2966,7 +3023,9 @@
{
ast_module_ref(ast_module_info->self);
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
/*!
* \internal
* \brief Unreference this module.
@@ -2978,7 +3037,9 @@
{
ast_module_unref(ast_module_info->self);
}
-
+#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_PRI)
static int dahdi_new_pri_nobch_channel(struct sig_pri_pri *pri);
static struct sig_pri_callback dahdi_pri_callbacks =
@@ -2993,9 +3054,9 @@
.fixup_chans = my_pri_fixup_chans,
.set_dialing = my_set_dialing,
.set_digital = my_set_digital,
- .set_callerid = my_pri_set_callerid,
- .set_dnid = my_pri_set_dnid,
- .set_rdnis = my_pri_set_rdnis,
+ .set_callerid = my_set_callerid,
+ .set_dnid = my_set_dnid,
+ .set_rdnis = my_set_rdnis,
.new_nobch_intf = dahdi_new_pri_nobch_channel,
.get_orig_dialstring = my_get_orig_dialstring,
.make_cc_dialstring = my_pri_make_cc_dialstring,
@@ -3004,6 +3065,123 @@
.module_unref = my_module_unref,
};
#endif /* defined(HAVE_PRI) */
+
+#if defined(HAVE_SS7)
+static void my_ss7_set_loopback(void *pvt, int enable)
+{
+ struct dahdi_pvt *p = pvt;
+
+ if (ioctl(p->subs[SUB_REAL].dfd, DAHDI_LOOPBACK, &enable)) {
+ ast_log(LOG_WARNING, "Unable to set loopback on channel %d: %s\n", p->channel,
+ strerror(errno));
+ }
+}
+#endif /* defined(HAVE_SS7) */
+
+#if defined(HAVE_SS7)
+/*!
+ * \internal
+ * \brief Create a new asterisk channel structure for SS7.
+ * \since 1.8
+ *
+ * \param pvt Private channel structure.
+ * \param state Initial state of new channel.
+ * \param startpbx TRUE if PBS is started
+ * \param law Combanding law to use.
+ * \param exten Dialplan extension for incoming call.
+ * \param requestor Channel requesting this new channel.
+ *
+ * \retval ast_channel on success.
+ * \retval NULL on error.
+ */
+static struct ast_channel *my_new_ss7_ast_channel(void *pvt, int state, int startpbx, enum sig_ss7_law law, char *exten, const struct ast_channel *requestor)
+{
+ struct dahdi_pvt *p = pvt;
+ int audio;
+ int newlaw = -1;
+
+ /* Set to audio mode at this point */
+ audio = 1;
+ if (ioctl(p->subs[SUB_REAL].dfd, DAHDI_AUDIOMODE, &audio) == -1)
+ ast_log(LOG_WARNING, "Unable to set audio mode on channel %d to %d: %s\n",
+ p->channel, audio, strerror(errno));
+
+ if (law != SIG_SS7_DEFLAW) {
+ dahdi_setlaw(p->subs[SUB_REAL].dfd,
+ (law == SIG_SS7_ULAW) ? DAHDI_LAW_MULAW : DAHDI_LAW_ALAW);
+ }
+
+ ast_copy_string(p->exten, exten, sizeof(p->exten));
+
+ switch (law) {
+ case SIG_SS7_DEFLAW:
+ newlaw = 0;
+ break;
+ case SIG_SS7_ALAW:
+ newlaw = DAHDI_LAW_ALAW;
+ break;
+ case SIG_SS7_ULAW:
+ newlaw = DAHDI_LAW_MULAW;
+ break;
+ }
+ return dahdi_new(p, state, startpbx, SUB_REAL, newlaw, 0,
+ requestor ? requestor->linkedid : "");
+
+ /*! \todo BUGBUG my_new_ss7_ast_channel() not written */
+}
+#endif /* defined(HAVE_SS7) */
+
+#if defined(HAVE_SS7)
+static int sig_ss7_tone_to_dahditone(enum sig_ss7_tone tone)
+{
+ switch (tone) {
+ case SIG_SS7_TONE_RINGTONE:
+ return DAHDI_TONE_RINGTONE;
+ case SIG_SS7_TONE_STUTTER:
+ return DAHDI_TONE_STUTTER;
+ case SIG_SS7_TONE_CONGESTION:
+ return DAHDI_TONE_CONGESTION;
+ case SIG_SS7_TONE_DIALTONE:
+ return DAHDI_TONE_DIALTONE;
+ case SIG_SS7_TONE_DIALRECALL:
+ return DAHDI_TONE_DIALRECALL;
+ case SIG_SS7_TONE_INFO:
+ return DAHDI_TONE_INFO;
+ case SIG_SS7_TONE_BUSY:
+ return DAHDI_TONE_BUSY;
+ default:
+ return -1;
+ }
+}
+#endif /* defined(HAVE_SS7) */
+
+#if defined(HAVE_SS7)
+static int my_ss7_play_tone(void *pvt, enum sig_ss7_tone tone)
+{
+ struct dahdi_pvt *p = pvt;
+
+ return tone_zone_play_tone(p->subs[SUB_REAL].dfd, sig_ss7_tone_to_dahditone(tone));
+}
+#endif /* defined(HAVE_SS7) */
+
+#if defined(HAVE_SS7)
+static struct sig_ss7_callback dahdi_ss7_callbacks =
+{
+ .lock_private = my_lock_private,
+ .unlock_private = my_unlock_private,
+
+ .set_echocanceller = my_set_echocanceller,
+ .set_loopback = my_ss7_set_loopback,
+
+ .new_ast_channel = my_new_ss7_ast_channel,
+ .play_tone = my_ss7_play_tone,
+
+ .set_dialing = my_set_dialing,
+ .set_callerid = my_set_callerid,
+ .set_dnid = my_set_dnid,
+ .set_rdnis = my_set_rdnis,
+};
+#endif /* defined(HAVE_SS7) */
/*!
* \brief Send MWI state change
@@ -3138,26 +3316,26 @@
static struct dahdi_pvt *round_robin[32];
#if defined(HAVE_SS7)
-static inline void ss7_rel(struct dahdi_ss7 *ss7)
+static inline void ss7_rel(struct sig_ss7_linkset *ss7)
{
ast_mutex_unlock(&ss7->lock);
}
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static inline int ss7_grab(struct dahdi_pvt *pvt, struct dahdi_ss7 *pri)
+static inline int ss7_grab(struct dahdi_pvt *pvt, struct sig_ss7_linkset *ss7)
{
int res;
/* Grab the lock first */
do {
- res = ast_mutex_trylock(&pri->lock);
+ res = ast_mutex_trylock(&ss7->lock);
if (res) {
DEADLOCK_AVOIDANCE(&pvt->lock);
}
} while (res);
/* Then break the poll */
- if (pri->master != AST_PTHREADT_NULL)
- pthread_kill(pri->master, SIGURG);
+ if (ss7->master != AST_PTHREADT_NULL)
+ pthread_kill(ss7->master, SIGURG);
return 0;
}
#endif /* defined(HAVE_SS7) */
@@ -3203,7 +3381,7 @@
if (data) {
switch (p->sig) {
case SIG_SS7:
- ast_mutex_unlock(&ss7->lock);
+ ast_mutex_unlock(&ss7->ss7.lock);
break;
default:
break;
@@ -3226,7 +3404,7 @@
if (data) {
switch (p->sig) {
case SIG_SS7:
- ast_mutex_lock(&ss7->lock);
+ ast_mutex_lock(&ss7->ss7.lock);
break;
default:
break;
@@ -3795,8 +3973,8 @@
#if defined(HAVE_SS7)
static void dahdi_close_ss7_fd(struct dahdi_ss7 *ss7, int fd_num)
{
- dahdi_close(ss7->fds[fd_num]);
- ss7->fds[fd_num] = -1;
+ dahdi_close(ss7->ss7.fds[fd_num]);
+ ss7->ss7.fds[fd_num] = -1;
}
#endif /* defined(HAVE_SS7) */
@@ -11532,17 +11710,17 @@
/* DB: Add CIC's DPC information */
tmp->dpc = cur_defaultdpc;
- tmp->ss7 = ss7;
+ tmp->ss7 = &ss7->ss7;
tmp->ss7call = NULL;
- ss7->pvts[ss7->numchans++] = tmp;
-
- ast_copy_string(ss7->internationalprefix, conf->ss7.internationalprefix, sizeof(ss7->internationalprefix));
- ast_copy_string(ss7->nationalprefix, conf->ss7.nationalprefix, sizeof(ss7->nationalprefix));
- ast_copy_string(ss7->subscriberprefix, conf->ss7.subscriberprefix, sizeof(ss7->subscriberprefix));
- ast_copy_string(ss7->unknownprefix, conf->ss7.unknownprefix, sizeof(ss7->unknownprefix));
-
- ss7->called_nai = conf->ss7.called_nai;
- ss7->calling_nai = conf->ss7.calling_nai;
+ ss7->ss7.pvts[ss7->ss7.numchans++] = tmp;
+
+ ast_copy_string(ss7->ss7.internationalprefix, conf->ss7.ss7.internationalprefix, sizeof(ss7->ss7.internationalprefix));
+ ast_copy_string(ss7->ss7.nationalprefix, conf->ss7.ss7.nationalprefix, sizeof(ss7->ss7.nationalprefix));
+ ast_copy_string(ss7->ss7.subscriberprefix, conf->ss7.ss7.subscriberprefix, sizeof(ss7->ss7.subscriberprefix));
+ ast_copy_string(ss7->ss7.unknownprefix, conf->ss7.ss7.unknownprefix, sizeof(ss7->ss7.unknownprefix));
+
+ ss7->ss7.called_nai = conf->ss7.ss7.called_nai;
+ ss7->ss7.calling_nai = conf->ss7.ss7.calling_nai;
}
#endif
#ifdef HAVE_OPENR2
@@ -12834,7 +13012,7 @@
}
#if defined(HAVE_SS7)
-static int ss7_find_cic(struct dahdi_ss7 *linkset, int cic, unsigned int dpc)
+static int ss7_find_cic(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc)
{
int i;
int winner = -1;
@@ -12849,10 +13027,10 @@
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static void ss7_handle_cqm(struct dahdi_ss7 *linkset, int startcic, int endcic, unsigned int dpc)
+static void ss7_handle_cqm(struct sig_ss7_linkset *linkset, int startcic, int endcic, unsigned int dpc)
{
unsigned char status[32];
- struct dahdi_pvt *p = NULL;
+ struct sig_ss7_chan *p = NULL;
int i, offset;
for (i = 0; i < linkset->numchans; i++) {
@@ -12883,23 +13061,23 @@
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static inline void ss7_hangup_cics(struct dahdi_ss7 *linkset, int startcic, int endcic, unsigned int dpc)
+static inline void ss7_hangup_cics(struct sig_ss7_linkset *linkset, int startcic, int endcic, unsigned int dpc)
{
int i;
for (i = 0; i < linkset->numchans; i++) {
if (linkset->pvts[i] && (linkset->pvts[i]->dpc == dpc && ((linkset->pvts[i]->cic >= startcic) && (linkset->pvts[i]->cic <= endcic)))) {
- ast_mutex_lock(&linkset->pvts[i]->lock);
+ sig_ss7_lock_private(linkset->pvts[i]);
if (linkset->pvts[i]->owner)
linkset->pvts[i]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
- ast_mutex_unlock(&linkset->pvts[i]->lock);
+ sig_ss7_unlock_private(linkset->pvts[i]);
}
}
}
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static inline void ss7_block_cics(struct dahdi_ss7 *linkset, int startcic, int endcic, unsigned int dpc, unsigned char state[], int block)
+static inline void ss7_block_cics(struct sig_ss7_linkset *linkset, int startcic, int endcic, unsigned int dpc, unsigned char state[], int block)
{
int i;
@@ -12916,7 +13094,7 @@
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static void ss7_inservice(struct dahdi_ss7 *linkset, int startcic, int endcic, unsigned int dpc)
+static void ss7_inservice(struct sig_ss7_linkset *linkset, int startcic, int endcic, unsigned int dpc)
{
int i;
@@ -12928,7 +13106,7 @@
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static void ss7_reset_linkset(struct dahdi_ss7 *linkset)
+static void ss7_reset_linkset(struct sig_ss7_linkset *linkset)
{
int i, startcic = -1, endcic, dpc;
@@ -12958,21 +13136,8 @@
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static void dahdi_loopback(struct dahdi_pvt *p, int enable)
-{
- if (p->loopedback != enable) {
- if (ioctl(p->subs[SUB_REAL].dfd, DAHDI_LOOPBACK, &enable)) {
- ast_log(LOG_WARNING, "Unable to set loopback on channel %d: %s\n", p->channel, strerror(errno));
- return;
- }
- p->loopedback = enable;
- }
-}
-#endif /* defined(HAVE_SS7) */
-
-#if defined(HAVE_SS7)
/* XXX: This function is assumed to be called with the private channel lock and linkset lock held */
-static void ss7_start_call(struct dahdi_pvt *p, struct dahdi_ss7 *linkset)
+static void ss7_start_call(struct sig_ss7_chan *p, struct sig_ss7_linkset *linkset)
{
struct ss7 *ss7 = linkset->ss7;
int res;
@@ -12999,7 +13164,6 @@
ast_mutex_unlock(&linkset->lock);
c = dahdi_new(p, AST_STATE_RING, 1, SUB_REAL, law, 0, NULL);
-
if (!c) {
ast_log(LOG_WARNING, "Unable to start PBX on CIC %d\n", p->cic);
/* Holding this lock is assumed entering the function */
@@ -13014,8 +13178,9 @@
* when receiving either and IAM or a COT message. Since they are only accessed
* from this context, we should be safe to unlock around them */
- ast_mutex_unlock(&p->lock);
-
+ sig_ss7_unlock_private(p);
+
+ /*! \todo XXX SS7 Crash possible because we are setting channel variables after starting the PBX! */
if (!ast_strlen_zero(p->charge_number)) {
pbx_builtin_setvar_helper(c, "SS7_CHARGE_NUMBER", p->charge_number);
/* Clear this after we set it */
@@ -13084,13 +13249,13 @@
p->generic_name[0] = 0;
}
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
ast_mutex_lock(&linkset->lock);
}
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
-static void ss7_apply_plan_to_number(char *buf, size_t size, const struct dahdi_ss7 *ss7, const char *number, const unsigned nai)
+static void ss7_apply_plan_to_number(char *buf, size_t size, const struct sig_ss7_linkset *ss7, const char *number, const unsigned nai)
{
if (ast_strlen_zero(number)) { /* make sure a number exists so prefix isn't placed on an empty string */
if (size) {
@@ -13130,16 +13295,17 @@
{
int res, i;
struct timeval *next = NULL, tv;
- struct dahdi_ss7 *linkset = (struct dahdi_ss7 *) data;
+ struct sig_ss7_linkset *linkset = (struct sig_ss7_linkset *) data;
struct ss7 *ss7 = linkset->ss7;
ss7_event *e = NULL;
- struct dahdi_pvt *p;
+ struct sig_ss7_chan *p;
int chanpos;
struct pollfd pollers[SIG_SS7_NUM_DCHANS];
int cic;
unsigned int dpc;
int nextms = 0;
+ ss7_set_debug(ss7, SIG_SS7_DEBUG_DEFAULT);
ss7_start(ss7);
while(1) {
@@ -13255,7 +13421,7 @@
break;
}
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
switch (e->cpg.event) {
case CPG_EVENT_ALERTING:
p->alerting = 1;
@@ -13279,7 +13445,7 @@
ast_debug(1, "Do not handle CPG with event type 0x%x\n", e->cpg.event);
}
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
break;
case ISUP_EVENT_RSC:
ast_verbose("Resetting CIC %d\n", e->rsc.cic);
@@ -13289,7 +13455,7 @@
break;
}
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->inservice = 1;
p->remotelyblocked = 0;
dpc = p->dpc;
@@ -13298,7 +13464,7 @@
p->ss7call = NULL;
if (p->owner)
p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
isup_rlc(ss7, e->rsc.call);
break;
case ISUP_EVENT_GRS:
@@ -13331,14 +13497,14 @@
break;
}
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
if (p->owner) {
if (p->ss7call == e->iam.call) {
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
ast_log(LOG_WARNING, "Duplicate IAM requested on CIC %d\n", e->iam.cic);
break;
} else {
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
ast_log(LOG_WARNING, "Ring requested on CIC %d already in use!\n", e->iam.cic);
break;
}
@@ -13396,7 +13562,7 @@
if (ast_exists_extension(NULL, p->context, p->exten, 1, p->cid_num)) {
if (e->iam.cot_check_required) {
- dahdi_loopback(p, 1);
+ sig_ss7_loopback(p, 1);
} else
ss7_start_call(p, linkset);
} else {
@@ -13404,7 +13570,7 @@
p->alreadyhungup = 1;
isup_rel(ss7, e->iam.call, AST_CAUSE_UNALLOCATED);
}
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
break;
case ISUP_EVENT_COT:
chanpos = ss7_find_cic(linkset, e->cot.cic, e->cot.opc);
@@ -13415,14 +13581,14 @@
}
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
if (p->loopedback) {
- dahdi_loopback(p, 0);
+ sig_ss7_loopback(p, 0);
ss7_start_call(p, linkset);
}
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
break;
case ISUP_EVENT_CCR:
@@ -13435,9 +13601,9 @@
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
- dahdi_loopback(p, 1);
- ast_mutex_unlock(&p->lock);
+ sig_ss7_lock_private(p);
+ sig_ss7_loopback(p, 1);
+ sig_ss7_unlock_private(p);
isup_lpa(linkset->ss7, e->ccr.cic, p->dpc);
break;
@@ -13451,9 +13617,9 @@
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
- dahdi_loopback(p, 1);
- ast_mutex_unlock(&p->lock);
+ sig_ss7_lock_private(p);
+ sig_ss7_loopback(p, 1);
+ sig_ss7_unlock_private(p);
isup_cvr(linkset->ss7, e->cvt.cic, p->dpc);
break;
@@ -13464,7 +13630,7 @@
break;
}
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
if (p->owner) {
p->owner->hangupcause = e->rel.cause;
p->owner->_softhangup |= AST_SOFTHANGUP_DEV;
@@ -13472,12 +13638,12 @@
ast_log(LOG_WARNING, "REL on channel (CIC %d) without owner!\n", p->cic);
/* End the loopback if we have one */
- dahdi_loopback(p, 0);
+ sig_ss7_loopback(p, 0);
isup_rlc(ss7, e->rel.call);
p->ss7call = NULL;
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
break;
case ISUP_EVENT_ACM:
chanpos = ss7_find_cic(linkset, e->acm.cic, e->acm.opc);
@@ -13496,7 +13662,7 @@
p->rlt = 1; /* Setting it but not using it here*/
}
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
dahdi_queue_frame(p, &f, linkset);
p->proceeding = 1;
p->dialing = 0;
@@ -13505,7 +13671,7 @@
p->alerting = 1;
p->subs[SUB_REAL].needringing = 1;
}
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
}
break;
case ISUP_EVENT_CGB:
@@ -13536,10 +13702,10 @@
}
p = linkset->pvts[chanpos];
ast_debug(1, "Unequiped Circuit Id Code on CIC %d\n", e->ucic.cic);
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->remotelyblocked = 1;
p->inservice = 0;
- ast_mutex_unlock(&p->lock); /* doesn't require a SS7 acknowledgement */
+ sig_ss7_unlock_private(p);/* doesn't require a SS7 acknowledgement */
break;
case ISUP_EVENT_BLO:
chanpos = ss7_find_cic(linkset, e->blo.cic, e->blo.opc);
@@ -13549,9 +13715,9 @@
}
p = linkset->pvts[chanpos];
ast_debug(1, "Blocking CIC %d\n", e->blo.cic);
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->remotelyblocked = 1;
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
isup_bla(linkset->ss7, e->blo.cic, p->dpc);
break;
case ISUP_EVENT_BLA:
@@ -13562,9 +13728,9 @@
}
ast_debug(1, "Blocking CIC %d\n", e->bla.cic);
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->locallyblocked = 1;
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
break;
case ISUP_EVENT_UBL:
chanpos = ss7_find_cic(linkset, e->ubl.cic, e->ubl.opc);
@@ -13574,9 +13740,9 @@
}
p = linkset->pvts[chanpos];
ast_debug(1, "Unblocking CIC %d\n", e->ubl.cic);
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->remotelyblocked = 0;
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
isup_uba(linkset->ss7, e->ubl.cic, p->dpc);
break;
case ISUP_EVENT_UBA:
@@ -13587,9 +13753,9 @@
}
p = linkset->pvts[chanpos];
ast_debug(1, "Unblocking CIC %d\n", e->uba.cic);
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->locallyblocked = 0;
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
break;
case ISUP_EVENT_CON:
case ISUP_EVENT_ANM:
@@ -13605,14 +13771,14 @@
break;
} else {
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
p->subs[SUB_REAL].needanswer = 1;
if (p->dsp && p->dsp_features) {
ast_dsp_set_features(p->dsp, p->dsp_features);
p->dsp_features = 0;
}
dahdi_enable_ec(p);
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
}
break;
case ISUP_EVENT_RLC:
@@ -13622,12 +13788,12 @@
break;
} else {
p = linkset->pvts[chanpos];
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
if (p->alreadyhungup)
p->ss7call = NULL;
else
ast_log(LOG_NOTICE, "Received RLC out and we haven't sent REL. Ignoring.\n");
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
}
break;
case ISUP_EVENT_FAA:
@@ -13638,12 +13804,12 @@
} else {
p = linkset->pvts[chanpos];
ast_debug(1, "FAA received on CIC %d\n", e->faa.cic);
- ast_mutex_lock(&p->lock);
+ sig_ss7_lock_private(p);
if (p->alreadyhungup){
p->ss7call = NULL;
ast_log(LOG_NOTICE, "Received FAA and we haven't sent FAR. Ignoring.\n");
}
- ast_mutex_unlock(&p->lock);
+ sig_ss7_unlock_private(p);
}
break;
default:
@@ -13661,33 +13827,34 @@
#if defined(HAVE_SS7)
static void dahdi_ss7_message(struct ss7 *ss7, char *s)
{
-#if 0
int i;
- for (i = 0; i < NUM_SPANS; i++)
- if (linksets[i].ss7 == ss7)
- break;
-
- ast_verbose("[%d] %s", i+1, s);
-#else
+ if (ss7) {
+ for (i = 0; i < NUM_SPANS; i++) {
+ if (linksets[i].ss7.ss7 == ss7) {
+ ast_verbose("[%d] %s", i + 1, s);
+ return;
+ }
+ }
+ }
ast_verbose("%s", s);
-#endif
}
#endif /* defined(HAVE_SS7) */
#if defined(HAVE_SS7)
static void dahdi_ss7_error(struct ss7 *ss7, char *s)
{
-#if 0
int i;
- for (i = 0; i < NUM_SPANS; i++)
- if (linksets[i].ss7 == ss7)
- break;
-
-#else
+ if (ss7) {
+ for (i = 0; i < NUM_SPANS; i++) {
+ if (linksets[i].ss7.ss7 == ss7) {
+ ast_log(LOG_ERROR, "[%d] %s", i + 1, s);
+ return;
+ }
+ }
+ }
ast_log(LOG_ERROR, "%s", s);
-#endif
}
#endif /* defined(HAVE_SS7) */
@@ -14738,11 +14905,11 @@
#if defined(HAVE_SS7)
for (i = 0; i < NUM_SPANS; i++) {
- if (linksets[i].master && (linksets[i].master != AST_PTHREADT_NULL)) {
- cancel_code = pthread_cancel(linksets[i].master);
- pthread_kill(linksets[i].master, SIGURG);
- ast_debug(4, "Waiting to join thread of span %d with pid=%p, cancel_code=%d\n", i, (void *) linksets[i].master, cancel_code);
- pthread_join(linksets[i].master, NULL);
+ if (linksets[i].ss7.master && (linksets[i].ss7.master != AST_PTHREADT_NULL)) {
+ cancel_code = pthread_cancel(linksets[i].ss7.master);
+ pthread_kill(linksets[i].ss7.master, SIGURG);
+ ast_debug(4, "Waiting to join thread of span %d with pid=%p, cancel_code=%d\n", i, (void *) linksets[i].ss7.master, cancel_code);
+ pthread_join(linksets[i].ss7.master, NULL);
ast_debug(4, "Joined thread of span %d\n", i);
}
}
@@ -14806,10 +14973,10 @@
memset(linksets, 0, sizeof(linksets));
for (i = 0; i < NUM_SPANS; i++) {
- ast_mutex_init(&linksets[i].lock);
- linksets[i].master = AST_PTHREADT_NULL;
+ ast_mutex_init(&linksets[i].ss7.lock);
+ linksets[i].ss7.master = AST_PTHREADT_NULL;
for (j = 0; j < SIG_SS7_NUM_DCHANS; j++)
- linksets[i].fds[j] = -1;
+ linksets[i].ss7.fds[j] = -1;
}
ss7_set_error(dahdi_ss7_error);
ss7_set_message(dahdi_ss7_message);
@@ -15077,12 +15244,15 @@
#endif
#ifdef HAVE_SS7
if (tmp->ss7) {
- ast_cli(a->fd, "CIC: %d\n", tmp->cic);
+ struct sig_ss7_chan *chan = tmp->sig_pvt;
+
+ ast_cli(a->fd, "CIC: %d\n", chan->cic);
}
#endif
#ifdef HAVE_PRI
if (tmp->pri) {
struct sig_pri_chan *chan = tmp->sig_pvt;
+
ast_cli(a->fd, "PRI Flags: ");
if (chan->resetting)
ast_cli(a->fd, "Resetting ");
@@ -15730,39 +15900,40 @@
return -1;
}
- if (!link->ss7)
- link->ss7 = ss7_new(cur_ss7type);
-
- if (!link->ss7) {
+ if (!link->ss7.ss7) {
+ link->ss7.ss7 = ss7_new(cur_ss7type);
+ }
+
+ if (!link->ss7.ss7) {
ast_log(LOG_ERROR, "Can't create new SS7!\n");
return -1;
}
- link->type = cur_ss7type;
+ link->ss7.type = cur_ss7type;
if (cur_pointcode < 0) {
ast_log(LOG_ERROR, "Unspecified pointcode!\n");
return -1;
} else
- ss7_set_pc(link->ss7, cur_pointcode);
+ ss7_set_pc(link->ss7.ss7, cur_pointcode);
if (sigchan < 0) {
ast_log(LOG_ERROR, "Invalid sigchan!\n");
return -1;
} else {
- if (link->numsigchans >= SIG_SS7_NUM_DCHANS) {
+ if (link->ss7.numsigchans >= SIG_SS7_NUM_DCHANS) {
ast_log(LOG_ERROR, "Too many sigchans on linkset %d\n", cur_linkset);
return -1;
}
- curfd = link->numsigchans;
-
- link->fds[curfd] = open("/dev/dahdi/channel", O_RDWR, 0600);
- if ((link->fds[curfd] < 0) || (ioctl(link->fds[curfd],DAHDI_SPECIFY,&sigchan) == -1)) {
+ curfd = link->ss7.numsigchans;
+
+ link->ss7.fds[curfd] = open("/dev/dahdi/channel", O_RDWR, 0600);
+ if ((link->ss7.fds[curfd] < 0) || (ioctl(link->ss7.fds[curfd],DAHDI_SPECIFY,&sigchan) == -1)) {
ast_log(LOG_ERROR, "Unable to open SS7 sigchan %d (%s)\n", sigchan, strerror(errno));
return -1;
}
memset(&p, 0, sizeof(p));
- res = ioctl(link->fds[curfd], DAHDI_GET_PARAMS, &p);
+ res = ioctl(link->ss7.fds[curfd], DAHDI_GET_PARAMS, &p);
if (res) {
dahdi_close_ss7_fd(link, curfd);
ast_log(LOG_ERROR, "Unable to get parameters for sigchan %d (%s)\n", sigchan, strerror(errno));
@@ -15780,32 +15951,32 @@
bi.numbufs = 32;
bi.bufsize = 512;
- if (ioctl(link->fds[curfd], DAHDI_SET_BUFINFO, &bi)) {
+ if (ioctl(link->ss7.fds[curfd], DAHDI_SET_BUFINFO, &bi)) {
ast_log(LOG_ERROR, "Unable to set appropriate buffering on channel %d: %s\n", sigchan, strerror(errno));
dahdi_close_ss7_fd(link, curfd);
return -1;
}
if (p.sigtype == DAHDI_SIG_MTP2)
- ss7_add_link(link->ss7, SS7_TRANSPORT_DAHDIMTP2, link->fds[curfd]);
+ ss7_add_link(link->ss7.ss7, SS7_TRANSPORT_DAHDIMTP2, link->ss7.fds[curfd]);
else
- ss7_add_link(link->ss7, SS7_TRANSPORT_DAHDIDCHAN, link->fds[curfd]);
-
- link->numsigchans++;
+ ss7_add_link(link->ss7.ss7, SS7_TRANSPORT_DAHDIDCHAN, link->ss7.fds[curfd]);
+
+ link->ss7.numsigchans++;
memset(&si, 0, sizeof(si));
- res = ioctl(link->fds[curfd], DAHDI_SPANSTAT, &si);
+ res = ioctl(link->ss7.fds[curfd], DAHDI_SPANSTAT, &si);
if (res) {
dahdi_close_ss7_fd(link, curfd);
ast_log(LOG_ERROR, "Unable to get span state for sigchan %d (%s)\n", sigchan, strerror(errno));
}
if (!si.alarms) {
- link->linkstate[curfd] = LINKSTATE_DOWN;
- ss7_link_noalarm(link->ss7, link->fds[curfd]);
+ link->ss7.linkstate[curfd] = LINKSTATE_DOWN;
+ ss7_link_noalarm(link->ss7.ss7, link->ss7.fds[curfd]);
} else {
- link->linkstate[curfd] = LINKSTATE_DOWN | LINKSTATE_INALARM;
- ss7_link_alarm(link->ss7, link->fds[curfd]);
+ link->ss7.linkstate[curfd] = LINKSTATE_DOWN | LINKSTATE_INALARM;
+ ss7_link_alarm(link->ss7.ss7, link->ss7.fds[curfd]);
}
}
@@ -15813,7 +15984,7 @@
ast_log(LOG_ERROR, "Unspecified adjpointcode!\n");
return -1;
} else {
- ss7_set_adjpc(link->ss7, link->fds[curfd], cur_adjpointcode);
+ ss7_set_adjpc(link->ss7.ss7, link->ss7.fds[curfd], cur_adjpointcode);
}
if (cur_defaultdpc < 0) {
@@ -15825,7 +15996,7 @@
ast_log(LOG_ERROR, "Invalid networkindicator!\n");
return -1;
} else
- ss7_set_network_ind(link->ss7, cur_networkindicator);
+ ss7_set_network_ind(link->ss7.ss7, cur_networkindicator);
return 0;
}
@@ -15852,16 +16023,14 @@
ast_cli(a->fd, "Invalid linkset %s. Should be a number from %d to %d\n", a->argv[5], 1, NUM_SPANS);
return CLI_SUCCESS;
}
- if (!linksets[span-1].ss7) {
+ if (!linksets[span-1].ss7.ss7) {
ast_cli(a->fd, "No SS7 running on linkset %d\n", span);
- return CLI_SUCCESS;
- }
- if (linksets[span-1].ss7) {
+ } else {
if (strcasecmp(a->argv[3], "on")) {
- ss7_set_debug(linksets[span-1].ss7, SS7_DEBUG_MTP2 | SS7_DEBUG_MTP3 | SS7_DEBUG_ISUP);
+ ss7_set_debug(linksets[span-1].ss7.ss7, SIG_SS7_DEBUG);
ast_cli(a->fd, "Enabled debugging on linkset %d\n", span);
} else {
- ss7_set_debug(linksets[span-1].ss7, 0);
+ ss7_set_debug(linksets[span-1].ss7.ss7, 0);
ast_cli(a->fd, "Disabled debugging on linkset %d\n", span);
}
}
@@ -15895,7 +16064,7 @@
return CLI_SUCCESS;
}
- if (!linksets[linkset-1].ss7) {
+ if (!linksets[linkset-1].ss7.ss7) {
ast_cli(a->fd, "No SS7 running on linkset %d\n", linkset);
return CLI_SUCCESS;
}
@@ -15907,13 +16076,13 @@
return CLI_SUCCESS;
}
- for (i = 0; i < linksets[linkset-1].numchans; i++) {
- if (linksets[linkset-1].pvts[i]->cic == cic) {
- blocked = linksets[linkset-1].pvts[i]->locallyblocked;
+ for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
+ if (linksets[linkset-1].ss7.pvts[i]->cic == cic) {
+ blocked = linksets[linkset-1].ss7.pvts[i]->locallyblocked;
if (!blocked) {
- ast_mutex_lock(&linksets[linkset-1].lock);
- isup_blo(linksets[linkset-1].ss7, cic, linksets[linkset-1].pvts[i]->dpc);
- ast_mutex_unlock(&linksets[linkset-1].lock);
+ ast_mutex_lock(&linksets[linkset-1].ss7.lock);
+ isup_blo(linksets[linkset-1].ss7.ss7, cic, linksets[linkset-1].ss7.pvts[i]->dpc);
+ ast_mutex_unlock(&linksets[linkset-1].ss7.lock);
}
}
}
@@ -15929,7 +16098,7 @@
ast_cli(a->fd, "CIC %d already locally blocked\n", cic);
/* Break poll on the linkset so it sends our messages */
- pthread_kill(linksets[linkset-1].master, SIGURG);
+ pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
return CLI_SUCCESS;
}
@@ -15960,20 +16129,20 @@
return CLI_SUCCESS;
}
- if (!linksets[linkset-1].ss7) {
+ if (!linksets[linkset-1].ss7.ss7) {
ast_cli(a->fd, "No SS7 running on linkset %d\n", linkset);
return CLI_SUCCESS;
}
- for (i = 0; i < linksets[linkset-1].numchans; i++) {
- ast_cli(a->fd, "Sending remote blocking request on CIC %d\n", linksets[linkset-1].pvts[i]->cic);
- ast_mutex_lock(&linksets[linkset-1].lock);
- isup_blo(linksets[linkset-1].ss7, linksets[linkset-1].pvts[i]->cic, linksets[linkset-1].pvts[i]->dpc);
- ast_mutex_unlock(&linksets[linkset-1].lock);
+ for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
+ ast_cli(a->fd, "Sending remote blocking request on CIC %d\n", linksets[linkset-1].ss7.pvts[i]->cic);
+ ast_mutex_lock(&linksets[linkset-1].ss7.lock);
+ isup_blo(linksets[linkset-1].ss7.ss7, linksets[linkset-1].ss7.pvts[i]->cic, linksets[linkset-1].ss7.pvts[i]->dpc);
+ ast_mutex_unlock(&linksets[linkset-1].ss7.lock);
}
/* Break poll on the linkset so it sends our messages */
- pthread_kill(linksets[linkset-1].master, SIGURG);
+ pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
return CLI_SUCCESS;
}
@@ -16005,7 +16174,7 @@
return CLI_SUCCESS;
}
- if (!linksets[linkset-1].ss7) {
+ if (!linksets[linkset-1].ss7.ss7) {
ast_cli(a->fd, "No SS7 running on linkset %d\n", linkset);
return CLI_SUCCESS;
}
@@ -16017,13 +16186,13 @@
return CLI_SUCCESS;
}
- for (i = 0; i < linksets[linkset-1].numchans; i++) {
- if (linksets[linkset-1].pvts[i]->cic == cic) {
- blocked = linksets[linkset-1].pvts[i]->locallyblocked;
+ for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
+ if (linksets[linkset-1].ss7.pvts[i]->cic == cic) {
+ blocked = linksets[linkset-1].ss7.pvts[i]->locallyblocked;
if (blocked) {
- ast_mutex_lock(&linksets[linkset-1].lock);
- isup_ubl(linksets[linkset-1].ss7, cic, linksets[linkset-1].pvts[i]->dpc);
- ast_mutex_unlock(&linksets[linkset-1].lock);
+ ast_mutex_lock(&linksets[linkset-1].ss7.lock);
+ isup_ubl(linksets[linkset-1].ss7.ss7, cic, linksets[linkset-1].ss7.pvts[i]->dpc);
+ ast_mutex_unlock(&linksets[linkset-1].ss7.lock);
}
}
}
@@ -16032,7 +16201,7 @@
ast_cli(a->fd, "Sent unblocking request for linkset %d on CIC %d\n", linkset, cic);
/* Break poll on the linkset so it sends our messages */
- pthread_kill(linksets[linkset-1].master, SIGURG);
+ pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
return CLI_SUCCESS;
}
@@ -16064,20 +16233,20 @@
return CLI_SUCCESS;
}
- if (!linksets[linkset-1].ss7) {
+ if (!linksets[linkset-1].ss7.ss7) {
ast_cli(a->fd, "No SS7 running on linkset %d\n", linkset);
return CLI_SUCCESS;
}
- for (i = 0; i < linksets[linkset-1].numchans; i++) {
- ast_cli(a->fd, "Sending remote unblock request on CIC %d\n", linksets[linkset-1].pvts[i]->cic);
- ast_mutex_lock(&linksets[linkset-1].lock);
- isup_ubl(linksets[linkset-1].ss7, linksets[linkset-1].pvts[i]->cic, linksets[linkset-1].pvts[i]->dpc);
- ast_mutex_unlock(&linksets[linkset-1].lock);
+ for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
+ ast_cli(a->fd, "Sending remote unblock request on CIC %d\n", linksets[linkset-1].ss7.pvts[i]->cic);
+ ast_mutex_lock(&linksets[linkset-1].ss7.lock);
+ isup_ubl(linksets[linkset-1].ss7.ss7, linksets[linkset-1].ss7.pvts[i]->cic, linksets[linkset-1].ss7.pvts[i]->dpc);
+ ast_mutex_unlock(&linksets[linkset-1].ss7.lock);
}
[... 322 lines stripped ...]
More information about the asterisk-commits
mailing list