]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
added restart all interfaces Restart_Indicator, to automatically send a RESTART after...
authorChristian Richter <christian.richter@beronet.com>
Mon, 12 Nov 2007 11:23:57 +0000 (11:23 +0000)
committerChristian Richter <christian.richter@beronet.com>
Mon, 12 Nov 2007 11:23:57 +0000 (11:23 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@89172 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_misdn.c
channels/misdn/isdn_lib.c
channels/misdn/isdn_lib_intern.h
channels/misdn/isdn_msg_parser.c

index 1eaa30d5f2aa8290b1f0619ffd2c31d53d817bd6..de97eb012040cca43160755c0dfe8c599c39e680 100644 (file)
@@ -797,7 +797,6 @@ static int misdn_set_crypt_debug(int fd, int argc, char *argv[])
        return 0;
 }
 
-
 static int misdn_port_block(int fd, int argc, char *argv[])
 {
        int port;
@@ -872,7 +871,7 @@ static int misdn_port_up (int fd, int argc, char *argv[])
 static int misdn_port_down (int fd, int argc, char *argv[])
 {
        int port;
-       
+
        if (argc != 4)
                return RESULT_SHOWUSAGE;
        
@@ -2422,7 +2421,7 @@ static int misdn_hangup(struct ast_channel *ast)
 {
        struct chan_list *p;
        struct misdn_bchannel *bc=NULL;
-       
+
        ast_log(LOG_DEBUG, "misdn_hangup(%s)\n", ast->name);
        
        if (!ast || ! (p=MISDN_ASTERISK_TECH_PVT(ast) ) ) return -1;
@@ -2510,7 +2509,8 @@ static int misdn_hangup(struct ast_channel *ast)
                        release_chan(bc);
 
                        p->state=MISDN_CLEANING;
-                       misdn_lib_send_event( bc, EVENT_RELEASE_COMPLETE);
+                       if (bc->need_release_complete)
+                               misdn_lib_send_event( bc, EVENT_RELEASE_COMPLETE);
                        break;
                case MISDN_HOLDED:
                case MISDN_DIALING:
@@ -2553,7 +2553,8 @@ static int misdn_hangup(struct ast_channel *ast)
                        /*p->state=MISDN_CLEANING;*/
                        break;
                case MISDN_DISCONNECTED:
-                       misdn_lib_send_event( bc, EVENT_RELEASE);
+                       if (bc->need_release)
+                               misdn_lib_send_event( bc, EVENT_RELEASE);
                        p->state=MISDN_CLEANING; /* MISDN_HUNGUP_FROM_AST; */
                        break;
 
@@ -2571,13 +2572,15 @@ static int misdn_hangup(struct ast_channel *ast)
                        chan_misdn_log(1, bc->port, " --> out_cause %d\n",bc->out_cause);
                        
                        bc->out_cause=-1;
-                       misdn_lib_send_event(bc,EVENT_RELEASE);
+                       if (bc->need_release)
+                               misdn_lib_send_event(bc,EVENT_RELEASE);
                        p->state=MISDN_CLEANING;
                        break;
                default:
                        if (bc->nt) {
                                bc->out_cause=-1;
-                               misdn_lib_send_event(bc, EVENT_RELEASE);
+                               if (bc->need_release)
+                                       misdn_lib_send_event(bc, EVENT_RELEASE);
                                p->state=MISDN_CLEANING; 
                        } else {
                                if (bc->need_disconnect)
index 638f8b0c08cc3439250216631342c0b3355b5521..e2003a190cf0025e2e0a2c8f47d9834fb0fd4de9 100644 (file)
@@ -766,15 +766,12 @@ static int misdn_lib_get_l1_down(struct misdn_stack *stack)
        /* Pull Up L1 */ 
        iframe_t act;
        act.prim = PH_DEACTIVATE | REQUEST; 
-       act.addr = (stack->upper_id | FLG_MSG_DOWN)  ;
-
-       
+       act.addr = stack->lower_id|FLG_MSG_DOWN;
        act.dinfo = 0;
        act.len = 0;
 
+       cb_log(1, stack->port, "SENDING PH_DEACTIVATE | REQ\n");
        return mISDN_write(stack->midev, &act, mISDN_HEADER_LEN+act.len, TIMEOUT_1SEC);
-
-
 }
 
 
@@ -1995,6 +1992,14 @@ handle_event_nt(void *dat, void *arg)
                                cb_log(0, stack->port, "%% GOT L2 Activate Info. but we're activated already.. this l2 is faulty, blocking port\n");
                                cb_event(EVENT_PORT_ALARM, &stack->bc[0], glob_mgr->user_data);
                        }
+
+                       if (stack->ptp && !stack->restart_sent) {
+                               /* make sure we restart the interface of the 
+                                * other side */
+                               stack->restart_sent=1;
+                               misdn_lib_send_restart(stack->port, -1);
+
+                       }
                
                        /* when we get the L2 UP, the L1 is UP definitely too*/
                        stack->l1link = 1;
@@ -3689,8 +3694,6 @@ int misdn_lib_pid_restart(int pid)
 /*Sends Restart message for every bchnanel*/
 int misdn_lib_send_restart(int port, int channel)
 {
-       int max;
-       int i;
        struct misdn_bchannel dummybc;
        struct misdn_stack *stack=find_stack_by_port(port);
        cb_log(0, port, "Sending Restarts on this port.\n");
@@ -3698,26 +3701,24 @@ int misdn_lib_send_restart(int port, int channel)
        make_dummy(&dummybc, stack->port, MISDN_ID_GLOBAL, stack->nt, 0);
 
        /*default is all channels*/
-       max=stack->pri?30:2;
-       i=1;
-       
-       /*if a channel is specified we restart only this one*/
-       if (channel > 0) {
-               i=channel;
-               max=channel;
+       if (channel <0) {
+               dummybc.channel=-1;
+               cb_log(0, port, "Restarting and all Interfaces\n");
+               misdn_lib_send_event(&dummybc, EVENT_RESTART);
+
+               return 0;
        }
 
-       for (;i<=max;i++) {
+       /*if a channel is specified we restart only this one*/
+       if (channel >0) {
                int cnt;
-               dummybc.channel=i;
-               cb_log(0, port, "Restarting and cleaning channel %d\n",i);
+               dummybc.channel=channel;
+               cb_log(0, port, "Restarting and cleaning channel %d\n",channel);
                misdn_lib_send_event(&dummybc, EVENT_RESTART);
-               /*do we need to wait before we get an EVENT_RESTART_ACK ?*/
-
                /* clean up chan in stack, to be sure we don't think it's
                 * in use anymore */
                for (cnt=0; cnt<=stack->b_num; cnt++) {
-                       if (stack->bc[cnt].channel == i) {
+                       if (stack->bc[cnt].channel == channel) {
                                empty_bc(&stack->bc[cnt]);
                                clean_up_bc(&stack->bc[cnt]);
                                stack->bc[cnt].in_use=0;
index 757e8e20b84327995df1a37955ff052fe320bc60..050c86fee6aadea212dfcf098d46c11d1bd5980d 100644 (file)
@@ -78,6 +78,9 @@ struct misdn_stack {
        time_t l2establish;
   
        int l1link;
+
+       int restart_sent;
+
        int midev;
   
        int nt;
index 4630c3780d7364a1486c474da5aa37906266fdf9..a587f8eaeabc922980a34bb200a6f913fcf74bbc 100644 (file)
@@ -840,8 +840,13 @@ static msg_t *build_restart (struct isdn_msg msgs[], struct misdn_bchannel *bc,
 #if 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);
+
+       if (bc->channel > 0) {
+               enc_ie_channel_id(&restart->CHANNEL_ID, msg, 1,bc->channel, nt,bc);
+               enc_ie_restart_ind(&restart->RESTART_IND, msg, 0x80, nt, bc);
+       } else {
+               enc_ie_restart_ind(&restart->RESTART_IND, msg, 0x87, nt, bc);
+       }
 
        cb_log(0,bc->port, "Restarting channel %d\n", bc->channel);