[asterisk-commits] may: trunk r313482 - in /trunk/addons: ./ ooh323c/src/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Apr 12 16:59:23 CDT 2011


Author: may
Date: Tue Apr 12 16:59:18 2011
New Revision: 313482

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=313482
Log:
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/


Modified:
    trunk/addons/chan_ooh323.c
    trunk/addons/ooh323c/src/ooCalls.h
    trunk/addons/ooh323c/src/ooGkClient.c
    trunk/addons/ooh323c/src/ooGkClient.h
    trunk/addons/ooh323c/src/ooLogChan.c
    trunk/addons/ooh323c/src/ooLogChan.h
    trunk/addons/ooh323c/src/ooSocket.c
    trunk/addons/ooh323c/src/ooSocket.h
    trunk/addons/ooh323c/src/oochannels.c
    trunk/addons/ooh323c/src/ooh245.c
    trunk/addons/ooh323c/src/ooh323.c
    trunk/addons/ooh323c/src/ooh323ep.h
    trunk/addons/ooh323c/src/ooports.c
    trunk/addons/ooh323c/src/ooq931.c
    trunk/addons/ooh323c/src/ootypes.h

Modified: trunk/addons/chan_ooh323.c
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/chan_ooh323.c?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/chan_ooh323.c (original)
+++ trunk/addons/chan_ooh323.c Tue Apr 12 16:59:18 2011
@@ -143,7 +143,7 @@
 	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 @@
 	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 @@
 	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 @@
 
 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 @@
 		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 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 @@
 	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 @@
 
 		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 @@
 
 		/* 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 @@
 		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 @@
 			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 @@
 
 	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 @@
 
 	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 @@
 	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 @@
 
 	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 @@
 			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 @@
 	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 @@
 
 	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 @@
 		}
 
 		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 @@
 	if (gH323Debug)
 		ast_verbose("--- onAlerting %s\n", call->callToken);
 
-	p = find_call(call);
-
-	if(!p) {
+   	p = find_call(call);
+
+   	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 @@
 	if (gH323Debug)
 		ast_verbose("--- onProgress %s\n", call->callToken);
 
-	p = find_call(call);
-
-	if(!p) {
+   	p = find_call(call);
+
+   	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 @@
 		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 @@
 	} 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 @@
 
 	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 @@
 			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 @@
       		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 @@
 		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 @@
 			}
 
 			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 @@
 
    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 @@
 					 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 @@
 				}
 			} 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 @@
 			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 @@
 	/* 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 @@
 		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 @@
 			free(cur->callerid_name);
 			cur->callerid_name = 0;
 		}
-
+		
 		if (cur->callerid_num) {
 			free(cur->callerid_num);
 			cur->callerid_num = 0;
@@ -3572,20 +3566,20 @@
 			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 @@
 {
 	/* 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 @@
 		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 @@
 
 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;
@@ -3950,6 +3945,45 @@
 
 	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);
@@ -3965,7 +3999,8 @@
 		}
 		/* 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 @@
 	}
 
 
-	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 @@
 	}
 
 	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_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);
+		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);
+	}
 
 	if (gH323Debug)
 		ast_verbose("+++   configure_local_rtp\n");
@@ -4031,7 +4065,6 @@
 								  int remotePort)
 {
 	struct ooh323_pvt *p = NULL;
-	struct sockaddr_in them;
 	struct ast_sockaddr tmp;
 
 	if (gH323Debug)
@@ -4045,10 +4078,8 @@
 		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 @@
 	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 @@
 								  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 @@
 		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 @@
 		ast_queue_control_data(p->owner, AST_CONTROL_T38_PARAMETERS, &parameters, 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 @@
 {
 	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 @@
 	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 @@
 		/* 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 @@
 				(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 @@
 
 	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;
 	}

Modified: trunk/addons/ooh323c/src/ooCalls.h
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/ooh323c/src/ooCalls.h?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/ooh323c/src/ooCalls.h (original)
+++ trunk/addons/ooh323c/src/ooCalls.h Tue Apr 12 16:59:18 2011
@@ -97,7 +97,7 @@
    int   cap;
    int   lMediaPort;
    int   lMediaCntrlPort;
-   char  lMediaIP[20];
+   char  lMediaIP[2+8*4+7];
    struct OOMediaInfo *next;
 } OOMediaInfo;
 
@@ -179,12 +179,13 @@
    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;

Modified: trunk/addons/ooh323c/src/ooGkClient.c
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/ooh323c/src/ooGkClient.c?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/ooh323c/src/ooGkClient.c (original)
+++ trunk/addons/ooh323c/src/ooGkClient.c Tue Apr 12 16:59:18 2011
@@ -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 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 @@
    }
    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 @@
       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 @@
    }
 
  
-   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 @@
    }
    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 @@
    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 @@
    }
    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 @@
       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 @@
       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 @@
 
    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 @@
       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;

Modified: trunk/addons/ooh323c/src/ooGkClient.h
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/ooh323c/src/ooGkClient.h?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/ooh323c/src/ooGkClient.h (original)
+++ trunk/addons/ooh323c/src/ooGkClient.h Tue Apr 12 16:59:18 2011
@@ -47,7 +47,7 @@
 
 
 
-#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 @@
    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;

Modified: trunk/addons/ooh323c/src/ooLogChan.c
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/ooh323c/src/ooLogChan.c?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/ooh323c/src/ooLogChan.c (original)
+++ trunk/addons/ooh323c/src/ooLogChan.c Tue Apr 12 16:59:18 2011
@@ -82,7 +82,7 @@
       /* 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);

Modified: trunk/addons/ooh323c/src/ooLogChan.h
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/ooh323c/src/ooLogChan.h?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/ooh323c/src/ooLogChan.h (original)
+++ trunk/addons/ooh323c/src/ooLogChan.h Tue Apr 12 16:59:18 2011
@@ -53,12 +53,12 @@
    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;

Modified: trunk/addons/ooh323c/src/ooSocket.c
URL: http://svnview.digium.com/svn/asterisk/trunk/addons/ooh323c/src/ooSocket.c?view=diff&rev=313482&r1=313481&r2=313482
==============================================================================
--- trunk/addons/ooh323c/src/ooSocket.c (original)
+++ trunk/addons/ooh323c/src/ooSocket.c Tue Apr 12 16:59:18 2011
@@ -21,9 +21,16 @@
 #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 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 @@
    return ASN_OK;
 }
 
-int ooSocketCreateUDP (OOSOCKET* psocket) 
+int ooSocketCreateUDP (OOSOCKET* psocket, int family) 
 {
    int on;
    struct linger linger;
-
-   OOSOCKET sock = socket (AF_INET,
+   OOSOCKET sock;
+
+   if (family == 6)
+   	sock = socket (AF_INET6,
+                             SOCK_DGRAM,
+                             0);
+   else
+   	sock = socket (AF_INET,
                              SOCK_DGRAM,
                              0);
 
@@ -272,7 +293,10 @@
 
 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 @@
       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);
-
-   if (bind (socket, (struct sockaddr *) (void*) &m_addr,
-                     sizeof (m_addr)) == -1)
-   {
+   ast_sockaddr_copy(&m_addr, &addr);
+   ast_sockaddr_set_port(&m_addr, port);
+
+   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 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 @@
                  "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 ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket, 
-                    OOIPADDR* destAddr, int* destPort) 
-{
-   struct sockaddr_in m_addr;
-   OOSOCKLEN addr_length = sizeof (m_addr);
+                    char* destAddr, int* destPort) 
+{
+   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);

[... 1790 lines stripped ...]



More information about the asterisk-commits mailing list