aboutsummaryrefslogtreecommitdiffstats
path: root/channels/misdn
diff options
context:
space:
mode:
authorcrichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-11 11:40:21 +0000
committercrichter <crichter@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-11 11:40:21 +0000
commitb3b18d4cb37bbe2d036d37e3689433d10453f6c4 (patch)
tree2cbaf69ddb7cd3c06414560e87843c54b5d2928b /channels/misdn
parent1c3d96abeccab17bf1354118041275035e2c35d1 (diff)
Merged revisions 68644 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r68644 | crichter | 2007-06-11 12:29:18 +0200 (Mo, 11 Jun 2007) | 9 lines Merged revisions 68631 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r68631 | crichter | 2007-06-11 11:18:01 +0200 (Mo, 11 Jun 2007) | 1 line fixed problem that the dummybc chanels had no lock, checking for the lock now. Also fixed the channel restart stuff, we can now specify and restart particular channels too. ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@68661 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/misdn')
-rw-r--r--channels/misdn/ie.c18
-rw-r--r--channels/misdn/isdn_lib.c55
-rw-r--r--channels/misdn/isdn_lib.h1
-rw-r--r--channels/misdn/isdn_msg_parser.c4
4 files changed, 72 insertions, 6 deletions
diff --git a/channels/misdn/ie.c b/channels/misdn/ie.c
index 32f0b76c2..4093805b5 100644
--- a/channels/misdn/ie.c
+++ b/channels/misdn/ie.c
@@ -1402,3 +1402,21 @@ static void dec_ie_useruser(unsigned char *p, Q931_info_t *qi, int *protocol, ch
}
#endif
+/* IE_DISPLAY */
+static void enc_ie_restart_ind(unsigned char **ntmode, msg_t *msg, unsigned char rind, int nt, struct misdn_bchannel *bc)
+{
+ unsigned char *p;
+ Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
+ /* if (MISDN_IE_DEBG) printf(" display='%s' (len=%d)\n", display, strlen((char *)display)); */
+
+ p = msg_put(msg, 3);
+ if (nt)
+ *ntmode = p+1;
+ else
+ qi->QI_ELEMENT(restart_ind) = p - (unsigned char *)qi - sizeof(Q931_info_t);
+ p[0] = IE_RESTART_IND;
+ p[1] = 1;
+ p[2] = rind;
+
+}
+
diff --git a/channels/misdn/isdn_lib.c b/channels/misdn/isdn_lib.c
index 2757c2727..6a6ffb9ee 100644
--- a/channels/misdn/isdn_lib.c
+++ b/channels/misdn/isdn_lib.c
@@ -1137,9 +1137,6 @@ int init_bc(struct misdn_stack *stack, struct misdn_bchannel *bc, int midev, in
}
-
-
-
{
stack_info_t *stinf;
ret = mISDN_get_stack_info(midev, stack->port, buff, sizeof(buff));
@@ -3205,13 +3202,15 @@ void misdn_send_unlock(struct misdn_bchannel *bc);
void misdn_send_lock(struct misdn_bchannel *bc)
{
//cb_log(0,bc->port,"Locking bc->pid:%d\n", bc->pid);
- pthread_mutex_lock(&bc->send_lock->lock);
+ if (bc->send_lock)
+ pthread_mutex_lock(&bc->send_lock->lock);
}
void misdn_send_unlock(struct misdn_bchannel *bc)
{
//cb_log(0,bc->port,"UnLocking bc->pid:%d\n", bc->pid);
- pthread_mutex_unlock(&bc->send_lock->lock);
+ if (bc->send_lock)
+ pthread_mutex_unlock(&bc->send_lock->lock);
}
int misdn_lib_send_event(struct misdn_bchannel *bc, enum event_e event )
@@ -3650,6 +3649,39 @@ int misdn_lib_pid_restart(int pid)
return 0;
}
+/*Sends Restart message for every bchnanel*/
+int misdn_lib_send_restart(int port, int channel)
+{
+ struct misdn_stack *stack=find_stack_by_port(port);
+ cb_log(0, port, "Sending Restarts on this port.\n");
+
+ struct misdn_bchannel dummybc;
+ memset (&dummybc,0,sizeof(dummybc));
+ dummybc.port=stack->port;
+ dummybc.l3_id=MISDN_ID_GLOBAL;
+ dummybc.nt=stack->nt;
+
+ /*default is all channels*/
+ int max=stack->pri?30:2;
+ int i=1;
+
+ /*if a channel is specified we restart only this one*/
+ if (channel > 0) {
+ i=channel;
+ max=channel;
+ }
+
+ for (;i<=max;i++) {
+ dummybc.channel=i;
+ cb_log(0, port, "Restarting channel %d\n",i);
+ misdn_lib_send_event(&dummybc, EVENT_RESTART);
+ /*do we need to wait before we get an EVENT_RESTART_ACK ?*/
+ }
+
+ return 0;
+}
+
+/*reinitializes the L2/L3*/
int misdn_lib_port_restart(int port)
{
struct misdn_stack *stack=find_stack_by_port(port);
@@ -3768,7 +3800,18 @@ static void manager_event_handler(void *arg)
} else {
iframe_t *frm = (iframe_t *)msg->data;
struct misdn_bchannel *bc = find_bc_by_l3id(stack, frm->dinfo);
- if (bc) send_msg(glob_mgr->midev, bc, msg);
+ if (bc)
+ send_msg(glob_mgr->midev, bc, msg);
+ else {
+ if (frm->dinfo == MISDN_ID_GLOBAL) {
+ struct misdn_bchannel dummybc;
+ memset (&dummybc,0,sizeof(dummybc));
+ dummybc.port=stack->port;
+ dummybc.l3_id=MISDN_ID_GLOBAL;
+ dummybc.nt=stack->nt;
+ send_msg(glob_mgr->midev, &dummybc, msg);
+ }
+ }
}
}
}
diff --git a/channels/misdn/isdn_lib.h b/channels/misdn/isdn_lib.h
index af4f20fee..ce8900b27 100644
--- a/channels/misdn/isdn_lib.h
+++ b/channels/misdn/isdn_lib.h
@@ -416,6 +416,7 @@ void isdn_lib_stop_dtmf (struct misdn_bchannel *bc);
int misdn_lib_port_restart(int port);
int misdn_lib_pid_restart(int pid);
+int misdn_lib_send_restart(int port, int channel);
int misdn_lib_get_port_info(int port);
diff --git a/channels/misdn/isdn_msg_parser.c b/channels/misdn/isdn_msg_parser.c
index 9388e4732..de3974184 100644
--- a/channels/misdn/isdn_msg_parser.c
+++ b/channels/misdn/isdn_msg_parser.c
@@ -838,6 +838,10 @@ static msg_t *build_restart (struct isdn_msg msgs[], struct misdn_bchannel *bc,
#ifdef DEBUG
printf("Building RESTART Msg\n");
#endif
+ enc_ie_channel_id(&restart->CHANNEL_ID, msg, 1,bc->channel, nt,bc);
+ enc_ie_restart_ind(&restart->RESTART_IND, msg, 0x80, nt, bc);
+
+ cb_log(0,bc->port, "Restarting channel %d\n", bc->channel);
return msg;
}