Index: addons/chan_ooh323.c =================================================================== --- addons/chan_ooh323.c (revision 287466) +++ addons/chan_ooh323.c (working copy) @@ -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 ch 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 ch 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, ch 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, ch 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,16 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931M p->dtmfcodec = user->dtmfcodec; p->t38support = user->t38support; p->rtptimeout = user->rtptimeout; + + 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 +2183,8 @@ static struct ooh323_user *build_user(const char * 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 +2202,10 @@ static struct ooh323_user *build_user(const char * 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 +2294,8 @@ static struct ooh323_peer *build_peer(const char * 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 +2342,10 @@ static struct ooh323_peer *build_peer(const char * 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 +2809,8 @@ static char *handle_cli_ooh323_show_peer(struct as 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 +2954,8 @@ static char *handle_cli_ooh323_show_user(struct as 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");