|
|
|
@ -899,22 +899,43 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
*reason = (const u08bits *)"Wrong TID"; |
|
|
|
|
} else { |
|
|
|
|
size_t len = ioa_network_buffer_get_size(nbh); |
|
|
|
|
ioa_addr xor_relayed_addr; |
|
|
|
|
ioa_addr *relayed_addr = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET)); |
|
|
|
|
if(!relayed_addr) |
|
|
|
|
relayed_addr = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET6)); |
|
|
|
|
if(relayed_addr) { |
|
|
|
|
ioa_addr xor_relayed_addr1, *pxor_relayed_addr1=NULL; |
|
|
|
|
ioa_addr xor_relayed_addr2, *pxor_relayed_addr2=NULL; |
|
|
|
|
ioa_addr *relayed_addr1 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET)); |
|
|
|
|
ioa_addr *relayed_addr2 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET6)); |
|
|
|
|
|
|
|
|
|
if(relayed_addr1) { |
|
|
|
|
if(server->external_ip_set) { |
|
|
|
|
addr_cpy(&xor_relayed_addr1, &(server->external_ip)); |
|
|
|
|
addr_set_port(&xor_relayed_addr1,addr_get_port(relayed_addr1)); |
|
|
|
|
} else { |
|
|
|
|
addr_cpy(&xor_relayed_addr1, relayed_addr1); |
|
|
|
|
} |
|
|
|
|
pxor_relayed_addr1 = &xor_relayed_addr1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(relayed_addr2) { |
|
|
|
|
if(server->external_ip_set) { |
|
|
|
|
addr_cpy(&xor_relayed_addr, &(server->external_ip)); |
|
|
|
|
addr_set_port(&xor_relayed_addr,addr_get_port(relayed_addr)); |
|
|
|
|
addr_cpy(&xor_relayed_addr2, &(server->external_ip)); |
|
|
|
|
addr_set_port(&xor_relayed_addr2,addr_get_port(relayed_addr2)); |
|
|
|
|
} else { |
|
|
|
|
addr_cpy(&xor_relayed_addr, relayed_addr); |
|
|
|
|
addr_cpy(&xor_relayed_addr2, relayed_addr2); |
|
|
|
|
} |
|
|
|
|
pxor_relayed_addr2 = &xor_relayed_addr2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(pxor_relayed_addr1 || pxor_relayed_addr2) { |
|
|
|
|
u32bits lifetime = 0; |
|
|
|
|
if(pxor_relayed_addr1) { |
|
|
|
|
lifetime = (get_relay_session(a,pxor_relayed_addr1->ss.sa_family)->expiration_time - server->ctime); |
|
|
|
|
} else if(pxor_relayed_addr2) { |
|
|
|
|
lifetime = (get_relay_session(a,pxor_relayed_addr2->ss.sa_family)->expiration_time - server->ctime); |
|
|
|
|
} |
|
|
|
|
stun_set_allocate_response_str(ioa_network_buffer_data(nbh), &len, |
|
|
|
|
tid, |
|
|
|
|
&xor_relayed_addr, |
|
|
|
|
pxor_relayed_addr1, pxor_relayed_addr2, |
|
|
|
|
get_remote_addr_from_ioa_socket(ss->client_socket), |
|
|
|
|
(get_relay_session(a,relayed_addr->ss.sa_family)->expiration_time - server->ctime), 0, NULL, 0, |
|
|
|
|
lifetime, 0, NULL, 0, |
|
|
|
|
ss->s_mobile_id); |
|
|
|
|
ioa_network_buffer_set_size(nbh,len); |
|
|
|
|
*resp_constructed = 1; |
|
|
|
@ -930,7 +951,8 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
int even_port = -1; |
|
|
|
|
int dont_fragment = 0; |
|
|
|
|
u64bits in_reservation_token = 0; |
|
|
|
|
int af = STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_DEFAULT; |
|
|
|
|
int af4 = 0; |
|
|
|
|
int af6 = 0; |
|
|
|
|
u08bits username[STUN_MAX_USERNAME_SIZE+1]="\0"; |
|
|
|
|
size_t ulen = 0; |
|
|
|
|
band_limit_t bps = 0; |
|
|
|
@ -1047,7 +1069,7 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
if (len != 8) { |
|
|
|
|
*err_code = 400; |
|
|
|
|
*reason = (const u08bits *)"Wrong Format of Reservation Token"; |
|
|
|
|
} else if(af != STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_DEFAULT) { |
|
|
|
|
} else if(af4 || af6) { |
|
|
|
|
*err_code = 400; |
|
|
|
|
*reason = (const u08bits *)"Address family attribute can not be used with reservation token request"; |
|
|
|
|
} else { |
|
|
|
@ -1069,11 +1091,13 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
*reason = (const u08bits *)"Address family attribute can not be used with reservation token request"; |
|
|
|
|
} else { |
|
|
|
|
int af_req = stun_get_requested_address_family(sar); |
|
|
|
|
if(af == STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_DEFAULT) { |
|
|
|
|
if(!af4 && !af6) { |
|
|
|
|
switch (af_req) { |
|
|
|
|
case STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV4: |
|
|
|
|
af4 = 1; |
|
|
|
|
break; |
|
|
|
|
case STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV6: |
|
|
|
|
af = af_req; |
|
|
|
|
af6 = 1; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
*err_code = 440; |
|
|
|
@ -1149,6 +1173,10 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int af = STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_DEFAULT; |
|
|
|
|
if(af4) af = STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV4; |
|
|
|
|
else if(af6) af = STUN_ATTRIBUTE_REQUESTED_ADDRESS_FAMILY_VALUE_IPV6; |
|
|
|
|
|
|
|
|
|
if (*err_code || create_relay_connection(server, ss, lifetime, |
|
|
|
|
af, transport, |
|
|
|
|
even_port, in_reservation_token, &out_reservation_token, |
|
|
|
@ -1173,20 +1201,35 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
|
|
|
|
|
size_t len = ioa_network_buffer_get_size(nbh); |
|
|
|
|
|
|
|
|
|
ioa_addr xor_relayed_addr; |
|
|
|
|
ioa_addr *relayed_addr = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET)); |
|
|
|
|
if(!relayed_addr) |
|
|
|
|
relayed_addr = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET6)); |
|
|
|
|
if(relayed_addr) { |
|
|
|
|
ioa_addr xor_relayed_addr1, *pxor_relayed_addr1=NULL; |
|
|
|
|
ioa_addr xor_relayed_addr2, *pxor_relayed_addr2=NULL; |
|
|
|
|
ioa_addr *relayed_addr1 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET)); |
|
|
|
|
ioa_addr *relayed_addr2 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET6)); |
|
|
|
|
|
|
|
|
|
if(relayed_addr1) { |
|
|
|
|
if(server->external_ip_set) { |
|
|
|
|
addr_cpy(&xor_relayed_addr, &(server->external_ip)); |
|
|
|
|
addr_set_port(&xor_relayed_addr,addr_get_port(relayed_addr)); |
|
|
|
|
addr_cpy(&xor_relayed_addr1, &(server->external_ip)); |
|
|
|
|
addr_set_port(&xor_relayed_addr1,addr_get_port(relayed_addr1)); |
|
|
|
|
} else { |
|
|
|
|
addr_cpy(&xor_relayed_addr, relayed_addr); |
|
|
|
|
addr_cpy(&xor_relayed_addr1, relayed_addr1); |
|
|
|
|
} |
|
|
|
|
pxor_relayed_addr1 = &xor_relayed_addr1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(relayed_addr2) { |
|
|
|
|
if(server->external_ip_set) { |
|
|
|
|
addr_cpy(&xor_relayed_addr2, &(server->external_ip)); |
|
|
|
|
addr_set_port(&xor_relayed_addr2,addr_get_port(relayed_addr2)); |
|
|
|
|
} else { |
|
|
|
|
addr_cpy(&xor_relayed_addr2, relayed_addr2); |
|
|
|
|
} |
|
|
|
|
pxor_relayed_addr2 = &xor_relayed_addr2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(pxor_relayed_addr1 || pxor_relayed_addr2) { |
|
|
|
|
|
|
|
|
|
stun_set_allocate_response_str(ioa_network_buffer_data(nbh), &len, tid, |
|
|
|
|
&xor_relayed_addr, |
|
|
|
|
pxor_relayed_addr1, pxor_relayed_addr2, |
|
|
|
|
get_remote_addr_from_ioa_socket(ss->client_socket), lifetime, |
|
|
|
|
0,NULL, |
|
|
|
|
out_reservation_token, |
|
|
|
@ -1213,7 +1256,7 @@ static int handle_turn_allocate(turn_turnserver *server, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
size_t len = ioa_network_buffer_get_size(nbh); |
|
|
|
|
stun_set_allocate_response_str(ioa_network_buffer_data(nbh), &len, tid, NULL, NULL, 0, *err_code, *reason, 0, ss->s_mobile_id); |
|
|
|
|
stun_set_allocate_response_str(ioa_network_buffer_data(nbh), &len, tid, NULL, NULL, NULL, 0, *err_code, *reason, 0, ss->s_mobile_id); |
|
|
|
|
ioa_network_buffer_set_size(nbh,len); |
|
|
|
|
*resp_constructed = 1; |
|
|
|
|
} |
|
|
|
|