From bb9ace0b9d268a4f7b1f6e123f90a8549d726f61 Mon Sep 17 00:00:00 2001 From: may Date: Tue, 12 Apr 2011 21:59:18 +0000 Subject: IPv6 support for chan_ooh323 IPv6 support for ooh323, bindaddr, peers and users ip can be IPv4 or IPv6 addr correction for multi-homed mode (0.0.0.0 or :: bindaddr) can work in dual 6/4 mode with :: bindaddr gatekeeper mode isn't supported in v6 mode while (issue #18278) Reported by: may213 Patches: ipv6-ooh323.patch uploaded by may213 (license 454) Review: https://reviewboard.asterisk.org/r/1004/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@313482 f38db490-d61c-443f-a65b-d21fe96a405b --- addons/chan_ooh323.c | 360 ++++++++++++++++++--------------- addons/ooh323c/src/ooCalls.h | 7 +- addons/ooh323c/src/ooGkClient.c | 27 +-- addons/ooh323c/src/ooGkClient.h | 8 +- addons/ooh323c/src/ooLogChan.c | 2 +- addons/ooh323c/src/ooLogChan.h | 4 +- addons/ooh323c/src/ooSocket.c | 119 ++++++----- addons/ooh323c/src/ooSocket.h | 17 +- addons/ooh323c/src/oochannels.c | 74 ++++--- addons/ooh323c/src/ooh245.c | 437 ++++++++++++++++++++++++++++------------ addons/ooh323c/src/ooh323.c | 144 +++++++++---- addons/ooh323c/src/ooh323ep.h | 3 +- addons/ooh323c/src/ooports.c | 4 +- addons/ooh323c/src/ooq931.c | 255 +++++++++++++++++------ addons/ooh323c/src/ootypes.h | 2 +- 15 files changed, 960 insertions(+), 503 deletions(-) diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index 1d78071b1..ebbabe47f 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -143,7 +143,7 @@ static struct ooh323_pvt { int faxmode; int t38_tx_enable; int t38_init; - struct sockaddr_in udptlredirip; + struct ast_sockaddr udptlredirip; time_t lastTxT38; int chmodepend; @@ -212,7 +212,7 @@ struct ooh323_user{ int t38support; int rtptimeout; int mUseIP; /* Use IP address or H323-ID to search user */ - char mIP[20]; + char mIP[4*8+7+2]; /* Max for IPv6 - 2 brackets, 8 4hex, 7 - : */ struct OOH323Regex *rtpmask; char rtpmaskstr[120]; int rtdrcount, rtdrinterval; @@ -235,7 +235,7 @@ struct ooh323_peer{ int dtmfcodec; int t38support; int mFriend; /* indicates defined as friend */ - char ip[20]; + char ip[4*8+7+2]; /* Max for IPv6 - 2 brackets, 8 4hex, 7 - : */ int port; char *h323id; /* H323-ID alias, which asterisk will register with gk to reach this peer*/ char *email; /* Email alias, which asterisk will register with gk to reach this peer*/ @@ -286,7 +286,9 @@ void onModeChanged(ooCallData *call, int t38mode); static char gLogFile[256] = DEFAULT_LOGFILE; static int gPort = 1720; -static char gIP[20]; +static char gIP[2+8*4+7]; /* Max for IPv6 addr */ +struct ast_sockaddr bindaddr; +int v6mode = 0; static char gCallerID[AST_MAX_EXTENSION] = ""; static struct ooAliases *gAliasList; static struct ast_format_cap *gCap; @@ -373,10 +375,6 @@ static struct ast_channel *ooh323_new(struct ooh323_pvt *i, int state, ast_format_copy(&ch->rawwriteformat, &tmpfmt); ast_format_copy(&ch->rawreadformat, &tmpfmt); - ast_channel_set_fd(ch, 0, ast_rtp_instance_fd(i->rtp, 0)); - ast_channel_set_fd(ch, 1, ast_rtp_instance_fd(i->rtp, 1)); - ast_channel_set_fd(ch, 5, ast_udptl_fd(i->udptl)); - ast_jb_configure(ch, &global_jbconf); if (state == AST_STATE_RING) @@ -468,9 +466,7 @@ static struct ast_channel *ooh323_new(struct ooh323_pvt *i, int state, static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken) { struct ooh323_pvt *pvt = NULL; - struct sockaddr_in ouraddr; - struct ast_sockaddr tmp; - struct in_addr ipAddr; + if (gH323Debug) ast_verbose("--- ooh323_alloc\n"); @@ -487,39 +483,6 @@ static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken) ast_mutex_init(&pvt->lock); ast_mutex_lock(&pvt->lock); - - if (!inet_aton(gIP, &ipAddr)) { - ast_log(LOG_ERROR, "Invalid OOH323 driver ip address\n"); - ast_mutex_unlock(&pvt->lock); - ast_mutex_destroy(&pvt->lock); - ast_free(pvt); - return NULL; - } - - ouraddr.sin_family = AF_INET; - ouraddr.sin_addr = ipAddr; - ast_sockaddr_from_sin(&tmp, &ouraddr); - if (!(pvt->rtp = ast_rtp_instance_new("asterisk", sched, &tmp, NULL))) { - ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", - strerror(errno)); - ast_mutex_unlock(&pvt->lock); - ast_mutex_destroy(&pvt->lock); - ast_free(pvt); - return NULL; - } - - ast_rtp_instance_set_qos(pvt->rtp, gTOS, 0, "ooh323-rtp"); - - if (!(pvt->udptl = ast_udptl_new_with_bindaddr(sched, io, 0, &tmp))) { - ast_log(LOG_WARNING, "Unable to create UDPTL session: %s\n", - strerror(errno)); - ast_mutex_unlock(&pvt->lock); - ast_mutex_destroy(&pvt->lock); - ast_free(pvt); - return NULL; - } - - ast_udptl_set_error_correction_scheme(pvt->udptl, UDPTL_ERROR_CORRECTION_NONE); ast_udptl_set_far_max_datagram(pvt->udptl, 144); pvt->faxmode = 0; pvt->t38support = gT38Support; @@ -1046,13 +1009,13 @@ static int ooh323_hangup(struct ast_channel *ast) if (gH323Debug) ast_verbose(" hanging %s with cause: %d\n", p->username, q931cause); - ast->tech_pvt = NULL; + ast->tech_pvt = NULL; if (!ast_test_flag(p, H323_ALREADYGONE)) { - ooHangCall(p->callToken, + ooHangCall(p->callToken, ooh323_convert_hangupcause_asteriskToH323(q931cause), q931cause); ast_set_flag(p, H323_ALREADYGONE); /* ast_mutex_unlock(&p->lock); */ - } else + } else ast_set_flag(p, H323_NEEDDESTROY); /* detach channel here */ if (p->owner) { @@ -1068,11 +1031,11 @@ static int ooh323_hangup(struct ast_channel *ast) /* Notify the module monitors that use count for resource has changed */ ast_update_use_count(); - + } else { ast_debug(1, "No call to hangup\n" ); } - + if (gH323Debug) ast_verbose("+++ ooh323_hangup\n"); @@ -1092,7 +1055,8 @@ static int ooh323_answer(struct ast_channel *ast) if (ast->_state != AST_STATE_UP) { ast_channel_lock(ast); ast_setstate(ast, AST_STATE_UP); - ast_debug(1, "ooh323_answer(%s)\n", ast->name); + if (option_debug) + ast_debug(1, "ooh323_answer(%s)\n", ast->name); ast_channel_unlock(ast); ooAnswerCall(p->callToken); } @@ -1141,10 +1105,11 @@ static int ooh323_write(struct ast_channel *ast, struct ast_frame *f) return res; } + if (f->frametype == AST_FRAME_VOICE) { /* sending progress for first */ if (!ast_test_flag(p, H323_OUTGOING) && !p->progsent && - p->callToken) { + p->callToken) { ooManualProgress(p->callToken); p->progsent = 1; } @@ -1209,39 +1174,39 @@ static int ooh323_indicate(struct ast_channel *ast, int condition, const void *d if (gH323Debug) ast_verbose("----- ooh323_indicate %d on call %s\n", condition, callToken); - - ast_mutex_lock(&p->lock); + + ast_mutex_lock(&p->lock); switch (condition) { case AST_CONTROL_CONGESTION: if (!ast_test_flag(p, H323_ALREADYGONE)) { - ooHangCall(callToken, OO_REASON_LOCAL_CONGESTED, + ooHangCall(callToken, OO_REASON_LOCAL_CONGESTED, AST_CAUSE_SWITCH_CONGESTION); ast_set_flag(p, H323_ALREADYGONE); } break; case AST_CONTROL_BUSY: if (!ast_test_flag(p, H323_ALREADYGONE)) { - ooHangCall(callToken, OO_REASON_LOCAL_BUSY, AST_CAUSE_USER_BUSY); + ooHangCall(callToken, OO_REASON_LOCAL_BUSY, AST_CAUSE_USER_BUSY); ast_set_flag(p, H323_ALREADYGONE); } break; case AST_CONTROL_HOLD: - ast_moh_start(ast, data, NULL); + ast_moh_start(ast, data, NULL); break; case AST_CONTROL_UNHOLD: ast_moh_stop(ast); break; case AST_CONTROL_PROGRESS: if (ast->_state != AST_STATE_UP) { - if (!p->progsent) { - if (gH323Debug) { + if (!p->progsent) { + if (gH323Debug) { ast_debug(1, "Sending manual progress for %s, res = %d\n", callToken, - ooManualProgress(callToken)); + ooManualProgress(callToken)); } else { - ooManualProgress(callToken); + ooManualProgress(callToken); } - p->progsent = 1; - } + p->progsent = 1; + } } break; case AST_CONTROL_RINGING: @@ -1393,8 +1358,8 @@ static int ooh323_queryoption(struct ast_channel *ast, int option, void *data, i if (gH323Debug) ast_verbose("+++++ ooh323_queryoption %d on channel %s\n", option, ast->name); - - ast_mutex_unlock(&p->lock); + + ast_mutex_unlock(&p->lock); return res; } @@ -1438,9 +1403,9 @@ void ooh323_set_write_format(ooCallData *call, struct ast_format *fmt, int txfra char formats[FORMAT_STRING_SIZE]; if (gH323Debug) - ast_verbose("--- ooh323_update_writeformat %s/%d\n", + ast_verbose("--- ooh323_update_writeformat %s/%d\n", ast_getformatname(fmt), txframes); - + p = find_call(call); if (!p) { ast_log(LOG_ERROR, "No matching call found for %s\n", call->callToken); @@ -1453,7 +1418,7 @@ void ooh323_set_write_format(ooCallData *call, struct ast_format *fmt, int txfra if (p->owner) { while (p->owner && ast_channel_trylock(p->owner)) { - ast_debug(1, "Failed to grab lock, trying again\n"); + ast_debug(1,"Failed to grab lock, trying again\n"); DEADLOCK_AVOIDANCE(&p->lock); } if (!p->owner) { @@ -1462,7 +1427,7 @@ void ooh323_set_write_format(ooCallData *call, struct ast_format *fmt, int txfra return; } if (gH323Debug) - ast_verbose("Writeformat before update %s/%s\n", + ast_verbose("Writeformat before update %s/%s\n", ast_getformatname(&p->owner->writeformat), ast_getformatname_multiple(formats, sizeof(formats), p->owner->nativeformats)); if (txframes) @@ -1498,7 +1463,7 @@ void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt) if (gH323Debug) ast_verbose("--- ooh323_update_readformat %s\n", ast_getformatname(fmt)); - + p = find_call(call); if (!p) { ast_log(LOG_ERROR, "No matching call found for %s\n", call->callToken); @@ -1511,7 +1476,7 @@ void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt) if (p->owner) { while (p->owner && ast_channel_trylock(p->owner)) { - ast_debug(1, "Failed to grab lock, trying again\n"); + ast_debug(1,"Failed to grab lock, trying again\n"); DEADLOCK_AVOIDANCE(&p->lock); } if (!p->owner) { @@ -1521,12 +1486,12 @@ void ooh323_set_read_format(ooCallData *call, struct ast_format *fmt) } if (gH323Debug) - ast_verbose("Readformat before update %s\n", + ast_verbose("Readformat before update %s\n", ast_getformatname(&p->owner->readformat)); ast_format_cap_set(p->owner->nativeformats, fmt); - ast_set_read_format(p->owner, &p->owner->readformat); + ast_set_read_format(p->owner, &p->owner->readformat); ast_channel_unlock(p->owner); - } else + } else ast_log(LOG_ERROR, "No owner found\n"); ast_mutex_unlock(&p->lock); @@ -1544,12 +1509,12 @@ int onAlerting(ooCallData *call) if (gH323Debug) ast_verbose("--- onAlerting %s\n", call->callToken); - p = find_call(call); + p = find_call(call); - if(!p) { + if(!p) { ast_log(LOG_ERROR, "No matching call found\n"); return -1; - } + } ast_mutex_lock(&p->lock); if (!p->owner) { ast_mutex_unlock(&p->lock); @@ -1600,12 +1565,12 @@ int onProgress(ooCallData *call) if (gH323Debug) ast_verbose("--- onProgress %s\n", call->callToken); - p = find_call(call); + p = find_call(call); - if(!p) { + if(!p) { ast_log(LOG_ERROR, "No matching call found\n"); return -1; - } + } ast_mutex_lock(&p->lock); if (!p->owner) { ast_mutex_unlock(&p->lock); @@ -1639,8 +1604,8 @@ int onProgress(ooCallData *call) ast_setstate(c, AST_STATE_RINGING); ast_queue_control(c, AST_CONTROL_PROGRESS); - ast_channel_unlock(c); - ast_mutex_unlock(&p->lock); + ast_channel_unlock(c); + ast_mutex_unlock(&p->lock); if (gH323Debug) ast_verbose("+++ onProgress %s\n", call->callToken); @@ -1819,10 +1784,14 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg) } else { ast_mutex_unlock(&p->lock); ast_log(LOG_ERROR, "Unacceptable ip %s\n", call->remoteIP); - if (!user) + if (!user) { ooHangCall(call->callToken, ooh323_convert_hangupcause_asteriskToH323(AST_CAUSE_CALL_REJECTED), AST_CAUSE_CALL_REJECTED); - else + call->callEndReason = OO_REASON_REMOTE_REJECTED; + } + else { ooHangCall(call->callToken, ooh323_convert_hangupcause_asteriskToH323(AST_CAUSE_NORMAL_CIRCUIT_CONGESTION), AST_CAUSE_NORMAL_CIRCUIT_CONGESTION); + call->callEndReason = OO_REASON_REMOTE_REJECTED; + } ast_set_flag(p, H323_NEEDDESTROY); return -1; } @@ -1830,15 +1799,19 @@ int ooh323_onReceivedSetup(ooCallData *call, Q931Message *pmsg) ooh323c_set_capability_for_call(call, &p->prefs, p->cap, p->dtmfmode, p->dtmfcodec, p->t38support, p->g729onlyA); - configure_local_rtp(p, call); - /* Incoming call */ c = ooh323_new(p, AST_STATE_RING, p->username, 0, NULL); if(!c) { ast_mutex_unlock(&p->lock); ast_log(LOG_ERROR, "Could not create ast_channel\n"); return -1; - } + } + if (!configure_local_rtp(p, call)) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Couldn't create rtp structure\n"); + return -1; + } + ast_mutex_unlock(&p->lock); if (gH323Debug) @@ -1909,6 +1882,11 @@ int onOutgoingCall(ooCallData *call) ast_copy_string(call->rtpMaskStr, p->rtpmaskstr, sizeof(call->rtpMaskStr)); } + if (!configure_local_rtp(p, call)) { + ast_mutex_unlock(&p->lock); + return OO_FAILED; + } + ast_mutex_unlock(&p->lock); } @@ -1998,7 +1976,7 @@ int onNewCallCreated(ooCallData *call) ooh323c_set_capability_for_call(call, &p->prefs, p->cap, p->dtmfmode, p->dtmfcodec, p->t38support, p->g729onlyA); - configure_local_rtp(p, call); + /* configure_local_rtp(p, call); */ ast_mutex_unlock(&p->lock); } @@ -2021,14 +1999,14 @@ int onCallEstablished(ooCallData *call) return -1; } - if(ast_test_flag(p, H323_OUTGOING)) { + if(ast_test_flag(p, H323_OUTGOING)) { ast_mutex_lock(&p->lock); if (!p->owner) { ast_mutex_unlock(&p->lock); ast_log(LOG_ERROR, "Channel has no owner\n"); return -1; } - + while (p->owner && ast_channel_trylock(p->owner)) { ast_debug(1, "Failed to grab lock, trying again\n"); DEADLOCK_AVOIDANCE(&p->lock); @@ -2050,7 +2028,7 @@ int onCallEstablished(ooCallData *call) } ast_queue_control(c, AST_CONTROL_ANSWER); - ast_channel_unlock(p->owner); + ast_channel_unlock(p->owner); manager_event(EVENT_FLAG_SYSTEM,"ChannelUpdate","Channel: %s\r\nChanneltype: %s\r\n" "CallRef: %d\r\n", c->name, "OOH323", p->call_reference); } @@ -2075,42 +2053,42 @@ int onCallCleared(ooCallData *call) if ((p = find_call(call))) { ast_mutex_lock(&p->lock); - + while (p->owner) { if (ast_channel_trylock(p->owner)) { ooTrace(OOTRCLVLINFO, "Failed to grab lock, trying again\n"); - ast_debug(1, "Failed to grab lock, trying again\n"); + ast_debug(1, "Failed to grab lock, trying again\n"); DEADLOCK_AVOIDANCE(&p->lock); } else { - ownerLock = 1; break; + ownerLock = 1; break; } } if (ownerLock) { - if (!ast_test_flag(p, H323_ALREADYGONE)) { + if (!ast_test_flag(p, H323_ALREADYGONE)) { ast_set_flag(p, H323_ALREADYGONE); p->owner->hangupcause = call->q931cause; p->owner->_softhangup |= AST_SOFTHANGUP_DEV; ast_queue_hangup_with_cause(p->owner,call->q931cause); } - } + } - if(p->owner) { - p->owner->tech_pvt = NULL; + if(p->owner) { + p->owner->tech_pvt = NULL; ast_channel_unlock(p->owner); - p->owner = NULL; + p->owner = NULL; ast_module_unref(myself); } ast_set_flag(p, H323_NEEDDESTROY); - ooh323c_stop_call_thread(call); + ooh323c_stop_call_thread(call); ast_mutex_unlock(&p->lock); - ast_mutex_lock(&usecnt_lock); - usecnt--; - ast_mutex_unlock(&usecnt_lock); + ast_mutex_lock(&usecnt_lock); + usecnt--; + ast_mutex_unlock(&usecnt_lock); } @@ -2265,12 +2243,14 @@ static struct ooh323_user *build_user(const char *name, struct ast_variable *v) user->cap, tcodecs, 1); } else if (!strcasecmp(v->name, "amaflags")) { user->amaflags = ast_cdr_amaflags2int(v->value); - } else if (!strcasecmp(v->name, "ip")) { - strncpy(user->mIP, v->value, sizeof(user->mIP)-1); + } else if (!strcasecmp(v->name, "ip") || !strcasecmp(v->name, "host")) { + struct ast_sockaddr p; + if (!ast_parse_arg(v->value, PARSE_ADDR, &p)) { + ast_copy_string(user->mIP, ast_sockaddr_stringify_addr(&p), sizeof(user->mIP)-1); + } else { + ast_copy_string(user->mIP, v->value, sizeof(user->mIP)-1); + } user->mUseIP = 1; - } else if (!strcasecmp(v->name, "host")) { - strncpy(user->mIP, v->value, sizeof(user->mIP)-1); - user->mUseIP = 1; } else if (!strcasecmp(v->name, "dtmfmode")) { if (!strcasecmp(v->value, "rfc2833")) user->dtmfmode = H323_DTMF_RFC2833; @@ -2371,10 +2351,14 @@ static struct ooh323_peer *build_peer(const char *name, struct ast_variable *v, } } else if (!strcasecmp(v->name, "port")) { peer->port = atoi(v->value); - } else if (!strcasecmp(v->name, "ip")) { - ast_copy_string(peer->ip, v->value, sizeof(peer->ip)); - } else if (!strcasecmp(v->name, "host")) { - ast_copy_string(peer->ip, v->value, sizeof(peer->ip)); + } else if (!strcasecmp(v->name, "host") || !strcasecmp(v->name, "ip")) { + struct ast_sockaddr p; + if (!ast_parse_arg(v->value, PARSE_ADDR, &p)) { + ast_copy_string(peer->ip, ast_sockaddr_stringify_host(&p), sizeof(peer->ip)); + } else { + ast_copy_string(peer->ip, v->value, sizeof(peer->ip)); + } + } else if (!strcasecmp(v->name, "outgoinglimit")) { peer->outgoinglimit = atoi(v->value); if (peer->outgoinglimit < 0) @@ -2583,6 +2567,13 @@ int reload_config(int reload) gPort = (int)strtol(v->value, NULL, 10); } else if (!strcasecmp(v->name, "bindaddr")) { ast_copy_string(gIP, v->value, sizeof(gIP)); + if (ast_parse_arg(v->value, PARSE_ADDR, &bindaddr)) { + ast_log(LOG_WARNING, "Invalid address: %s\n", v->value); + return 1; + } + if (ast_sockaddr_is_ipv6(&bindaddr)) { + v6mode = 1; + } } else if (!strcasecmp(v->name, "h225portrange")) { char* endlimit = 0; char temp[512]; @@ -2802,7 +2793,7 @@ int reload_config(int reload) /* Determine ip address if neccessary */ if (ast_strlen_zero(gIP)) { ooGetLocalIPAddress(gIP); - if (!strcmp(gIP, "127.0.0.1")) { + if (!strcmp(gIP, "127.0.0.1") || !strcmp(gIP, "::1")) { ast_log(LOG_NOTICE, "Failed to determine local ip address. Please " "specify it in ooh323.conf. OOH323 Disabled\n"); return 1; @@ -3320,6 +3311,9 @@ static int load_module(void) ooH323EpSetH225MsgCallbacks(h225Callbacks); ooH323EpSetTraceLevel(gTRCLVL); ooH323EpSetLocalAddress(gIP, gPort); + if (v6mode) { + ast_debug(1, "OOH323 channel is in IP6 mode\n"); + } ooH323EpSetCallerID(gCallerID); if(ooH323EpSetTCPPortRange(ooconfig.mTCPPortStart, @@ -3557,7 +3551,7 @@ int ooh323_destroy(struct ooh323_pvt *p) free(cur->callerid_name); cur->callerid_name = 0; } - + if (cur->callerid_num) { free(cur->callerid_num); cur->callerid_num = 0; @@ -3572,20 +3566,20 @@ int ooh323_destroy(struct ooh323_pvt *p) ast_udptl_destroy(cur->udptl); cur->udptl = NULL; } - + /* Unlink us from the owner if we have one */ if (cur->owner) { - while(ast_channel_trylock(cur->owner)) { - ast_debug(1, "Failed to grab lock, trying again\n"); + while(ast_channel_trylock(cur->owner)) { + ast_debug(1, "Failed to grab lock, trying again\n"); DEADLOCK_AVOIDANCE(&cur->lock); - } + } ast_debug(1, "Detaching from %s\n", cur->owner->name); cur->owner->tech_pvt = NULL; ast_channel_unlock(cur->owner); cur->owner = NULL; ast_module_unref(myself); } - + if (cur->vad) { ast_dsp_free(cur->vad); cur->vad = NULL; @@ -3910,8 +3904,6 @@ static int ooh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance { /* XXX Deal with Video */ struct ooh323_pvt *p; - struct sockaddr_in them; - struct sockaddr_in us; struct ast_sockaddr tmp; int mode; @@ -3929,10 +3921,13 @@ static int ooh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance return -1; } ast_rtp_instance_get_remote_address(rtp, &tmp); - ast_sockaddr_to_sin(&tmp, &them); ast_rtp_instance_get_local_address(rtp, &tmp); - ast_sockaddr_to_sin(&tmp, &us); return 0; + +/* May 20101003 */ +/* What we should to do here? */ + + } @@ -3940,7 +3935,7 @@ static int ooh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call) { - struct sockaddr_in us; + char lhost[INET6_ADDRSTRLEN], *lport=NULL; struct ast_sockaddr tmp; ooMediaInfo mediaInfo; int x; @@ -3951,6 +3946,45 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call) if (gH323Debug) ast_verbose("--- configure_local_rtp\n"); + + if (ast_parse_arg(call->localIP, PARSE_ADDR, &tmp)) { + ast_sockaddr_copy(&tmp, &bindaddr); + } + if (!(p->rtp = ast_rtp_instance_new("asterisk", sched, &tmp, NULL))) { + ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", + strerror(errno)); + return 0; + } + + ast_rtp_instance_set_qos(p->rtp, gTOS, 0, "ooh323-rtp"); + + if (!(p->udptl = ast_udptl_new_with_bindaddr(sched, io, 0, &tmp))) { + ast_log(LOG_WARNING, "Unable to create UDPTL session: %s\n", + strerror(errno)); + return 0; + } + + if (p->owner) { + while (p->owner && ast_channel_trylock(p->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); + DEADLOCK_AVOIDANCE(&p->lock); + } + if (!p->owner) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Channel has no owner\n"); + return 0; + } + } else { + ast_log(LOG_ERROR, "Channel has no owner\n"); + return 0; + } + + ast_channel_set_fd(p->owner, 0, ast_rtp_instance_fd(p->rtp, 0)); + ast_channel_set_fd(p->owner, 1, ast_rtp_instance_fd(p->rtp, 1)); + ast_channel_set_fd(p->owner, 5, ast_udptl_fd(p->udptl)); + + ast_channel_unlock(p->owner); + if (p->rtp) { ast_rtp_codecs_packetization_set(ast_rtp_instance_get_codecs(p->rtp), p->rtp, &p->prefs); if (p->dtmfmode & H323_DTMF_RFC2833 && p->dtmfcodec) { @@ -3965,7 +3999,8 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call) } /* figure out our local RTP port and tell the H.323 stack about it*/ ast_rtp_instance_get_local_address(p->rtp, &tmp); - ast_sockaddr_to_sin(&tmp, &us); + strncpy(lhost, ast_sockaddr_stringify_addr(&tmp), sizeof(lhost)); + lport = ast_sockaddr_stringify_port(&tmp); if (p->rtptimeout) { ast_rtp_instance_set_timeout(p->rtp, p->rtptimeout); @@ -3982,8 +4017,8 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call) } - ast_copy_string(mediaInfo.lMediaIP, ast_inet_ntoa(us.sin_addr), sizeof(mediaInfo.lMediaIP)); - mediaInfo.lMediaPort = ntohs(us.sin_port); + ast_copy_string(mediaInfo.lMediaIP, lhost, sizeof(mediaInfo.lMediaIP)); + mediaInfo.lMediaPort = atoi(lport); mediaInfo.lMediaCntrlPort = mediaInfo.lMediaPort +1; for (x = 0; ast_codec_pref_index(&p->prefs, x, &tmpfmt); x++) { strcpy(mediaInfo.dir, "transmit"); @@ -4007,19 +4042,18 @@ int configure_local_rtp(struct ooh323_pvt *p, ooCallData *call) } if (p->udptl) { - struct ast_sockaddr us_tmp; - ast_sockaddr_from_sin(&us_tmp, &us); - ast_udptl_get_us(p->udptl, &us_tmp); - ast_sockaddr_to_sin(&us_tmp, &us); + ast_udptl_get_us(p->udptl, &tmp); + strncpy(lhost, ast_sockaddr_stringify_addr(&tmp), sizeof(lhost)); + lport = ast_sockaddr_stringify_port(&tmp); + ast_copy_string(mediaInfo.lMediaIP, lhost, sizeof(mediaInfo.lMediaIP)); + mediaInfo.lMediaPort = atoi(lport); + mediaInfo.lMediaCntrlPort = mediaInfo.lMediaPort +1; + mediaInfo.cap = OO_T38; + strcpy(mediaInfo.dir, "transmit"); + ooAddMediaInfo(call, mediaInfo); + strcpy(mediaInfo.dir, "receive"); + ooAddMediaInfo(call, mediaInfo); } - ast_copy_string(mediaInfo.lMediaIP, ast_inet_ntoa(us.sin_addr), sizeof(mediaInfo.lMediaIP)); - mediaInfo.lMediaPort = ntohs(us.sin_port); - mediaInfo.lMediaCntrlPort = mediaInfo.lMediaPort +1; - mediaInfo.cap = OO_T38; - strcpy(mediaInfo.dir, "transmit"); - ooAddMediaInfo(call, mediaInfo); - strcpy(mediaInfo.dir, "receive"); - ooAddMediaInfo(call, mediaInfo); if (gH323Debug) ast_verbose("+++ configure_local_rtp\n"); @@ -4031,7 +4065,6 @@ void setup_rtp_connection(ooCallData *call, const char *remoteIp, int remotePort) { struct ooh323_pvt *p = NULL; - struct sockaddr_in them; struct ast_sockaddr tmp; if (gH323Debug) @@ -4045,10 +4078,8 @@ void setup_rtp_connection(ooCallData *call, const char *remoteIp, return; } - them.sin_family = AF_INET; - them.sin_addr.s_addr = inet_addr(remoteIp); /* only works for IPv4 */ - them.sin_port = htons(remotePort); - ast_sockaddr_from_sin(&tmp, &them); + ast_parse_arg(remoteIp, PARSE_ADDR, &tmp); + ast_sockaddr_set_port(&tmp, remotePort); ast_rtp_instance_set_remote_address(p->rtp, &tmp); if (p->writeformat.id == AST_FORMAT_G726_AAL2) @@ -4114,10 +4145,9 @@ static int ooh323_set_udptl_peer(struct ast_channel *chan, struct ast_udptl *udp if (!p) return -1; ast_mutex_lock(&p->lock); + if (udptl) { - struct ast_sockaddr udptl_addr; - ast_udptl_get_peer(udptl, &udptl_addr); - ast_sockaddr_to_sin(&udptl_addr, &p->udptlredirip); + ast_udptl_get_peer(udptl, &p->udptlredirip); } else memset(&p->udptlredirip, 0, sizeof(p->udptlredirip)); @@ -4130,14 +4160,13 @@ void setup_udptl_connection(ooCallData *call, const char *remoteIp, int remotePort) { struct ooh323_pvt *p = NULL; - struct sockaddr_in them; - struct ast_sockaddr them_addr; + struct ast_sockaddr them; if (gH323Debug) ast_verbose("--- setup_udptl_connection\n"); /* Find the call or allocate a private structure if call not found */ - p = find_call(call); + p = find_call(call); if (!p) { ast_log(LOG_ERROR, "Something is wrong: rtp\n"); @@ -4161,11 +4190,10 @@ void setup_udptl_connection(ooCallData *call, const char *remoteIp, return; } - them.sin_family = AF_INET; - them.sin_addr.s_addr = inet_addr(remoteIp); /* only works for IPv4 */ - them.sin_port = htons(remotePort); - ast_sockaddr_from_sin(&them_addr, &them); - ast_udptl_set_peer(p->udptl, &them_addr); + ast_parse_arg(remoteIp, PARSE_ADDR, &them); + ast_sockaddr_set_port(&them, remotePort); + + ast_udptl_set_peer(p->udptl, &them); ast_udptl_set_tag(p->udptl, "%s", p->owner->name); p->t38_tx_enable = 1; p->lastTxT38 = time(NULL); @@ -4177,8 +4205,8 @@ void setup_udptl_connection(ooCallData *call, const char *remoteIp, ast_queue_control_data(p->owner, AST_CONTROL_T38_PARAMETERS, ¶meters, sizeof(parameters)); } if (gH323Debug) - ast_debug(1, "Receiving UDPTL %s:%d\n", ast_inet_ntoa(them.sin_addr), - ntohs(them.sin_port)); + ast_debug(1, "Receiving UDPTL %s:%s\n", ast_sockaddr_stringify_host(&them), + ast_sockaddr_stringify_port(&them)); ast_channel_unlock(p->owner); ast_mutex_unlock(&p->lock); @@ -4193,12 +4221,12 @@ void close_udptl_connection(ooCallData *call) { struct ooh323_pvt *p = NULL; - if(gH323Debug) + if(gH323Debug) ast_verbose("--- close_udptl_connection\n"); p = find_call(call); if (!p) { - ast_log(LOG_ERROR, "Couldn't find matching call to close udptl " + ast_log(LOG_ERROR, "Couldn't find matching call to close udptl " "connection\n"); return; } @@ -4287,7 +4315,7 @@ struct ast_frame *ooh323_rtp_read(struct ast_channel *ast, struct ooh323_pvt *p) case 5: f = ast_udptl_read(p->udptl); /* UDPTL t.38 data */ if (gH323Debug) { - ast_debug(1, "Got UDPTL %d/%d len %d for %s\n", + ast_debug(1, "Got UDPTL %d/%d len %d for %s\n", f->frametype, f->subclass.integer, f->datalen, ast->name); } break; @@ -4300,7 +4328,7 @@ struct ast_frame *ooh323_rtp_read(struct ast_channel *ast, struct ooh323_pvt *p) /* We already hold the channel lock */ if (f->frametype == AST_FRAME_VOICE && !p->faxmode) { if (!(ast_format_cap_iscompatible(p->owner->nativeformats, &f->subclass.format))) { - ast_debug(1, "Oooh, voice format changed to %s\n", ast_getformatname(&f->subclass.format)); + ast_debug(1, "Oooh, voice format changed to %s\n", ast_getformatname(&f->subclass.format)); ast_format_cap_set(p->owner->nativeformats, &f->subclass.format); ast_set_read_format(p->owner, &p->owner->readformat); ast_set_write_format(p->owner, &p->owner->writeformat); @@ -4310,8 +4338,8 @@ struct ast_frame *ooh323_rtp_read(struct ast_channel *ast, struct ooh323_pvt *p) (f->subclass.format.id == AST_FORMAT_SLINEAR || f->subclass.format.id == AST_FORMAT_ALAW || f->subclass.format.id == AST_FORMAT_ULAW)) { f = ast_dsp_process(p->owner, p->vad, f); - if (f && (f->frametype == AST_FRAME_DTMF)) { - ast_debug(1, "* Detected inband DTMF '%c'\n", f->subclass.integer); + if (f && (f->frametype == AST_FRAME_DTMF)) { + ast_debug(1, "* Detected inband DTMF '%c'\n", f->subclass.integer); } } } @@ -4330,15 +4358,13 @@ void onModeChanged(ooCallData *call, int t38mode) { ast_mutex_lock(&p->lock); - if (gH323Debug) { - ast_debug(1, "change mode to %d for %s\n", t38mode, call->callToken); - } + if (gH323Debug) + ast_debug(1, "change mode to %d for %s\n", t38mode, call->callToken); if (t38mode == p->faxmode) { - if (gH323Debug) { + if (gH323Debug) ast_debug(1, "mode for %s is already %d\n", call->callToken, t38mode); - } ast_mutex_unlock(&p->lock); return; } diff --git a/addons/ooh323c/src/ooCalls.h b/addons/ooh323c/src/ooCalls.h index 5c2604087..ce7f6e5a8 100644 --- a/addons/ooh323c/src/ooCalls.h +++ b/addons/ooh323c/src/ooCalls.h @@ -97,7 +97,7 @@ typedef struct OOMediaInfo{ int cap; int lMediaPort; int lMediaCntrlPort; - char lMediaIP[20]; + char lMediaIP[2+8*4+7]; struct OOMediaInfo *next; } OOMediaInfo; @@ -179,12 +179,13 @@ typedef struct OOH323CallData { int dtmfcodec; OOMediaInfo *mediaInfo; OOCallFwdData *pCallFwdData; - char localIP[20];/* Local IP address */ + char localIP[2+8*4+7];/* Local IP address */ + int versionIP; /* IP Address family 6 or 4 */ OOH323Channel* pH225Channel; OOH323Channel* pH245Channel; OOSOCKET *h245listener; int *h245listenport; - char remoteIP[20];/* Remote IP address */ + char remoteIP[2+8*4+7];/* Remote IP address */ int remotePort; int remoteH245Port; char *remoteDisplayName; diff --git a/addons/ooh323c/src/ooGkClient.c b/addons/ooh323c/src/ooGkClient.c index 3dce5eb59..04359998a 100644 --- a/addons/ooh323c/src/ooGkClient.c +++ b/addons/ooh323c/src/ooGkClient.c @@ -22,6 +22,7 @@ */ #include "asterisk.h" #include "asterisk/lock.h" +#include "asterisk/netsock2.h" #include "ooGkClient.h" #include "ootypes.h" @@ -261,7 +262,7 @@ int ooGkClientCreateChannel(ooGkClient *pGkClient) int ret=0; OOIPADDR ipaddrs; /* Create socket */ - if((ret=ooSocketCreateUDP(&pGkClient->rasSocket))!=ASN_OK) + if((ret=ooSocketCreateUDP(&pGkClient->rasSocket, 4))!=ASN_OK) { OOTRACEERR1("Failed to create RAS socket\n"); pGkClient->state = GkClientFailed; @@ -269,7 +270,7 @@ int ooGkClientCreateChannel(ooGkClient *pGkClient) } if(pGkClient->localRASPort) { - ret= ooSocketStrToAddr (pGkClient->localRASIP, &ipaddrs); + inet_pton(AF_INET, pGkClient->localRASIP, &ipaddrs); if( (ret=ooSocketBind( pGkClient->rasSocket, ipaddrs, pGkClient->localRASPort))!=ASN_OK ) { @@ -295,7 +296,7 @@ int ooGkClientCreateChannel(ooGkClient *pGkClient) OOTRACEDBGA1("Determining ip address for RAS channel " "multihomed mode. \n"); ret = ooSocketGetIpAndPort(pGkClient->rasSocket, pGkClient->localRASIP, - 20, &pGkClient->localRASPort); + 20, &pGkClient->localRASPort, NULL); if(ret != ASN_OK) { OOTRACEERR1("Error:Failed to retrieve local ip and port from " @@ -666,7 +667,7 @@ int ooGkClientSendGRQ(ooGkClient *pGkClient) } - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pRasAddress->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pRasAddress->ip.data); pRasAddress->ip.numocts = 4; pRasAddress->port = pGkClient->localRASPort; @@ -932,7 +933,7 @@ int ooGkClientSendRRQ(ooGkClient *pGkClient, ASN1BOOL keepAlive) } pTransportAddress->t = T_H225TransportAddress_ipAddress; pTransportAddress->u.ipAddress = pIpAddress; - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddress->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pIpAddress->ip.data); pIpAddress->ip.numocts = 4; pIpAddress->port = gH323ep.listenPort; @@ -960,7 +961,7 @@ int ooGkClientSendRRQ(ooGkClient *pGkClient, ASN1BOOL keepAlive) pTransportAddress->t = T_H225TransportAddress_ipAddress; pTransportAddress->u.ipAddress = pIpAddress; - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddress->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pIpAddress->ip.data); pIpAddress->ip.numocts = 4; pIpAddress->port = pGkClient->localRASPort; @@ -1430,7 +1431,7 @@ int ooGkClientSendURQ(ooGkClient *pGkClient, ooAliases *aliases) } pTransportAddress->t = T_H225TransportAddress_ipAddress; pTransportAddress->u.ipAddress = pIpAddress; - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddress->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pIpAddress->ip.data); pIpAddress->ip.numocts = 4; pIpAddress->port = gH323ep.listenPort; @@ -1645,14 +1646,14 @@ int ooGkClientSendAdmissionRequest ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddressLocal->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pIpAddressLocal->ip.data); pIpAddressLocal->ip.numocts = 4; pIpAddressLocal->port = gH323ep.listenPort; if(!ooUtilsIsStrEmpty(call->remoteIP)) { - ooSocketConvertIpToNwAddr(call->remoteIP, pIpAddressRemote->ip.data); + inet_pton(AF_INET, call->remoteIP, pIpAddressRemote->ip.data); pIpAddressRemote->ip.numocts = 4; pIpAddressRemote->port = call->remotePort; } @@ -2153,7 +2154,7 @@ int ooGkClientSendIRR ast_mutex_unlock(&pGkClient->Lock); return OO_FAILED; } - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpAddressLocal->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pIpAddressLocal->ip.data); pIpAddressLocal->ip.numocts = 4; pIpAddressLocal->port = gH323ep.listenPort; @@ -2184,7 +2185,7 @@ int ooGkClientSendIRR pIpRasAddress->ip.numocts = 4; pIpRasAddress->port = pGkClient->localRASPort; - ooSocketConvertIpToNwAddr(pGkClient->localRASIP, pIpRasAddress->ip.data); + inet_pton(AF_INET, pGkClient->localRASIP, pIpRasAddress->ip.data); pIRR->rasAddress.u.ipAddress = pIpRasAddress; pIRR->rasAddress.t=T_H225TransportAddress_ipAddress; /* IPv4 address */ @@ -2283,11 +2284,11 @@ int ooGkClientSendIRR return OO_FAILED; } pLocalAddr->ip.numocts = 4; - ooSocketConvertIpToNwAddr(call->localIP, pLocalAddr->ip.data); + inet_pton(AF_INET, call->localIP, pLocalAddr->ip.data); pLocalAddr->port = (call->pH225Channel->port) ? call->pH225Channel->port : gH323ep.listenPort; pRemoteAddr->ip.numocts = 4; - ooSocketConvertIpToNwAddr(call->remoteIP, pRemoteAddr->ip.data); + inet_pton(AF_INET, call->remoteIP, pRemoteAddr->ip.data); pRemoteAddr->port = call->remotePort; perCallInfo->callSignaling.m.sendAddressPresent = TRUE; diff --git a/addons/ooh323c/src/ooGkClient.h b/addons/ooh323c/src/ooGkClient.h index c616c1137..e12b45a96 100644 --- a/addons/ooh323c/src/ooGkClient.h +++ b/addons/ooh323c/src/ooGkClient.h @@ -47,7 +47,7 @@ extern "C" { -#define MAX_IP_LEN 18 +#define MAX_IP_LEN 2+8*4+7 #define DEFAULT_GKPORT 1719 #define MULTICAST_GKADDRESS "224.0.1.41" #define MULTICAST_GKPORT 1718 @@ -181,9 +181,9 @@ typedef struct ooGkClient{ OOCTXT msgCtxt; OOSOCKET rasSocket; int localRASPort; - char localRASIP[20]; - char gkRasIP[20]; - char gkCallSignallingIP[20]; + char localRASIP[2+8*4+7]; + char gkRasIP[2+8*4+7]; + char gkCallSignallingIP[2+8*4+7]; RasGatekeeperInfo gkInfo; int gkRasPort; int gkCallSignallingPort; diff --git a/addons/ooh323c/src/ooLogChan.c b/addons/ooh323c/src/ooLogChan.c index c3b5c8fee..63c8fc6f7 100644 --- a/addons/ooh323c/src/ooLogChan.c +++ b/addons/ooh323c/src/ooLogChan.c @@ -82,7 +82,7 @@ OOLogicalChannel* ooAddNewLogicalChannel(OOH323CallData *call, int channelNo, /* If user application has not specified a specific ip and is using multihomed mode, substitute appropriate ip. */ - if(!strcmp(pMediaInfo->lMediaIP, "0.0.0.0")) + if(!strcmp(pMediaInfo->lMediaIP, "0.0.0.0") || !strcmp(pMediaInfo->lMediaIP, "::")) strcpy(pNewChannel->localIP, call->localIP); else strcpy(pNewChannel->localIP, pMediaInfo->lMediaIP); diff --git a/addons/ooh323c/src/ooLogChan.h b/addons/ooh323c/src/ooLogChan.h index f480f1090..183eb1445 100644 --- a/addons/ooh323c/src/ooLogChan.h +++ b/addons/ooh323c/src/ooLogChan.h @@ -53,12 +53,12 @@ typedef struct OOLogicalChannel { int sessionID; enum OOCapType type; char dir[10]; /* receive/transmit */ - char remoteIP[20]; + char remoteIP[2+8*4+7]; int remoteMediaPort; int remoteMediaControlPort; int localRtpPort; int localRtcpPort; - char localIP[20]; + char localIP[2+8*4+7]; OOLogicalChannelState state; struct ooH323EpCapability *chanCap; struct OOLogicalChannel *next; diff --git a/addons/ooh323c/src/ooSocket.c b/addons/ooh323c/src/ooSocket.c index e2267dc00..9349700da 100644 --- a/addons/ooh323c/src/ooSocket.c +++ b/addons/ooh323c/src/ooSocket.c @@ -21,9 +21,16 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/lock.h" #include "asterisk/utils.h" #include "asterisk/network.h" +#include "asterisk/netsock2.h" +#include "asterisk/config.h" #include "ooSocket.h" #include "ootrace.h" +#include "ooh323ep.h" + +/** Global endpoint structure */ +extern OOH323EndPoint gH323ep; + #if defined(_WIN32_WCE) static int inited = 0; #define SEND_FLAGS 0 @@ -188,17 +195,25 @@ typedef int OOSOCKLEN; typedef socklen_t OOSOCKLEN; #endif -int ooSocketCreate (OOSOCKET* psocket) +int ooSocketCreate (OOSOCKET* psocket, int family) { int on; + OOSOCKET sock; int keepalive = 1; #ifdef __linux__ int keepcnt = 24, keepidle = 120, keepintvl = 30; #endif struct linger linger; - OOSOCKET sock = socket (AF_INET, - SOCK_STREAM, - 0); + + if (family == 6) { + sock = socket (AF_INET6, + SOCK_STREAM, + 0); + } else { + sock = socket (AF_INET, + SOCK_STREAM, + 0); + } if (sock == OOSOCKET_INVALID){ OOTRACEERR1("Error:Failed to create TCP socket\n"); @@ -231,12 +246,18 @@ int ooSocketCreate (OOSOCKET* psocket) return ASN_OK; } -int ooSocketCreateUDP (OOSOCKET* psocket) +int ooSocketCreateUDP (OOSOCKET* psocket, int family) { int on; struct linger linger; + OOSOCKET sock; - OOSOCKET sock = socket (AF_INET, + if (family == 6) + sock = socket (AF_INET6, + SOCK_DGRAM, + 0); + else + sock = socket (AF_INET, SOCK_DGRAM, 0); @@ -272,7 +293,10 @@ int ooSocketClose (OOSOCKET socket) int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port) { - struct sockaddr_in m_addr; + struct ast_sockaddr m_addr; + + memset(&m_addr, 0, sizeof(m_addr)); + if (socket == OOSOCKET_INVALID) { @@ -280,14 +304,10 @@ int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port) return ASN_E_INVSOCKET; } - memset (&m_addr, 0, sizeof (m_addr)); - m_addr.sin_family = AF_INET; - m_addr.sin_addr.s_addr = (addr == 0) ? INADDR_ANY : htonl (addr); - m_addr.sin_port = htons ((unsigned short)port); + ast_sockaddr_copy(&m_addr, &addr); + ast_sockaddr_set_port(&m_addr, port); - if (bind (socket, (struct sockaddr *) (void*) &m_addr, - sizeof (m_addr)) == -1) - { + if (ast_bind(socket, &m_addr) < 0) { if (errno != EADDRINUSE) { perror ("bind"); OOTRACEERR2("Error:Bind failed, error: %d\n", errno); @@ -311,20 +331,17 @@ int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, socklen_t *si } } -int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port) +int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port, int *family) { int ret=ASN_OK; - socklen_t size; - struct sockaddr_in addr; + struct ast_sockaddr addr; const char *host=NULL; - size = sizeof(addr); - - ret = ooSocketGetSockName(socket, &addr, &size); + ret = ast_getsockname(socket, &addr); if(ret != 0) return ASN_E_INVSOCKET; - host = ast_inet_ntoa(addr.sin_addr); + host = ast_sockaddr_stringify_addr(&addr); if(host && strlen(host) < (unsigned)len) strcpy(ip, host); @@ -333,8 +350,14 @@ int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port) "ooSocketGetIpAndPort\n"); return -1; } - - *port = addr.sin_port; + *port = ast_sockaddr_port(&addr); + + if (family) { + if (ast_sockaddr_is_ipv6(&addr) && !ast_sockaddr_is_ipv4_mapped(&addr)) + *family = 6; + else + *family = 4; + } return ASN_OK; } @@ -350,29 +373,30 @@ int ooSocketListen (OOSOCKET socket, int maxConnection) } int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket, - OOIPADDR* destAddr, int* destPort) + char* destAddr, int* destPort) { - struct sockaddr_in m_addr; - OOSOCKLEN addr_length = sizeof (m_addr); + struct ast_sockaddr addr; + char* host = NULL; if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET; if (pNewSocket == 0) return ASN_E_INVPARAM; - *pNewSocket = accept (socket, (struct sockaddr *) (void*) &m_addr, - &addr_length); + *pNewSocket = ast_accept (socket, &addr); if (*pNewSocket <= 0) return ASN_E_INVSOCKET; - if (destAddr != 0) - *destAddr = ntohl (m_addr.sin_addr.s_addr); + if (destAddr != 0) { + if ((host = ast_sockaddr_stringify_addr(&addr)) != NULL); + strncpy(destAddr, host, strlen(host)); + } if (destPort != 0) - *destPort = ntohs (m_addr.sin_port); + *destPort = ast_sockaddr_port(&addr); return ASN_OK; } int ooSocketConnect (OOSOCKET socket, const char* host, int port) { - struct sockaddr_in m_addr; + struct ast_sockaddr m_addr; if (socket == OOSOCKET_INVALID) { @@ -380,13 +404,10 @@ int ooSocketConnect (OOSOCKET socket, const char* host, int port) } memset (&m_addr, 0, sizeof (m_addr)); + ast_parse_arg(host, PARSE_ADDR, &m_addr); + ast_sockaddr_set_port(&m_addr, port); - m_addr.sin_family = AF_INET; - m_addr.sin_port = htons ((unsigned short)port); - m_addr.sin_addr.s_addr = inet_addr (host); - - if (connect (socket, (struct sockaddr *) (void*) &m_addr, - sizeof (struct sockaddr_in)) == -1) + if (ast_connect(socket, &m_addr)) { return ASN_E_INVSOCKET; } @@ -522,10 +543,18 @@ int ooGetLocalIPAddress(char * pIPAddrs) ret = gethostname(hostname, 100); if(ret == 0) { - if (!(hp = ast_gethostbyname(hostname, &phost))) { - struct in_addr i; - memcpy(&i, hp->h_addr, sizeof(i)); - strcpy(pIPAddrs, (ast_inet_ntoa(i) == NULL) ? "127.0.0.1" : ast_inet_ntoa(i)); + if ((hp = ast_gethostbyname(hostname, &phost))) { + if (hp->h_addrtype == AF_INET6) { + struct in6_addr i; + memcpy(&i, hp->h_addr, sizeof(i)); + strcpy(pIPAddrs, (inet_ntop(AF_INET6, &i, + hostname, sizeof(hostname))) == NULL ? "::1" : + inet_ntop(AF_INET6, &i, hostname, sizeof(hostname))); + } else { + struct in_addr i; + memcpy(&i, hp->h_addr, sizeof(i)); + strcpy(pIPAddrs, (ast_inet_ntoa(i) == NULL) ? "127.0.0.1" : ast_inet_ntoa(i)); + } } else { return -1; } @@ -536,7 +565,7 @@ int ooGetLocalIPAddress(char * pIPAddrs) return ASN_OK; } -int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr) +/* int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr) { int b1, b2, b3, b4; int rv = sscanf (pIPAddrStr, "%d.%d.%d.%d", &b1, &b2, &b3, &b4); @@ -589,7 +618,7 @@ int ooSocketAddrToStr (OOIPADDR ipAddr, char* pbuf, int bufsize) return ASN_E_BUFOVFLW; sprintf (pbuf, "%s.%s.%s.%s", buf1, buf2, buf3, buf4); return ASN_OK; -} +} */ int ooSocketsCleanup (void) { @@ -623,7 +652,7 @@ int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList) struct sockaddr_in sin; OOTRACEDBGA1("Retrieving local interfaces\n"); - if(ooSocketCreateUDP(&sock)!= ASN_OK) + if(ooSocketCreateUDP(&sock, 4)!= ASN_OK) { OOTRACEERR1("Error:Failed to create udp socket - " "ooSocketGetInterfaceList\n"); diff --git a/addons/ooh323c/src/ooSocket.h b/addons/ooh323c/src/ooSocket.h index 73492cc60..dca390ffa 100644 --- a/addons/ooh323c/src/ooSocket.h +++ b/addons/ooh323c/src/ooSocket.h @@ -81,7 +81,8 @@ typedef int OOSOCKET; /**< Socket's handle */ * address. The least significant 8 bits represent the last number of the IP * address. */ -typedef unsigned long OOIPADDR; +/* typedef unsigned long OOIPADDR; */ +typedef struct ast_sockaddr OOIPADDR; #define OOIPADDR_ANY ((OOIPADDR)0) #define OOIPADDR_LOCAL ((OOIPADDR)0x7f000001UL) /* 127.0.0.1 */ @@ -115,7 +116,7 @@ typedef struct OOInterface{ * negative return value is error. */ EXTERN int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket, - OOIPADDR* destAddr, int* destPort); + char* destAddr, int* destPort); /** * This function converts an IP address to its string representation. @@ -177,10 +178,11 @@ EXTERN int ooSocketConnect (OOSOCKET socket, const char* host, int port); * * @param psocket The pointer to the socket's handle variable to receive * the handle of new socket. + * @param family Which family socket will created * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ -EXTERN int ooSocketCreate (OOSOCKET* psocket); +EXTERN int ooSocketCreate (OOSOCKET* psocket, int family); /** * This function creates a UDP datagram socket. @@ -190,7 +192,7 @@ EXTERN int ooSocketCreate (OOSOCKET* psocket); * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ -EXTERN int ooSocketCreateUDP (OOSOCKET* psocket); +EXTERN int ooSocketCreateUDP (OOSOCKET* psocket, int family); /** * This function initiates use of sockets by an application. This function must @@ -351,7 +353,7 @@ EXTERN int ooPDWrite(struct pollfd *pfds, int nfds, int fd); * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ -EXTERN int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr); +/* EXTERN int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr); */ /** * This function converts an internet dotted ip address to network address @@ -364,7 +366,7 @@ EXTERN int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr); * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ -EXTERN int ooSocketConvertIpToNwAddr(char *inetIp, unsigned char *netIp); +/* EXTERN int ooSocketConvertIpToNwAddr(char *inetIp, unsigned char *netIp); */ /** * This function retrives the IP address of the local host. @@ -393,10 +395,11 @@ EXTERN short ooSocketHTONS(short val); * @param ip Buffer in which ip address will be returned. * @param len Length of the ip address buffer. * @param port Pointer to integer in which port number will be returned. + * @param family Pointer to integer in which IP family (4 or 6) will be returned * * @return ASN_OK, on success; -ve on failed. */ -EXTERN int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port); +EXTERN int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port, int *family); EXTERN int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList); diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c index e16fdcc06..891a12d17 100644 --- a/addons/ooh323c/src/oochannels.c +++ b/addons/ooh323c/src/oochannels.c @@ -16,6 +16,8 @@ #include "asterisk.h" #include "asterisk/lock.h" #include "asterisk/poll-compat.h" +#include "asterisk/config.h" +#include "asterisk/netsock2.h" #include "ooports.h" #include "oochannels.h" @@ -31,6 +33,7 @@ #include "ooh323ep.h" #include "ooStackCmds.h" #include "ooCmdChannel.h" +#include "ooSocket.h" #include "ootypes.h" @@ -60,7 +63,7 @@ int ooCreateH245Listener(OOH323CallData *call) int ret=0; OOSOCKET channelSocket=0; OOTRACEINFO1("Creating H245 listener\n"); - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + if((ret=ooSocketCreate (&channelSocket, call->versionIP))!=ASN_OK) { OOTRACEERR3("ERROR: Failed to create socket for H245 listener " "(%s, %s)\n", call->callType, call->callToken); @@ -97,7 +100,7 @@ int ooCreateH245Connection(OOH323CallData *call) ooTimerCallback *cbData=NULL; OOTRACEINFO1("Creating H245 Connection\n"); - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + if((ret=ooSocketCreate (&channelSocket, call->versionIP))!=ASN_OK) { OOTRACEERR3("ERROR:Failed to create socket for H245 connection " "(%s, %s)\n", call->callType, call->callToken); @@ -241,7 +244,7 @@ int ooCreateH225Connection(OOH323CallData *call) int ret=0, i; OOSOCKET channelSocket=0; for (i=0;i<3;i++) { - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + if((ret=ooSocketCreate (&channelSocket, call->versionIP))!=ASN_OK) { OOTRACEERR3("Failed to create socket for transmit H2250 channel (%s, %s)" "\n", call->callType, call->callToken); @@ -285,9 +288,9 @@ int ooCreateH225Connection(OOH323CallData *call) } call->pH225Channel->port = ret; - OOTRACEINFO5("Trying to connect to remote endpoint(%s:%d) to setup " + OOTRACEINFO6("Trying to connect to remote endpoint(%s:%d) (IPv%d) to setup " "H2250 channel (%s, %s)\n", call->remoteIP, - call->remotePort, call->callType, call->callToken); + call->remotePort, call->versionIP, call->callType, call->callToken); if((ret=ooSocketConnect(channelSocket, call->remoteIP, call->remotePort))==ASN_OK) @@ -298,13 +301,13 @@ int ooCreateH225Connection(OOH323CallData *call) "(%s, %s)\n", call->callType, call->callToken); /* If multihomed, get ip from socket */ - if(!strcmp(call->localIP, "0.0.0.0")) + if(!strcmp(call->localIP, "0.0.0.0") || !strcmp(call->localIP, "::")) { OOTRACEDBGA3("Determining IP address for outgoing call in " "multihomed mode. (%s, %s)\n", call->callType, call->callToken); - ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 20, - &call->pH225Channel->port); + ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 2+8*4+7, + &call->pH225Channel->port, NULL); if(ret != ASN_OK) { OOTRACEERR3("ERROR:Failed to retrieve local ip and port from " @@ -367,12 +370,13 @@ int ooCreateH323Listener() OOIPADDR ipaddrs; /* Create socket */ - if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) + ret = ast_parse_arg(gH323ep.signallingIP, PARSE_ADDR, &ipaddrs); + if((ret=ooSocketCreate (&channelSocket, ast_sockaddr_is_ipv6(&ipaddrs) ? 6 : 4)) + !=ASN_OK) { OOTRACEERR1("Failed to create socket for H323 Listener\n"); return OO_FAILED; } - ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipaddrs); if((ret=ooSocketBind (channelSocket, ipaddrs, gH323ep.listenPort))==ASN_OK) { @@ -397,9 +401,12 @@ int ooAcceptH225Connection() OOH323CallData * call; int ret; char callToken[20]; + char remoteIP[2+8*4+7]; OOSOCKET h225Channel=0; + + memset(remoteIP, 0, sizeof(remoteIP)); ret = ooSocketAccept (*(gH323ep.listener), &h225Channel, - NULL, NULL); + remoteIP, NULL); if(ret != ASN_OK) { OOTRACEERR1("Error:Accepting h225 connection\n"); @@ -421,29 +428,33 @@ int ooAcceptH225Connection() call->pH225Channel->sock = h225Channel; /* If multihomed, get ip from socket */ - if(!strcmp(call->localIP, "0.0.0.0")) + if(!strcmp(call->localIP, "0.0.0.0") || !strcmp(call->localIP,"::")) { OOTRACEDBGA3("Determining IP address for incoming call in multihomed " "mode (%s, %s)\n", call->callType, call->callToken); - ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 20, - &call->pH225Channel->port); - if(ret != ASN_OK) - { - OOTRACEERR3("Error:Failed to retrieve local ip and port from " - "socket for multihomed mode.(%s, %s)\n", - call->callType, call->callToken); - if(call->callState < OO_CALL_CLEAR) - { /* transport failure */ - call->callState = OO_CALL_CLEAR; - call->callEndReason = OO_REASON_TRANSPORTFAILURE; - } - ast_mutex_unlock(&call->Lock); - return OO_FAILED; + } + ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 2+8*4+7, + &call->pH225Channel->port, &call->versionIP); + if(ret != ASN_OK) + { + OOTRACEERR3("Error:Failed to retrieve local ip and port from " + "socket for multihomed mode.(%s, %s)\n", + call->callType, call->callToken); + if(call->callState < OO_CALL_CLEAR) + { /* transport failure */ + call->callState = OO_CALL_CLEAR; + call->callEndReason = OO_REASON_TRANSPORTFAILURE; } - OOTRACEDBGA4("Using Local IP address %s for incoming call in multihomed " - "mode. (%s, %s)\n", call->localIP, call->callType, - call->callToken); + ast_mutex_unlock(&call->Lock); + return OO_FAILED; + } + OOTRACEDBGA5("Using Local IP address %s (IPv%d) for incoming call " + "(%s, %s)\n", call->localIP, call->versionIP, call->callType, + call->callToken); + + if (remoteIP[0]) { + strncpy(call->remoteIP, remoteIP, strlen(remoteIP)); } ast_mutex_unlock(&call->Lock); @@ -658,7 +669,7 @@ int ooProcessCallFDSETsAndTimers "(%s, %s)\n", call->callType, call->callToken); if(call->callState < OO_CALL_CLEAR) { - call->callEndReason = OO_REASON_INVALIDMESSAGE; + if (!call->callEndReason) call->callEndReason = OO_REASON_INVALIDMESSAGE; call->callState = OO_CALL_CLEAR; } } @@ -1393,7 +1404,8 @@ int ooSendMsg(OOH323CallData *call, int type) { call->callEndReason = OO_REASON_TRANSPORTFAILURE; call->callState = OO_CALL_CLEAR; - } + } else if (call->callState == OO_CALL_CLEAR) + call->callState = OO_CALL_CLEAR_RELEASESENT; return OO_FAILED; } }/* end of type==OOQ931MSG */ diff --git a/addons/ooh323c/src/ooh245.c b/addons/ooh323c/src/ooh245.c index 687e07eb5..940b8d838 100644 --- a/addons/ooh323c/src/ooh245.c +++ b/addons/ooh323c/src/ooh245.c @@ -1559,7 +1559,8 @@ int ooHandleOpenLogicalChannel_helper(OOH323CallData *call, H245H2250LogicalChannelAckParameters *h2250lcap=NULL; OOCTXT *pctxt; H245UnicastAddress *unicastAddrs, *unicastAddrs1; - H245UnicastAddress_iPAddress *iPAddress, *iPAddress1; + H245UnicastAddress_iPAddress *iPAddress = NULL, *iPAddress1 = NULL; + H245UnicastAddress_iP6Address *iP6Address = NULL, *iP6Address1 = NULL; ooLogicalChannel *pLogicalChannel = NULL; H245H2250LogicalChannelParameters *h2250lcp=NULL; H245OpenLogicalChannel_forwardLogicalChannelParameters *flcp = @@ -1637,11 +1638,20 @@ int ooHandleOpenLogicalChannel_helper(OOH323CallData *call, unicastAddrs = h2250lcap->mediaChannel.u.unicastAddress; memset(unicastAddrs, 0, sizeof(H245UnicastAddress)); - unicastAddrs->t = T_H245UnicastAddress_iPAddress; - unicastAddrs->u.iPAddress = (H245UnicastAddress_iPAddress*) + + if (call->versionIP == 6) { + unicastAddrs->t = T_H245UnicastAddress_iP6Address; + unicastAddrs->u.iP6Address = (H245UnicastAddress_iP6Address*) + memAlloc(pctxt, sizeof(H245UnicastAddress_iP6Address)); + iP6Address = unicastAddrs->u.iP6Address; + memset(iP6Address, 0, sizeof(H245UnicastAddress_iP6Address)); + } else { + unicastAddrs->t = T_H245UnicastAddress_iPAddress; + unicastAddrs->u.iPAddress = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, sizeof(H245UnicastAddress_iPAddress)); - iPAddress = unicastAddrs->u.iPAddress; - memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress)); + iPAddress = unicastAddrs->u.iPAddress; + memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress)); + } pLogicalChannel = ooAddNewLogicalChannel(call, olc->forwardLogicalChannelNumber, h2250lcap->sessionID, @@ -1652,10 +1662,16 @@ int ooHandleOpenLogicalChannel_helper(OOH323CallData *call, "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } - ooSocketConvertIpToNwAddr(call->localIP, iPAddress->network.data); - iPAddress->network.numocts = 4; - iPAddress->tsapIdentifier = pLogicalChannel->localRtpPort; + if (call->versionIP == 6) { + inet_pton(AF_INET6, call->localIP, iP6Address->network.data); + iP6Address->network.numocts = 16; + iP6Address->tsapIdentifier = pLogicalChannel->localRtpPort; + } else { + inet_pton(AF_INET, call->localIP, iPAddress->network.data); + iPAddress->network.numocts = 4; + iPAddress->tsapIdentifier = pLogicalChannel->localRtpPort; + } /* media contrcol channel */ h2250lcap->mediaControlChannel.t = @@ -1664,17 +1680,28 @@ int ooHandleOpenLogicalChannel_helper(OOH323CallData *call, ASN1MALLOC(pctxt, sizeof(H245UnicastAddress)); unicastAddrs1 = h2250lcap->mediaControlChannel.u.unicastAddress; - memset(unicastAddrs1, 0, sizeof(H245UnicastAddress)); - unicastAddrs1->t = T_H245UnicastAddress_iPAddress; - unicastAddrs1->u.iPAddress = (H245UnicastAddress_iPAddress*) - memAlloc(pctxt, sizeof(H245UnicastAddress_iPAddress)); - iPAddress1 = unicastAddrs1->u.iPAddress; - memset(iPAddress1, 0, sizeof(H245UnicastAddress_iPAddress)); - ooSocketConvertIpToNwAddr(call->localIP, iPAddress1->network.data); + memset(unicastAddrs1, 0, sizeof(H245UnicastAddress)); + if (call->versionIP == 6) { + unicastAddrs1->t = T_H245UnicastAddress_iP6Address; + unicastAddrs1->u.iP6Address = (H245UnicastAddress_iP6Address*) + memAlloc(pctxt, sizeof(H245UnicastAddress_iP6Address)); + iP6Address1 = unicastAddrs1->u.iP6Address; + memset(iP6Address1, 0, sizeof(H245UnicastAddress_iP6Address)); + inet_pton(AF_INET6, call->localIP, iP6Address1->network.data); + iP6Address1->network.numocts = 16; + iP6Address1->tsapIdentifier = pLogicalChannel->localRtcpPort; + } else { + unicastAddrs1->t = T_H245UnicastAddress_iPAddress; + unicastAddrs1->u.iPAddress = (H245UnicastAddress_iPAddress*) + memAlloc(pctxt, sizeof(H245UnicastAddress_iPAddress)); + iPAddress1 = unicastAddrs1->u.iPAddress; + memset(iPAddress1, 0, sizeof(H245UnicastAddress_iPAddress)); - iPAddress1->network.numocts = 4; - iPAddress1->tsapIdentifier = pLogicalChannel->localRtcpPort; + inet_pton(AF_INET, call->localIP, iPAddress1->network.data); + iPAddress1->network.numocts = 4; + iPAddress1->tsapIdentifier = pLogicalChannel->localRtcpPort; + } OOTRACEDBGA3("Built OpenLogicalChannelAck (%s, %s)\n", call->callType, call->callToken); @@ -1765,14 +1792,16 @@ int ooSendOpenLogicalChannelReject int ooOnReceivedOpenLogicalChannelAck(OOH323CallData *call, H245OpenLogicalChannelAck *olcAck) { - char remoteip[20]; + char remoteip[2+8*4+7]; regmatch_t pmatch[1]; ooLogicalChannel *pLogicalChannel; H245H2250LogicalChannelAckParameters *h2250lcap; H245UnicastAddress *unicastAddr; - H245UnicastAddress_iPAddress *iPAddress; + H245UnicastAddress_iPAddress *iPAddress = NULL; + H245UnicastAddress_iP6Address *iP6Address = NULL; H245UnicastAddress *unicastAddr1; H245UnicastAddress_iPAddress *iPAddress1 = NULL; + H245UnicastAddress_iP6Address *iP6Address1 = NULL; if(!((olcAck->m.forwardMultiplexAckParametersPresent == 1) && (olcAck->forwardMultiplexAckParameters.t == @@ -1802,19 +1831,28 @@ int ooOnReceivedOpenLogicalChannelAck(OOH323CallData *call, } unicastAddr = h2250lcap->mediaChannel.u.unicastAddress; - if(unicastAddr->t != T_H245UnicastAddress_iPAddress) - { - OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel " + if (call->versionIP == 6) { + if(unicastAddr->t != T_H245UnicastAddress_iP6Address) + { + OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel " + "address type is not IP6 (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } + iP6Address = unicastAddr->u.iP6Address; + inet_ntop(AF_INET6, iP6Address->network.data, remoteip, sizeof(remoteip)); + + } else { + if(unicastAddr->t != T_H245UnicastAddress_iPAddress) + { + OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel " "address type is not IP (%s, %s)\n", call->callType, call->callToken); - return OO_FAILED; + return OO_FAILED; + } + iPAddress = unicastAddr->u.iPAddress; + inet_ntop(AF_INET, iPAddress->network.data, remoteip, sizeof(remoteip)); } - iPAddress = unicastAddr->u.iPAddress; - - sprintf(remoteip,"%d.%d.%d.%d", iPAddress->network.data[0], - iPAddress->network.data[1], - iPAddress->network.data[2], - iPAddress->network.data[3]); /* Extract media control channel address */ if(h2250lcap->m.mediaControlChannelPresent == 1) { @@ -1828,14 +1866,23 @@ int ooOnReceivedOpenLogicalChannelAck(OOH323CallData *call, } unicastAddr1 = h2250lcap->mediaControlChannel.u.unicastAddress; - if(unicastAddr1->t != T_H245UnicastAddress_iPAddress) { - OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control " - "channel address type is not IP (%s, %s)\n", call->callType, - call->callToken); - return OO_FAILED; - } - - iPAddress1 = unicastAddr1->u.iPAddress; + if (call->versionIP == 6) { + if(unicastAddr1->t != T_H245UnicastAddress_iP6Address) { + OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control " + "channel address type is not IP6 (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } + iP6Address1 = unicastAddr1->u.iP6Address; + } else { + if(unicastAddr1->t != T_H245UnicastAddress_iPAddress) { + OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control " + "channel address type is not IP (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } + iPAddress1 = unicastAddr1->u.iPAddress; + } } else { OOTRACEDBGA3("Warning: Processing OpenLogicalChannelAck - Missing media " "control channel (%s, %s)\n", call->callType, call->callToken); @@ -1870,10 +1917,15 @@ int ooOnReceivedOpenLogicalChannelAck(OOH323CallData *call, } strcpy(pLogicalChannel->remoteIP, remoteip); - pLogicalChannel->remoteMediaPort = iPAddress->tsapIdentifier; - if (iPAddress1) - pLogicalChannel->remoteMediaControlPort = iPAddress1->tsapIdentifier; - + if (call->versionIP == 6) { + pLogicalChannel->remoteMediaPort = iP6Address->tsapIdentifier; + if (iP6Address1) + pLogicalChannel->remoteMediaControlPort = iP6Address1->tsapIdentifier; + } else { + pLogicalChannel->remoteMediaPort = iPAddress->tsapIdentifier; + if (iPAddress1) + pLogicalChannel->remoteMediaControlPort = iPAddress1->tsapIdentifier; + } if(pLogicalChannel->chanCap->startTransmitChannel) { pLogicalChannel->chanCap->startTransmitChannel(call, pLogicalChannel); @@ -3613,6 +3665,7 @@ int ooOpenChannel(OOH323CallData* call, ooH323EpCapability *epCap) H245H2250LogicalChannelParameters *h2250lcp = NULL; H245UnicastAddress *unicastAddrs = NULL; H245UnicastAddress_iPAddress *iPAddress = NULL; + H245UnicastAddress_iP6Address *iP6Address = NULL; unsigned session_id=0; ooLogicalChannel *pLogicalChannel = NULL; @@ -3756,16 +3809,27 @@ int ooOpenChannel(OOH323CallData* call, ooH323EpCapability *epCap) unicastAddrs = h2250lcp->mediaControlChannel.u.unicastAddress; memset(unicastAddrs, 0, sizeof(H245UnicastAddress)); - unicastAddrs->t = T_H245UnicastAddress_iPAddress; - unicastAddrs->u.iPAddress = (H245UnicastAddress_iPAddress*) + if (call->versionIP == 6) { + unicastAddrs->t = T_H245UnicastAddress_iP6Address; + unicastAddrs->u.iP6Address = (H245UnicastAddress_iP6Address*) + ASN1MALLOC(pctxt, sizeof(H245UnicastAddress_iP6Address)); + iP6Address = unicastAddrs->u.iP6Address; + memset(iP6Address, 0, sizeof(H245UnicastAddress_iP6Address)); + + inet_pton(AF_INET6, pLogicalChannel->localIP, iP6Address->network.data); + iP6Address->network.numocts = 16; + iP6Address->tsapIdentifier = pLogicalChannel->localRtcpPort; + } else { + unicastAddrs->t = T_H245UnicastAddress_iPAddress; + unicastAddrs->u.iPAddress = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress_iPAddress)); - iPAddress = unicastAddrs->u.iPAddress; - memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress)); - - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP,iPAddress->network.data); + iPAddress = unicastAddrs->u.iPAddress; + memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress)); - iPAddress->network.numocts = 4; - iPAddress->tsapIdentifier = pLogicalChannel->localRtcpPort; + inet_pton(AF_INET, pLogicalChannel->localIP, iPAddress->network.data); + iPAddress->network.numocts = 4; + iPAddress->tsapIdentifier = pLogicalChannel->localRtcpPort; + } pLogicalChannel->state = OO_LOGICALCHAN_PROPOSED; OOTRACEDBGA4("Built OpenLogicalChannel-%s (%s, %s)\n", ooGetCapTypeText(epCap->cap), call->callType, @@ -3798,6 +3862,7 @@ int ooBuildFastStartOLC H245H2250LogicalChannelParameters *pH2250lcp1=NULL, *pH2250lcp2=NULL; H245UnicastAddress *pUnicastAddrs=NULL, *pUniAddrs=NULL; H245UnicastAddress_iPAddress *pIpAddrs=NULL, *pUniIpAddrs=NULL; + H245UnicastAddress_iP6Address *pIp6Addrs=NULL, *pUniIp6Addrs=NULL; unsigned session_id = 0; ooLogicalChannel *pLogicalChannel = NULL; int outgoing=FALSE; @@ -3880,17 +3945,29 @@ int ooBuildFastStartOLC sizeof(H245UnicastAddress)); memset(pUniAddrs, 0, sizeof(H245UnicastAddress)); pH2250lcp1->mediaChannel.u.unicastAddress = pUniAddrs; - pUniAddrs->t = T_H245UnicastAddress_iPAddress; - pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, + if (call->versionIP == 6) { + pUniAddrs->t = T_H245UnicastAddress_iP6Address; + pUniIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + memset(pUniIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address)); + pUniAddrs->u.iP6Address = pUniIp6Addrs; + + inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data); + + pUniIp6Addrs->network.numocts = 16; + pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtpPort; + } else { + pUniAddrs->t = T_H245UnicastAddress_iPAddress; + pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress_iPAddress)); - memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); - pUniAddrs->u.iPAddress = pUniIpAddrs; + memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); + pUniAddrs->u.iPAddress = pUniIpAddrs; - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pUniIpAddrs->network.data); + inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data); - pUniIpAddrs->network.numocts = 4; - pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort; + pUniIpAddrs->network.numocts = 4; + pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort; + } } pH2250lcp1->m.mediaControlChannelPresent = 1; pH2250lcp1->mediaControlChannel.t = @@ -3899,17 +3976,30 @@ int ooBuildFastStartOLC sizeof(H245UnicastAddress)); memset(pUnicastAddrs, 0, sizeof(H245UnicastAddress)); pH2250lcp1->mediaControlChannel.u.unicastAddress = pUnicastAddrs; - pUnicastAddrs->t = T_H245UnicastAddress_iPAddress; - pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, + if (call->versionIP == 6) { + pUnicastAddrs->t = T_H245UnicastAddress_iP6Address; + pIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + memset(pIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address)); + pUnicastAddrs->u.iP6Address = pIp6Addrs; + + inet_pton(AF_INET6, pLogicalChannel->localIP, pIp6Addrs->network.data); + + pIp6Addrs->network.numocts = 16; + pIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } else { + pUnicastAddrs->t = T_H245UnicastAddress_iPAddress; + pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress_iPAddress)); - memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); - pUnicastAddrs->u.iPAddress = pIpAddrs; + memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); + pUnicastAddrs->u.iPAddress = pIpAddrs; - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pIpAddrs->network.data); + inet_pton(AF_INET, pLogicalChannel->localIP, pIpAddrs->network.data); + + pIpAddrs->network.numocts = 4; + pIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } - pIpAddrs->network.numocts = 4; - pIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; if(!outgoing) { if(epCap->startReceiveChannel) @@ -3972,18 +4062,33 @@ int ooBuildFastStartOLC sizeof(H245UnicastAddress)); memset(pUnicastAddrs, 0, sizeof(H245UnicastAddress)); pH2250lcp2->mediaChannel.u.unicastAddress = pUnicastAddrs; + + /* May 20101022 */ - pUnicastAddrs->t = T_H245UnicastAddress_iPAddress; - pIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, + if (call->versionIP == 6) { + pUnicastAddrs->t = T_H245UnicastAddress_iP6Address; + pIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + memset(pIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address)); + pUnicastAddrs->u.iP6Address = pIp6Addrs; + + inet_pton(AF_INET6, pLogicalChannel->localIP, pIp6Addrs->network.data); + + pIp6Addrs->network.numocts = 16; + pIp6Addrs->tsapIdentifier = pLogicalChannel->localRtpPort; + } else { + pUnicastAddrs->t = T_H245UnicastAddress_iPAddress; + pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress_iPAddress)); - memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); - pUnicastAddrs->u.iPAddress = pIpAddrs; + memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); + pUnicastAddrs->u.iPAddress = pIpAddrs; + + inet_pton(AF_INET, pLogicalChannel->localIP, pIpAddrs->network.data); - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pIpAddrs->network.data); + pIpAddrs->network.numocts = 4; + pIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort; + } - pIpAddrs->network.numocts = 4; - pIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort; } pH2250lcp2->m.mediaControlChannelPresent = 1; pH2250lcp2->mediaControlChannel.t = @@ -3993,17 +4098,32 @@ int ooBuildFastStartOLC memset(pUniAddrs, 0, sizeof(H245UnicastAddress)); pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs; + /* May 20101023 */ - pUniAddrs->t = T_H245UnicastAddress_iPAddress; - pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress_iPAddress)); - memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); - pUniAddrs->u.iPAddress = pUniIpAddrs; - - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pUniIpAddrs->network.data); - pUniIpAddrs->network.numocts = 4; - pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; - + if (call->versionIP == 6) { + pUniAddrs->t = T_H245UnicastAddress_iP6Address; + pUniIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + memset(pUniIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address)); + pUniAddrs->u.iP6Address = pUniIp6Addrs; + + inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data); + + pUniIp6Addrs->network.numocts = 16; + pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } else { + pUniAddrs->t = T_H245UnicastAddress_iPAddress; + pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt, + sizeof(H245UnicastAddress_iPAddress)); + memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress)); + pUniAddrs->u.iPAddress = pUniIpAddrs; + + inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data); + + pUniIpAddrs->network.numocts = 4; + pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } + /* In case of fast start, the local endpoint need to be ready to receive all the media types proposed in the fast connect, before @@ -4201,6 +4321,7 @@ int ooGetIpPortFromH245TransportAddress { H245UnicastAddress *unicastAddress = NULL; H245UnicastAddress_iPAddress *ipAddress = NULL; + H245UnicastAddress_iP6Address *ip6Address = NULL; regmatch_t pmatch[1]; if(h245Address->t != T_H245TransportAddress_unicastAddress) @@ -4211,7 +4332,17 @@ int ooGetIpPortFromH245TransportAddress } unicastAddress = h245Address->u.unicastAddress; - if(unicastAddress->t != T_H245UnicastAddress_iPAddress) + if (call->versionIP == 6) { + if (unicastAddress->t != T_H245UnicastAddress_iP6Address) { + OOTRACEERR3("ERROR:H245 Address type is not IP6" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + ip6Address = unicastAddress->u.iP6Address; + *port = ip6Address->tsapIdentifier; + inet_ntop(AF_INET6, ip6Address->network.data, ip, INET6_ADDRSTRLEN); + + } else { if(unicastAddress->t != T_H245UnicastAddress_iPAddress) { OOTRACEERR3("ERROR:H245 Address type is not IP" "(%s, %s)\n", call->callType, call->callToken); @@ -4220,11 +4351,8 @@ int ooGetIpPortFromH245TransportAddress ipAddress = unicastAddress->u.iPAddress; *port = ipAddress->tsapIdentifier; - - sprintf(ip, "%d.%d.%d.%d", ipAddress->network.data[0], - ipAddress->network.data[1], - ipAddress->network.data[2], - ipAddress->network.data[3]); + inet_ntop(AF_INET, ipAddress->network.data, ip, INET_ADDRSTRLEN); + } if (call->rtpMaskStr[0]) { if (regexec(&call->rtpMask->regex, ip, 1, pmatch, 0)) { OOTRACEERR5("ERROR:H245 Address is not matched with filter %s/%s" @@ -4232,7 +4360,6 @@ int ooGetIpPortFromH245TransportAddress return OO_FAILED; } } - return OO_OK; } @@ -4247,6 +4374,7 @@ int ooPrepareFastStartResponseOLC H245H2250LogicalChannelParameters *pH2250lcp1=NULL, *pH2250lcp2=NULL; H245UnicastAddress *pUnicastAddrs=NULL, *pUniAddrs=NULL; H245UnicastAddress_iPAddress *pIpAddrs=NULL, *pUniIpAddrs=NULL; + H245UnicastAddress_iP6Address *pIp6Addrs=NULL, *pUniIp6Addrs=NULL; unsigned session_id = 0; ooLogicalChannel *pLogicalChannel = NULL; @@ -4292,53 +4420,82 @@ int ooPrepareFastStartResponseOLC pH2250lcp1->m.mediaChannelPresent = 1; pH2250lcp1->mediaChannel.t = T_H245TransportAddress_unicastAddress; - pUniAddrs = (H245UnicastAddress*) memAlloc(pctxt, + pUniAddrs = (H245UnicastAddress*) memAllocZ(pctxt, sizeof(H245UnicastAddress)); - pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, + pH2250lcp1->mediaChannel.u.unicastAddress = pUniAddrs; + if (call->versionIP == 6) { + pUniIp6Addrs = (H245UnicastAddress_iP6Address*) memAllocZ(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + if(!pUniAddrs || !pUniIpAddrs) { + OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - pUniAddrs" + "/pUniIpAddrs (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } + + pUniAddrs->t = T_H245UnicastAddress_iP6Address; + pUniAddrs->u.iP6Address = pUniIp6Addrs; + inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data); + + pUniIp6Addrs->network.numocts = 16; + pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtpPort; + + } else { + pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAllocZ(pctxt, sizeof(H245UnicastAddress_iPAddress)); - if(!pUniAddrs || !pUniIpAddrs) - { + if(!pUniAddrs || !pUniIpAddrs) { OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - pUniAddrs" "/pUniIpAddrs (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } + } - pH2250lcp1->mediaChannel.u.unicastAddress = pUniAddrs; - pUniAddrs->t = T_H245UnicastAddress_iPAddress; - pUniAddrs->u.iPAddress = pUniIpAddrs; + pUniAddrs->t = T_H245UnicastAddress_iPAddress; + pUniAddrs->u.iPAddress = pUniIpAddrs; + inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data); - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pUniIpAddrs->network.data); + pUniIpAddrs->network.numocts = 4; + pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort; + } - pUniIpAddrs->network.numocts = 4; - pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort; pH2250lcp1->m.mediaControlChannelPresent = 1; pH2250lcp1->mediaControlChannel.t = T_H245TransportAddress_unicastAddress; - pUnicastAddrs = (H245UnicastAddress*) memAlloc(pctxt, + pUnicastAddrs = (H245UnicastAddress*) memAllocZ(pctxt, sizeof(H245UnicastAddress)); - pIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, - sizeof(H245UnicastAddress_iPAddress)); - if(!pUnicastAddrs || !pIpAddrs) - { + pH2250lcp1->mediaControlChannel.u.unicastAddress = pUnicastAddrs; + + if (call->versionIP == 6) { + pIp6Addrs = (H245UnicastAddress_iP6Address*) memAllocZ(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + if(!pUnicastAddrs || !pIp6Addrs) { OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - " "pUnicastAddrs/pIpAddrs (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } - memset(pUnicastAddrs, 0, sizeof(H245UnicastAddress)); - pH2250lcp1->mediaControlChannel.u.unicastAddress = pUnicastAddrs; - pUnicastAddrs->t = T_H245UnicastAddress_iPAddress; - - pUnicastAddrs->u.iPAddress = pIpAddrs; - - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pIpAddrs->network.data); + } + pUnicastAddrs->t = T_H245UnicastAddress_iP6Address; + pUnicastAddrs->u.iP6Address = pIp6Addrs; + inet_pton(AF_INET6, pLogicalChannel->localIP, pIp6Addrs->network.data); + pIp6Addrs->network.numocts = 16; + pIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } else { - pIpAddrs->network.numocts = 4; - pIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + pIpAddrs = (H245UnicastAddress_iPAddress*) memAllocZ(pctxt, + sizeof(H245UnicastAddress_iPAddress)); + if(!pUnicastAddrs || !pIpAddrs) { + OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - " + "pUnicastAddrs/pIpAddrs (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } + pUnicastAddrs->t = T_H245UnicastAddress_iPAddress; + pUnicastAddrs->u.iPAddress = pIpAddrs; + inet_pton(AF_INET, pLogicalChannel->localIP, pIpAddrs->network.data); + pIpAddrs->network.numocts = 4; + pIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } } if(reverse) @@ -4357,26 +4514,42 @@ int ooPrepareFastStartResponseOLC T_H245TransportAddress_unicastAddress; pUniAddrs = (H245UnicastAddress*) memAlloc(pctxt, sizeof(H245UnicastAddress)); - pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, - sizeof(H245UnicastAddress_iPAddress)); - if(!pUniAddrs || !pUniIpAddrs) - { - OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - " + pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs; + + if (call->versionIP == 6) { + pUniIp6Addrs = (H245UnicastAddress_iP6Address*) memAlloc(pctxt, + sizeof(H245UnicastAddress_iP6Address)); + if(!pUniAddrs || !pUniIp6Addrs) { + OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - " "pUniAddrs/pUniIpAddrs (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } + } - pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs; - pUniAddrs->t = T_H245UnicastAddress_iPAddress; - - pUniAddrs->u.iPAddress = pUniIpAddrs; + pUniAddrs->t = T_H245UnicastAddress_iP6Address; + pUniAddrs->u.iP6Address = pUniIp6Addrs; + inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data); + pUniIp6Addrs->network.numocts = 16; + pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } else { + pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt, + sizeof(H245UnicastAddress_iPAddress)); + if(!pUniAddrs || !pUniIpAddrs) { + OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - " + "pUniAddrs/pUniIpAddrs (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } - ooSocketConvertIpToNwAddr(pLogicalChannel->localIP, - pUniIpAddrs->network.data); - pUniIpAddrs->network.numocts = 4; - pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs; + + pUniAddrs->t = T_H245UnicastAddress_iPAddress; + pUniAddrs->u.iPAddress = pUniIpAddrs; + inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data); + pUniIpAddrs->network.numocts = 4; + pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort; + } } diff --git a/addons/ooh323c/src/ooh323.c b/addons/ooh323c/src/ooh323.c index 33751067a..349c21f29 100644 --- a/addons/ooh323c/src/ooh323.c +++ b/addons/ooh323c/src/ooh323.c @@ -226,7 +226,7 @@ int ooHandleFastStart(OOH323CallData *call, H225Facility_UUIE *facility) if(ret != OO_OK) { OOTRACEERR3("Error: Unknown H245 address type in received " - "CallProceeding message (%s, %s)", call->callType, + "Facility message (%s, %s)", call->callType, call->callToken); /* Mark call for clearing */ if(call->callState < OO_CALL_CLEAR) @@ -368,8 +368,10 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg) H245OpenLogicalChannel* olc; ASN1OCTET msgbuf[MAXMSGLEN]; H225TransportAddress_ipAddress_ip *ip = NULL; + H225TransportAddress_ip6Address_ip *ip6 = NULL; Q931InformationElement* pDisplayIE=NULL; OOAliases *pAlias=NULL; + char remoteIP[2+8*4+7]; call->callReference = q931Msg->callReference; @@ -507,18 +509,26 @@ int ooOnReceivedSetup(OOH323CallData *call, Q931Message *q931Msg) "setup (%s, %s)\n", call->callType, call->callToken); } else{ - - if(setup->sourceCallSignalAddress.t != T_H225TransportAddress_ipAddress) - { - OOTRACEERR3("ERROR: Source call signalling address type not ip " + if(setup->sourceCallSignalAddress.t == T_H225TransportAddress_ip6Address) { + ip6 = &setup->sourceCallSignalAddress.u.ip6Address->ip; + inet_ntop(AF_INET6, ip6->data, remoteIP, INET6_ADDRSTRLEN); + call->remotePort = setup->sourceCallSignalAddress.u.ip6Address->port; + } else if(setup->sourceCallSignalAddress.t == T_H225TransportAddress_ipAddress) { + ip = &setup->sourceCallSignalAddress.u.ipAddress->ip; + sprintf(remoteIP, "%d.%d.%d.%d", ip->data[0], ip->data[1], + ip->data[2], ip->data[3]); + call->remotePort = setup->sourceCallSignalAddress.u.ipAddress->port; + } else { + OOTRACEERR3("ERROR: Source call signalling address type not ip4 nor ip6 " "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } + } - ip = &setup->sourceCallSignalAddress.u.ipAddress->ip; - sprintf(call->remoteIP, "%d.%d.%d.%d", ip->data[0], ip->data[1], - ip->data[2], ip->data[3]); - call->remotePort = setup->sourceCallSignalAddress.u.ipAddress->port; + if (strncmp(remoteIP, call->remoteIP, strlen(remoteIP))) { + OOTRACEERR5("ERROR: Security denial remote sig IP isn't a socket ip, %s not %s " + "(%s, %s)\n", remoteIP, call->remoteIP, call->callType, + call->callToken); } /* check for fast start */ @@ -1814,6 +1824,7 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg) H225Facility_UUIE * facility = NULL; int ret; H225TransportAddress_ipAddress_ip *ip = NULL; + H225TransportAddress_ip6Address_ip *ip6 = NULL; OOTRACEDBGC3("Received Facility Message.(%s, %s)\n", call->callType, call->callToken); @@ -1899,6 +1910,21 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg) call->pCallFwdData->aliases = NULL; if(facility->m.alternativeAddressPresent) { + if (call->versionIP == 6) { + if(facility->alternativeAddress.t != + T_H225TransportAddress_ip6Address) + { + OOTRACEERR3("ERROR: Source call signalling address type not ip6 " + "(%s, %s)\n", call->callType, call->callToken); + + return OO_FAILED; + } + + ip6 = &facility->alternativeAddress.u.ip6Address->ip; + inet_ntop(AF_INET6, ip6->data, call->pCallFwdData->ip, INET6_ADDRSTRLEN); + call->pCallFwdData->port = + facility->alternativeAddress.u.ip6Address->port; + } else { if(facility->alternativeAddress.t != T_H225TransportAddress_ipAddress) { @@ -1913,6 +1939,7 @@ int ooOnReceivedFacility(OOH323CallData *call, Q931Message * pQ931Msg) ip->data[1], ip->data[2], ip->data[3]); call->pCallFwdData->port = facility->alternativeAddress.u.ipAddress->port; + } } if(facility->m.alternativeAliasAddressPresent) @@ -1969,6 +1996,7 @@ int ooHandleStartH245FacilityMessage (OOH323CallData *call, H225Facility_UUIE *facility) { H225TransportAddress_ipAddress *ipAddress = NULL; + H225TransportAddress_ip6Address *ip6Address = NULL; int ret; /* Extract H245 address */ @@ -1978,25 +2006,43 @@ int ooHandleStartH245FacilityMessage "address (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } - if(facility->h245Address.t != T_H225TransportAddress_ipAddress) - { + if (call->versionIP == 6) { + if(facility->h245Address.t != T_H225TransportAddress_ip6Address) + { OOTRACEERR3("ERROR:Unknown H245 address type in received startH245 " "facility message (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } - ipAddress = facility->h245Address.u.ipAddress; - if(!ipAddress) - { + } + ip6Address = facility->h245Address.u.ip6Address; + if(!ip6Address) + { + OOTRACEERR3("ERROR:Invalid startH245 facility message. No H245 ip6 " + "address found. (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + inet_ntop(AF_INET6, ip6Address->ip.data, call->remoteIP, INET6_ADDRSTRLEN); + call->remoteH245Port = ip6Address->port; + } else { + if(facility->h245Address.t != T_H225TransportAddress_ipAddress) + { + OOTRACEERR3("ERROR:Unknown H245 address type in received startH245 " + "facility message (%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + ipAddress = facility->h245Address.u.ipAddress; + if(!ipAddress) + { OOTRACEERR3("ERROR:Invalid startH245 facility message. No H245 ip " "address found. (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } + } - sprintf(call->remoteIP, "%d.%d.%d.%d", ipAddress->ip.data[0], + sprintf(call->remoteIP, "%d.%d.%d.%d", ipAddress->ip.data[0], ipAddress->ip.data[1], ipAddress->ip.data[2], ipAddress->ip.data[3]); - call->remoteH245Port = ipAddress->port; + call->remoteH245Port = ipAddress->port; + } /* disable tunneling for this call */ OO_CLRFLAG (call->flags, OO_M_TUNNELING); @@ -2178,15 +2224,16 @@ int ooH323RetrieveAliases newAlias->value[strlen(pAliasAddress->u.url_ID)*sizeof(char)]='\0'; break; case T_H225AliasAddress_transportID: - newAlias->type = T_H225AliasAddress_transportID; - pTransportAddrss = pAliasAddress->u.transportID; - if(pTransportAddrss->t != T_H225TransportAddress_ipAddress) - { - OOTRACEERR3("Error:Alias transportID not an IP address" - "(%s, %s)\n", call->callType, call->callToken); - memFreePtr(call->pctxt, newAlias); - break; - } + newAlias->type = T_H225AliasAddress_transportID; + pTransportAddrss = pAliasAddress->u.transportID; + if(pTransportAddrss->t == T_H225TransportAddress_ip6Address) { + /* hopefully ip:port value can't exceed more than 30 + characters */ + newAlias->value = (char*)memAlloc(call->pctxt, + INET6_ADDRSTRLEN*sizeof(char)*2); + inet_ntop(AF_INET6, pTransportAddrss->u.ip6Address->ip.data, newAlias->value, INET6_ADDRSTRLEN); + sprintf(newAlias->value+strlen(newAlias->value), ":%d", pTransportAddrss->u.ip6Address->port); + } else if(pTransportAddrss->t == T_H225TransportAddress_ipAddress) { /* hopefully ip:port value can't exceed more than 30 characters */ newAlias->value = (char*)memAlloc(call->pctxt, @@ -2197,7 +2244,12 @@ int ooH323RetrieveAliases pTransportAddrss->u.ipAddress->ip.data[2], pTransportAddrss->u.ipAddress->ip.data[3], pTransportAddrss->u.ipAddress->port); - break; + } else { + OOTRACEERR3("Error:Alias transportID not an IP4 nor IP6 address" + "(%s, %s)\n", call->callType, call->callToken); + memFreePtr(call->pctxt, newAlias); + } + break; case T_H225AliasAddress_email_ID: newAlias->type = T_H225AliasAddress_email_ID; newAlias->value = (char*)memAlloc(call->pctxt, @@ -2471,22 +2523,29 @@ OOAliases* ooH323AddAliasToList case T_H225AliasAddress_transportID: newAlias->type = T_H225AliasAddress_transportID; pTransportAddrss = pAliasAddress->u.transportID; - if(pTransportAddrss->t != T_H225TransportAddress_ipAddress) - { - OOTRACEERR1("Error:Alias transportID not an IP address\n"); - memFreePtr(pctxt, newAlias); - return NULL; - } - /* hopefully ip:port value can't exceed more than 30 + if(pTransportAddrss->t == T_H225TransportAddress_ip6Address) { + /* hopefully ip:port value can't exceed more than 30 characters */ - newAlias->value = (char*)memAlloc(pctxt, + newAlias->value = (char*)memAlloc(pctxt, + INET6_ADDRSTRLEN*sizeof(char)*2); + inet_ntop(AF_INET6, pTransportAddrss->u.ip6Address->ip.data, newAlias->value, INET6_ADDRSTRLEN); + sprintf(newAlias->value+strlen(newAlias->value), ":%d", pTransportAddrss->u.ip6Address->port); + } else if(pTransportAddrss->t == T_H225TransportAddress_ipAddress) { + /* hopefully ip:port value can't exceed more than 30 + characters */ + newAlias->value = (char*)memAlloc(pctxt, 30*sizeof(char)); - sprintf(newAlias->value, "%d.%d.%d.%d:%d", + sprintf(newAlias->value, "%d.%d.%d.%d:%d", pTransportAddrss->u.ipAddress->ip.data[0], pTransportAddrss->u.ipAddress->ip.data[1], pTransportAddrss->u.ipAddress->ip.data[2], pTransportAddrss->u.ipAddress->ip.data[3], pTransportAddrss->u.ipAddress->port); + } else { + OOTRACEERR1("Error:Alias transportID not an IP4 nor IP6 address\n"); + memFreePtr(pctxt, newAlias); + return NULL; + } break; case T_H225AliasAddress_email_ID: newAlias->type = T_H225AliasAddress_email_ID; @@ -2509,6 +2568,17 @@ OOAliases* ooH323AddAliasToList int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call, H225TransportAddress *h225Address, char *ip, int *port) { + if (call->versionIP == 6) { + if(h225Address->t != T_H225TransportAddress_ip6Address) + { + OOTRACEERR3("Error: Unknown H225 address type. (%s, %s)", call->callType, + call->callToken); + return OO_FAILED; + } + inet_ntop(AF_INET6, h225Address->u.ip6Address->ip.data, ip, INET6_ADDRSTRLEN); + *port = h225Address->u.ip6Address->port; + return OO_OK; + } if(h225Address->t != T_H225TransportAddress_ipAddress) { OOTRACEERR3("Error: Unknown H225 address type. (%s, %s)", call->callType, diff --git a/addons/ooh323c/src/ooh323ep.h b/addons/ooh323c/src/ooh323ep.h index 0cb71a019..50ac29dc6 100644 --- a/addons/ooh323c/src/ooh323ep.h +++ b/addons/ooh323c/src/ooh323ep.h @@ -130,7 +130,7 @@ typedef struct OOH323EndPoint { int noOfCaps; OOH225MsgCallbacks h225Callbacks; OOH323CALLBACKS h323Callbacks; - char signallingIP[20]; + char signallingIP[2+8*4+7]; int listenPort; OOSOCKET *listener; OOH323CallData *callList; @@ -148,6 +148,7 @@ typedef struct OOH323EndPoint { OOInterface *ifList; /* interface list for the host we are running on*/ OOBOOL isGateway; OOSOCKET cmdSock; + OOBOOL v6Mode; } OOH323EndPoint; #define ooEndPoint OOH323EndPoint diff --git a/addons/ooh323c/src/ooports.c b/addons/ooh323c/src/ooports.c index 3b2efb8d5..6ff9b4c0b 100644 --- a/addons/ooh323c/src/ooports.c +++ b/addons/ooh323c/src/ooports.c @@ -16,6 +16,8 @@ #include "asterisk.h" #include "asterisk/lock.h" +#include "asterisk/netsock2.h" +#include "asterisk/config.h" #include "ooports.h" #include "ooh323ep.h" @@ -71,7 +73,7 @@ int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip) initialPort = ooGetNextPort (type); bindPort = initialPort; - ret= ooSocketStrToAddr (ip, &ipAddrs); + ret=ast_parse_arg(ip, PARSE_ADDR, &ipAddrs); while(1) { diff --git a/addons/ooh323c/src/ooq931.c b/addons/ooh323c/src/ooq931.c index dddcf15ec..352f85ed2 100644 --- a/addons/ooh323c/src/ooq931.c +++ b/addons/ooh323c/src/ooq931.c @@ -17,6 +17,8 @@ #include "asterisk.h" #include "asterisk/lock.h" #include "asterisk/utils.h" +#include "asterisk/config.h" +#include "asterisk/netsock2.h" #include #include "ooq931.h" @@ -854,7 +856,7 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, /* OOCTXT *pctxt = &gH323ep.msgctxt; */ OOCTXT *pctxt = pCall->msgctxt; int ret = 0, i=0, j=0, remoteMediaPort=0, remoteMediaControlPort = 0, dir=0; - char remoteMediaIP[20], remoteMediaControlIP[20]; + char remoteMediaIP[2+8*4+7], remoteMediaControlIP[2+8*4+7]; DListNode *pNode = NULL; H245OpenLogicalChannel *olc = NULL, printOlc; ooH323EpCapability *epCap = NULL; @@ -1473,6 +1475,7 @@ int ooSendProgress(OOH323CallData *call) H225VendorIdentifier *vendor; Q931Message *q931msg=NULL; H225TransportAddress_ipAddress *h245IpAddr; + H225TransportAddress_ip6Address *h245Ip6Addr; OOCTXT *pctxt = call->msgctxt; ret = ooCreateQ931Message(pctxt, &q931msg, Q931ProgressMsg); @@ -1569,6 +1572,23 @@ int ooSendProgress(OOH323CallData *call) !OO_TESTFLAG (call->flags, OO_M_TUNNELING) && !call->h245listener && ooCreateH245Listener(call) == OO_OK) { + if (call->versionIP == 6) { + progress->m.h245AddressPresent = TRUE; + progress->h245Address.t = T_H225TransportAddress_ip6Address; + + h245Ip6Addr = (H225TransportAddress_ip6Address*) + memAllocZ (pctxt, sizeof(H225TransportAddress_ip6Address)); + if(!h245Ip6Addr) + { + OOTRACEERR3("Error:Memory - ooSendProgress - h245Ip6Addr" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + inet_pton(AF_INET6, call->localIP, h245Ip6Addr->ip.data); + h245Ip6Addr->ip.numocts=16; + h245Ip6Addr->port = *(call->h245listenport); + progress->h245Address.u.ip6Address = h245Ip6Addr; + } else { progress->m.h245AddressPresent = TRUE; progress->h245Address.t = T_H225TransportAddress_ipAddress; @@ -1576,14 +1596,15 @@ int ooSendProgress(OOH323CallData *call) memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress)); if(!h245IpAddr) { - OOTRACEERR3("Error:Memory - ooAcceptCall - h245IpAddr" + OOTRACEERR3("Error:Memory - ooSendProgress - h245IpAddr" "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } - ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data); + inet_pton(AF_INET, call->localIP, h245IpAddr->ip.data); h245IpAddr->ip.numocts=4; h245IpAddr->port = *(call->h245listenport); progress->h245Address.u.ipAddress = h245IpAddr; + } } OOTRACEDBGA3("Built Progress (%s, %s)\n", call->callType, call->callToken); @@ -1614,6 +1635,7 @@ int ooSendStartH245Facility(OOH323CallData *call) /* OOCTXT *pctxt = &gH323ep.msgctxt; */ OOCTXT *pctxt = call->msgctxt; H225TransportAddress_ipAddress *h245IpAddr; + H225TransportAddress_ip6Address *h245Ip6Addr; OOTRACEDBGA3("Building Facility message (%s, %s)\n", call->callType, call->callToken); @@ -1674,19 +1696,35 @@ int ooSendStartH245Facility(OOH323CallData *call) } facility->m.h245AddressPresent = TRUE; - facility->h245Address.t = T_H225TransportAddress_ipAddress; + if (call->versionIP == 6) { + facility->h245Address.t = T_H225TransportAddress_ip6Address; - h245IpAddr = (H225TransportAddress_ipAddress*) + h245Ip6Addr = (H225TransportAddress_ip6Address*) + memAllocZ (pctxt, sizeof(H225TransportAddress_ip6Address)); + if(!h245Ip6Addr) { + OOTRACEERR3("Error:Memory - ooSendFacility - h245Ip6Addr" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + inet_pton(AF_INET6, call->localIP, h245Ip6Addr->ip.data); + h245Ip6Addr->ip.numocts=16; + h245Ip6Addr->port = *(call->h245listenport); + facility->h245Address.u.ip6Address = h245Ip6Addr; + } else { + facility->h245Address.t = T_H225TransportAddress_ipAddress; + + h245IpAddr = (H225TransportAddress_ipAddress*) memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress)); - if(!h245IpAddr) { + if(!h245IpAddr) { OOTRACEERR3("Error:Memory - ooSendFacility - h245IpAddr" "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; + } + inet_pton(AF_INET, call->localIP, h245IpAddr->ip.data); + h245IpAddr->ip.numocts=4; + h245IpAddr->port = *(call->h245listenport); + facility->h245Address.u.ipAddress = h245IpAddr; } - ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data); - h245IpAddr->ip.numocts=4; - h245IpAddr->port = *(call->h245listenport); - facility->h245Address.u.ipAddress = h245IpAddr; OOTRACEDBGA3("Built Facility message to send (%s, %s)\n", call->callType, call->callToken); @@ -1818,6 +1856,7 @@ int ooAcceptCall(OOH323CallData *call) int ret = 0, i=0; H225Connect_UUIE *connect; H225TransportAddress_ipAddress *h245IpAddr; + H225TransportAddress_ip6Address *h245Ip6Addr; H225VendorIdentifier *vendor; Q931Message *q931msg=NULL; /* OOCTXT *pctxt = &gH323ep.msgctxt; */ @@ -1980,20 +2019,37 @@ int ooAcceptCall(OOH323CallData *call) !call->pH245Channel)) { connect->m.h245AddressPresent = TRUE; - connect->h245Address.t = T_H225TransportAddress_ipAddress; + if (call->versionIP == 6) { + connect->h245Address.t = T_H225TransportAddress_ip6Address; - h245IpAddr = (H225TransportAddress_ipAddress*) + h245Ip6Addr = (H225TransportAddress_ip6Address*) + memAllocZ (pctxt, sizeof(H225TransportAddress_ip6Address)); + if(!h245Ip6Addr) + { + OOTRACEERR3("Error:Memory - ooAcceptCall - h245Ip6Addr" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + inet_pton(AF_INET6, call->localIP, h245Ip6Addr->ip.data); + h245Ip6Addr->ip.numocts=16; + h245Ip6Addr->port = *(call->h245listenport); + connect->h245Address.u.ip6Address = h245Ip6Addr; + } else { + connect->h245Address.t = T_H225TransportAddress_ipAddress; + + h245IpAddr = (H225TransportAddress_ipAddress*) memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress)); - if(!h245IpAddr) - { + if(!h245IpAddr) + { OOTRACEERR3("Error:Memory - ooAcceptCall - h245IpAddr" "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; + } + inet_pton(AF_INET, call->localIP, h245IpAddr->ip.data); + h245IpAddr->ip.numocts=4; + h245IpAddr->port = *(call->h245listenport); + connect->h245Address.u.ipAddress = h245IpAddr; } - ooSocketConvertIpToNwAddr(call->localIP, h245IpAddr->ip.data); - h245IpAddr->ip.numocts=4; - h245IpAddr->port = *(call->h245listenport); - connect->h245Address.u.ipAddress = h245IpAddr; } OOTRACEDBGA3("Built H.225 Connect message (%s, %s)\n", call->callType, @@ -2126,10 +2182,11 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) OOCTXT *pctxt; OOH323CallData *call; int ret=OO_OK, i=0, irand=0; - char tmp[30]="\0"; + char tmp[2+8*4+7]="\0"; char *ip=NULL, *port = NULL; struct timeval tv; struct timespec ts; + struct ast_sockaddr m_addr; if(!dest) { @@ -2173,7 +2230,7 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) } - ret = ooParseDestination(call, dest, tmp, 24, &call->remoteAliases); + ret = ooParseDestination(call, dest, tmp, 2+8*4+7, &call->remoteAliases); if(ret != OO_OK) { OOTRACEERR2("Error: Failed to parse the destination string %s for " @@ -2185,10 +2242,15 @@ int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) /* Check whether we have ip address */ if(!ooUtilsIsStrEmpty(tmp)) { ip = tmp; - port = strchr(tmp, ':'); + port = strrchr(tmp, ':'); *port = '\0'; port++; strcpy(call->remoteIP, ip); + ast_parse_arg(ip, PARSE_ADDR, &m_addr); + if (ast_sockaddr_is_ipv6(&m_addr)) + call->versionIP = 6; + else + call->versionIP = 4; call->remotePort = atoi(port); } @@ -2261,7 +2323,16 @@ int ooH323CallAdmitted(OOH323CallData *call) if(gH323ep.h323Callbacks.onOutgoingCall) { /* Outgoing call callback function */ - gH323ep.h323Callbacks.onOutgoingCall(call); + if (gH323ep.h323Callbacks.onOutgoingCall(call) != OO_OK) { + OOTRACEERR3("ERROR:Failed to setup media to (%s,%d)\n", + call->callType, call->callToken); + if(call->callState< OO_CALL_CLEAR) + { + call->callState = OO_CALL_CLEAR; + call->callEndReason = OO_REASON_UNKNOWN; + } + return OO_FAILED; + } } ret = ooH323MakeCall_helper(call); @@ -2294,9 +2365,8 @@ int ooH323MakeCall_helper(OOH323CallData *call) H225Setup_UUIE *setup; ASN1DynOctStr *pFS=NULL; - H225TransportAddress_ipAddress *destCallSignalIpAddress; - - H225TransportAddress_ipAddress *srcCallSignalIpAddress; + H225TransportAddress_ipAddress *destCallSignalIpAddress,*srcCallSignalIpAddress; + H225TransportAddress_ip6Address *destCallSignalIp6Address,*srcCallSignalIp6Address; ooH323EpCapability *epCap=NULL; OOCTXT *pctxt = NULL; H245OpenLogicalChannel *olc, printOlc; @@ -2465,41 +2535,77 @@ int ooH323MakeCall_helper(OOH323CallData *call) setup->sourceInfo.undefinedNode = FALSE; /* Populate the destination Call Signal Address */ - setup->destCallSignalAddress.t=T_H225TransportAddress_ipAddress; - destCallSignalIpAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, + setup->m.destCallSignalAddressPresent=TRUE; + setup->activeMC=FALSE; + if (call->versionIP == 6) { + setup->destCallSignalAddress.t=T_H225TransportAddress_ip6Address; + destCallSignalIp6Address = (H225TransportAddress_ip6Address*)memAlloc(pctxt, + sizeof(H225TransportAddress_ip6Address)); + if(!destCallSignalIp6Address) + { + OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - " + "destCallSignal6Address. (%s, %s)\n", call->callType, + call->callToken); + return OO_FAILED; + } + inet_pton(AF_INET6, call->remoteIP, destCallSignalIp6Address->ip.data); + + destCallSignalIp6Address->ip.numocts=16; + destCallSignalIp6Address->port = call->remotePort; + + setup->destCallSignalAddress.u.ip6Address = destCallSignalIp6Address; + } else { + setup->destCallSignalAddress.t=T_H225TransportAddress_ipAddress; + destCallSignalIpAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, sizeof(H225TransportAddress_ipAddress)); - if(!destCallSignalIpAddress) - { + if(!destCallSignalIpAddress) + { OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - " "destCallSignalAddress. (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } - ooSocketConvertIpToNwAddr(call->remoteIP, destCallSignalIpAddress->ip.data); + } + inet_pton(AF_INET, call->remoteIP, destCallSignalIpAddress->ip.data); - destCallSignalIpAddress->ip.numocts=4; - destCallSignalIpAddress->port = call->remotePort; + destCallSignalIpAddress->ip.numocts=4; + destCallSignalIpAddress->port = call->remotePort; - setup->destCallSignalAddress.u.ipAddress = destCallSignalIpAddress; - setup->m.destCallSignalAddressPresent=TRUE; - setup->activeMC=FALSE; + setup->destCallSignalAddress.u.ipAddress = destCallSignalIpAddress; + } /* Populate the source Call Signal Address */ - setup->sourceCallSignalAddress.t=T_H225TransportAddress_ipAddress; - srcCallSignalIpAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, + setup->m.sourceCallSignalAddressPresent=TRUE; + if (call->versionIP == 6) { + setup->sourceCallSignalAddress.t=T_H225TransportAddress_ip6Address; + srcCallSignalIp6Address = (H225TransportAddress_ip6Address*)memAlloc(pctxt, + sizeof(H225TransportAddress_ip6Address)); + if(!srcCallSignalIp6Address) + { + OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - srcCallSignal6Address" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + inet_pton(AF_INET6, call->localIP, srcCallSignalIp6Address->ip.data); + + srcCallSignalIp6Address->ip.numocts=16; + srcCallSignalIp6Address->port= call->pH225Channel->port; + setup->sourceCallSignalAddress.u.ip6Address = srcCallSignalIp6Address; + } else { + setup->sourceCallSignalAddress.t=T_H225TransportAddress_ipAddress; + srcCallSignalIpAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, sizeof(H225TransportAddress_ipAddress)); - if(!srcCallSignalIpAddress) - { + if(!srcCallSignalIpAddress) + { OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - srcCallSignalAddress" "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } - ooSocketConvertIpToNwAddr(call->localIP, srcCallSignalIpAddress->ip.data); + } + inet_pton(AF_INET, call->localIP, srcCallSignalIpAddress->ip.data); - srcCallSignalIpAddress->ip.numocts=4; - srcCallSignalIpAddress->port= call->pH225Channel->port; - setup->sourceCallSignalAddress.u.ipAddress = srcCallSignalIpAddress; - setup->m.sourceCallSignalAddressPresent=TRUE; + srcCallSignalIpAddress->ip.numocts=4; + srcCallSignalIpAddress->port= call->pH225Channel->port; + setup->sourceCallSignalAddress.u.ipAddress = srcCallSignalIpAddress; + } /* No fast start */ if(!OO_TESTFLAG(call->flags, OO_M_FASTSTART)) { @@ -2845,8 +2951,9 @@ int ooH323ForwardCall(char* callToken, char *dest) H225Facility_UUIE *facility=NULL; OOCTXT *pctxt = &gH323ep.msgctxt; OOH323CallData *call; - char ip[30]="\0", *pcPort=NULL; + char ip[2+8*4+7]="\0", *pcPort=NULL; H225TransportAddress_ipAddress *fwdCallSignalIpAddress; + H225TransportAddress_ip6Address *fwdCallSignalIp6Address; call= ooFindCallByToken(callToken); if(!call) @@ -2865,7 +2972,7 @@ int ooH323ForwardCall(char* callToken, char *dest) return OO_FAILED; } - ret = ooParseDestination(call, dest, ip, 20, + ret = ooParseDestination(call, dest, ip, 2+8*4+7, &call->pCallFwdData->aliases); if(ret != OO_OK) { @@ -2877,7 +2984,7 @@ int ooH323ForwardCall(char* callToken, char *dest) if(!ooUtilsIsStrEmpty(ip)) { - pcPort = strchr(ip, ':'); + pcPort = strrchr(ip, ':'); if(pcPort) { *pcPort = '\0'; @@ -2941,21 +3048,39 @@ int ooH323ForwardCall(char* callToken, char *dest) if(!ooUtilsIsStrEmpty(call->pCallFwdData->ip)) { facility->m.alternativeAddressPresent = TRUE; - facility->alternativeAddress.t=T_H225TransportAddress_ipAddress; - fwdCallSignalIpAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, + if (call->versionIP == 6) { + facility->alternativeAddress.t=T_H225TransportAddress_ip6Address; + fwdCallSignalIp6Address = (H225TransportAddress_ip6Address*)memAlloc(pctxt, + sizeof(H225TransportAddress_ip6Address)); + if(!fwdCallSignalIp6Address) + { + OOTRACEERR3("Error:Memory - ooH323ForwardCall - fwdCallSignal6Address" + "(%s, %s)\n", call->callType, call->callToken); + return OO_FAILED; + } + inet_pton(AF_INET6, call->pCallFwdData->ip, + fwdCallSignalIp6Address->ip.data); + + fwdCallSignalIp6Address->ip.numocts=16; + fwdCallSignalIp6Address->port = call->pCallFwdData->port; + facility->alternativeAddress.u.ip6Address = fwdCallSignalIp6Address; + } else { + facility->alternativeAddress.t=T_H225TransportAddress_ipAddress; + fwdCallSignalIpAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt, sizeof(H225TransportAddress_ipAddress)); - if(!fwdCallSignalIpAddress) - { + if(!fwdCallSignalIpAddress) + { OOTRACEERR3("Error:Memory - ooH323ForwardCall - fwdCallSignalAddress" "(%s, %s)\n", call->callType, call->callToken); return OO_FAILED; - } - ooSocketConvertIpToNwAddr(call->pCallFwdData->ip, + } + inet_pton(AF_INET, call->pCallFwdData->ip, fwdCallSignalIpAddress->ip.data); - fwdCallSignalIpAddress->ip.numocts=4; - fwdCallSignalIpAddress->port = call->pCallFwdData->port; - facility->alternativeAddress.u.ipAddress = fwdCallSignalIpAddress; + fwdCallSignalIpAddress->ip.numocts=4; + fwdCallSignalIpAddress->port = call->pCallFwdData->port; + facility->alternativeAddress.u.ipAddress = fwdCallSignalIpAddress; + } } if(call->pCallFwdData->aliases) @@ -3469,6 +3594,7 @@ int ooParseDestination char tmp[256], buf[30]; char *alias=NULL; OOCTXT *pctxt = call->pctxt; + struct ast_sockaddr tmpaddr; parsedIP[0] = '\0'; OOTRACEINFO2("Parsing destination %s\n", dest); @@ -3498,6 +3624,19 @@ int ooParseDestination return OO_OK; } + if (!ast_parse_arg(dest, PARSE_ADDR, &tmpaddr)) { + if(strlen(dest)+7>len) + { + OOTRACEERR1("Error:Insufficient buffer space for parsed ip - " + "ooParseDestination\n"); + return OO_FAILED; + } + strcpy(parsedIP, ast_sockaddr_stringify_addr(&tmpaddr)); + strcat(parsedIP, ":"); + strcat(parsedIP, ast_sockaddr_stringify_port(&tmpaddr)); + return OO_OK; + } + /* alias@host */ strncpy(tmp, dest, sizeof(tmp)-1); tmp[sizeof(tmp)-1]='\0'; diff --git a/addons/ooh323c/src/ootypes.h b/addons/ooh323c/src/ootypes.h index 83c20fa45..244c47303 100644 --- a/addons/ooh323c/src/ootypes.h +++ b/addons/ooh323c/src/ootypes.h @@ -143,7 +143,7 @@ typedef enum OOCallClearReason { #define OOTERMTYPE 60 /** Maximum length of an IP address (xxx.xxx.xxx.xxx). */ -#define MAX_IP_LENGTH 15 +#define MAX_IP_LENGTH 2+8*4+7 /** Maximum length of a log file message */ #define MAXLOGMSGLEN 2048 -- cgit v1.2.3