aboutsummaryrefslogtreecommitdiffstats
path: root/channels/misdn/isdn_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/misdn/isdn_lib.c')
-rw-r--r--channels/misdn/isdn_lib.c70
1 files changed, 51 insertions, 19 deletions
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index 1a42c0287..2b0e6aee4 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -819,9 +819,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;
@@ -860,9 +861,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;
@@ -1369,6 +1371,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);
@@ -1410,6 +1413,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);
}
@@ -1846,17 +1850,22 @@ handle_event_nt(void *dat, void *arg)
manager_t *mgr = (manager_t *)dat;
msg_t *msg = (msg_t *)arg;
mISDNuser_head_t *hh;
+ struct misdn_stack *stack;
int reject=0;
- struct misdn_stack *stack=find_stack_by_mgr(mgr);
- int port;
-
if (!msg || !mgr)
return(-EINVAL);
+ 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){
@@ -1876,6 +1885,7 @@ handle_event_nt(void *dat, void *arg)
msg_t *dmsg;
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;
@@ -1907,12 +1917,16 @@ handle_event_nt(void *dat, void *arg)
int l3id = *((int *)(((u_char *)msg->data)+ mISDNUSER_HEAD_SIZE));
cb_log(4, stack->port, " --> lib: Event_ind:SETUP CONFIRM [NT] : new L3ID is %x\n",l3id );
- if (!bc) { cb_log(4, stack->port, "Bc Not found (after SETUP CONFIRM)\n"); return 0; }
- cb_log (2,bc->port,"I IND :CC_SETUP|CONFIRM: old l3id:%x new l3id:%x\n", bc->l3_id, l3id);
- bc->l3_id=l3id;
- cb_event(EVENT_NEW_L3ID, bc, glob_mgr->user_data);
+ if (bc) {
+ cb_log (2, bc->port, "I IND :CC_SETUP|CONFIRM: old l3id:%x new l3id:%x\n", bc->l3_id, l3id);
+ bc->l3_id = l3id;
+ cb_event(EVENT_NEW_L3ID, bc, glob_mgr->user_data);
+ } else {
+ 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:
@@ -1924,6 +1938,7 @@ handle_event_nt(void *dat, void *arg)
msg_t *dmsg;
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;
@@ -1980,6 +1995,7 @@ handle_event_nt(void *dat, void *arg)
msg_t *dmsg;
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;
@@ -2005,6 +2021,7 @@ 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 ;
break;
@@ -2014,7 +2031,11 @@ handle_event_nt(void *dat, void *arg)
{
struct misdn_bchannel *bc=find_bc_by_l3id(stack, hh->dinfo);
int l3id = *((int *)(((u_char *)msg->data)+ mISDNUSER_HEAD_SIZE));
- if (!bc) { cb_log(0, stack->port, " --> In NEW_CR: didn't found bc ??\n"); return -1;};
+ 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)) {
cb_log(4, stack->port, " --> Removing Process Id:%x on this port.\n", 0xff&bc->l3_id);
stack->procids[bc->l3_id&0xff] = 0 ;
@@ -2025,6 +2046,7 @@ handle_event_nt(void *dat, void *arg)
cb_event(EVENT_NEW_L3ID, bc, glob_mgr->user_data);
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
}
@@ -2051,6 +2073,7 @@ handle_event_nt(void *dat, void *arg)
stack->l2upcnt=0;
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
}
break;
@@ -2079,6 +2102,7 @@ handle_event_nt(void *dat, void *arg)
stack->l2link = 0;
free_msg(msg);
+ pthread_mutex_lock(&stack->nstlock);
return 0;
}
break;
@@ -2152,6 +2176,7 @@ handle_event_nt(void *dat, void *arg)
}
+ pthread_mutex_lock(&stack->nstlock);
return 0;
}
@@ -2194,7 +2219,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;
}
@@ -2610,8 +2637,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++;
@@ -2623,9 +2651,8 @@ static int handle_frm_nt(msg_t *msg)
}
free_msg(msg);
return 1;
-
}
-
+ pthread_mutex_unlock(&stack->nstlock);
return 1;
}
@@ -2803,8 +2830,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);
@@ -2845,8 +2874,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);
}
@@ -2935,16 +2966,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);
@@ -3969,9 +4000,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);