mirror of https://github.com/coturn/coturn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
9.6 KiB
274 lines
9.6 KiB
/*
|
|
* Copyright (C) 2011, 2012, 2013 Citrix Systems
|
|
*
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the project nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* IO Abstraction library
|
|
*/
|
|
|
|
#ifndef __IOA_LIB__
|
|
#define __IOA_LIB__
|
|
|
|
#include "ns_turn_ioaddr.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
////////////// forward declarations ////////
|
|
|
|
struct _ts_ur_super_session;
|
|
typedef struct _ts_ur_super_session ts_ur_super_session;
|
|
|
|
struct _tcp_connection;
|
|
typedef struct _tcp_connection tcp_connection;
|
|
|
|
|
|
////////////// Mutexes /////////////////////
|
|
|
|
struct _turn_mutex {
|
|
u32bits data;
|
|
void* mutex;
|
|
};
|
|
|
|
typedef struct _turn_mutex turn_mutex;
|
|
|
|
int turn_mutex_init(turn_mutex* mutex);
|
|
int turn_mutex_init_recursive(turn_mutex* mutex);
|
|
|
|
int turn_mutex_lock(const turn_mutex *mutex);
|
|
int turn_mutex_unlock(const turn_mutex *mutex);
|
|
|
|
int turn_mutex_destroy(turn_mutex* mutex);
|
|
|
|
#define TURN_MUTEX_DECLARE(mutex) turn_mutex mutex;
|
|
#define TURN_MUTEX_INIT(mutex) turn_mutex_init(mutex)
|
|
#define TURN_MUTEX_INIT_RECURSIVE(mutex) turn_mutex_init_recursive(mutex)
|
|
#define TURN_MUTEX_LOCK(mutex) turn_mutex_lock(mutex)
|
|
#define TURN_MUTEX_UNLOCK(mutex) turn_mutex_unlock(mutex)
|
|
#define TURN_MUTEX_DESTROY(mutex) turn_mutex_destroy(mutex)
|
|
|
|
/////// Sockets //////////////////////////////
|
|
|
|
#define IOA_EV_TIMEOUT 0x01
|
|
#define IOA_EV_READ 0x02
|
|
#define IOA_EV_WRITE 0x04
|
|
#define IOA_EV_SIGNAL 0x08
|
|
#define IOA_EV_CLOSE 0x10
|
|
|
|
enum _SOCKET_TYPE {
|
|
UNKNOWN_SOCKET=0,
|
|
TCP_SOCKET=6,
|
|
UDP_SOCKET=17,
|
|
TLS_SOCKET=56,
|
|
DTLS_SOCKET=250,
|
|
TENTATIVE_TCP_SOCKET=255
|
|
};
|
|
|
|
typedef enum _SOCKET_TYPE SOCKET_TYPE;
|
|
|
|
enum _SOCKET_APP_TYPE {
|
|
UNKNOWN_APP_SOCKET,
|
|
CLIENT_SOCKET,
|
|
RELAY_SOCKET,
|
|
RELAY_RTCP_SOCKET,
|
|
TCP_CLIENT_DATA_SOCKET,
|
|
TCP_RELAY_DATA_SOCKET,
|
|
LISTENER_SOCKET
|
|
};
|
|
|
|
typedef enum _SOCKET_APP_TYPE SOCKET_APP_TYPE;
|
|
|
|
struct _ioa_socket;
|
|
typedef struct _ioa_socket ioa_socket;
|
|
typedef ioa_socket *ioa_socket_handle;
|
|
|
|
struct _ioa_engine;
|
|
typedef struct _ioa_engine ioa_engine;
|
|
typedef ioa_engine *ioa_engine_handle;
|
|
|
|
typedef void *ioa_timer_handle;
|
|
|
|
typedef void *ioa_network_buffer_handle;
|
|
|
|
/* event data for net event */
|
|
typedef struct _ioa_net_data {
|
|
ioa_addr src_addr;
|
|
ioa_network_buffer_handle nbh;
|
|
int recv_ttl;
|
|
int recv_tos;
|
|
} ioa_net_data;
|
|
|
|
/* Callback on TCP connection completion */
|
|
typedef void (*connect_cb)(int success, void *arg);
|
|
/* Callback on accepted socket from TCP relay endpoint */
|
|
typedef void (*accept_cb)(ioa_socket_handle s, void *arg);
|
|
|
|
////////// REALM ////////////
|
|
|
|
struct _realm_options_t;
|
|
typedef struct _realm_options_t realm_options_t;
|
|
|
|
//////// IP White/black listing ///////////
|
|
|
|
struct _ip_range_list {
|
|
char **ranges;
|
|
ioa_addr_range **encaddrsranges;
|
|
size_t ranges_number;
|
|
};
|
|
|
|
typedef struct _ip_range_list ip_range_list_t;
|
|
|
|
void ioa_lock_whitelist(ioa_engine_handle e);
|
|
void ioa_unlock_whitelist(ioa_engine_handle e);
|
|
const ip_range_list_t* ioa_get_whitelist(ioa_engine_handle e);
|
|
|
|
void ioa_lock_blacklist(ioa_engine_handle e);
|
|
void ioa_unlock_blacklist(ioa_engine_handle e);
|
|
const ip_range_list_t* ioa_get_blacklist(ioa_engine_handle e);
|
|
|
|
////////////////////////////////////////////
|
|
|
|
/*
|
|
* Network buffer functions
|
|
*/
|
|
ioa_network_buffer_handle ioa_network_buffer_allocate(ioa_engine_handle e);
|
|
void ioa_network_buffer_header_init(ioa_network_buffer_handle nbh);
|
|
u08bits *ioa_network_buffer_data(ioa_network_buffer_handle nbh);
|
|
size_t ioa_network_buffer_get_size(ioa_network_buffer_handle nbh);
|
|
size_t ioa_network_buffer_get_capacity(ioa_network_buffer_handle nbh);
|
|
size_t ioa_network_buffer_get_capacity_udp(void);
|
|
void ioa_network_buffer_set_size(ioa_network_buffer_handle nbh, size_t len);
|
|
void ioa_network_buffer_add_offset_size(ioa_network_buffer_handle nbh, u16bits offset, u08bits coffset, size_t len);
|
|
u16bits ioa_network_buffer_get_offset(ioa_network_buffer_handle nbh);
|
|
u08bits ioa_network_buffer_get_coffset(ioa_network_buffer_handle nbh);
|
|
void ioa_network_buffer_delete(ioa_engine_handle e, ioa_network_buffer_handle nbh);
|
|
|
|
/*
|
|
* Status reporting functions
|
|
*/
|
|
void turn_report_allocation_set(void *a, turn_time_t lifetime, int refresh);
|
|
void turn_report_allocation_delete(void *a);
|
|
void turn_report_session_usage(void *session);
|
|
|
|
/*
|
|
* Network event handler callback
|
|
* chnum parameter is just an optimisation hint -
|
|
* the function must work correctly when chnum=0
|
|
* (when no hint information is available).
|
|
*/
|
|
typedef void (*ioa_net_event_handler)(ioa_socket_handle s, int event_type, ioa_net_data *data, void *ctx, int can_resume);
|
|
|
|
/*
|
|
* Timer callback
|
|
*/
|
|
typedef void (*ioa_timer_event_handler)(ioa_engine_handle e, void *ctx);
|
|
|
|
/* timers */
|
|
|
|
ioa_timer_handle set_ioa_timer(ioa_engine_handle e, int secs, int ms, ioa_timer_event_handler cb, void *ctx, int persist, const s08bits *txt);
|
|
void stop_ioa_timer(ioa_timer_handle th);
|
|
void delete_ioa_timer(ioa_timer_handle th);
|
|
#define IOA_EVENT_DEL(E) do { if(E) { delete_ioa_timer(E); E = NULL; } } while(0)
|
|
|
|
ioa_socket_handle create_unbound_ioa_socket(ioa_engine_handle e, int family, SOCKET_TYPE st, SOCKET_APP_TYPE sat);
|
|
|
|
void inc_ioa_socket_ref_counter(ioa_socket_handle s);
|
|
|
|
/* Relay socket handling */
|
|
/*
|
|
* event_port == -1: no rtcp;
|
|
* event_port == 0: reserve rtcp;
|
|
* even_port == +1: reserve and bind rtcp.
|
|
*/
|
|
int create_relay_ioa_sockets(ioa_engine_handle e, ioa_socket_handle client_s,
|
|
int address_family, u08bits transport,
|
|
int even_port, ioa_socket_handle *rtp_s, ioa_socket_handle *rtcp_s,
|
|
u64bits *out_reservation_token, int *err_code, const u08bits **reason,
|
|
accept_cb acb, void *acbarg);
|
|
|
|
ioa_socket_handle ioa_create_connecting_tcp_relay_socket(ioa_socket_handle s, ioa_addr *peer_addr, connect_cb cb, void *arg);
|
|
|
|
int get_ioa_socket_from_reservation(ioa_engine_handle e, u64bits in_reservation_token, ioa_socket_handle *s, u08bits *realm);
|
|
|
|
int get_ioa_socket_address_family(ioa_socket_handle s);
|
|
SOCKET_TYPE get_ioa_socket_type(ioa_socket_handle s);
|
|
SOCKET_APP_TYPE get_ioa_socket_app_type(ioa_socket_handle s);
|
|
const char* get_ioa_socket_tls_method(ioa_socket_handle s);
|
|
const char* get_ioa_socket_tls_cipher(ioa_socket_handle s);
|
|
void set_ioa_socket_app_type(ioa_socket_handle s, SOCKET_APP_TYPE sat);
|
|
ioa_addr* get_local_addr_from_ioa_socket(ioa_socket_handle s);
|
|
ioa_addr* get_remote_addr_from_ioa_socket(ioa_socket_handle s);
|
|
int get_local_mtu_ioa_socket(ioa_socket_handle s);
|
|
ts_ur_super_session *get_ioa_socket_session(ioa_socket_handle s);
|
|
void set_ioa_socket_session(ioa_socket_handle s, ts_ur_super_session *ss);
|
|
void clear_ioa_socket_session_if(ioa_socket_handle s, void *ss);
|
|
tcp_connection *get_ioa_socket_sub_session(ioa_socket_handle s);
|
|
void set_ioa_socket_sub_session(ioa_socket_handle s, tcp_connection *tc);
|
|
int register_callback_on_ioa_socket(ioa_engine_handle e, ioa_socket_handle s, int event_type, ioa_net_event_handler cb, void *ctx, int clean_preexisting);
|
|
int send_data_from_ioa_socket_nbh(ioa_socket_handle s, ioa_addr* dest_addr, ioa_network_buffer_handle nbh, int ttl, int tos);
|
|
void close_ioa_socket(ioa_socket_handle s);
|
|
#define IOA_CLOSE_SOCKET(S) do { if(S) { close_ioa_socket(S); S = NULL; } } while(0)
|
|
ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach);
|
|
void detach_socket_net_data(ioa_socket_handle s);
|
|
int set_df_on_ioa_socket(ioa_socket_handle s, int value);
|
|
void set_do_not_use_df(ioa_socket_handle s);
|
|
int ioa_socket_tobeclosed(ioa_socket_handle s);
|
|
void set_ioa_socket_tobeclosed(ioa_socket_handle s);
|
|
void close_ioa_socket_after_processing_if_necessary(ioa_socket_handle s);
|
|
int check_realm_hash(ioa_socket_handle s, u08bits *realm);
|
|
void set_realm_hash(ioa_socket_handle s, u08bits *realm);
|
|
|
|
////////////////// Base64 /////////////////////////////
|
|
|
|
char *base64_encode(const unsigned char *data,
|
|
size_t input_length,
|
|
size_t *output_length);
|
|
|
|
void build_base64_decoding_table(void);
|
|
|
|
unsigned char *base64_decode(const char *data,
|
|
size_t input_length,
|
|
size_t *output_length);
|
|
|
|
///////////// Realm ///////////////////
|
|
|
|
void get_default_realm_options(realm_options_t* ro);
|
|
int get_realm_options_by_origin(char *origin, realm_options_t* ro);
|
|
void get_realm_options_by_name(char *realm, realm_options_t* ro);
|
|
int get_canonic_origin(const char* o, char *co, int sz);
|
|
int get_default_protocol_port(const char* scheme, size_t slen);
|
|
|
|
///////////////////////////////////////
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __IOA_LIB__ */
|
|
|