Changeset 6004 for pjproject/trunk/pjnath/src/pjnath/turn_sock.c
- Timestamp:
- May 24, 2019 3:32:17 AM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjnath/src/pjnath/turn_sock.c
r5988 r6004 20 20 #include <pjnath/turn_sock.h> 21 21 #include <pj/activesock.h> 22 #include <pj/ssl_sock.h> 22 23 #include <pj/assert.h> 23 24 #include <pj/errno.h> … … 26 27 #include <pj/pool.h> 27 28 #include <pj/ioqueue.h> 29 #include <pj/compat/socket.h> 28 30 29 31 enum … … 85 87 pj_turn_tp_type conn_type; 86 88 pj_activesock_t *active_sock; 89 #if PJ_HAS_SSL_SOCK 90 pj_ssl_sock_t *ssl_sock; 91 pj_ssl_cert_t *cert; 92 pj_str_t server_name; 93 #endif 94 87 95 pj_ioqueue_op_key_t send_key; 88 96 … … 123 131 unsigned addr_len); 124 132 125 static pj_bool_t on_data_read(pj_ activesock_t *asock,133 static pj_bool_t on_data_read(pj_turn_sock *turn_sock, 126 134 void *data, 127 135 pj_size_t size, 128 136 pj_status_t status, 129 137 pj_size_t *remainder); 130 static pj_bool_t on_connect_complete(pj_ activesock_t *asock,138 static pj_bool_t on_connect_complete(pj_turn_sock *turn_sock, 131 139 pj_status_t status); 132 140 141 /* 142 * Activesock callback 143 */ 144 static pj_bool_t on_connect_complete_asock(pj_activesock_t *asock, 145 pj_status_t status); 146 static pj_bool_t on_data_read_asock(pj_activesock_t *asock, 147 void *data, 148 pj_size_t size, 149 pj_status_t status, 150 pj_size_t *remainder); 151 152 /* 153 * SSL sock callback 154 */ 155 static pj_bool_t on_connect_complete_ssl_sock(pj_ssl_sock_t *ssl_sock, 156 pj_status_t status); 157 static pj_bool_t on_data_read_ssl_sock(pj_ssl_sock_t *ssl_sock, 158 void *data, 159 pj_size_t size, 160 pj_status_t status, 161 pj_size_t *remainder); 162 133 163 static pj_bool_t dataconn_on_data_read(pj_activesock_t *asock, 134 164 void *data, … … 152 182 cfg->qos_type = PJ_QOS_TYPE_BEST_EFFORT; 153 183 cfg->qos_ignore_error = PJ_TRUE; 154 } 155 184 185 #if PJ_HAS_SSL_SOCK 186 pj_turn_sock_tls_cfg_default(&cfg->tls_cfg); 187 #endif 188 } 189 190 #if PJ_HAS_SSL_SOCK 191 192 PJ_DEF(void) pj_turn_sock_tls_cfg_default(pj_turn_sock_tls_cfg *tls_cfg) 193 { 194 pj_bzero(tls_cfg, sizeof(*tls_cfg)); 195 pj_ssl_sock_param_default(&tls_cfg->ssock_param); 196 tls_cfg->ssock_param.proto = PJ_TURN_TLS_DEFAULT_PROTO; 197 } 198 199 PJ_DEF(void) pj_turn_sock_tls_cfg_dup(pj_pool_t *pool, 200 pj_turn_sock_tls_cfg *dst, 201 const pj_turn_sock_tls_cfg *src) 202 { 203 pj_memcpy(dst, src, sizeof(*dst)); 204 pj_strdup_with_null(pool, &dst->ca_list_file, &src->ca_list_file); 205 pj_strdup_with_null(pool, &dst->ca_list_path, &src->ca_list_path); 206 pj_strdup_with_null(pool, &dst->cert_file, &src->cert_file); 207 pj_strdup_with_null(pool, &dst->privkey_file, &src->privkey_file); 208 pj_strdup_with_null(pool, &dst->password, &src->password); 209 pj_strdup(pool, &dst->ca_buf, &src->ca_buf); 210 pj_strdup(pool, &dst->cert_buf, &src->cert_buf); 211 pj_strdup(pool, &dst->privkey_buf, &src->privkey_buf); 212 pj_ssl_sock_param_copy(pool, &dst->ssock_param, &src->ssock_param); 213 } 214 215 static void wipe_buf(pj_str_t *buf) 216 { 217 volatile char *p = buf->ptr; 218 pj_ssize_t len = buf->slen; 219 while (len--) *p++ = 0; 220 buf->slen = 0; 221 } 222 223 PJ_DEF(void) pj_turn_sock_tls_cfg_wipe_keys(pj_turn_sock_tls_cfg *tls_cfg) 224 { 225 wipe_buf(&tls_cfg->ca_list_file); 226 wipe_buf(&tls_cfg->ca_list_path); 227 wipe_buf(&tls_cfg->cert_file); 228 wipe_buf(&tls_cfg->privkey_file); 229 wipe_buf(&tls_cfg->password); 230 wipe_buf(&tls_cfg->ca_buf); 231 wipe_buf(&tls_cfg->cert_buf); 232 wipe_buf(&tls_cfg->privkey_buf); 233 } 234 #endif 156 235 157 236 /* … … 176 255 PJ_ASSERT_RETURN(af==pj_AF_INET() || af==pj_AF_INET6(), PJ_EINVAL); 177 256 PJ_ASSERT_RETURN(conn_type!=PJ_TURN_TP_TCP || PJ_HAS_TCP, PJ_EINVAL); 257 PJ_ASSERT_RETURN(conn_type!=PJ_TURN_TP_TLS || PJ_HAS_SSL_SOCK, PJ_EINVAL); 178 258 179 259 if (!setting) { … … 189 269 name_tmpl = "tcprel%p"; 190 270 break; 271 #if PJ_HAS_SSL_SOCK 272 case PJ_TURN_TP_TLS: 273 name_tmpl = "tlsrel%p"; 274 break; 275 #endif 191 276 default: 192 277 PJ_ASSERT_RETURN(!"Invalid TURN conn_type", PJ_EINVAL); … … 210 295 /* Copy setting (QoS parameters etc */ 211 296 pj_memcpy(&turn_sock->setting, setting, sizeof(*setting)); 297 #if PJ_HAS_SSL_SOCK 298 pj_turn_sock_tls_cfg_dup(turn_sock->pool, &turn_sock->setting.tls_cfg, 299 &setting->tls_cfg); 300 #endif 212 301 213 302 /* Set callback */ … … 289 378 if (turn_sock->active_sock) 290 379 pj_activesock_close(turn_sock->active_sock); 380 #if PJ_HAS_SSL_SOCK 381 if (turn_sock->ssl_sock) 382 pj_ssl_sock_close(turn_sock->ssl_sock); 383 #endif 291 384 292 385 for (i=0; i < PJ_TURN_MAX_TCP_CONN_CNT; ++i) { … … 475 568 } 476 569 } 570 #if PJ_HAS_SSL_SOCK 571 if (turn_sock->conn_type == PJ_TURN_TP_TLS) { 572 pj_strdup_with_null(turn_sock->pool, &turn_sock->server_name, domain); 573 } 574 #endif 477 575 478 576 /* Resolve server */ … … 549 647 * Notification when outgoing TCP socket has been connected. 550 648 */ 551 static pj_bool_t on_connect_complete(pj_ activesock_t *asock,649 static pj_bool_t on_connect_complete(pj_turn_sock *turn_sock, 552 650 pj_status_t status) 553 651 { 554 pj_turn_sock *turn_sock;555 556 turn_sock = (pj_turn_sock*) pj_activesock_get_user_data(asock);557 if (!turn_sock)558 return PJ_FALSE;559 560 652 pj_grp_lock_acquire(turn_sock->grp_lock); 561 653 … … 570 662 571 663 if (status != PJ_SUCCESS) { 572 sess_fail(turn_sock, "TCP connect() error", status); 664 if (turn_sock->conn_type == PJ_TURN_TP_UDP) 665 sess_fail(turn_sock, "UDP connect() error", status); 666 else if (turn_sock->conn_type == PJ_TURN_TP_TCP) 667 sess_fail(turn_sock, "TCP connect() error", status); 668 else if (turn_sock->conn_type == PJ_TURN_TP_TLS) 669 sess_fail(turn_sock, "TLS connect() error", status); 670 573 671 pj_grp_lock_release(turn_sock->grp_lock); 574 672 return PJ_FALSE; … … 576 674 577 675 if (turn_sock->conn_type != PJ_TURN_TP_UDP) { 578 PJ_LOG(5,(turn_sock->obj_name, "TCP connected")); 676 PJ_LOG(5, (turn_sock->obj_name, "%s connected", 677 turn_sock->conn_type == PJ_TURN_TP_TCP ? "TCP" : "TLS")); 579 678 } 580 679 581 680 /* Kick start pending read operation */ 582 status = pj_activesock_start_read(asock, turn_sock->pool, 583 turn_sock->setting.max_pkt_size, 0); 681 if (turn_sock->conn_type != PJ_TURN_TP_TLS) 682 status = pj_activesock_start_read(turn_sock->active_sock, 683 turn_sock->pool, 684 turn_sock->setting.max_pkt_size, 685 0); 686 #if PJ_HAS_SSL_SOCK 687 else 688 status = pj_ssl_sock_start_read(turn_sock->ssl_sock, turn_sock->pool, 689 turn_sock->setting.max_pkt_size, 0); 690 #endif 584 691 585 692 /* Init send_key */ … … 598 705 } 599 706 707 static pj_bool_t on_connect_complete_asock(pj_activesock_t *asock, 708 pj_status_t status) 709 { 710 pj_turn_sock *turn_sock; 711 712 turn_sock = (pj_turn_sock*)pj_activesock_get_user_data(asock); 713 if (!turn_sock) 714 return PJ_FALSE; 715 716 return on_connect_complete(turn_sock, status); 717 } 718 719 static pj_bool_t on_connect_complete_ssl_sock(pj_ssl_sock_t *ssl_sock, 720 pj_status_t status) 721 { 722 pj_turn_sock *turn_sock; 723 724 turn_sock = (pj_turn_sock*)pj_ssl_sock_get_user_data(ssl_sock); 725 if (!turn_sock) 726 return PJ_FALSE; 727 728 return on_connect_complete(turn_sock, status); 729 } 730 600 731 static pj_uint16_t GETVAL16H(const pj_uint8_t *buf, unsigned pos) 601 732 { … … 644 775 * Notification from ioqueue when incoming UDP packet is received. 645 776 */ 646 static pj_bool_t on_data_read(pj_ activesock_t *asock,777 static pj_bool_t on_data_read(pj_turn_sock *turn_sock, 647 778 void *data, 648 779 pj_size_t size, … … 650 781 pj_size_t *remainder) 651 782 { 652 pj_turn_sock *turn_sock;653 783 pj_bool_t ret = PJ_TRUE; 654 784 655 turn_sock = (pj_turn_sock*) pj_activesock_get_user_data(asock);656 785 pj_grp_lock_acquire(turn_sock->grp_lock); 657 786 … … 697 826 // "Buffer size now %lu bytes", size)); 698 827 } 699 } else if (status != PJ_SUCCESS && 700 turn_sock->conn_type != PJ_TURN_TP_UDP) 701 { 702 sess_fail(turn_sock, "TCP connection closed", status); 828 } else if (status != PJ_SUCCESS) { 829 if (turn_sock->conn_type == PJ_TURN_TP_UDP) 830 sess_fail(turn_sock, "UDP connection closed", status); 831 else if (turn_sock->conn_type == PJ_TURN_TP_TCP) 832 sess_fail(turn_sock, "TCP connection closed", status); 833 else if (turn_sock->conn_type == PJ_TURN_TP_TLS) 834 sess_fail(turn_sock, "TLS connection closed", status); 835 703 836 ret = PJ_FALSE; 704 837 goto on_return; … … 711 844 } 712 845 846 static pj_bool_t on_data_read_asock(pj_activesock_t *asock, 847 void *data, 848 pj_size_t size, 849 pj_status_t status, 850 pj_size_t *remainder) 851 { 852 pj_turn_sock *turn_sock; 853 854 turn_sock = (pj_turn_sock*)pj_activesock_get_user_data(asock); 855 856 return on_data_read(turn_sock, data, size, status, remainder); 857 } 858 859 static pj_bool_t on_data_read_ssl_sock(pj_ssl_sock_t *ssl_sock, 860 void *data, 861 pj_size_t size, 862 pj_status_t status, 863 pj_size_t *remainder) 864 { 865 pj_turn_sock *turn_sock; 866 867 turn_sock = (pj_turn_sock*)pj_ssl_sock_get_user_data(ssl_sock); 868 869 return on_data_read(turn_sock, data, size, status, remainder); 870 } 871 872 static pj_bool_t on_data_sent_ssl_sock(pj_ssl_sock_t *ssl_sock, 873 pj_ioqueue_op_key_t *op_key, 874 pj_ssize_t bytes_sent) 875 { 876 pj_turn_sock *turn_sock; 877 878 PJ_UNUSED_ARG(op_key); 879 880 turn_sock = (pj_turn_sock*)pj_ssl_sock_get_user_data(ssl_sock); 881 882 /* Check for error/closure */ 883 if (bytes_sent <= 0) { 884 pj_status_t status; 885 886 status = (bytes_sent == 0) ? PJ_RETURN_OS_ERROR(OSERR_ENOTCONN) : 887 (pj_status_t)-bytes_sent; 888 889 sess_fail(turn_sock, "TLS send() error", status); 890 891 return PJ_FALSE; 892 } 893 894 return PJ_TRUE; 895 } 713 896 714 897 /* … … 761 944 } 762 945 } 763 } else {946 } else if (turn_sock->conn_type == PJ_TURN_TP_TCP) { 764 947 status = pj_activesock_send(turn_sock->active_sock, 765 948 &turn_sock->send_key, pkt, &len, 0); 949 } 950 #if PJ_HAS_SSL_SOCK 951 else if (turn_sock->conn_type == PJ_TURN_TP_TLS) { 952 status = pj_ssl_sock_send(turn_sock->ssl_sock, 953 &turn_sock->send_key, pkt, &len, 0); 954 } 955 #endif 956 else { 957 PJ_ASSERT_RETURN(!"Invalid TURN conn_type", PJ_EINVAL); 766 958 } 767 959 … … 826 1018 pj_turn_sock *turn_sock = (pj_turn_sock*) 827 1019 pj_turn_session_get_user_data(sess); 828 pj_status_t status ;1020 pj_status_t status = PJ_SUCCESS; 829 1021 830 1022 if (turn_sock == NULL) { … … 863 1055 * connection or ALLOCATE request failed. 864 1056 */ 865 if (turn_sock->active_sock) { 1057 if ((turn_sock->conn_type != PJ_TURN_TP_TLS) && 1058 (turn_sock->active_sock)) 1059 { 866 1060 pj_activesock_close(turn_sock->active_sock); 867 1061 turn_sock->active_sock = NULL; 868 1062 } 869 1063 #if PJ_HAS_SSL_SOCK 1064 else if ((turn_sock->conn_type == PJ_TURN_TP_TLS) && 1065 (turn_sock->ssl_sock)) 1066 { 1067 pj_ssl_sock_close(turn_sock->ssl_sock); 1068 turn_sock->ssl_sock = NULL; 1069 } 1070 #endif 870 1071 /* Get server address from session info */ 871 1072 pj_turn_session_get_info(sess, &info); … … 876 1077 sock_type = pj_SOCK_STREAM(); 877 1078 878 /* Init socket */879 status = pj_sock_socket(turn_sock->af, sock_type, 0, &sock);880 if (status != PJ_SUCCESS) {881 pj_turn_sock_destroy(turn_sock);882 return;883 }884 885 /* Bind socket */886 1079 cfg_bind_addr = &turn_sock->setting.bound_addr; 887 1080 max_bind_retry = MAX_BIND_RETRY; … … 897 1090 pj_sockaddr_cp(&bound_addr, cfg_bind_addr); 898 1091 } 899 status = pj_sock_bind_random(sock, &bound_addr, 900 turn_sock->setting.port_range, 901 max_bind_retry); 902 if (status != PJ_SUCCESS) { 903 pj_turn_sock_destroy(turn_sock); 904 return; 905 } 906 907 /* Apply QoS, if specified */ 908 status = pj_sock_apply_qos2(sock, turn_sock->setting.qos_type, 909 &turn_sock->setting.qos_params, 1092 1093 if (turn_sock->conn_type != PJ_TURN_TP_TLS) { 1094 /* Init socket */ 1095 status = pj_sock_socket(turn_sock->af, sock_type, 0, &sock); 1096 if (status != PJ_SUCCESS) { 1097 pj_turn_sock_destroy(turn_sock); 1098 return; 1099 } 1100 1101 /* Bind socket */ 1102 status = pj_sock_bind_random(sock, &bound_addr, 1103 turn_sock->setting.port_range, 1104 max_bind_retry); 1105 if (status != PJ_SUCCESS) { 1106 pj_turn_sock_destroy(turn_sock); 1107 return; 1108 } 1109 /* Apply QoS, if specified */ 1110 status = pj_sock_apply_qos2(sock, turn_sock->setting.qos_type, 1111 &turn_sock->setting.qos_params, 910 1112 (turn_sock->setting.qos_ignore_error?2:1), 911 1113 turn_sock->pool->obj_name, NULL); 912 if (status != PJ_SUCCESS && !turn_sock->setting.qos_ignore_error) { 913 pj_turn_sock_destroy(turn_sock); 914 return; 915 } 916 917 /* Apply socket buffer size */ 918 if (turn_sock->setting.so_rcvbuf_size > 0) { 919 unsigned sobuf_size = turn_sock->setting.so_rcvbuf_size; 920 status = pj_sock_setsockopt_sobuf(sock, pj_SO_RCVBUF(), 921 PJ_TRUE, &sobuf_size); 922 if (status != PJ_SUCCESS) { 923 PJ_PERROR(3, (turn_sock->obj_name, status, 924 "Failed setting SO_RCVBUF")); 925 } else { 926 if (sobuf_size < turn_sock->setting.so_rcvbuf_size) { 927 PJ_LOG(4, (turn_sock->obj_name, 928 "Warning! Cannot set SO_RCVBUF as configured," 929 " now=%d, configured=%d", sobuf_size, 930 turn_sock->setting.so_rcvbuf_size)); 1114 if (status != PJ_SUCCESS && !turn_sock->setting.qos_ignore_error) 1115 { 1116 pj_turn_sock_destroy(turn_sock); 1117 return; 1118 } 1119 1120 /* Apply socket buffer size */ 1121 if (turn_sock->setting.so_rcvbuf_size > 0) { 1122 unsigned sobuf_size = turn_sock->setting.so_rcvbuf_size; 1123 status = pj_sock_setsockopt_sobuf(sock, pj_SO_RCVBUF(), 1124 PJ_TRUE, &sobuf_size); 1125 if (status != PJ_SUCCESS) { 1126 pj_perror(3, turn_sock->obj_name, status, 1127 "Failed setting SO_RCVBUF"); 931 1128 } else { 932 PJ_LOG(5, (turn_sock->obj_name, "SO_RCVBUF set to %d", 933 sobuf_size)); 1129 if (sobuf_size < turn_sock->setting.so_rcvbuf_size) { 1130 PJ_LOG(4, (turn_sock->obj_name, 1131 "Warning! Cannot set SO_RCVBUF as configured," 1132 " now=%d, configured=%d", sobuf_size, 1133 turn_sock->setting.so_rcvbuf_size)); 1134 } else { 1135 PJ_LOG(5, (turn_sock->obj_name, "SO_RCVBUF set to %d", 1136 sobuf_size)); 1137 } 934 1138 } 935 1139 } 936 } 937 if (turn_sock->setting.so_sndbuf_size > 0) { 938 unsigned sobuf_size = turn_sock->setting.so_sndbuf_size; 939 status = pj_sock_setsockopt_sobuf(sock, pj_SO_SNDBUF(), 940 PJ_TRUE, &sobuf_size); 941 if (status != PJ_SUCCESS) { 942 PJ_PERROR(3, (turn_sock->obj_name, status, 943 "Failed setting SO_SNDBUF")); 944 } else { 945 if (sobuf_size < turn_sock->setting.so_sndbuf_size) { 946 PJ_LOG(4, (turn_sock->obj_name, 947 "Warning! Cannot set SO_SNDBUF as configured," 948 " now=%d, configured=%d", sobuf_size, 949 turn_sock->setting.so_sndbuf_size)); 1140 if (turn_sock->setting.so_sndbuf_size > 0) { 1141 unsigned sobuf_size = turn_sock->setting.so_sndbuf_size; 1142 status = pj_sock_setsockopt_sobuf(sock, pj_SO_SNDBUF(), 1143 PJ_TRUE, &sobuf_size); 1144 if (status != PJ_SUCCESS) { 1145 pj_perror(3, turn_sock->obj_name, status, 1146 "Failed setting SO_SNDBUF"); 950 1147 } else { 951 PJ_LOG(5, (turn_sock->obj_name, "SO_SNDBUF set to %d", 952 sobuf_size)); 1148 if (sobuf_size < turn_sock->setting.so_sndbuf_size) { 1149 PJ_LOG(4, (turn_sock->obj_name, 1150 "Warning! Cannot set SO_SNDBUF as configured," 1151 " now=%d, configured=%d", sobuf_size, 1152 turn_sock->setting.so_sndbuf_size)); 1153 } else { 1154 PJ_LOG(5, (turn_sock->obj_name, "SO_SNDBUF set to %d", 1155 sobuf_size)); 1156 } 953 1157 } 954 1158 } 955 } 956 957 /* Create active socket */ 958 pj_activesock_cfg_default(&asock_cfg); 959 asock_cfg.grp_lock = turn_sock->grp_lock; 960 961 pj_bzero(&asock_cb, sizeof(asock_cb)); 962 asock_cb.on_data_read = &on_data_read; 963 asock_cb.on_connect_complete = &on_connect_complete; 964 status = pj_activesock_create(turn_sock->pool, sock, 965 sock_type, &asock_cfg, 966 turn_sock->cfg.ioqueue, &asock_cb, 967 turn_sock, 968 &turn_sock->active_sock); 1159 1160 /* Create active socket */ 1161 pj_activesock_cfg_default(&asock_cfg); 1162 asock_cfg.grp_lock = turn_sock->grp_lock; 1163 1164 pj_bzero(&asock_cb, sizeof(asock_cb)); 1165 asock_cb.on_data_read = &on_data_read_asock; 1166 asock_cb.on_connect_complete = &on_connect_complete_asock; 1167 status = pj_activesock_create(turn_sock->pool, sock, 1168 sock_type, &asock_cfg, 1169 turn_sock->cfg.ioqueue, &asock_cb, 1170 turn_sock, 1171 &turn_sock->active_sock); 1172 } 1173 #if PJ_HAS_SSL_SOCK 1174 else { 1175 //TURN TLS 1176 pj_ssl_sock_param param, *ssock_param; 1177 1178 ssock_param = &turn_sock->setting.tls_cfg.ssock_param; 1179 pj_ssl_sock_param_default(¶m); 1180 1181 pj_ssl_sock_param_copy(turn_sock->pool, ¶m, ssock_param); 1182 param.cb.on_connect_complete = &on_connect_complete_ssl_sock; 1183 param.cb.on_data_read = &on_data_read_ssl_sock; 1184 param.cb.on_data_sent = &on_data_sent_ssl_sock; 1185 param.ioqueue = turn_sock->cfg.ioqueue; 1186 param.timer_heap = turn_sock->cfg.timer_heap; 1187 param.grp_lock = turn_sock->grp_lock; 1188 param.server_name = turn_sock->server_name; 1189 param.user_data = turn_sock; 1190 param.sock_type = sock_type; 1191 param.sock_af = turn_sock->af; 1192 if (param.send_buffer_size < PJ_TURN_MAX_PKT_LEN) 1193 param.send_buffer_size = PJ_TURN_MAX_PKT_LEN; 1194 if (param.read_buffer_size < PJ_TURN_MAX_PKT_LEN) 1195 param.read_buffer_size = PJ_TURN_MAX_PKT_LEN; 1196 1197 param.qos_type = turn_sock->setting.qos_type; 1198 param.qos_ignore_error = turn_sock->setting.qos_ignore_error; 1199 pj_memcpy(¶m.qos_params, &turn_sock->setting.qos_params, 1200 sizeof(param.qos_params)); 1201 1202 if (turn_sock->setting.tls_cfg.cert_file.slen || 1203 turn_sock->setting.tls_cfg.ca_list_file.slen || 1204 turn_sock->setting.tls_cfg.ca_list_path.slen || 1205 turn_sock->setting.tls_cfg.privkey_file.slen) 1206 { 1207 status = pj_ssl_cert_load_from_files2( 1208 turn_sock->pool, 1209 &turn_sock->setting.tls_cfg.ca_list_file, 1210 &turn_sock->setting.tls_cfg.ca_list_path, 1211 &turn_sock->setting.tls_cfg.cert_file, 1212 &turn_sock->setting.tls_cfg.privkey_file, 1213 &turn_sock->setting.tls_cfg.password, 1214 &turn_sock->cert); 1215 1216 } else if (turn_sock->setting.tls_cfg.ca_buf.slen || 1217 turn_sock->setting.tls_cfg.cert_buf.slen || 1218 turn_sock->setting.tls_cfg.privkey_buf.slen) 1219 { 1220 status = pj_ssl_cert_load_from_buffer( 1221 turn_sock->pool, 1222 &turn_sock->setting.tls_cfg.ca_buf, 1223 &turn_sock->setting.tls_cfg.cert_buf, 1224 &turn_sock->setting.tls_cfg.privkey_buf, 1225 &turn_sock->setting.tls_cfg.password, 1226 &turn_sock->cert); 1227 } 1228 if (status != PJ_SUCCESS) { 1229 pj_turn_sock_destroy(turn_sock); 1230 return; 1231 } 1232 if (turn_sock->cert) { 1233 pj_turn_sock_tls_cfg_wipe_keys(&turn_sock->setting.tls_cfg); 1234 } 1235 1236 status = pj_ssl_sock_create(turn_sock->pool, ¶m, 1237 &turn_sock->ssl_sock); 1238 1239 if (status != PJ_SUCCESS) { 1240 pj_turn_sock_destroy(turn_sock); 1241 return; 1242 } 1243 1244 if (turn_sock->cert) { 1245 status = pj_ssl_sock_set_certificate(turn_sock->ssl_sock, 1246 turn_sock->pool, 1247 turn_sock->cert); 1248 1249 pj_ssl_cert_wipe_keys(turn_sock->cert); 1250 turn_sock->cert = NULL; 1251 } 1252 1253 } 1254 #endif 1255 969 1256 if (status != PJ_SUCCESS) { 970 1257 pj_turn_sock_destroy(turn_sock); … … 978 1265 979 1266 /* Initiate non-blocking connect */ 1267 if (turn_sock->conn_type == PJ_TURN_TP_UDP) { 1268 status = PJ_SUCCESS; 1269 } 980 1270 #if PJ_HAS_TCP 981 if (turn_sock->conn_type != PJ_TURN_TP_UDP) {1271 else if (turn_sock->conn_type == PJ_TURN_TP_TCP) { 982 1272 status=pj_activesock_start_connect( 983 1273 turn_sock->active_sock, … … 985 1275 &info.server, 986 1276 pj_sockaddr_get_len(&info.server)); 987 } else { 988 status = PJ_SUCCESS; 989 } 1277 } 1278 #endif 1279 #if PJ_HAS_SSL_SOCK 1280 else if (turn_sock->conn_type == PJ_TURN_TP_TLS) { 1281 pj_ssl_start_connect_param connect_param; 1282 connect_param.pool = turn_sock->pool; 1283 connect_param.localaddr = &bound_addr; 1284 connect_param.local_port_range = turn_sock->setting.port_range; 1285 connect_param.remaddr = &info.server; 1286 connect_param.addr_len = pj_sockaddr_get_len(&info.server); 1287 1288 status = pj_ssl_sock_start_connect2(turn_sock->ssl_sock, 1289 &connect_param); 1290 } 1291 #endif 990 1292 if (status == PJ_SUCCESS) { 991 on_connect_complete(turn_sock ->active_sock, PJ_SUCCESS);1293 on_connect_complete(turn_sock, PJ_SUCCESS); 992 1294 } else if (status != PJ_EPENDING) { 993 1295 PJ_PERROR(3, (turn_sock->pool->obj_name, status, … … 998 1300 return; 999 1301 } 1000 #else1001 on_connect_complete(turn_sock->active_sock, PJ_SUCCESS);1002 #endif1003 1302 1004 1303 /* Done for now. Subsequent work will be done in
Note: See TracChangeset
for help on using the changeset viewer.