77#define IPTOS_MINCOST 0x02
80#define FORMAT_STRING_SIZE 512
83#define DEFAULT_CONTEXT "default"
84#define DEFAULT_H323ID "Asterisk PBX"
85#define DEFAULT_LOGFILE "h323_log"
86#define DEFAULT_H323ACCNT "ast_h323"
89#define H323_SILENCESUPPRESSION (1<<0)
90#define H323_GKROUTED (1<<1)
91#define H323_TUNNELING (1<<2)
92#define H323_FASTSTART (1<<3)
93#define H323_OUTGOING (1<<4)
94#define H323_ALREADYGONE (1<<5)
95#define H323_NEEDDESTROY (1<<6)
96#define H323_DISABLEGK (1<<7)
97#define H323_NEEDSTART (1<<8)
100#define T38TOAUDIOTIMEOUT 30
101#define T38_DISABLED 0
105#define FAXDETECT_CNG 1
106#define FAXDETECT_T38 2
109static const char type[] =
"OOH323";
110static const char tdesc[] =
"Objective Systems H323 Channel Driver";
111static const char config[] =
"ooh323.conf";
119 .resync_threshold = -1,
152 .description =
tdesc,
423 ast_verb(0,
"--- ooh323_new - %s\n", host);
660 dest = strchr(
tmp,
'/');
667 }
else if ((dest = strchr(
tmp,
'@'))) {
677 if ((sport = strchr(dest,
':'))) {
739 }
else if (!
gH323ep.gkClient || (
gH323ep.gkClient &&
gH323ep.gkClient->state != GkClientRegistered)) {
772 assignedids, requestor);
803 ast_verb(0,
"+++ ooh323_request\n");
842 if (ip &&
user->mUseIP && !strcmp(
user->mIP, ip)) {
869 ast_verb(0,
" comparing with \"%s\"\n", peer->
ip);
871 if (!strcmp(peer->
ip,
name)) {
881 ast_verb(0,
" found matching friend\n");
901 ast_verb(0,
" comparing with \"%s\"\n", peer->
ip);
920 ast_verb(0,
" found matching peer\n");
935 ast_verb(0,
"--- ooh323_digit_begin\n");
957 ast_verb(0,
"+++ ooh323_digit_begin, res = %d\n", res);
968 ast_verb(0,
"--- ooh323_digit_end\n");
984 ast_verb(0,
"+++ ooh323_digit_end, res = %d\n", res);
993 char destination[256];
996 ooCallOptions opts = {
1000 .callMode = OO_CALLMODE_AUDIOCALL,
1005 ast_verb(0,
"--- ooh323_call- %s\n", dest);
1056 snprintf(destination,
sizeof(destination),
"%s:%d", p->
host, p->
port);
1058 snprintf(destination,
sizeof(destination),
"%s", p->
host);
1062 destination[
sizeof(destination)-1]=
'\0';
1068 for (i=0;i<480 && !isRunning(p->
callToken);i++) usleep(12000);
1093 ast_verb(0,
"--- ooh323_hangup\n");
1103 if (!strcmp(cause,
"CONGESTION")) {
1105 }
else if (!strcmp(cause,
"BUSY")) {
1107 }
else if (!strcmp(cause,
"CHANISUNVAIL")) {
1109 }
else if (!strcmp(cause,
"NOANSWER")) {
1111 }
else if (!strcmp(cause,
"CANCEL")) {
1149 ast_verb(0,
"+++ ooh323_hangup\n");
1160 ast_verb(0,
"--- ooh323_answer\n");
1170 ast_debug(1,
"Sending forced ringback for %s, res = %u\n",
1189 ast_verb(0,
"+++ ooh323_answer\n");
1200 if (!p)
return &null_frame;
1223 ast_debug(1,
"Send UDPTL %u/%d len %d for %s\n",
1245 "Asked to transmit frame type %s, while native formats is %s (read/write = %s/%s)\n",
1295 ast_verb(0,
" ooh323_indicate - No callToken\n");
1308 switch (condition) {
1368 ast_debug(1,
"Sending connected line info for %s (%s)\n",
1379 ¶meters,
sizeof(parameters));
1384 "Expected %d, got %d\n",
1447 condition, callToken);
1453 ast_verb(0,
"++++ ooh323_indicate %d on %s is %d\n", condition, callToken, res);
1481 " Expected %d, got %d\n", (
int)
sizeof(
enum ast_t38_state), *datalen);
1501 *cp = p->
vad ? 1 : 0;
1502 ast_debug(1,
"Reporting digit detection %sabled on %s\n",
1529 ast_verb(0,
"--- ooh323c ooh323_fixup\n");
1532 if (p->
owner != oldchan) {
1538 if (p->
owner == oldchan) {
1547 ast_verb(0,
"+++ ooh323c ooh323_fixup \n");
1558 ast_verb(0,
"--- ooh323_update_writeformat %s/%d\n",
1581 ast_debug(1,
"Failed to grab lock, trying again\n");
1592 ast_verb(0,
"Writeformat before update %s/%s\n",
1603 p->
rtp, p->
dtmfcodec,
"audio",
"cisco-telephone-event", 0);
1622 ast_verb(0,
"+++ ooh323_update_writeformat\n");
1630 ast_verb(0,
"--- ooh323_update_readformat %s\n",
1653 ast_debug(1,
"Failed to grab lock, trying again\n");
1664 ast_verb(0,
"Readformat before update %s\n",
1678 ast_verb(0,
"+++ ooh323_update_readformat\n");
1703 ast_debug(1,
"Failed to grab lock, trying again\n");
1713 if (
call->remoteDisplayName) {
1717 memset(&update_connected, 0,
sizeof(update_connected));
1718 update_connected.
id.
name = 1;
1759 ast_debug(1,
"Failed to grab lock, trying again\n");
1769 if (
call->remoteDisplayName) {
1773 memset(&update_connected, 0,
sizeof(update_connected));
1774 update_connected.
id.
name = 1;
1815 memset(&f, 0,
sizeof(f));
1823 f.
src =
"SEND_DIGIT";
1826 ast_debug(1,
"Failed to grab lock, trying again\n");
1845 ooAliases *alias =
NULL;
1847 char number [OO_MAX_NUMBER_LENGTH];
1850 ast_verb(0,
"--- ooh323_onReceivedSetup %s\n",
call->callToken);
1861 if (
call->remoteDisplayName) {
1865 if (ooCallGetCallingPartyNumber(
call,
number, OO_MAX_NUMBER_LENGTH) == OO_OK) {
1869 if (
call->remoteAliases) {
1870 for (alias =
call->remoteAliases; alias; alias = alias->next) {
1871 if (alias->type == T_H225AliasAddress_h323_ID) {
1877 else if(alias->type == T_H225AliasAddress_dialedDigits)
1884 else if(alias->type == T_H225AliasAddress_email_ID)
1888 else if(alias->type == T_H225AliasAddress_url_ID)
1896 if(ooCallGetCalledPartyNumber(
call,
number, OO_MAX_NUMBER_LENGTH)== OO_OK) {
1906 if ((at = strchr(p->
exten,
'@'))) {
1919 if(
user && (
user->incominglimit == 0 ||
user->inUse <
user->incominglimit)) {
1941 OO_SETFLAG(
call->flags, OO_M_FASTSTART);
1943 OO_CLRFLAG(
call->flags, OO_M_FASTSTART);
1949 OO_CLRFLAG(
call->flags, OO_M_TUNNELING);
1951 if (
user->rtpmask &&
user->rtpmaskstr[0]) {
1956 if (
user->rtdrcount > 0 &&
user->rtdrinterval > 0) {
1963 if (
user->incominglimit)
user->inUse++;
1975 call->callEndReason = OO_REASON_REMOTE_REJECTED;
1979 call->callEndReason = OO_REASON_REMOTE_REJECTED;
2008 ast_verb(0,
"+++ ooh323_onReceivedSetup - Determined context %s, "
2022 ast_verb(0,
"--- onOutgoingCall %lx: %s\n", (
long unsigned int)
call,
call->callToken);
2024 if (!strcmp(
call->callType,
"outgoing")) {
2070 call->rtpMask->inuse++;
2084 ast_verb(0,
"+++ onOutgoingCall %s\n",
call->callToken);
2095 ast_verb(0,
"--- onNewCallCreated %lx: %s\n", (
long unsigned int)
call,
call->callToken);
2104 if (!strcmp(
call->callType,
"outgoing")) {
2151 if (ooIsDialedDigit(p->
exten)) {
2152 ooCallSetCalledPartyNumber(
call, p->
exten);
2153 ooCallAddRemoteAliasDialedDigits(
call, p->
exten);
2155 ooCallAddRemoteAliasH323ID(
call, p->
exten);
2162 ast_verb(0,
" Outgoing call %s(%s) - Codec prefs - %s\n",
2177 ast_verb(0,
"+++ onNewCallCreated %s\n",
call->callToken);
2186 ast_verb(0,
"--- onCallEstablished %s\n",
call->callToken);
2203 ast_debug(1,
"Failed to grab lock, trying again\n");
2209 if (
call->remoteDisplayName) {
2213 memset(&update_connected, 0,
sizeof(update_connected));
2214 update_connected.
id.
name = 1;
2231 ast_verb(0,
"+++ onCallEstablished %s\n",
call->callToken);
2242 ast_verb(0,
"--- onCallCleared %s \n",
call->callToken);
2250 ooTrace(OOTRCLVLINFO,
"Failed to grab lock, trying again\n");
2251 ast_debug(1,
"Failed to grab lock, trying again\n");
2254 ownerLock = 1;
break;
2291 ast_verb(0,
"+++ onCallCleared\n");
2333 ast_verb(0,
"--- ooh323_delete_peer\n");
2339 if(cur==peer)
break;
2362 ast_verb(0,
"+++ ooh323_delete_peer\n");
2402 if (!strcasecmp(v->
name,
"context")) {
2404 }
else if (!strcasecmp(v->
name,
"incominglimit")) {
2406 if (
user->incominglimit < 0)
2407 user->incominglimit = 0;
2408 }
else if (!strcasecmp(v->
name,
"accountcode")) {
2410 }
else if (!strcasecmp(v->
name,
"roundtrip")) {
2411 sscanf(v->
value,
"%d,%d", &
user->rtdrcount, &
user->rtdrinterval);
2412 }
else if (!strcasecmp(v->
name,
"faststart")) {
2414 }
else if (!strcasecmp(v->
name,
"h245tunneling")) {
2416 }
else if (!strcasecmp(v->
name,
"directrtp") || !strcasecmp(v->
name,
"directmedia")) {
2419 }
else if (!strcasecmp(v->
name,
"earlydirect") || !strcasecmp(v->
name,
"directrtpsetup")) {
2421 }
else if (!strcasecmp(v->
name,
"g729onlyA")) {
2423 }
else if (!strcasecmp(v->
name,
"nat")) {
2425 }
else if (!strcasecmp(v->
name,
"rtptimeout")) {
2427 if (
user->rtptimeout < 0)
2429 }
else if (!strcasecmp(v->
name,
"rtpmask")) {
2430 if ((
user->rtpmask =
ast_calloc(1,
sizeof(
struct OOH323Regex))) &&
2431 (regcomp(&
user->rtpmask->regex, v->
value, REG_EXTENDED)
2434 user->rtpmask->inuse = 1;
2436 sizeof(
user->rtpmaskstr));
2438 }
else if (!strcasecmp(v->
name,
"disallow")) {
2440 }
else if (!strcasecmp(v->
name,
"allow")) {
2441 const char* tcodecs = v->
value;
2442 if (!strcasecmp(v->
value,
"all")) {
2443 tcodecs =
"ulaw,alaw,g729,g723,gsm";
2446 }
else if (!strcasecmp(v->
name,
"amaflags")) {
2448 }
else if (!strcasecmp(v->
name,
"ip") || !strcasecmp(v->
name,
"host")) {
2456 }
else if (!strcasecmp(v->
name,
"dtmfmode")) {
2457 if (!strcasecmp(v->
value,
"rfc2833"))
2459 if (!strcasecmp(v->
value,
"cisco"))
2461 else if (!strcasecmp(v->
value,
"q931keypad"))
2463 else if (!strcasecmp(v->
value,
"h245alphanumeric"))
2465 else if (!strcasecmp(v->
value,
"h245signal"))
2467 else if (!strcasecmp(v->
value,
"inband"))
2469 }
else if (!strcasecmp(v->
name,
"relaxdtmf")) {
2471 }
else if (!strcasecmp(v->
name,
"dtmfcodec") && atoi(v->
value)) {
2473 }
else if (!strcasecmp(v->
name,
"faxdetect")) {
2477 user->faxdetect = 0;
2481 user->faxdetect = 0;
2483 if (!strcasecmp(
word,
"cng")) {
2485 }
else if (!strcasecmp(
word,
"t38")) {
2493 }
else if (!strcasecmp(v->
name,
"t38support")) {
2494 if (!strcasecmp(v->
value,
"disabled"))
2496 if (!strcasecmp(v->
value,
"no"))
2498 else if (!strcasecmp(v->
value,
"faxgw"))
2500 else if (!strcasecmp(v->
value,
"yes"))
2502 }
else if (!strcasecmp(v->
name,
"aniasdni")) {
2546 if (0 == friend_type) {
2551 if (!strcasecmp(v->
name,
"h323id")) {
2558 }
else if (!strcasecmp(v->
name,
"e164")) {
2562 if (!isdigit(*
tmp)) {
2577 }
else if (!strcasecmp(v->
name,
"email")) {
2584 }
else if (!strcasecmp(v->
name,
"url")) {
2591 }
else if (!strcasecmp(v->
name,
"port")) {
2593 }
else if (!strcasecmp(v->
name,
"host") || !strcasecmp(v->
name,
"ip")) {
2601 }
else if (!strcasecmp(v->
name,
"outgoinglimit")) {
2608 }
else if (!strcasecmp(v->
name,
"accountcode")) {
2610 }
else if (!strcasecmp(v->
name,
"faststart")) {
2612 }
else if (!strcasecmp(v->
name,
"h245tunneling")) {
2614 }
else if (!strcasecmp(v->
name,
"directrtp") || !strcasecmp(v->
name,
"directmedia")) {
2617 }
else if (!strcasecmp(v->
name,
"earlydirect") || !strcasecmp(v->
name,
"directrtpsetup")) {
2619 }
else if (!strcasecmp(v->
name,
"g729onlyA")) {
2621 }
else if (!strcasecmp(v->
name,
"nat")) {
2623 }
else if (!strcasecmp(v->
name,
"rtptimeout")) {
2627 }
else if (!strcasecmp(v->
name,
"rtpmask")) {
2629 (regcomp(&peer->
rtpmask->regex, v->
value, REG_EXTENDED)
2636 }
else if (!strcasecmp(v->
name,
"disallow")) {
2638 }
else if (!strcasecmp(v->
name,
"allow")) {
2639 const char* tcodecs = v->
value;
2640 if (!strcasecmp(v->
value,
"all")) {
2641 tcodecs =
"ulaw,alaw,g729,g723,gsm";
2644 }
else if (!strcasecmp(v->
name,
"amaflags")) {
2646 }
else if (!strcasecmp(v->
name,
"roundtrip")) {
2648 }
else if (!strcasecmp(v->
name,
"dtmfmode")) {
2649 if (!strcasecmp(v->
value,
"rfc2833"))
2651 if (!strcasecmp(v->
value,
"cisco"))
2653 else if (!strcasecmp(v->
value,
"q931keypad"))
2655 else if (!strcasecmp(v->
value,
"h245alphanumeric"))
2657 else if (!strcasecmp(v->
value,
"h245signal"))
2659 else if (!strcasecmp(v->
value,
"inband"))
2661 }
else if (!strcasecmp(v->
name,
"relaxdtmf")) {
2663 }
else if (!strcasecmp(v->
name,
"dtmfcodec") && atoi(v->
value)) {
2665 }
else if (!strcasecmp(v->
name,
"faxdetect")) {
2675 if (!strcasecmp(
word,
"cng")) {
2677 }
else if (!strcasecmp(
word,
"t38")) {
2685 }
else if (!strcasecmp(v->
name,
"t38support")) {
2686 if (!strcasecmp(v->
value,
"disabled"))
2688 if (!strcasecmp(v->
value,
"no"))
2690 else if (!strcasecmp(v->
value,
"faxgw"))
2692 else if (!strcasecmp(v->
value,
"yes"))
2707 struct ooAliases * pNewAlias =
NULL;
2711 ast_verb(0,
"--- ooh323_do_reload\n");
2716 ooGkClientDestroy();
2722 if (
gRasGkMode == RasUseSpecificGatekeeper ||
2726 ooGkClientStart(
gH323ep.gkClient);
2731 ast_verb(0,
"updating local aliases\n");
2734 for (pNewAlias =
gAliasList; pNewAlias; pNewAlias = pNewAlias->next) {
2735 switch (pNewAlias->type) {
2736 case T_H225AliasAddress_h323_ID:
2737 ooH323EpAddAliasH323ID(pNewAlias->value);
2739 case T_H225AliasAddress_dialedDigits:
2740 ooH323EpAddAliasDialedDigits(pNewAlias->value);
2742 case T_H225AliasAddress_email_ID:
2743 ooH323EpAddAliasEmailID(pNewAlias->value);
2754 ooH323EpAddAliasH323ID(peer->
h323id);
2757 ooH323EpAddAliasEmailID(peer->
email);
2760 ooH323EpAddAliasDialedDigits(peer->
e164);
2763 ooH323EpAddAliasURLID(peer->
url);
2770 ast_verb(0,
"+++ ooh323_do_reload\n");
2785 "Usage: ooh323 reload\n"
2786 " Reload OOH323 config.\n";
2796 ast_verb(0,
"--- ooh323_reload\n");
2800 ast_verb(0,
"Previous OOH323 reload not yet done\n");
2808 ast_verb(0,
"+++ ooh323_reload\n");
2816 struct ooAliases *pNewAlias =
NULL, *cur, *prev;
2826 ast_verb(0,
"--- reload_config\n");
2841 ast_verb(0,
" reload_config - Freeing up alias list\n");
2851 ooH323EpClearAllAliases();
2892 if (!strcasecmp(v->
name,
"port")) {
2894 }
else if (!strcasecmp(v->
name,
"bindaddr")) {
2904 }
else if (!strcasecmp(v->
name,
"h225portrange")) {
2908 endlimit = strchr(temp,
',');
2916 ast_log(
LOG_ERROR,
"h225portrange: Invalid format, separate port range with \",\"\n");
2918 }
else if (!strcasecmp(v->
name,
"gateway")) {
2920 }
else if (!strcasecmp(v->
name,
"faststart")) {
2923 ooH323EpEnableFastStart();
2925 ooH323EpDisableFastStart();
2926 }
else if (!strcasecmp(v->
name,
"mediawaitforconnect")) {
2929 ooH323EpEnableMediaWaitForConnect();
2931 ooH323EpDisableMediaWaitForConnect();
2932 }
else if (!strcasecmp(v->
name,
"h245tunneling")) {
2935 ooH323EpEnableH245Tunneling();
2937 ooH323EpDisableH245Tunneling();
2938 }
else if (!strcasecmp(v->
name,
"directrtp") || !strcasecmp(v->
name,
"directmedia")) {
2941 }
else if (!strcasecmp(v->
name,
"earlydirect") || !strcasecmp(v->
name,
"directrtpsetup")) {
2943 }
else if (!strcasecmp(v->
name,
"g729onlyA")) {
2945 }
else if (!strcasecmp(v->
name,
"roundtrip")) {
2947 }
else if (!strcasecmp(v->
name,
"trybemaster")) {
2950 ooH323EpTryBeMaster(1);
2952 ooH323EpTryBeMaster(0);
2953 }
else if (!strcasecmp(v->
name,
"h323id")) {
2954 pNewAlias =
ast_calloc(1,
sizeof(
struct ooAliases));
2963 pNewAlias->type = T_H225AliasAddress_h323_ID;
2968 }
else if (!strcasecmp(v->
name,
"e164")) {
2972 if (!isdigit(*
tmp)) {
2978 pNewAlias =
ast_calloc(1,
sizeof(
struct ooAliases));
2984 pNewAlias->type = T_H225AliasAddress_dialedDigits;
2992 }
else if (!strcasecmp(v->
name,
"email")) {
2993 pNewAlias =
ast_calloc(1,
sizeof(
struct ooAliases));
2999 pNewAlias->type = T_H225AliasAddress_email_ID;
3004 }
else if (!strcasecmp(v->
name,
"t35country")) {
3006 }
else if (!strcasecmp(v->
name,
"t35extensions")) {
3008 }
else if (!strcasecmp(v->
name,
"manufacturer")) {
3010 }
else if (!strcasecmp(v->
name,
"vendorid")) {
3012 }
else if (!strcasecmp(v->
name,
"versionid")) {
3014 }
else if (!strcasecmp(v->
name,
"callerid")) {
3016 }
else if (!strcasecmp(v->
name,
"incominglimit")) {
3018 }
else if (!strcasecmp(v->
name,
"outgoinglimit")) {
3020 }
else if (!strcasecmp(v->
name,
"gatekeeper")) {
3021 if (!strcasecmp(v->
value,
"DISABLE")) {
3023 }
else if (!strcasecmp(v->
value,
"DISCOVER")) {
3029 }
else if (!strcasecmp(v->
name,
"localras")) {
3032 }
else if (!strcasecmp(v->
name,
"logfile")) {
3033 if (v->
value[0] ==
'/') {
3038 }
else if (!strcasecmp(v->
name,
"context")) {
3041 }
else if (!strcasecmp(v->
name,
"nat")) {
3043 }
else if (!strcasecmp(v->
name,
"rtptimeout")) {
3047 }
else if (!strcasecmp(v->
name,
"tos")) {
3048 if (sscanf(v->
value,
"%30i", &format) == 1)
3049 gTOS = format & 0xff;
3050 else if (!strcasecmp(v->
value,
"lowdelay"))
3051 gTOS = IPTOS_LOWDELAY;
3052 else if (!strcasecmp(v->
value,
"throughput"))
3053 gTOS = IPTOS_THROUGHPUT;
3054 else if (!strcasecmp(v->
value,
"reliability"))
3055 gTOS = IPTOS_RELIABILITY;
3056 else if (!strcasecmp(v->
value,
"mincost"))
3058 else if (!strcasecmp(v->
value,
"none"))
3062 "'lowdelay', 'throughput', 'reliability', "
3063 "'mincost', or 'none'\n", v->
lineno);
3064 }
else if (!strcasecmp(v->
name,
"amaflags")) {
3066 }
else if (!strcasecmp(v->
name,
"accountcode")) {
3068 }
else if (!strcasecmp(v->
name,
"disallow")) {
3070 }
else if (!strcasecmp(v->
name,
"allow")) {
3071 const char* tcodecs = v->
value;
3072 if (!strcasecmp(v->
value,
"all")) {
3073 tcodecs =
"ulaw,alaw,g729,g723,gsm";
3076 }
else if (!strcasecmp(v->
name,
"dtmfmode")) {
3077 if (!strcasecmp(v->
value,
"inband"))
3079 else if (!strcasecmp(v->
value,
"rfc2833"))
3081 else if (!strcasecmp(v->
value,
"cisco"))
3083 else if (!strcasecmp(v->
value,
"q931keypad"))
3085 else if (!strcasecmp(v->
value,
"h245alphanumeric"))
3087 else if (!strcasecmp(v->
value,
"h245signal"))
3094 }
else if (!strcasecmp(v->
name,
"relaxdtmf")) {
3096 }
else if (!strcasecmp(v->
name,
"dtmfcodec") && atoi(v->
value)) {
3098 }
else if (!strcasecmp(v->
name,
"faxdetect")) {
3108 if (!strcasecmp(
word,
"cng")) {
3110 }
else if (!strcasecmp(
word,
"t38")) {
3118 }
else if (!strcasecmp(v->
name,
"t38support")) {
3119 if (!strcasecmp(v->
value,
"disabled"))
3121 if (!strcasecmp(v->
value,
"no"))
3123 else if (!strcasecmp(v->
value,
"faxgw"))
3125 else if (!strcasecmp(v->
value,
"yes"))
3127 }
else if (!strcasecmp(v->
name,
"tracelevel")) {
3129 ooH323EpSetTraceLevel(
gTRCLVL);
3130 }
else if (!strcasecmp(v->
name,
"aniasdni")) {
3137 if (strcasecmp(cat,
"general")) {
3138 int friend_type = 0;
3141 friend_type = strcasecmp(utype,
"friend");
3142 if (!strcmp(utype,
"user") || 0 == friend_type) {
3153 if (!strcasecmp(utype,
"peer") || 0 == friend_type) {
3172 ooGetLocalIPAddress(
gIP);
3173 if (!strcmp(
gIP,
"127.0.0.1") || !strcmp(
gIP,
"::1")) {
3175 "specify it in ooh323.conf. OOH323 Disabled\n");
3181 ast_verb(0,
"+++ reload_config\n");
3195 e->
command =
"ooh323 show peer";
3197 "Usage: ooh323 show peer <name>\n"
3198 " List details of specific OOH323 peer.\n";
3211 if (!strcmp(peer->name,
a->argv[3])) {
3221 sprintf(ip_port,
"%s:%d", peer->ip, peer->port);
3223 ast_cli(
a->fd,
"%s:%s,%s\n",
"FastStart/H.245 Tunneling", peer->faststart?
"yes":
"no",
3224 peer->h245tunneling?
"yes":
"no");
3225 ast_cli(
a->fd,
"%-15s%s\n",
"DirectRTP", peer->directrtp ?
"yes" :
"no");
3226 ast_cli(
a->fd,
"%-15s%s\n",
"EarlyDirectRTP", peer->earlydirect ?
"yes" :
"no");
3227 ast_cli(
a->fd,
"%-15.15s",
"DTMF Mode: ");
3230 ast_cli(
a->fd,
"%-15.15s%d\n",
"DTMF Codec: ", peer->dtmfcodec);
3233 ast_cli(
a->fd,
"%-15.15s%d\n",
"DTMF Codec: ", peer->dtmfcodec);
3235 ast_cli(
a->fd,
"%s\n",
"q931keypad");
3237 ast_cli(
a->fd,
"%s\n",
"h245alphanumeric");
3239 ast_cli(
a->fd,
"%s\n",
"h245signal");
3241 ast_cli(
a->fd,
"%s\n",
"inband-relaxed");
3247 ast_cli(
a->fd,
"%-15s",
"T.38 Mode: ");
3249 ast_cli(
a->fd,
"%s\n",
"disabled");
3250 }
else if (peer->t38support ==
T38_FAXGW) {
3251 ast_cli(
a->fd,
"%s\n",
"faxgw compatible");
3254 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"Yes");
3256 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"Cng");
3258 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"T.38");
3260 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"No");
3263 ast_cli(
a->fd,
"%-15.15s%s\n",
"AccountCode: ", peer->accountcode);
3265 ast_cli(
a->fd,
"%-15.15s%s\n",
"IP:Port: ", ip_port);
3266 ast_cli(
a->fd,
"%-15.15s%u\n",
"OutgoingLimit: ", peer->outgoinglimit);
3267 ast_cli(
a->fd,
"%-15.15s%d\n",
"rtptimeout: ", peer->rtptimeout);
3268 ast_cli(
a->fd,
"%-15.15s%s\n",
"nat: ", peer->nat?
"yes":
"no");
3269 if (peer->rtpmaskstr[0]) {
3270 ast_cli(
a->fd,
"%-15.15s%s\n",
"rtpmask: ", peer->rtpmaskstr);
3272 if (peer->rtdrcount && peer->rtdrinterval) {
3273 ast_cli(
a->fd,
"%-15.15s%d,%d\n",
"RoundTrip: ", peer->rtdrcount, peer->rtdrinterval);
3277 ast_cli(
a->fd,
"Peer %s not found\n",
a->argv[3]);
3290#define FORMAT "%-15.15s %-15.15s %-23.23s %-s\n"
3294 e->
command =
"ooh323 show peers";
3296 "Usage: ooh323 show peers\n"
3297 " Lists all known OOH323 peers.\n";
3306 ast_cli(
a->fd,
FORMAT,
"Name",
"Accountcode",
"ip:port",
"Formats");
3312 snprintf(ip_port,
sizeof(ip_port),
"%s:%d", peer->ip, peer->port);
3333 e->
command =
"ooh323 show user";
3335 "Usage: ooh323 show user <name>\n"
3336 " List details of specific OOH323 user.\n";
3350 if (!strcmp(
user->name,
a->argv[3])) {
3361 ast_cli(
a->fd,
"%s:%s,%s\n",
"FastStart/H.245 Tunneling",
user->faststart?
"yes":
"no",
3362 user->h245tunneling?
"yes":
"no");
3363 ast_cli(
a->fd,
"%-15s%s\n",
"DirectRTP",
user->directrtp ?
"yes" :
"no");
3364 ast_cli(
a->fd,
"%-15s%s\n",
"EarlyDirectRTP",
user->earlydirect ?
"yes" :
"no");
3365 ast_cli(
a->fd,
"%-15.15s",
"DTMF Mode: ");
3368 ast_cli(
a->fd,
"%-15.15s%d\n",
"DTMF Codec: ",
user->dtmfcodec);
3371 ast_cli(
a->fd,
"%-15.15s%d\n",
"DTMF Codec: ",
user->dtmfcodec);
3373 ast_cli(
a->fd,
"%s\n",
"q931keypad");
3375 ast_cli(
a->fd,
"%s\n",
"h245alphanumeric");
3377 ast_cli(
a->fd,
"%s\n",
"h245signal");
3379 ast_cli(
a->fd,
"%s\n",
"inband-relaxed");
3385 ast_cli(
a->fd,
"%-15s",
"T.38 Mode: ");
3387 ast_cli(
a->fd,
"%s\n",
"disabled");
3389 ast_cli(
a->fd,
"%s\n",
"faxgw compatible");
3392 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"Yes");
3394 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"Cng");
3396 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"T.38");
3398 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"No");
3401 ast_cli(
a->fd,
"%-15.15s%s\n",
"AccountCode: ",
user->accountcode);
3403 ast_cli(
a->fd,
"%-15.15s%s\n",
"Context: ",
user->context);
3404 ast_cli(
a->fd,
"%-15.15s%d\n",
"IncomingLimit: ",
user->incominglimit);
3405 ast_cli(
a->fd,
"%-15.15s%u\n",
"InUse: ",
user->inUse);
3406 ast_cli(
a->fd,
"%-15.15s%d\n",
"rtptimeout: ",
user->rtptimeout);
3407 ast_cli(
a->fd,
"%-15.15s%s\n",
"nat: ",
user->nat?
"yes":
"no");
3408 if (
user->rtpmaskstr[0]) {
3409 ast_cli(
a->fd,
"%-15.15s%s\n",
"rtpmask: ",
user->rtpmaskstr);
3412 if (
user->rtdrcount &&
user->rtdrinterval) {
3413 ast_cli(
a->fd,
"%-15.15s%d,%d\n",
"RoundTrip: ",
user->rtdrcount,
user->rtdrinterval);
3416 ast_cli(
a->fd,
"User %s not found\n",
a->argv[3]);
3428#define FORMAT1 "%-15.15s %-15.15s %-15.15s %-s\n"
3432 e->
command =
"ooh323 show users";
3434 "Usage: ooh323 show users \n"
3435 " Lists all known OOH323 users.\n";
3445 ast_cli(
a->fd,
FORMAT1,
"Username",
"Accountcode",
"Context",
"Formats");
3470 e->
command =
"ooh323 set debug [off]";
3472 "Usage: ooh323 set debug [off]\n"
3473 " Enables/Disables debugging of OOH323 channel driver\n";
3479 if (
a->argc < 3 ||
a->argc > 4)
3481 if (
a->argc == 4 && strcasecmp(
a->argv[3],
"off"))
3491static int ooh323_show_channels(
int fd,
int argc,
char *argv[])
3503 e->
command =
"ooh323 show gk";
3505 "Usage: ooh323 show gk\n"
3506 " Shows Gatekeeper connection state\n";
3515 ast_cli(
a->fd,
"\nGateKeeper connection state:\n");
3517 ast_cli(
a->fd,
"No Gatekeeper is configured\n");
3522 snprintf(
value,
sizeof(
value),
"%s",
"No Gatekeeper");
3523 }
else if (
gRasGkMode == RasDiscoverGatekeeper) {
3524 snprintf(
value,
sizeof(
value),
"%s",
"Discover");
3529 switch(
gH323ep.gkClient->state) {
3531 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Idle");
3533 case GkClientDiscovered:
3534 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Discovered");
3536 case GkClientRegistered:
3537 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Registered");
3539 case GkClientUnregistered:
3540 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Unregistered");
3543 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Error");
3545 case GkClientFailed:
3546 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Failed");
3548 case GkClientStopped:
3549 ast_cli(
a->fd,
"%-20s%s\n",
"GK state:",
"Shutdown");
3562 ooAliases *pAlias =
NULL, *pAliasNext =
NULL;;
3566 e->
command =
"ooh323 show config";
3568 "Usage: ooh323 show config\n"
3569 " Shows global configuration of H.323 channel driver\n";
3578 ast_cli(
a->fd,
"\nObjective Open H.323 Channel Driver's Config:\n");
3590 extern OOH323EndPoint
gH323ep;
3591 ast_cli(
a->fd,
"%-20s%s\n",
"FASTSTART",
3592 (OO_TESTFLAG(
gH323ep.flags, OO_M_FASTSTART) != 0) ?
"yes" :
"no");
3593 ast_cli(
a->fd,
"%-20s%s\n",
"TUNNELING",
3594 (OO_TESTFLAG(
gH323ep.flags, OO_M_TUNNELING) != 0) ?
"yes" :
"no");
3595 ast_cli(
a->fd,
"%-20s%s\n",
"MEDIAWAITFORCONN",
3596 (OO_TESTFLAG(
gH323ep.flags, OO_M_MEDIAWAITFORCONN) != 0) ?
"yes" :
"no");
3600 snprintf(
value,
sizeof(
value),
"%s",
"No Gatekeeper");
3601 }
else if (
gRasGkMode == RasDiscoverGatekeeper) {
3602 snprintf(
value,
sizeof(
value),
"%s",
"Discover");
3609 ast_cli(
a->fd,
"%-20s%s\n",
"Capability:",
3611 ast_cli(
a->fd,
"%-20s",
"DTMF Mode: ");
3619 ast_cli(
a->fd,
"%s\n",
"q931keypad");
3621 ast_cli(
a->fd,
"%s\n",
"h245alphanumeric");
3623 ast_cli(
a->fd,
"%s\n",
"h245signal");
3625 ast_cli(
a->fd,
"%s\n",
"inband-relaxed");
3632 ast_cli(
a->fd,
"%-20s",
"T.38 Mode: ");
3634 ast_cli(
a->fd,
"%s\n",
"disabled");
3636 ast_cli(
a->fd,
"%s\n",
"faxgw compatible");
3639 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"Yes");
3641 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"Cng");
3643 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"T.38");
3645 ast_cli(
a->fd,
"%-20s%s\n",
"FAX Detect:",
"No");
3658 ast_cli(
a->fd,
"%-20s\n",
"Aliases: ");
3661 pAliasNext = pAlias->next;
3663 ast_cli(
a->fd,
"\t%-30s\t%-30s\n",pAlias->value, pAliasNext->value);
3664 pAlias = pAliasNext->next;
3666 ast_cli(
a->fd,
"\t%-30s\n",pAlias->value);
3667 pAlias = pAlias->next;
3702 if (!strcasecmp(data,
"faxdetect")) {
3704 }
else if (!strcasecmp(data,
"t38support")) {
3706 }
else if (!strcasecmp(data,
"caller_h323id")) {
3708 }
else if (!strcasecmp(data,
"caller_dialeddigits")) {
3710 }
else if (!strcasecmp(data,
"caller_email")) {
3712 }
else if (!strcasecmp(data,
"h323id_url")) {
3714 }
else if (!strcasecmp(data,
"callee_h323id")) {
3716 }
else if (!strcasecmp(data,
"callee_dialeddigits")) {
3718 }
else if (!strcasecmp(data,
"callee_email")) {
3720 }
else if (!strcasecmp(data,
"callee_url")) {
3748 if (!strcasecmp(data,
"faxdetect")) {
3761 if (!strcasecmp(
word,
"cng")) {
3763 }
else if (!strcasecmp(
word,
"t38")) {
3772 }
else if (!strcasecmp(data,
"t38support")) {
3789 struct ooAliases * pNewAlias =
NULL;
3791 OOH225MsgCallbacks h225Callbacks = {0, 0, 0, 0};
3793 OOH323CALLBACKS h323Callbacks = {
3797 .onIncomingCall =
NULL,
3801 .openLogicalChannels =
NULL,