Added fast start and h.245 tunneling options per user and peer.
authorAlexandr Anikin <may@telecom-service.ru>
Sat, 9 Oct 2010 14:04:35 +0000 (14:04 +0000)
committerAlexandr Anikin <may@telecom-service.ru>
Sat, 9 Oct 2010 14:04:35 +0000 (14:04 +0000)
Added options for faststart/h.245 tunneling per user/peer, properly
handle these and global options, correction of handling fs/tunneling
fields in signalling responses

(closes issue #17972)
Reported by: salecha
Patches:
      fs-tunnel-per-point-3.patch uploaded by may213 (license 454)
Tested by: may213, salecha

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@291006 65c4cc65-6c06-0410-ace0-fbb531ad65f3

addons/chan_ooh323.c
addons/ooh323c/src/ooh245.c
addons/ooh323c/src/ooh323.c

index fc674ad..af9a711 100644 (file)
@@ -188,6 +188,7 @@ static struct ooh323_pvt {
        struct OOH323Regex *rtpmask;    /* rtp ip regexp */
        char rtpmaskstr[120];
        int rtdrcount, rtdrinterval;    /* roundtripdelayreq */
+       int faststart, h245tunneling;   /* faststart & h245 tunneling */
        struct ooh323_pvt *next;        /* Next entity */
 } *iflist = NULL;
 
@@ -214,6 +215,7 @@ struct ooh323_user{
        struct OOH323Regex          *rtpmask;
        char        rtpmaskstr[120];
        int         rtdrcount, rtdrinterval;
+       int         faststart, h245tunneling;
        struct ooh323_user *next;
 };
 
@@ -241,6 +243,7 @@ struct ooh323_peer{
        struct OOH323Regex          *rtpmask;
        char        rtpmaskstr[120];
        int         rtdrcount,rtdrinterval;
+       int         faststart, h245tunneling;
        struct ooh323_peer *next;
 };
 
@@ -636,6 +639,8 @@ static struct ast_channel *ooh323_request(const char *type, format_t format,
                p->dtmfcodec  = peer->dtmfcodec;
                p->t38support = peer->t38support;
                p->rtptimeout = peer->rtptimeout;
+               p->faststart = peer->faststart;
+               p->h245tunneling = peer->h245tunneling;
                if (peer->rtpmask && peer->rtpmaskstr[0]) {
                        p->rtpmask = peer->rtpmask;
                        ast_copy_string(p->rtpmaskstr, peer->rtpmaskstr, sizeof(p->rtpmaskstr));
@@ -665,6 +670,8 @@ static struct ast_channel *ooh323_request(const char *type, format_t format,
                p->capability = gCapability;
                p->rtdrinterval = gRTDRInterval;
                p->rtdrcount = gRTDRCount;
+               p->faststart = gFastStart;
+               p->h245tunneling = gTunneling;
 
                memcpy(&p->prefs, &gPrefs, sizeof(struct ast_codec_pref));
                p->username = strdup(dest);
@@ -914,10 +921,9 @@ static int ooh323_call(struct ast_channel *ast, char *dest, int timeout)
                ast_verbose("---   ooh323_call- %s\n", dest);
 
 
-   if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) 
-   {
+       if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
                ast_log(LOG_WARNING, "ooh323_call called on %s, neither down nor "
-                                                                       "reserved\n", ast->name);
+                                                               "reserved\n", ast->name);
                return -1;
        }
        ast_mutex_lock(&p->lock);
@@ -972,6 +978,8 @@ static int ooh323_call(struct ast_channel *ast, char *dest, int timeout)
        destination[sizeof(destination)-1]='\0';
 
        opts.transfercap = ast->transfercapability;
+       opts.fastStart = p->faststart;
+       opts.tunneling = p->h245tunneling;
 
        for (i=0;i<480 && !isRunning(p->callToken);i++) usleep(12000);
 
@@ -1758,6 +1766,18 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg)
                p->dtmfcodec = user->dtmfcodec;
                p->t38support = user->t38support;
                p->rtptimeout = user->rtptimeout;
+               p->h245tunneling = user->h245tunneling;
+               p->faststart = user->faststart;
+
+               if (p->faststart)
+                       OO_SETFLAG(call->flags, OO_M_FASTSTART);
+               else
+                       OO_CLRFLAG(call->flags, OO_M_FASTSTART);
+               if (p->h245tunneling)
+                       OO_SETFLAG(call->flags, OO_M_TUNNELING);
+               else
+                       OO_CLRFLAG(call->flags, OO_M_TUNNELING);
+
                if (user->rtpmask && user->rtpmaskstr[0]) {
                        p->rtpmask = user->rtpmask;
                        ast_copy_string(p->rtpmaskstr, user->rtpmaskstr, 
@@ -2165,6 +2185,8 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v)
                user->dtmfmode = gDTMFMode;
                user->dtmfcodec = gDTMFCodec;
                user->t38support = gT38Support;
+               user->faststart = gFastStart;
+               user->h245tunneling = gTunneling;
                /* set default context */
                ast_copy_string(user->context, gContext, sizeof(user->context));
                ast_copy_string(user->accountcode, gAccountcode, sizeof(user->accountcode));
@@ -2182,6 +2204,10 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v)
                                                sizeof(user->accountcode)-1);
                        } else if (!strcasecmp(v->name, "roundtrip")) {
                                sscanf(v->value, "%d,%d", &user->rtdrcount, &user->rtdrinterval);
+                       } else if (!strcasecmp(v->name, "faststart")) {
+                               user->faststart = ast_true(v->value);
+                       } else if (!strcasecmp(v->name, "h245tunneling")) {
+                               user->h245tunneling = ast_true(v->value);
                        } else if (!strcasecmp(v->name, "rtptimeout")) {
                                user->rtptimeout = atoi(v->value);
                                if (user->rtptimeout < 0)
@@ -2270,6 +2296,8 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v,
                peer->dtmfmode = gDTMFMode;
                peer->dtmfcodec = gDTMFCodec;
                peer->t38support = gT38Support;
+               peer->faststart = gFastStart;
+               peer->h245tunneling = gTunneling;
                peer->port = 1720;
                if (0 == friend_type) {
                        peer->mFriend = 1;
@@ -2316,6 +2344,10 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v,
                                        peer->outgoinglimit = 0;
                        } else if (!strcasecmp(v->name, "accountcode")) {
                                ast_copy_string(peer->accountcode, v->value, sizeof(peer->accountcode));
+                       } else if (!strcasecmp(v->name, "faststart")) {
+                               peer->faststart = ast_true(v->value);
+                       } else if (!strcasecmp(v->name, "h245tunneling")) {
+                               peer->h245tunneling = ast_true(v->value);
                        } else if (!strcasecmp(v->name, "rtptimeout")) {
                                peer->rtptimeout = atoi(v->value);
                                if(peer->rtptimeout < 0)
@@ -2779,6 +2811,8 @@ static char *handle_cli_ooh323_show_peer(struct ast_cli_entry *e, int cmd, struc
        if (peer) {
       sprintf(ip_port, "%s:%d", peer->ip, peer->port);
       ast_cli(a->fd, "%-15.15s%s\n", "Name: ", peer->name);
+      ast_cli(a->fd, "%s:%s,%s\n", "FastStart/H.245 Tunneling", peer->faststart?"yes":"no",
+                                       peer->h245tunneling?"yes":"no");
       ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "(");
       print_codec_to_cli(a->fd, &peer->prefs);
       ast_cli(a->fd, ")\n");
@@ -2922,6 +2956,8 @@ static char *handle_cli_ooh323_show_user(struct ast_cli_entry *e, int cmd, struc
 
        if (user) {
       ast_cli(a->fd, "%-15.15s%s\n", "Name: ", user->name);
+      ast_cli(a->fd, "%s:%s,%s\n", "FastStart/H.245 Tunneling", user->faststart?"yes":"no",
+                                       user->h245tunneling?"yes":"no");
       ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "(");
       print_codec_to_cli(a->fd, &user->prefs);
       ast_cli(a->fd, ")\n");
index d42f8bb..adbe184 100644 (file)
@@ -957,10 +957,8 @@ int ooHandleMasterSlave(OOH323CallData *call, void * pmsg,
             /*Since Cap exchange and MasterSlave Procedures are done */
             if(gH323ep.h323Callbacks.openLogicalChannels)
                gH323ep.h323Callbacks.openLogicalChannels(call);
-            else{
-               if(!ooGetTransmitLogicalChannel(call))
-                  ooOpenLogicalChannels(call);
-            }
+            if(!ooGetTransmitLogicalChannel(call))
+               ooOpenLogicalChannels(call);
 #if 0
             if(!call->logicalChans){
                if(!gH323ep.h323Callbacks.openLogicalChannels)
@@ -2114,10 +2112,8 @@ int ooOnReceivedTerminalCapabilitySetAck(OOH323CallData* call)
    {
       if(gH323ep.h323Callbacks.openLogicalChannels)
          gH323ep.h323Callbacks.openLogicalChannels(call);
-      else{
-         if(!ooGetTransmitLogicalChannel(call))
-            ooOpenLogicalChannels(call);
-      }
+      if(!ooGetTransmitLogicalChannel(call))
+         ooOpenLogicalChannels(call);
 #if 0
       if(!call->logicalChans){
          if(!gH323ep.h323Callbacks.openLogicalChannels)
@@ -3141,10 +3137,8 @@ int ooOnReceivedTerminalCapabilitySet(OOH323CallData *call, H245Message *pmsg)
  
    if(gH323ep.h323Callbacks.openLogicalChannels)
       gH323ep.h323Callbacks.openLogicalChannels(call);
-   else{
-      if(!ooGetTransmitLogicalChannel(call))
-         ooOpenLogicalChannels(call);
-   }
+   if(!ooGetTransmitLogicalChannel(call))
+      ooOpenLogicalChannels(call);
 #if 0
    if(!call->logicalChans){
       if(!gH323ep.h323Callbacks.openLogicalChannels)
index c266b19..ed097d9 100644 (file)
@@ -751,9 +751,18 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg)
       
    }
 
-   /* Retrieve the H.245 control channel address from the connect msg */
+   /* Retrieve tunneling info/H.245 control channel address from the connect msg */
+   if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && 
+      !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
+       if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+               OO_CLRFLAG (call->flags, OO_M_TUNNELING);
+               OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling"
+                             " (%s, %s)\n", call->callType, call->callToken);
+       }
+   }
    if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
       q931Msg->userInfo->h323_uu_pdu.h245Tunneling &&
+      OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
       callProceeding->m.h245AddressPresent) {
       OOTRACEINFO3("Tunneling and h245address provided."
                    "Using Tunneling for H.245 messages (%s, %s)\n", 
@@ -801,6 +810,7 @@ int ooOnReceivedCallProceeding(OOH323CallData *call, Q931Message *q931Msg)
        }
       }
    }
+
    return OO_OK;
 }
 
@@ -970,16 +980,27 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg)
 
    }
 
-   /* Retrieve the H.245 control channel address from the connect msg */
+   /* Retrieve tunneling info/H.245 control channel address from the connect msg */
+   if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && 
+      !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
+       if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+               OO_CLRFLAG (call->flags, OO_M_TUNNELING);
+               OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling"
+                             " (%s, %s)\n", call->callType, call->callToken);
+       }
+   }
    if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
       q931Msg->userInfo->h323_uu_pdu.h245Tunneling &&
-      alerting->m.h245AddressPresent) {
-      OOTRACEINFO3("Tunneling and h245address provided."
-                   "Giving preference to Tunneling (%s, %s)\n", 
-                   call->callType, call->callToken);
-   }
-   else if(alerting->m.h245AddressPresent)
-   {
+        OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+      if (alerting->m.h245AddressPresent) 
+       OOTRACEINFO3("Tunneling and h245address provided."
+                     "Giving preference to Tunneling (%s, %s)\n", 
+                       call->callType, call->callToken);
+       ret =ooSendTCSandMSD(call);
+       if (ret != OO_OK)
+               return ret;
+
+   } else if(alerting->m.h245AddressPresent) {
       if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))
       {
          OO_CLRFLAG (call->flags, OO_M_TUNNELING);
@@ -1019,13 +1040,12 @@ int ooOnReceivedAlerting(OOH323CallData *call, Q931Message *q931Msg)
          return OO_FAILED;
        }
       }
-   } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
-       ret =ooSendTCSandMSD(call);
+   } else if (!call->pH245Channel && !call->h245listener) {
+       ret = ooSendStartH245Facility(call);
        if (ret != OO_OK)
                return ret;
    }
 
-
    return OO_OK;
 }
 
@@ -1195,15 +1215,26 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg)
    }
 
    /* Retrieve the H.245 control channel address from the connect msg */
+   /* Retrieve tunneling info/H.245 control channel address from the connect msg */
+   if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && 
+      !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
+       if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+               OO_CLRFLAG (call->flags, OO_M_TUNNELING);
+               OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling"
+                             " (%s, %s)\n", call->callType, call->callToken);
+       }
+   }
    if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
       q931Msg->userInfo->h323_uu_pdu.h245Tunneling &&
-      progress->m.h245AddressPresent) {
-      OOTRACEINFO3("Tunneling and h245address provided."
-                   "Giving preference to Tunneling (%s, %s)\n", 
-                   call->callType, call->callToken);
-   }
-   else if(progress->m.h245AddressPresent)
-   {
+      OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+      if (progress->m.h245AddressPresent) 
+       OOTRACEINFO3("Tunneling and h245address provided."
+                     "Giving preference to Tunneling (%s, %s)\n", 
+                     call->callType, call->callToken);
+       ret =ooSendTCSandMSD(call);
+       if (ret != OO_OK)
+               return ret;
+   } else if(progress->m.h245AddressPresent) {
       if (OO_TESTFLAG (call->flags, OO_M_TUNNELING))
       {
          OO_CLRFLAG (call->flags, OO_M_TUNNELING);
@@ -1243,8 +1274,8 @@ int ooOnReceivedProgress(OOH323CallData *call, Q931Message *q931Msg)
          return OO_FAILED;
        }
       }
-   } else if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
-       ret =ooSendTCSandMSD(call);
+   } else if (!call->pH245Channel && !call->h245listener) {
+       ret = ooSendStartH245Facility(call);
        if (ret != OO_OK)
                return ret;
    }
@@ -1444,9 +1475,18 @@ int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg)
       OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
    }
 
-   /* Retrieve the H.245 control channel address from the CONNECT msg */
+   /* Retrieve tunneling info/H.245 control channel address from the connect msg */
+   if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && 
+      !q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
+       if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+               OO_CLRFLAG (call->flags, OO_M_TUNNELING);
+               OOTRACEINFO3("Tunneling is disabled for call due to remote reject tunneling"
+                             " (%s, %s)\n", call->callType, call->callToken);
+       }
+   }
    if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
       q931Msg->userInfo->h323_uu_pdu.h245Tunneling &&
+      OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
       connect->m.h245AddressPresent) {
       OOTRACEINFO3("Tunneling and h245address provided."
                    "Giving preference to Tunneling (%s, %s)\n",