coturn/src/apps/relay/mainrelay.h
2016-10-27 17:48:32 +02:00

364 lines
8.2 KiB
C

/*
* 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.
*/
#if !defined(__MAIN_RELAY__)
#define __MAIN_RELAY__
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <limits.h>
#include <ifaddrs.h>
#include <getopt.h>
#include <locale.h>
#include <libgen.h>
#include <pthread.h>
#include <sched.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/resource.h>
#include <sys/utsname.h>
#include <pwd.h>
#include <grp.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include "ns_turn_openssl.h"
#include "ns_turn_utils.h"
#include "ns_turn_khash.h"
#include "userdb.h"
#include "turn_admin_server.h"
#include "tls_listener.h"
#include "dtls_listener.h"
#include "ns_turn_server.h"
#include "ns_turn_maps.h"
#include "apputils.h"
#include "ns_ioalib_impl.h"
#ifdef __cplusplus
extern "C" {
#endif
////////////// DEFINES ////////////////////////////
#define DEFAULT_CONFIG_FILE "turnserver.conf"
#define DEFAULT_CIPHER_LIST "DEFAULT"
/* "ALL:eNULL:aNULL:NULL" */
#define DEFAULT_EC_CURVE_NAME "prime256v1"
#define MAX_NUMBER_OF_GENERAL_RELAY_SERVERS ((u08bits)(0x80))
#define TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP MAX_NUMBER_OF_GENERAL_RELAY_SERVERS
#define TURNSERVER_ID_BOUNDARY_BETWEEN_UDP_AND_TCP TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP
#define DEFAULT_CPUS_NUMBER (2)
/////////// TYPES ///////////////////////////////////
enum _DH_KEY_SIZE {
DH_566,
DH_1066,
DH_2066,
DH_CUSTOM
};
typedef enum _DH_KEY_SIZE DH_KEY_SIZE;
///////// LISTENER SERVER TYPES /////////////////////
struct message_to_listener_to_client {
ioa_addr origin;
ioa_addr destination;
ioa_network_buffer_handle nbh;
};
enum _MESSAGE_TO_LISTENER_TYPE {
LMT_UNKNOWN,
LMT_TO_CLIENT
};
typedef enum _MESSAGE_TO_LISTENER_TYPE MESSAGE_TO_LISTENER_TYPE;
struct message_to_listener {
MESSAGE_TO_LISTENER_TYPE t;
union {
struct message_to_listener_to_client tc;
} m;
};
struct listener_server {
rtcp_map* rtcpmap;
turnipports* tp;
struct event_base* event_base;
ioa_engine_handle ioa_eng;
struct bufferevent *in_buf;
struct bufferevent *out_buf;
char **addrs;
ioa_addr **encaddrs;
size_t addrs_number;
size_t services_number;
dtls_listener_relay_server_type ***udp_services;
dtls_listener_relay_server_type ***dtls_services;
dtls_listener_relay_server_type ***aux_udp_services;
};
enum _NET_ENG_VERSION {
NEV_UNKNOWN=0,
NEV_MIN,
NEV_UDP_SOCKET_PER_SESSION=NEV_MIN,
NEV_UDP_SOCKET_PER_ENDPOINT,
NEV_UDP_SOCKET_PER_THREAD,
NEV_MAX=NEV_UDP_SOCKET_PER_THREAD,
NEV_TOTAL
};
typedef enum _NET_ENG_VERSION NET_ENG_VERSION;
/////////// PARAMS //////////////////////////////////
typedef struct _turn_params_ {
//////////////// OpenSSL group //////////////////////
SSL_CTX *tls_ctx_ssl23;
SSL_CTX *tls_ctx_v1_0;
#if TLSv1_1_SUPPORTED
SSL_CTX *tls_ctx_v1_1;
#if TLSv1_2_SUPPORTED
SSL_CTX *tls_ctx_v1_2;
#endif
#endif
#if DTLS_SUPPORTED
SSL_CTX *dtls_ctx;
#if DTLSv1_2_SUPPORTED
SSL_CTX *dtls_ctx_v1_2;
#endif
#endif
DH_KEY_SIZE dh_key_size;
char cipher_list[1025];
char ec_curve_name[33];
char ca_cert_file[1025];
char cert_file[1025];
char pkey_file[1025];
char tls_password[513];
char dh_file[1025];
int no_tlsv1;
int no_tlsv1_1;
int no_tlsv1_2;
int no_tls;
int no_dtls;
//////////////// Common params ////////////////////
int verbose;
int turn_daemon;
int prod;
int do_not_use_config_file;
char pidfile[1025];
//////////////// Listener server /////////////////
int listener_port;
int tls_listener_port;
int alt_listener_port;
int alt_tls_listener_port;
int rfc5780;
int no_udp;
int no_tcp;
vint no_tcp_relay;
vint no_udp_relay;
char listener_ifname[1025];
char redis_statsdb[1025];
int use_redis_statsdb;
struct listener_server listener;
ip_range_list_t ip_whitelist;
ip_range_list_t ip_blacklist;
NET_ENG_VERSION net_engine_version;
const char* net_engine_version_txt[NEV_TOTAL];
//////////////// Relay servers /////////////
u16bits min_port;
u16bits max_port;
vint check_origin;
vint no_multicast_peers;
vint no_loopback_peers;
char relay_ifname[1025];
size_t relays_number;
char **relay_addrs;
int default_relays;
// Single global public IP.
// If multiple public IPs are used
// then ioa_addr mapping must be used.
ioa_addr *external_ip;
turnserver_id general_relay_servers_number;
turnserver_id udp_relay_servers_number;
////////////// Auth server ////////////////
char oauth_server_name[1025];
char domain[1025];
int oauth;
/////////////// AUX SERVERS ////////////////
turn_server_addrs_list_t aux_servers_list;
int udp_self_balance;
/////////////// ALTERNATE SERVERS ////////////////
turn_server_addrs_list_t alternate_servers_list;
turn_server_addrs_list_t tls_alternate_servers_list;
int stop_turn_server;
////////////// MISC PARAMS ////////////////
vint stun_only;
vint no_stun;
vint secure_stun;
int server_relay;
int fingerprint;
char rest_api_separator;
vint stale_nonce;
vint max_allocate_lifetime;
vint channel_lifetime;
vint permission_lifetime;
vint mobility;
turn_credential_type ct;
int use_auth_secret_with_timestamp;
band_limit_t max_bps;
band_limit_t bps_capacity;
band_limit_t bps_capacity_allocated;
vint total_quota;
vint user_quota;
/////// Users DB ///////////
default_users_db_t default_users_db;
/////// CPUs //////////////
unsigned long cpus;
} turn_params_t;
extern turn_params_t turn_params;
//////////////// Listener server /////////////////
static inline int get_alt_listener_port(void) {
if(turn_params.alt_listener_port<1)
return turn_params.listener_port + 1;
return turn_params.alt_listener_port;
}
static inline int get_alt_tls_listener_port(void) {
if(turn_params.alt_tls_listener_port<1)
return turn_params.tls_listener_port + 1;
return turn_params.alt_tls_listener_port;
}
void add_aux_server(const char *saddr);
void add_alternate_server(const char *saddr);
void del_alternate_server(const char *saddr);
void add_tls_alternate_server(const char *saddr);
void del_tls_alternate_server(const char *saddr);
////////// Addrs ////////////////////
void add_listener_addr(const char* addr);
int add_relay_addr(const char* addr);
///////// Auth ////////////////
void send_auth_message_to_auth_server(struct auth_message *am);
/////////// Setup server ////////
void init_listener(void);
void setup_server(void);
void run_listener_server(struct listener_server *ls);
////////// BPS ////////////////
band_limit_t get_bps_capacity_allocated(void);
band_limit_t get_bps_capacity(void);
void set_bps_capacity(band_limit_t value);
band_limit_t get_max_bps(void);
void set_max_bps(band_limit_t value);
///////////////////////////////
#ifdef __cplusplus
}
#endif
#endif //__MAIN_RELAY__