|
@@ -75,13 +75,23 @@ static inline int get_family(int stun_family, ioa_engine_handle e, ioa_socket_ha
|
|
////////////////////////////////////////////////
|
|
////////////////////////////////////////////////
|
|
|
|
|
|
const char *get_version(turn_turnserver *server) {
|
|
const char *get_version(turn_turnserver *server) {
|
|
- if (server && !*server->no_software_attribute) {
|
|
|
|
|
|
+ if (server && server->software_attribute) {
|
|
return (const char *)TURN_SOFTWARE;
|
|
return (const char *)TURN_SOFTWARE;
|
|
} else {
|
|
} else {
|
|
return (const char *)"None";
|
|
return (const char *)"None";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void maybe_add_software_attribute(turn_turnserver *server, ioa_network_buffer_handle nbh) {
|
|
|
|
+ if (server->software_attribute) {
|
|
|
|
+ const char *field = get_version(server);
|
|
|
|
+ size_t fsz = strlen(get_version(server));
|
|
|
|
+ size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
+ stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
+ ioa_network_buffer_set_size(nbh, len);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
#define MAX_NUMBER_OF_UNKNOWN_ATTRS (128)
|
|
#define MAX_NUMBER_OF_UNKNOWN_ATTRS (128)
|
|
|
|
|
|
int TURN_MAX_ALLOCATE_TIMEOUT = 60;
|
|
int TURN_MAX_ALLOCATE_TIMEOUT = 60;
|
|
@@ -1768,13 +1778,7 @@ static int handle_turn_refresh(turn_turnserver *server, ts_ur_super_session *ss,
|
|
(uint8_t *)ss->s_mobile_id, strlen(ss->s_mobile_id));
|
|
(uint8_t *)ss->s_mobile_id, strlen(ss->s_mobile_id));
|
|
ioa_network_buffer_set_size(nbh, len);
|
|
ioa_network_buffer_set_size(nbh, len);
|
|
|
|
|
|
- if (!(*server->no_software_attribute)) {
|
|
|
|
- const uint8_t *field = (const uint8_t *)get_version(server);
|
|
|
|
- size_t fsz = strlen(get_version(server));
|
|
|
|
- size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
- stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
- ioa_network_buffer_set_size(nbh, len);
|
|
|
|
- }
|
|
|
|
|
|
+ maybe_add_software_attribute(server, nbh);
|
|
|
|
|
|
if (message_integrity) {
|
|
if (message_integrity) {
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
@@ -2252,13 +2256,7 @@ static void tcp_peer_accept_connection(ioa_socket_handle s, void *arg) {
|
|
|
|
|
|
ioa_network_buffer_set_size(nbh, len);
|
|
ioa_network_buffer_set_size(nbh, len);
|
|
|
|
|
|
- if (!(*server->no_software_attribute)) {
|
|
|
|
- const uint8_t *field = (const uint8_t *)get_version(server);
|
|
|
|
- size_t fsz = strlen(get_version(server));
|
|
|
|
- size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
- stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
- ioa_network_buffer_set_size(nbh, len);
|
|
|
|
- }
|
|
|
|
|
|
+ maybe_add_software_attribute(server, nbh);
|
|
|
|
|
|
if ((server->fingerprint) || ss->enforce_fingerprints) {
|
|
if ((server->fingerprint) || ss->enforce_fingerprints) {
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
@@ -2530,13 +2528,7 @@ int turnserver_accept_tcp_client_data_connection(turn_turnserver *server, tcp_co
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (!(*server->no_software_attribute)) {
|
|
|
|
- size_t fsz = strlen(get_version(server));
|
|
|
|
- const uint8_t *field = (const uint8_t *)get_version(server);
|
|
|
|
- size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
- stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
- ioa_network_buffer_set_size(nbh, len);
|
|
|
|
- }
|
|
|
|
|
|
+ maybe_add_software_attribute(server, nbh);
|
|
|
|
|
|
if (message_integrity && ss) {
|
|
if (message_integrity && ss) {
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
@@ -3814,13 +3806,7 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss,
|
|
(unsigned long long)(ss->id));
|
|
(unsigned long long)(ss->id));
|
|
}
|
|
}
|
|
|
|
|
|
- if (!(*server->no_software_attribute)) {
|
|
|
|
- const uint8_t *field = (const uint8_t *)get_version(server);
|
|
|
|
- size_t fsz = strlen(get_version(server));
|
|
|
|
- size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
- stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
- ioa_network_buffer_set_size(nbh, len);
|
|
|
|
- }
|
|
|
|
|
|
+ maybe_add_software_attribute(server, nbh);
|
|
|
|
|
|
send_turn_message_to(server, nbh, &response_origin, &response_destination);
|
|
send_turn_message_to(server, nbh, &response_origin, &response_destination);
|
|
stun_report_binding(ss, STUN_PROMETHEUS_METRIC_TYPE_RESPONSE);
|
|
stun_report_binding(ss, STUN_PROMETHEUS_METRIC_TYPE_RESPONSE);
|
|
@@ -3920,13 +3906,7 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss,
|
|
*resp_constructed = 1;
|
|
*resp_constructed = 1;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!(*server->no_software_attribute)) {
|
|
|
|
- const uint8_t *field = (const uint8_t *)get_version(server);
|
|
|
|
- size_t fsz = strlen(get_version(server));
|
|
|
|
- size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
- stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
- ioa_network_buffer_set_size(nbh, len);
|
|
|
|
- }
|
|
|
|
|
|
+ maybe_add_software_attribute(server, nbh);
|
|
|
|
|
|
if (message_integrity) {
|
|
if (message_integrity) {
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
@@ -4855,13 +4835,7 @@ static void peer_input_handler(ioa_socket_handle s, int event_type, ioa_net_data
|
|
stun_attr_add_addr_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_XOR_PEER_ADDRESS, &(in_buffer->src_addr));
|
|
stun_attr_add_addr_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_XOR_PEER_ADDRESS, &(in_buffer->src_addr));
|
|
ioa_network_buffer_set_size(nbh, len);
|
|
ioa_network_buffer_set_size(nbh, len);
|
|
|
|
|
|
- if (!(*server->no_software_attribute)) {
|
|
|
|
- const uint8_t *field = (const uint8_t *)get_version(server);
|
|
|
|
- size_t fsz = strlen(get_version(server));
|
|
|
|
- size_t len = ioa_network_buffer_get_size(nbh);
|
|
|
|
- stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_SOFTWARE, field, fsz);
|
|
|
|
- ioa_network_buffer_set_size(nbh, len);
|
|
|
|
- }
|
|
|
|
|
|
+ maybe_add_software_attribute(server, nbh);
|
|
|
|
|
|
if ((server->fingerprint) || ss->enforce_fingerprints) {
|
|
if ((server->fingerprint) || ss->enforce_fingerprints) {
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
size_t len = ioa_network_buffer_get_size(nbh);
|
|
@@ -4916,7 +4890,7 @@ void init_turn_server(turn_turnserver *server, turnserver_id id, int verbose, io
|
|
get_user_key_cb userkeycb, check_new_allocation_quota_cb chquotacb,
|
|
get_user_key_cb userkeycb, check_new_allocation_quota_cb chquotacb,
|
|
release_allocation_quota_cb raqcb, ioa_addr *external_ip, vintp check_origin, vintp no_tcp_relay,
|
|
release_allocation_quota_cb raqcb, ioa_addr *external_ip, vintp check_origin, vintp no_tcp_relay,
|
|
vintp no_udp_relay, vintp stale_nonce, vintp max_allocate_lifetime, vintp channel_lifetime,
|
|
vintp no_udp_relay, vintp stale_nonce, vintp max_allocate_lifetime, vintp channel_lifetime,
|
|
- vintp permission_lifetime, vintp stun_only, vintp no_stun, vintp no_software_attribute,
|
|
|
|
|
|
+ vintp permission_lifetime, vintp stun_only, vintp no_stun, bool software_attribute,
|
|
vintp web_admin_listen_on_workers, turn_server_addrs_list_t *alternate_servers_list,
|
|
vintp web_admin_listen_on_workers, turn_server_addrs_list_t *alternate_servers_list,
|
|
turn_server_addrs_list_t *tls_alternate_servers_list, turn_server_addrs_list_t *aux_servers_list,
|
|
turn_server_addrs_list_t *tls_alternate_servers_list, turn_server_addrs_list_t *aux_servers_list,
|
|
int self_udp_balance, vintp no_multicast_peers, vintp allow_loopback_peers,
|
|
int self_udp_balance, vintp no_multicast_peers, vintp allow_loopback_peers,
|
|
@@ -4977,7 +4951,7 @@ void init_turn_server(turn_turnserver *server, turnserver_id id, int verbose, io
|
|
server->permission_lifetime = permission_lifetime;
|
|
server->permission_lifetime = permission_lifetime;
|
|
server->stun_only = stun_only;
|
|
server->stun_only = stun_only;
|
|
server->no_stun = no_stun;
|
|
server->no_stun = no_stun;
|
|
- server->no_software_attribute = no_software_attribute;
|
|
|
|
|
|
+ server->software_attribute = software_attribute;
|
|
server->web_admin_listen_on_workers = web_admin_listen_on_workers;
|
|
server->web_admin_listen_on_workers = web_admin_listen_on_workers;
|
|
|
|
|
|
server->dont_fragment = dont_fragment;
|
|
server->dont_fragment = dont_fragment;
|