Generic support for tcp/tls servers in Asterisk. More...
#include "asterisk/netsock2.h"#include "asterisk/utils.h"#include <openssl/ssl.h>#include <openssl/err.h>

Go to the source code of this file.
Data Structures | |
| struct | ast_tcptls_session_args |
| arguments for the accepting thread More... | |
| struct | ast_tcptls_session_instance |
| struct | ast_tls_config |
Defines | |
| #define | AST_CERTFILE "asterisk.pem" |
| #define | DO_SSL |
| #define | HOOK_T ssize_t |
| #define | LEN_T size_t |
Enumerations | |
| enum | ast_ssl_flags { AST_SSL_VERIFY_CLIENT = (1 << 0), AST_SSL_DONT_VERIFY_SERVER = (1 << 1), AST_SSL_IGNORE_COMMON_NAME = (1 << 2), AST_SSL_SSLV2_CLIENT = (1 << 3), AST_SSL_SSLV3_CLIENT = (1 << 4), AST_SSL_TLSV1_CLIENT = (1 << 5) } |
Functions | |
| int | ast_ssl_setup (struct ast_tls_config *cfg) |
| Set up an SSL server. | |
| void | ast_ssl_teardown (struct ast_tls_config *cfg) |
| free resources used by an SSL server | |
| struct ast_tcptls_session_instance * | ast_tcptls_client_create (struct ast_tcptls_session_args *desc) |
| struct ast_tcptls_session_instance * | ast_tcptls_client_start (struct ast_tcptls_session_instance *tcptls_session) |
| attempts to connect and start tcptls session, on error the tcptls_session's ref count is decremented, fd and file are closed, and NULL is returned. | |
| void | ast_tcptls_close_session_file (struct ast_tcptls_session_instance *tcptls_session) |
| Closes a tcptls session instance's file and/or file descriptor. The tcptls_session will be set to NULL and it's file descriptor will be set to -1 by this function. | |
| HOOK_T | ast_tcptls_server_read (struct ast_tcptls_session_instance *ser, void *buf, size_t count) |
| void * | ast_tcptls_server_root (void *) |
| void | ast_tcptls_server_start (struct ast_tcptls_session_args *desc) |
| This is a generic (re)start routine for a TCP server, which does the socket/bind/listen and starts a thread for handling accept(). | |
| void | ast_tcptls_server_stop (struct ast_tcptls_session_args *desc) |
| Shutdown a running server if there is one. | |
| HOOK_T | ast_tcptls_server_write (struct ast_tcptls_session_instance *ser, const void *buf, size_t count) |
| void | ast_tcptls_stream_set_exclusive_input (struct ast_tcptls_stream *stream, int exclusive_input) |
| Set the TCP/TLS stream I/O if it can exclusively depend upon the set timeouts. | |
| void | ast_tcptls_stream_set_timeout_disable (struct ast_tcptls_stream *stream) |
| Disable the TCP/TLS stream timeout timer. | |
| void | ast_tcptls_stream_set_timeout_inactivity (struct ast_tcptls_stream *stream, int timeout) |
| Set the TCP/TLS stream inactivity timeout timer. | |
| void | ast_tcptls_stream_set_timeout_sequence (struct ast_tcptls_stream *stream, struct timeval start, int timeout) |
| Set the TCP/TLS stream I/O sequence timeout timer. | |
| int | ast_tls_read_conf (struct ast_tls_config *tls_cfg, struct ast_tcptls_session_args *tls_desc, const char *varname, const char *value) |
| Used to parse conf files containing tls/ssl options. | |
Generic support for tcp/tls servers in Asterisk.
TLS/SSL support is basically implemented by reading from a config file (currently http.conf and sip.conf) the names of the certificate and cipher to use, and then run ssl_setup() to create an appropriate SSL_CTX (ssl_ctx) If we support multiple domains, presumably we need to read multiple certificates.
When we are requested to open a TLS socket, we run make_file_from_fd() on the socket, to do the necessary setup. At the moment the context's name is hardwired in the function, but we can certainly make it into an extra parameter to the function.
We declare most of ssl support variables unconditionally, because their number is small and this simplifies the code.
Definition in file tcptls.h.
| #define AST_CERTFILE "asterisk.pem" |
SSL support
Definition at line 68 of file tcptls.h.
Referenced by __ast_http_load(), manager_set_defaults(), and reload_config().
| enum ast_ssl_flags |
| AST_SSL_VERIFY_CLIENT |
Verify certificate when acting as server |
| AST_SSL_DONT_VERIFY_SERVER |
Don't verify certificate when connecting to a server |
| AST_SSL_IGNORE_COMMON_NAME |
Don't compare "Common Name" against IP or hostname |
| AST_SSL_SSLV2_CLIENT |
Use SSLv2 for outgoing client connections |
| AST_SSL_SSLV3_CLIENT |
Use SSLv3 for outgoing client connections |
| AST_SSL_TLSV1_CLIENT |
Use TLSv1 for outgoing client connections |
Definition at line 70 of file tcptls.h.
00070 { 00071 /*! Verify certificate when acting as server */ 00072 AST_SSL_VERIFY_CLIENT = (1 << 0), 00073 /*! Don't verify certificate when connecting to a server */ 00074 AST_SSL_DONT_VERIFY_SERVER = (1 << 1), 00075 /*! Don't compare "Common Name" against IP or hostname */ 00076 AST_SSL_IGNORE_COMMON_NAME = (1 << 2), 00077 /*! Use SSLv2 for outgoing client connections */ 00078 AST_SSL_SSLV2_CLIENT = (1 << 3), 00079 /*! Use SSLv3 for outgoing client connections */ 00080 AST_SSL_SSLV3_CLIENT = (1 << 4), 00081 /*! Use TLSv1 for outgoing client connections */ 00082 AST_SSL_TLSV1_CLIENT = (1 << 5) 00083 };
| int ast_ssl_setup | ( | struct ast_tls_config * | cfg | ) |
Set up an SSL server.
| cfg | Configuration for the SSL server |
| 1 | Success | |
| 0 | Failure |
Definition at line 843 of file tcptls.c.
References __ssl_setup().
Referenced by __ast_http_load(), __init_manager(), and reload_config().
00844 { 00845 return __ssl_setup(cfg, 0); 00846 }
| void ast_ssl_teardown | ( | struct ast_tls_config * | cfg | ) |
free resources used by an SSL server
| cfg | Configuration for the SSL server |
Definition at line 848 of file tcptls.c.
References ast_tls_config::ssl_ctx.
Referenced by sip_tcptls_client_args_destructor(), and unload_module().
| struct ast_tcptls_session_instance* ast_tcptls_client_create | ( | struct ast_tcptls_session_args * | desc | ) | [read] |
Definition at line 895 of file tcptls.c.
References ast_tcptls_session_args::accept_fd, ao2_alloc, ao2_ref, ast_bind(), ast_debug, ast_log(), ast_mutex_init, ast_sockaddr_cmp(), ast_sockaddr_copy(), ast_sockaddr_is_ipv6(), ast_sockaddr_isnull(), ast_sockaddr_setnull(), ast_sockaddr_stringify(), ast_str_create(), ast_tcptls_session_instance::client, errno, ast_tcptls_session_instance::fd, ast_tcptls_session_args::local_address, ast_tcptls_session_instance::lock, LOG_ERROR, LOG_WARNING, ast_tcptls_session_args::name, ast_tcptls_session_args::old_address, ast_tcptls_session_instance::overflow_buf, ast_tcptls_session_instance::parent, ast_tcptls_session_instance::remote_address, ast_tcptls_session_args::remote_address, session_instance_destructor(), and ast_tcptls_session_args::worker_fn.
Referenced by app_exec(), and sip_prepare_socket().
00896 { 00897 int x = 1; 00898 struct ast_tcptls_session_instance *tcptls_session = NULL; 00899 00900 /* Do nothing if nothing has changed */ 00901 if (!ast_sockaddr_cmp(&desc->old_address, &desc->remote_address)) { 00902 ast_debug(1, "Nothing changed in %s\n", desc->name); 00903 return NULL; 00904 } 00905 00906 /* If we return early, there is no connection */ 00907 ast_sockaddr_setnull(&desc->old_address); 00908 00909 if (desc->accept_fd != -1) 00910 close(desc->accept_fd); 00911 00912 desc->accept_fd = socket(ast_sockaddr_is_ipv6(&desc->remote_address) ? 00913 AF_INET6 : AF_INET, SOCK_STREAM, IPPROTO_TCP); 00914 if (desc->accept_fd < 0) { 00915 ast_log(LOG_WARNING, "Unable to allocate socket for %s: %s\n", 00916 desc->name, strerror(errno)); 00917 return NULL; 00918 } 00919 00920 /* if a local address was specified, bind to it so the connection will 00921 originate from the desired address */ 00922 if (!ast_sockaddr_isnull(&desc->local_address)) { 00923 setsockopt(desc->accept_fd, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x)); 00924 if (ast_bind(desc->accept_fd, &desc->local_address)) { 00925 ast_log(LOG_ERROR, "Unable to bind %s to %s: %s\n", 00926 desc->name, 00927 ast_sockaddr_stringify(&desc->local_address), 00928 strerror(errno)); 00929 goto error; 00930 } 00931 } 00932 00933 if (!(tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor))) 00934 goto error; 00935 00936 ast_mutex_init(&tcptls_session->lock); 00937 tcptls_session->overflow_buf = ast_str_create(128); 00938 tcptls_session->client = 1; 00939 tcptls_session->fd = desc->accept_fd; 00940 tcptls_session->parent = desc; 00941 tcptls_session->parent->worker_fn = NULL; 00942 ast_sockaddr_copy(&tcptls_session->remote_address, 00943 &desc->remote_address); 00944 00945 /* Set current info */ 00946 ast_sockaddr_copy(&desc->old_address, &desc->remote_address); 00947 return tcptls_session; 00948 00949 error: 00950 close(desc->accept_fd); 00951 desc->accept_fd = -1; 00952 if (tcptls_session) 00953 ao2_ref(tcptls_session, -1); 00954 return NULL; 00955 }
| struct ast_tcptls_session_instance* ast_tcptls_client_start | ( | struct ast_tcptls_session_instance * | tcptls_session | ) | [read] |
attempts to connect and start tcptls session, on error the tcptls_session's ref count is decremented, fd and file are closed, and NULL is returned.
Definition at line 858 of file tcptls.c.
References __ssl_setup(), ast_tcptls_session_args::accept_fd, ao2_ref, ast_connect(), ast_log(), ast_sockaddr_stringify(), desc, ast_tls_config::enabled, errno, handle_tcptls_connection(), LOG_ERROR, ast_tcptls_session_args::name, ast_tcptls_session_instance::parent, ast_tcptls_session_args::remote_address, and ast_tcptls_session_args::tls_cfg.
Referenced by _sip_tcp_helper_thread(), and app_exec().
00859 { 00860 struct ast_tcptls_session_args *desc; 00861 int flags; 00862 00863 if (!(desc = tcptls_session->parent)) { 00864 goto client_start_error; 00865 } 00866 00867 if (ast_connect(desc->accept_fd, &desc->remote_address)) { 00868 ast_log(LOG_ERROR, "Unable to connect %s to %s: %s\n", 00869 desc->name, 00870 ast_sockaddr_stringify(&desc->remote_address), 00871 strerror(errno)); 00872 goto client_start_error; 00873 } 00874 00875 flags = fcntl(desc->accept_fd, F_GETFL); 00876 fcntl(desc->accept_fd, F_SETFL, flags & ~O_NONBLOCK); 00877 00878 if (desc->tls_cfg) { 00879 desc->tls_cfg->enabled = 1; 00880 __ssl_setup(desc->tls_cfg, 1); 00881 } 00882 00883 return handle_tcptls_connection(tcptls_session); 00884 00885 client_start_error: 00886 if (desc) { 00887 close(desc->accept_fd); 00888 desc->accept_fd = -1; 00889 } 00890 ao2_ref(tcptls_session, -1); 00891 return NULL; 00892 00893 }
| void ast_tcptls_close_session_file | ( | struct ast_tcptls_session_instance * | tcptls_session | ) |
Closes a tcptls session instance's file and/or file descriptor. The tcptls_session will be set to NULL and it's file descriptor will be set to -1 by this function.
Definition at line 1026 of file tcptls.c.
References ast_log(), errno, ast_tcptls_session_instance::f, ast_tcptls_session_instance::fd, and LOG_ERROR.
Referenced by _sip_tcp_helper_thread(), ast_http_send(), ast_tcptls_server_root(), handle_tcptls_connection(), httpd_helper_thread(), and sip_prepare_socket().
01027 { 01028 if (tcptls_session->f) { 01029 fflush(tcptls_session->f); 01030 if (fclose(tcptls_session->f)) { 01031 ast_log(LOG_ERROR, "fclose() failed: %s\n", strerror(errno)); 01032 } 01033 tcptls_session->f = NULL; 01034 tcptls_session->fd = -1; 01035 } else if (tcptls_session->fd != -1) { 01036 /* 01037 * Issuing shutdown() is necessary here to avoid a race 01038 * condition where the last data written may not appear 01039 * in the TCP stream. See ASTERISK-23548 01040 */ 01041 shutdown(tcptls_session->fd, SHUT_RDWR); 01042 if (close(tcptls_session->fd)) { 01043 ast_log(LOG_ERROR, "close() failed: %s\n", strerror(errno)); 01044 } 01045 tcptls_session->fd = -1; 01046 } else { 01047 ast_log(LOG_ERROR, "ast_tcptls_close_session_file invoked on session instance without file or file descriptor\n"); 01048 } 01049 }
| HOOK_T ast_tcptls_server_read | ( | struct ast_tcptls_session_instance * | ser, | |
| void * | buf, | |||
| size_t | count | |||
| ) |
Definition at line 519 of file tcptls.c.
References ast_log(), errno, ast_tcptls_stream::fd, LOG_ERROR, ast_tcptls_session_instance::stream_cookie, and tcptls_stream_read().
Referenced by sip_tcptls_read().
00520 { 00521 if (!tcptls_session->stream_cookie || tcptls_session->stream_cookie->fd == -1) { 00522 ast_log(LOG_ERROR, "TCP/TLS read called on invalid stream.\n"); 00523 errno = EIO; 00524 return -1; 00525 } 00526 00527 return tcptls_stream_read(tcptls_session->stream_cookie, buf, count); 00528 }
| void* ast_tcptls_server_root | ( | void * | ) |
Definition at line 686 of file tcptls.c.
References ast_tcptls_session_args::accept_fd, ao2_alloc, ao2_ref, ast_accept(), ast_log(), ast_mutex_init, ast_pthread_create_detached_background, ast_sockaddr_copy(), ast_str_create(), ast_tcptls_close_session_file(), ast_wait_for_input(), ast_tcptls_session_instance::client, desc, errno, ast_tcptls_session_instance::fd, handle_tcptls_connection(), ast_tcptls_session_instance::lock, LOG_ERROR, LOG_WARNING, ast_tcptls_session_instance::overflow_buf, ast_tcptls_session_instance::parent, ast_tcptls_session_args::periodic_fn, ast_tcptls_session_args::poll_timeout, ast_tcptls_session_instance::remote_address, and session_instance_destructor().
00687 { 00688 struct ast_tcptls_session_args *desc = data; 00689 int fd; 00690 struct ast_sockaddr addr; 00691 struct ast_tcptls_session_instance *tcptls_session; 00692 pthread_t launched; 00693 00694 for (;;) { 00695 int i, flags; 00696 00697 if (desc->periodic_fn) 00698 desc->periodic_fn(desc); 00699 i = ast_wait_for_input(desc->accept_fd, desc->poll_timeout); 00700 if (i <= 0) 00701 continue; 00702 fd = ast_accept(desc->accept_fd, &addr); 00703 if (fd < 0) { 00704 if ((errno != EAGAIN) && (errno != EINTR)) 00705 ast_log(LOG_WARNING, "Accept failed: %s\n", strerror(errno)); 00706 continue; 00707 } 00708 tcptls_session = ao2_alloc(sizeof(*tcptls_session), session_instance_destructor); 00709 if (!tcptls_session) { 00710 ast_log(LOG_WARNING, "No memory for new session: %s\n", strerror(errno)); 00711 if (close(fd)) { 00712 ast_log(LOG_ERROR, "close() failed: %s\n", strerror(errno)); 00713 } 00714 continue; 00715 } 00716 00717 ast_mutex_init(&tcptls_session->lock); 00718 tcptls_session->overflow_buf = ast_str_create(128); 00719 00720 flags = fcntl(fd, F_GETFL); 00721 fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); 00722 tcptls_session->fd = fd; 00723 tcptls_session->parent = desc; 00724 ast_sockaddr_copy(&tcptls_session->remote_address, &addr); 00725 00726 tcptls_session->client = 0; 00727 00728 /* This thread is now the only place that controls the single ref to tcptls_session */ 00729 if (ast_pthread_create_detached_background(&launched, NULL, handle_tcptls_connection, tcptls_session)) { 00730 ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno)); 00731 ast_tcptls_close_session_file(tcptls_session); 00732 ao2_ref(tcptls_session, -1); 00733 } 00734 } 00735 return NULL; 00736 }
| void ast_tcptls_server_start | ( | struct ast_tcptls_session_args * | desc | ) |
This is a generic (re)start routine for a TCP server, which does the socket/bind/listen and starts a thread for handling accept().
Definition at line 957 of file tcptls.c.
References ast_tcptls_session_args::accept_fd, ast_tcptls_session_args::accept_fn, ast_bind(), ast_debug, ast_log(), ast_pthread_create_background, AST_PTHREADT_NULL, ast_sockaddr_cmp(), ast_sockaddr_copy(), ast_sockaddr_is_ipv6(), ast_sockaddr_isnull(), ast_sockaddr_setnull(), ast_sockaddr_stringify(), errno, ast_tcptls_session_args::local_address, LOG_ERROR, ast_tcptls_session_args::master, ast_tcptls_session_args::name, and ast_tcptls_session_args::old_address.
Referenced by __ast_http_load(), __init_manager(), and reload_config().
00958 { 00959 int flags; 00960 int x = 1; 00961 00962 /* Do nothing if nothing has changed */ 00963 if (!ast_sockaddr_cmp(&desc->old_address, &desc->local_address)) { 00964 ast_debug(1, "Nothing changed in %s\n", desc->name); 00965 return; 00966 } 00967 00968 /* If we return early, there is no one listening */ 00969 ast_sockaddr_setnull(&desc->old_address); 00970 00971 /* Shutdown a running server if there is one */ 00972 if (desc->master != AST_PTHREADT_NULL) { 00973 pthread_cancel(desc->master); 00974 pthread_kill(desc->master, SIGURG); 00975 pthread_join(desc->master, NULL); 00976 } 00977 00978 if (desc->accept_fd != -1) 00979 close(desc->accept_fd); 00980 00981 /* If there's no new server, stop here */ 00982 if (ast_sockaddr_isnull(&desc->local_address)) { 00983 ast_debug(2, "Server disabled: %s\n", desc->name); 00984 return; 00985 } 00986 00987 desc->accept_fd = socket(ast_sockaddr_is_ipv6(&desc->local_address) ? 00988 AF_INET6 : AF_INET, SOCK_STREAM, 0); 00989 if (desc->accept_fd < 0) { 00990 ast_log(LOG_ERROR, "Unable to allocate socket for %s: %s\n", desc->name, strerror(errno)); 00991 return; 00992 } 00993 00994 setsockopt(desc->accept_fd, SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x)); 00995 if (ast_bind(desc->accept_fd, &desc->local_address)) { 00996 ast_log(LOG_ERROR, "Unable to bind %s to %s: %s\n", 00997 desc->name, 00998 ast_sockaddr_stringify(&desc->local_address), 00999 strerror(errno)); 01000 goto error; 01001 } 01002 if (listen(desc->accept_fd, 10)) { 01003 ast_log(LOG_ERROR, "Unable to listen for %s!\n", desc->name); 01004 goto error; 01005 } 01006 flags = fcntl(desc->accept_fd, F_GETFL); 01007 fcntl(desc->accept_fd, F_SETFL, flags | O_NONBLOCK); 01008 if (ast_pthread_create_background(&desc->master, NULL, desc->accept_fn, desc)) { 01009 ast_log(LOG_ERROR, "Unable to launch thread for %s on %s: %s\n", 01010 desc->name, 01011 ast_sockaddr_stringify(&desc->local_address), 01012 strerror(errno)); 01013 goto error; 01014 } 01015 01016 /* Set current info */ 01017 ast_sockaddr_copy(&desc->old_address, &desc->local_address); 01018 01019 return; 01020 01021 error: 01022 close(desc->accept_fd); 01023 desc->accept_fd = -1; 01024 }
| void ast_tcptls_server_stop | ( | struct ast_tcptls_session_args * | desc | ) |
Shutdown a running server if there is one.
Definition at line 1051 of file tcptls.c.
References ast_tcptls_session_args::accept_fd, ast_debug, AST_PTHREADT_NULL, ast_tcptls_session_args::master, and ast_tcptls_session_args::name.
Referenced by __ast_http_load(), __init_manager(), http_shutdown(), manager_shutdown(), and unload_module().
01052 { 01053 if (desc->master != AST_PTHREADT_NULL) { 01054 pthread_cancel(desc->master); 01055 pthread_kill(desc->master, SIGURG); 01056 pthread_join(desc->master, NULL); 01057 desc->master = AST_PTHREADT_NULL; 01058 } 01059 if (desc->accept_fd != -1) 01060 close(desc->accept_fd); 01061 desc->accept_fd = -1; 01062 ast_debug(2, "Stopped server :: %s\n", desc->name); 01063 }
| HOOK_T ast_tcptls_server_write | ( | struct ast_tcptls_session_instance * | ser, | |
| const void * | buf, | |||
| size_t | count | |||
| ) |
Definition at line 530 of file tcptls.c.
References ast_log(), errno, ast_tcptls_stream::fd, LOG_ERROR, ast_tcptls_session_instance::stream_cookie, and tcptls_stream_write().
Referenced by _sip_tcp_helper_thread().
00531 { 00532 if (!tcptls_session->stream_cookie || tcptls_session->stream_cookie->fd == -1) { 00533 ast_log(LOG_ERROR, "TCP/TLS write called on invalid stream.\n"); 00534 errno = EIO; 00535 return -1; 00536 } 00537 00538 return tcptls_stream_write(tcptls_session->stream_cookie, buf, count); 00539 }
| void ast_tcptls_stream_set_exclusive_input | ( | struct ast_tcptls_stream * | stream, | |
| int | exclusive_input | |||
| ) |
Set the TCP/TLS stream I/O if it can exclusively depend upon the set timeouts.
| stream | TCP/TLS stream control data. | |
| exclusive_input | TRUE if stream can exclusively wait for fd input. Otherwise, the stream will not wait for fd input. It will wait while trying to send data. |
Definition at line 107 of file tcptls.c.
References ast_assert, and ast_tcptls_stream::exclusive_input.
Referenced by _sip_tcp_helper_thread(), httpd_helper_thread(), and session_do().
00108 { 00109 ast_assert(stream != NULL); 00110 00111 stream->exclusive_input = exclusive_input; 00112 }
| void ast_tcptls_stream_set_timeout_disable | ( | struct ast_tcptls_stream * | stream | ) |
Disable the TCP/TLS stream timeout timer.
| stream | TCP/TLS stream control data. |
Definition at line 84 of file tcptls.c.
References ast_assert, and ast_tcptls_stream::timeout.
Referenced by _sip_tcp_helper_thread(), and session_do().
00085 { 00086 ast_assert(stream != NULL); 00087 00088 stream->timeout = -1; 00089 }
| void ast_tcptls_stream_set_timeout_inactivity | ( | struct ast_tcptls_stream * | stream, | |
| int | timeout | |||
| ) |
Set the TCP/TLS stream inactivity timeout timer.
| stream | TCP/TLS stream control data. | |
| timeout | Number of milliseconds to wait for data transfer with the peer. |
This is basically how much time we are willing to spend in an I/O call before we declare the peer unresponsive.
Definition at line 91 of file tcptls.c.
References ast_assert, ast_tcptls_stream::start, and ast_tcptls_stream::timeout.
Referenced by httpd_helper_thread().
00092 { 00093 ast_assert(stream != NULL); 00094 00095 stream->start.tv_sec = 0; 00096 stream->timeout = timeout; 00097 }
| void ast_tcptls_stream_set_timeout_sequence | ( | struct ast_tcptls_stream * | stream, | |
| struct timeval | start, | |||
| int | timeout | |||
| ) |
Set the TCP/TLS stream I/O sequence timeout timer.
| stream | TCP/TLS stream control data. | |
| start | Time the I/O sequence timer starts. | |
| timeout | Number of milliseconds from the start time before timeout. |
This is how much time are we willing to allow the peer to complete an operation that can take several I/O calls. The main use is as an authentication timer with us.
Definition at line 99 of file tcptls.c.
References ast_assert, ast_tcptls_stream::start, and ast_tcptls_stream::timeout.
Referenced by _sip_tcp_helper_thread(), and session_do().
00100 { 00101 ast_assert(stream != NULL); 00102 00103 stream->start = start; 00104 stream->timeout = timeout; 00105 }
| int ast_tls_read_conf | ( | struct ast_tls_config * | tls_cfg, | |
| struct ast_tcptls_session_args * | tls_desc, | |||
| const char * | varname, | |||
| const char * | value | |||
| ) |
Used to parse conf files containing tls/ssl options.
Definition at line 1065 of file tcptls.c.
References ast_clear_flag, ast_free, ast_log(), ast_parse_arg(), ast_set2_flag, ast_set_flag, AST_SSL_DONT_VERIFY_SERVER, AST_SSL_SSLV2_CLIENT, AST_SSL_SSLV3_CLIENT, AST_SSL_TLSV1_CLIENT, AST_SSL_VERIFY_CLIENT, ast_strdup, ast_true(), ast_tls_config::cafile, ast_tls_config::capath, ast_tls_config::certfile, ast_tls_config::cipher, ast_tls_config::enabled, ast_tls_config::flags, ast_tcptls_session_args::local_address, LOG_WARNING, PARSE_ADDR, and ast_tls_config::pvtfile.
Referenced by __ast_http_load(), __init_manager(), and reload_config().
01066 { 01067 if (!strcasecmp(varname, "tlsenable") || !strcasecmp(varname, "sslenable")) { 01068 tls_cfg->enabled = ast_true(value) ? 1 : 0; 01069 } else if (!strcasecmp(varname, "tlscertfile") || !strcasecmp(varname, "sslcert") || !strcasecmp(varname, "tlscert")) { 01070 ast_free(tls_cfg->certfile); 01071 tls_cfg->certfile = ast_strdup(value); 01072 } else if (!strcasecmp(varname, "tlsprivatekey") || !strcasecmp(varname, "sslprivatekey")) { 01073 ast_free(tls_cfg->pvtfile); 01074 tls_cfg->pvtfile = ast_strdup(value); 01075 } else if (!strcasecmp(varname, "tlscipher") || !strcasecmp(varname, "sslcipher")) { 01076 ast_free(tls_cfg->cipher); 01077 tls_cfg->cipher = ast_strdup(value); 01078 } else if (!strcasecmp(varname, "tlscafile")) { 01079 ast_free(tls_cfg->cafile); 01080 tls_cfg->cafile = ast_strdup(value); 01081 } else if (!strcasecmp(varname, "tlscapath") || !strcasecmp(varname, "tlscadir")) { 01082 ast_free(tls_cfg->capath); 01083 tls_cfg->capath = ast_strdup(value); 01084 } else if (!strcasecmp(varname, "tlsverifyclient")) { 01085 ast_set2_flag(&tls_cfg->flags, ast_true(value), AST_SSL_VERIFY_CLIENT); 01086 } else if (!strcasecmp(varname, "tlsdontverifyserver")) { 01087 ast_set2_flag(&tls_cfg->flags, ast_true(value), AST_SSL_DONT_VERIFY_SERVER); 01088 } else if (!strcasecmp(varname, "tlsbindaddr") || !strcasecmp(varname, "sslbindaddr")) { 01089 if (ast_parse_arg(value, PARSE_ADDR, &tls_desc->local_address)) 01090 ast_log(LOG_WARNING, "Invalid %s '%s'\n", varname, value); 01091 } else if (!strcasecmp(varname, "tlsclientmethod") || !strcasecmp(varname, "sslclientmethod")) { 01092 if (!strcasecmp(value, "tlsv1")) { 01093 ast_set_flag(&tls_cfg->flags, AST_SSL_TLSV1_CLIENT); 01094 ast_clear_flag(&tls_cfg->flags, AST_SSL_SSLV3_CLIENT); 01095 ast_clear_flag(&tls_cfg->flags, AST_SSL_SSLV2_CLIENT); 01096 } else if (!strcasecmp(value, "sslv3")) { 01097 ast_set_flag(&tls_cfg->flags, AST_SSL_SSLV3_CLIENT); 01098 ast_clear_flag(&tls_cfg->flags, AST_SSL_SSLV2_CLIENT); 01099 ast_clear_flag(&tls_cfg->flags, AST_SSL_TLSV1_CLIENT); 01100 } else if (!strcasecmp(value, "sslv2")) { 01101 ast_set_flag(&tls_cfg->flags, AST_SSL_SSLV2_CLIENT); 01102 ast_clear_flag(&tls_cfg->flags, AST_SSL_TLSV1_CLIENT); 01103 ast_clear_flag(&tls_cfg->flags, AST_SSL_SSLV3_CLIENT); 01104 } 01105 } else { 01106 return -1; 01107 } 01108 01109 return 0; 01110 }
1.6.1