aboutsummaryrefslogtreecommitdiffstats
path: root/channels/misdn
diff options
context:
space:
mode:
Diffstat (limited to 'channels/misdn')
-rw-r--r--channels/misdn/isdn_lib.c48
-rw-r--r--channels/misdn/isdn_lib_intern.h1
2 files changed, 38 insertions, 11 deletions
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index 8cd2fd10f..835f75cf6 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -884,9 +884,10 @@ static int misdn_lib_get_l2_down(struct misdn_stack *stack)
/* L2 */
dmsg = create_l2msg(DL_RELEASE| REQUEST, 0, 0);
+ pthread_mutex_lock(&stack->nstlock);
if (stack->nst.manager_l3(&stack->nst, dmsg))
free_msg(dmsg);
-
+ pthread_mutex_unlock(&stack->nstlock);
} else {
iframe_t act;
@@ -925,9 +926,10 @@ int misdn_lib_get_l2_up(struct misdn_stack *stack)
/* L2 */
dmsg = create_l2msg(DL_ESTABLISH | REQUEST, 0, 0);
+ pthread_mutex_lock(&stack->nstlock);
if (stack->nst.manager_l3(&stack->nst, dmsg))
free_msg(dmsg);
-
+ pthread_mutex_unlock(&stack->nstlock);
} else {
iframe_t act;
@@ -1427,6 +1429,7 @@ static struct misdn_stack *stack_init(int midev, int port, int ptp)
stack->nst.l2_id = stack->upper_id;
msg_queue_init(&stack->nst.down_queue);
+ pthread_mutex_init(&stack->nstlock, NULL);
Isdnl2Init(&stack->nst);
Isdnl3Init(&stack->nst);
@@ -1463,6 +1466,7 @@ static void stack_destroy(struct misdn_stack *stack)
if (!stack) return;
if (stack->nt) {
+ pthread_mutex_destroy(&stack->nstlock);
cleanup_Isdnl2(&stack->nst);
cleanup_Isdnl3(&stack->nst);
}
@@ -1936,7 +1940,6 @@ static int handle_event_nt(void *dat, void *arg)
struct misdn_stack *stack;
enum event_e event;
int reject=0;
- int port;
int l3id;
int channel;
int tmpcause;
@@ -1946,7 +1949,13 @@ static int handle_event_nt(void *dat, void *arg)
stack = find_stack_by_mgr(mgr);
hh=(mISDNuser_head_t*)msg->data;
- port=stack->port;
+
+ /*
+ * When we are called from the mISDNuser lib, the nstlock is held and it
+ * must be held when we return. We unlock here because the lib may be
+ * entered again recursively.
+ */
+ pthread_mutex_unlock(&stack->nstlock);
cb_log(5, stack->port, " --> lib: prim %x dinfo %x\n",hh->prim, hh->dinfo);
switch(hh->prim) {
@@ -1994,6 +2003,7 @@ static int handle_event_nt(void *dat, void *arg)
cb_log(4, stack->port, "Bc Not found (after SETUP CONFIRM)\n");
}
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
case CC_SETUP | INDICATION:
@@ -2020,6 +2030,7 @@ static int handle_event_nt(void *dat, void *arg)
cb_log(4, stack->port, "Bc Not found (after REGISTER CONFIRM)\n");
}
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
#endif /* defined(AST_MISDN_ENHANCEMENTS) */
@@ -2076,6 +2087,7 @@ static int handle_event_nt(void *dat, void *arg)
case CC_SUSPEND|INDICATION:
cb_log(4, stack->port, " --> Got Suspend, sending Reject for now\n");
dmsg = create_l3msg(CC_SUSPEND_REJECT | REQUEST,MT_SUSPEND_REJECT, hh->dinfo,sizeof(RELEASE_COMPLETE_t), 1);
+ pthread_mutex_lock(&stack->nstlock);
stack->nst.manager_l3(&stack->nst, dmsg);
free_msg(msg);
return 0;
@@ -2097,6 +2109,7 @@ static int handle_event_nt(void *dat, void *arg)
case CC_RELEASE_CR|INDICATION:
release_cr(stack, hh);
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
case CC_NEW_CR|INDICATION:
@@ -2107,6 +2120,7 @@ static int handle_event_nt(void *dat, void *arg)
bc = find_bc_by_l3id(stack, hh->dinfo);
if (!bc) {
cb_log(0, stack->port, " --> In NEW_CR: didn't found bc ??\n");
+ pthread_mutex_lock(&stack->nstlock);
return -1;
}
if (((l3id&0xff00)!=0xff00) && ((bc->l3_id&0xff00)==0xff00)) {
@@ -2121,6 +2135,7 @@ static int handle_event_nt(void *dat, void *arg)
}
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
case DL_ESTABLISH | INDICATION:
@@ -2145,6 +2160,7 @@ static int handle_event_nt(void *dat, void *arg)
stack->l2upcnt=0;
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
case DL_RELEASE | INDICATION:
@@ -2170,6 +2186,7 @@ static int handle_event_nt(void *dat, void *arg)
stack->l2link = 0;
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
default:
@@ -2231,11 +2248,13 @@ static int handle_event_nt(void *dat, void *arg)
}
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
ERR_NO_CHANNEL:
cb_log(4, stack->port, "Patch from MEIDANIS:Sending RELEASE_COMPLETE %x (No free Chan for you..)\n", hh->dinfo);
dmsg = create_l3msg(CC_RELEASE_COMPLETE | REQUEST, MT_RELEASE_COMPLETE, hh->dinfo, sizeof(RELEASE_COMPLETE_t), 1);
+ pthread_mutex_lock(&stack->nstlock);
stack->nst.manager_l3(&stack->nst, dmsg);
free_msg(msg);
return 0;
@@ -2280,7 +2299,9 @@ static int handle_timers(msg_t* msg)
ret = mISDN_write_frame(stack->midev, msg->data, frm->addr,
MGR_TIMER | RESPONSE, 0, 0, NULL, TIMEOUT_1SEC);
test_and_clear_bit(FLG_TIMER_RUNING, (long unsigned int *)&it->Flags);
+ pthread_mutex_lock(&stack->nstlock);
ret = it->function(it->data);
+ pthread_mutex_unlock(&stack->nstlock);
free_msg(msg);
return 1;
}
@@ -2703,8 +2724,9 @@ static int handle_frm_nt(msg_t *msg)
}
+ pthread_mutex_lock(&stack->nstlock);
if ((err=stack->nst.l1_l2(&stack->nst,msg))) {
-
+ pthread_mutex_unlock(&stack->nstlock);
if (nt_err_cnt > 0 ) {
if (nt_err_cnt < 100) {
nt_err_cnt++;
@@ -2716,9 +2738,8 @@ static int handle_frm_nt(msg_t *msg)
}
free_msg(msg);
return 1;
-
}
-
+ pthread_mutex_unlock(&stack->nstlock);
return 1;
}
@@ -2882,8 +2903,10 @@ static int handle_l1(msg_t *msg)
if (stack->nt) {
+ pthread_mutex_lock(&stack->nstlock);
if (stack->nst.l1_l2(&stack->nst, msg))
free_msg(msg);
+ pthread_mutex_unlock(&stack->nstlock);
if (stack->ptp)
misdn_lib_get_l2_up(stack);
@@ -2924,8 +2947,10 @@ static int handle_l1(msg_t *msg)
#endif
if (stack->nt) {
+ pthread_mutex_lock(&stack->nstlock);
if (stack->nst.l1_l2(&stack->nst, msg))
free_msg(msg);
+ pthread_mutex_unlock(&stack->nstlock);
} else {
free_msg(msg);
}
@@ -3014,16 +3039,16 @@ static int handle_mgmt(msg_t *msg)
switch(frm->prim) {
case MGR_SHORTSTATUS | INDICATION:
case MGR_SHORTSTATUS | CONFIRM:
- cb_log(5, 0, "MGMT: Short status dinfo %x\n",frm->dinfo);
+ cb_log(5, stack->port, "MGMT: Short status dinfo %x\n",frm->dinfo);
switch (frm->dinfo) {
case SSTATUS_L1_ACTIVATED:
- cb_log(3, 0, "MGMT: SSTATUS: L1_ACTIVATED \n");
+ cb_log(3, stack->port, "MGMT: SSTATUS: L1_ACTIVATED \n");
stack->l1link=1;
break;
case SSTATUS_L1_DEACTIVATED:
- cb_log(3, 0, "MGMT: SSTATUS: L1_DEACTIVATED \n");
+ cb_log(3, stack->port, "MGMT: SSTATUS: L1_DEACTIVATED \n");
stack->l1link=0;
#if 0
clear_l3(stack);
@@ -4216,9 +4241,10 @@ static void manager_event_handler(void *arg)
while ( (msg=msg_dequeue(&stack->downqueue)) ) {
if (stack->nt ) {
+ pthread_mutex_lock(&stack->nstlock);
if (stack->nst.manager_l3(&stack->nst, msg))
cb_log(0, stack->port, "Error@ Sending Message in NT-Stack.\n");
-
+ pthread_mutex_unlock(&stack->nstlock);
} else {
iframe_t *frm = (iframe_t *)msg->data;
struct misdn_bchannel *bc = find_bc_by_l3id(stack, frm->dinfo);
diff --git a/channels/misdn/isdn_lib_intern.h b/channels/misdn/isdn_lib_intern.h
index 7e7ea8a61..3d0fd5428 100644
--- a/channels/misdn/isdn_lib_intern.h
+++ b/channels/misdn/isdn_lib_intern.h
@@ -65,6 +65,7 @@ struct misdn_stack {
/** is first element because &nst equals &mISDNlist **/
net_stack_t nst;
manager_t mgr;
+ pthread_mutex_t nstlock;
/*! \brief D Channel mISDN driver stack ID (Parent stack ID) */
int d_stid;