summaryrefslogtreecommitdiffstats
path: root/tinyRTP
diff options
context:
space:
mode:
authorMamadou DIOP <bossiel@yahoo.fr>2016-05-24 00:11:39 +0200
committerMamadou DIOP <bossiel@yahoo.fr>2016-05-24 00:11:39 +0200
commit3383de3026cd0afb06747069c05a600fd07ec02e (patch)
tree421b8f5a13c6da7770ce781e199265dc3c7076be /tinyRTP
parentaff961eb2374344cb9a62cd9c4f0fae1edf4dbc0 (diff)
downloaddoubango-3383de3026cd0afb06747069c05a600fd07ec02e.zip
doubango-3383de3026cd0afb06747069c05a600fd07ec02e.tar.gz
Make ICE dual-satck (IPv46) more versatile
Diffstat (limited to 'tinyRTP')
-rwxr-xr-xtinyRTP/include/tinyrtp/trtp_manager.h14
-rwxr-xr-xtinyRTP/src/trtp_manager.c46
2 files changed, 37 insertions, 23 deletions
diff --git a/tinyRTP/include/tinyrtp/trtp_manager.h b/tinyRTP/include/tinyrtp/trtp_manager.h
index e409c7b..61d9fcb 100755
--- a/tinyRTP/include/tinyrtp/trtp_manager.h
+++ b/tinyRTP/include/tinyrtp/trtp_manager.h
@@ -90,8 +90,11 @@ typedef struct trtp_manager_s {
tnet_port_t remote_port;
struct sockaddr_storage remote_addr;
- char* public_ip;
- tnet_port_t public_port;
+ struct {
+ char* ip;
+ tnet_port_t port;
+ tnet_socket_type_t type;
+ } public_addr;
struct {
uint32_t local;
@@ -117,8 +120,11 @@ typedef struct trtp_manager_s {
struct sockaddr_storage remote_addr;
tnet_socket_t* local_socket;
- char* public_ip;
- tnet_port_t public_port;
+ struct {
+ char* ip;
+ tnet_port_t port;
+ tnet_socket_type_t type;
+ } public_addr;
struct {
const void* usrdata;
diff --git a/tinyRTP/src/trtp_manager.c b/tinyRTP/src/trtp_manager.c
index 16aeab1..d1fcff1 100755
--- a/tinyRTP/src/trtp_manager.c
+++ b/tinyRTP/src/trtp_manager.c
@@ -833,8 +833,8 @@ static int _trtp_manager_ice_init(trtp_manager_t* self)
if (candidate_answer_dest) { // could be "null" if remote peer is ICE-lite
tsk_strupdate(&self->rtp.remote_ip, candidate_answer_dest->connection_addr);
self->rtp.remote_port = candidate_answer_dest->port;
- tsk_strupdate(&self->rtp.public_ip, candidate_offer->connection_addr);
- self->rtp.public_port = candidate_offer->port;
+ tsk_strupdate(&self->rtp.public_addr.ip, candidate_offer->connection_addr);
+ self->rtp.public_addr.port = candidate_offer->port;
}
// get rtp nominated symetric candidates
@@ -845,8 +845,8 @@ static int _trtp_manager_ice_init(trtp_manager_t* self)
// set rtp local and remote IPs and ports
tsk_strupdate(&self->rtcp.remote_ip, candidate_answer_dest->connection_addr);
self->rtcp.remote_port = candidate_answer_dest->port;
- tsk_strupdate(&self->rtcp.public_ip, candidate_offer->connection_addr);
- self->rtcp.public_port = candidate_offer->port;
+ tsk_strupdate(&self->rtcp.public_addr.ip, candidate_offer->connection_addr);
+ self->rtcp.public_addr.port = candidate_offer->port;
TSK_OBJECT_SAFE_FREE(self->rtcp.local_socket);
// Get RTCP socket
if (self->is_ice_turn_active && candidate_offer->turn.ss) {
@@ -918,6 +918,7 @@ int trtp_manager_prepare(trtp_manager_t* self)
{
const char *rtp_local_ip = tsk_null, *rtcp_local_ip = tsk_null;
tnet_port_t rtp_local_port = 0, rtcp_local_port = 0;
+ tnet_socket_type_t socket_type = self->use_ipv6 ? tnet_socket_type_udp_ipv6 : tnet_socket_type_udp_ipv4;
if(!self) {
TSK_DEBUG_ERROR("Invalid parameter");
@@ -939,7 +940,12 @@ int trtp_manager_prepare(trtp_manager_t* self)
#define __retry_count_max 5
#define __retry_count_max_minus1 (__retry_count_max - 1)
uint8_t retry_count = __retry_count_max;
- tnet_socket_type_t socket_type = self->use_ipv6 ? tnet_socket_type_udp_ipv6 : tnet_socket_type_udp_ipv4;
+ tnet_socket_type_t socket_type = tnet_socket_type_invalid;
+
+ // If local IP is defined then check its address family
+ if (!tsk_strempty(self->local_ip)) {
+ socket_type = tnet_get_type(self->local_ip, rtp_local_port); // IP @ always returns IPv4Only or IPv6Only
+ }
/* Creates local rtp and rtcp sockets */
while(retry_count--) {
@@ -949,8 +955,8 @@ int trtp_manager_prepare(trtp_manager_t* self)
tnet_port_t local_port = 6060;
#else
// first check => try to use port from latest active session if exist
- tnet_port_t local_port = (retry_count == __retry_count_max_minus1 && (self->port_range.start <= self->rtp.public_port && self->rtp.public_port <= self->port_range.stop))
- ? self->rtp.public_port
+ tnet_port_t local_port = (retry_count == __retry_count_max_minus1 && (self->port_range.start <= self->rtp.public_addr.port && self->rtp.public_addr.port <= self->port_range.stop))
+ ? self->rtp.public_addr.port
: (((rand() ^ ++counter) % (self->port_range.stop - self->port_range.start)) + self->port_range.start);
#endif
local_port = (local_port & 0xFFFE); /* turn to even number */
@@ -987,11 +993,13 @@ int trtp_manager_prepare(trtp_manager_t* self)
}
}// end-of-else(!ice)
- tsk_strupdate(&self->rtp.public_ip, rtp_local_ip);
- self->rtp.public_port = rtp_local_port;
+ tsk_strupdate(&self->rtp.public_addr.ip, rtp_local_ip);
+ self->rtp.public_addr.port = rtp_local_port;
+ self->rtp.public_addr.type = socket_type;
- tsk_strupdate(&self->rtcp.public_ip, rtcp_local_ip);
- self->rtcp.public_port = rtcp_local_port;
+ tsk_strupdate(&self->rtcp.public_addr.ip, rtcp_local_ip);
+ self->rtcp.public_addr.port = rtcp_local_port;
+ self->rtcp.public_addr.type = socket_type;
if(self->transport) {
/* set callback function */
@@ -1225,15 +1233,15 @@ int trtp_manager_set_natt_ctx(trtp_manager_t* self, struct tnet_nat_ctx_s* natt_
tnet_port_t public_port = 0;
// get RTP public IP and Port
if(!tnet_transport_get_public_ip_n_port(self->transport, self->transport->master->fd, &public_ip, &public_port)) {
- tsk_strupdate(&self->rtp.public_ip, public_ip);
- self->rtp.public_port = public_port;
+ tsk_strupdate(&self->rtp.public_addr.ip, public_ip);
+ self->rtp.public_addr.port = public_port;
}
// get RTCP public IP and Port
memset(public_ip, 0, sizeof(public_ip));
public_port = 0;
if(self->rtcp.local_socket && !tnet_transport_get_public_ip_n_port(self->transport, self->rtcp.local_socket->fd, &public_ip, &public_port)) {
- tsk_strupdate(&self->rtcp.public_ip, public_ip);
- self->rtcp.public_port = public_port;
+ tsk_strupdate(&self->rtcp.public_addr.ip, public_ip);
+ self->rtcp.public_addr.port = public_port;
}
// re-enable sockets to be able to receive STUN packets
#if 0
@@ -1826,8 +1834,8 @@ int trtp_manager_stop(trtp_manager_t* self)
// Free RTCP info to make sure these values will be updated in next start()
TSK_OBJECT_SAFE_FREE(self->rtcp.local_socket);
TSK_OBJECT_SAFE_FREE(self->rtcp.session);
- self->rtcp.public_port = self->rtcp.remote_port = 0;
- TSK_FREE(self->rtcp.public_ip);
+ self->rtcp.public_addr.port = self->rtcp.remote_port = 0;
+ TSK_FREE(self->rtcp.public_addr.ip);
TSK_FREE(self->rtcp.remote_ip);
// reset default values
@@ -1914,13 +1922,13 @@ static tsk_object_t* trtp_manager_dtor(tsk_object_t * self)
/* rtp */
TSK_FREE(manager->rtp.remote_ip);
- TSK_FREE(manager->rtp.public_ip);
+ TSK_FREE(manager->rtp.public_addr.ip);
TSK_FREE(manager->rtp.serial_buffer.ptr);
/* rtcp */
TSK_OBJECT_SAFE_FREE(manager->rtcp.session);
TSK_FREE(manager->rtcp.remote_ip);
- TSK_FREE(manager->rtcp.public_ip);
+ TSK_FREE(manager->rtcp.public_addr.ip);
TSK_FREE(manager->rtcp.cname);
TSK_OBJECT_SAFE_FREE(manager->rtcp.local_socket);
OpenPOWER on IntegriCloud