Changeset 1913 for pjproject/trunk/pjnath/src/pjnath/turn_session.c
- Timestamp:
- Apr 9, 2008 9:38:12 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjnath/src/pjnath/turn_session.c
r1882 r1913 111 111 */ 112 112 static void sess_shutdown(pj_turn_session *sess, 113 pj_bool_t notify,114 113 pj_status_t status); 115 114 static void do_destroy(pj_turn_session *sess); 116 115 static void send_refresh(pj_turn_session *sess, int lifetime); 117 116 static pj_status_t stun_on_send_msg(pj_stun_session *sess, 117 void *token, 118 118 const void *pkt, 119 119 pj_size_t pkt_size, … … 122 122 static void stun_on_request_complete(pj_stun_session *sess, 123 123 pj_status_t status, 124 void *token, 124 125 pj_stun_tx_data *tdata, 125 126 const pj_stun_msg *response, … … 130 131 unsigned pkt_len, 131 132 const pj_stun_msg *msg, 133 void *token, 132 134 const pj_sockaddr_t *src_addr, 133 135 unsigned src_addr_len); … … 145 147 146 148 147 /** 149 /* 150 * Create default pj_turn_alloc_param. 151 */ 152 PJ_DEF(void) pj_turn_alloc_param_default(pj_turn_alloc_param *prm) 153 { 154 pj_bzero(prm, sizeof(*prm)); 155 } 156 157 /* 158 * Duplicate pj_turn_alloc_param. 159 */ 160 PJ_DEF(void) pj_turn_alloc_param_copy( pj_pool_t *pool, 161 pj_turn_alloc_param *dst, 162 const pj_turn_alloc_param *src) 163 { 164 PJ_UNUSED_ARG(pool); 165 pj_memcpy(dst, src, sizeof(*dst)); 166 } 167 168 /* 148 169 * Get TURN state name. 149 170 */ … … 286 307 pj_turn_state_t old_state = sess->state; 287 308 309 if (state==sess->state) 310 return; 311 288 312 PJ_LOG(4,(sess->obj_name, "State changed %s --> %s", 289 313 state_names[old_state], state_names[state])); … … 299 323 */ 300 324 static void sess_shutdown(pj_turn_session *sess, 301 pj_bool_t notify,302 325 pj_status_t status) 303 326 { 304 327 pj_bool_t can_destroy = PJ_TRUE; 305 306 PJ_UNUSED_ARG(notify);307 328 308 329 PJ_LOG(4,(sess->obj_name, "Request to shutdown in state %s, cause:%d", … … 361 382 * Public API to destroy TURN client session. 362 383 */ 363 PJ_DEF(pj_status_t) pj_turn_session_ destroy(pj_turn_session *sess)384 PJ_DEF(pj_status_t) pj_turn_session_shutdown(pj_turn_session *sess) 364 385 { 365 386 PJ_ASSERT_RETURN(sess, PJ_EINVAL); … … 367 388 pj_lock_acquire(sess->lock); 368 389 369 sess_shutdown(sess, PJ_ FALSE, PJ_SUCCESS);390 sess_shutdown(sess, PJ_SUCCESS); 370 391 371 392 pj_lock_release(sess->lock); 372 393 394 return PJ_SUCCESS; 395 } 396 397 398 /** 399 * Forcefully destroy the TURN session. 400 */ 401 PJ_DEF(pj_status_t) pj_turn_session_destroy( pj_turn_session *sess) 402 { 403 set_state(sess, PJ_TURN_STATE_DEALLOCATED); 404 sess_shutdown(sess, PJ_SUCCESS); 373 405 return PJ_SUCCESS; 374 406 } … … 465 497 } 466 498 499 PJ_LOG(5,(sess->obj_name, "Resolving %.*s%.*s with DNS SRV", 500 (int)res_name.slen, res_name.ptr, 501 (int)domain->slen, domain->ptr)); 467 502 set_state(sess, PJ_TURN_STATE_RESOLVING); 503 468 504 status = pj_dns_srv_resolve(domain, &res_name, default_port, 469 505 sess->pool, resolver, opt, sess, … … 488 524 ai = (pj_addrinfo*) 489 525 pj_pool_calloc(sess->pool, cnt, sizeof(pj_addrinfo)); 526 527 PJ_LOG(5,(sess->obj_name, "Resolving %.*s with DNS A", 528 (int)domain->slen, domain->ptr)); 490 529 491 530 status = pj_getaddrinfo(sess->af, domain, &cnt, ai); … … 539 578 { 540 579 pj_stun_tx_data *tdata; 580 pj_bool_t retransmit; 541 581 pj_status_t status; 542 582 543 583 PJ_ASSERT_RETURN(sess, PJ_EINVAL); 544 PJ_ASSERT_RETURN(sess->state>PJ_TURN_STATE_NULL && sess->state<=PJ_TURN_STATE_RESOLVED, 584 PJ_ASSERT_RETURN(sess->state>PJ_TURN_STATE_NULL && 585 sess->state<=PJ_TURN_STATE_RESOLVED, 545 586 PJ_EINVALIDOP); 546 587 … … 548 589 549 590 if (sess->state < PJ_TURN_STATE_RESOLVED) { 550 if (param && param != &sess->alloc_param) 551 pj_ memcpy(&sess->alloc_param, param, sizeof(*param));591 if (param && param != &sess->alloc_param) 592 pj_turn_alloc_param_copy(sess->pool, &sess->alloc_param, param); 552 593 sess->pending_alloc = PJ_TRUE; 553 594 … … 595 636 /* Send request */ 596 637 set_state(sess, PJ_TURN_STATE_ALLOCATING); 597 status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 638 retransmit = (sess->tp_type == PJ_TURN_TP_UDP); 639 status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE, 640 retransmit, sess->srv_addr, 598 641 pj_sockaddr_get_len(sess->srv_addr), 599 642 tdata); … … 637 680 } 638 681 639 status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 682 status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE, 683 (sess->tp_type==PJ_TURN_TP_UDP), 684 sess->srv_addr, 640 685 pj_sockaddr_get_len(sess->srv_addr), 641 686 tdata); … … 648 693 if (lifetime == 0) { 649 694 set_state(sess, PJ_TURN_STATE_DEALLOCATED); 650 sess_shutdown(sess, PJ_FALSE,status);695 sess_shutdown(sess, status); 651 696 } 652 697 } … … 725 770 726 771 /* Send the indication */ 727 status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 772 status = pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE, 773 PJ_FALSE, sess->srv_addr, 728 774 pj_sockaddr_get_len(sess->srv_addr), 729 775 tdata); … … 763 809 peer = lookup_peer_by_addr(sess, peer_adr, addr_len, PJ_TRUE, PJ_FALSE); 764 810 pj_assert(peer); 765 766 /* Associate peer data structure with tdata for future reference767 * when we receive the ChannelBind response.768 */769 tdata->user_data = peer;770 811 771 812 if (peer->ch_id != PJ_TURN_INVALID_CHANNEL) { … … 788 829 peer_adr, addr_len); 789 830 790 /* Send the request */ 791 status = pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 831 /* Send the request, associate peer data structure with tdata 832 * for future reference when we receive the ChannelBind response. 833 */ 834 status = pj_stun_session_send_msg(sess->stun, peer, PJ_FALSE, 835 (sess->tp_type==PJ_TURN_TP_UDP), 836 sess->srv_addr, 792 837 pj_sockaddr_get_len(sess->srv_addr), 793 838 tdata); … … 829 874 options |= PJ_STUN_IS_DATAGRAM; 830 875 status=pj_stun_session_on_rx_pkt(sess->stun, pkt, pkt_len, 831 options, NULL, 876 options, NULL, NULL, 832 877 sess->srv_addr, 833 878 pj_sockaddr_get_len(sess->srv_addr)); … … 883 928 */ 884 929 static pj_status_t stun_on_send_msg(pj_stun_session *stun, 930 void *token, 885 931 const void *pkt, 886 932 pj_size_t pkt_size, … … 889 935 { 890 936 pj_turn_session *sess; 937 938 PJ_UNUSED_ARG(token); 891 939 892 940 sess = (pj_turn_session*) pj_stun_session_get_user_data(stun); … … 928 976 929 977 set_state(sess, PJ_TURN_STATE_DEALLOCATED); 930 sess_shutdown(sess, PJ_TRUE,status);978 sess_shutdown(sess, status); 931 979 return; 932 980 } … … 937 985 if (method==PJ_STUN_REFRESH_METHOD) { 938 986 set_state(sess, PJ_TURN_STATE_DEALLOCATED); 939 sess_shutdown(sess, PJ_TRUE,status);987 sess_shutdown(sess, status); 940 988 return; 941 989 } … … 976 1024 /* If LIFETIME is zero, this is a deallocation */ 977 1025 if (lf_attr->value == 0) { 978 pj_bool_t notify = sess->state < PJ_TURN_STATE_DEALLOCATING;979 1026 set_state(sess, PJ_TURN_STATE_DEALLOCATED); 980 sess_shutdown(sess, notify,PJ_SUCCESS);1027 sess_shutdown(sess, PJ_SUCCESS); 981 1028 return; 982 1029 } … … 1069 1116 static void stun_on_request_complete(pj_stun_session *stun, 1070 1117 pj_status_t status, 1118 void *token, 1071 1119 pj_stun_tx_data *tdata, 1072 1120 const pj_stun_msg *response, … … 1146 1194 { 1147 1195 /* Successful ChannelBind response */ 1148 struct peer *peer = (struct peer*)t data->user_data;1196 struct peer *peer = (struct peer*)token; 1149 1197 1150 1198 pj_assert(peer->ch_id != PJ_TURN_INVALID_CHANNEL); … … 1192 1240 unsigned pkt_len, 1193 1241 const pj_stun_msg *msg, 1242 void *token, 1194 1243 const pj_sockaddr_t *src_addr, 1195 1244 unsigned src_addr_len) … … 1199 1248 pj_stun_data_attr *data_attr; 1200 1249 1250 PJ_UNUSED_ARG(token); 1201 1251 PJ_UNUSED_ARG(pkt); 1202 1252 PJ_UNUSED_ARG(pkt_len); … … 1254 1304 /* Check failure */ 1255 1305 if (status != PJ_SUCCESS) { 1256 sess_shutdown(sess, PJ_TRUE,status);1306 sess_shutdown(sess, status); 1257 1307 return; 1258 1308 } … … 1263 1313 1264 1314 for (j=0; j<rec->entry[i].server.addr_count && cnt<MAX_SRV_CNT; ++j) { 1265 pj_sockaddr_in *addr = &sess->srv_addr [cnt].ipv4;1315 pj_sockaddr_in *addr = &sess->srv_addr_list[cnt].ipv4; 1266 1316 1267 1317 addr->sin_family = sess->af; … … 1275 1325 1276 1326 /* Set current server */ 1277 sess->srv_addr = &sess->srv_addr [0];1327 sess->srv_addr = &sess->srv_addr_list[0]; 1278 1328 1279 1329 /* Set state to PJ_TURN_STATE_RESOLVED */ … … 1415 1465 1416 1466 /* Send the indication */ 1417 pj_stun_session_send_msg(sess->stun, PJ_FALSE, sess->srv_addr, 1418 pj_sockaddr_get_len(sess->srv_addr), 1419 tdata); 1467 pj_stun_session_send_msg(sess->stun, NULL, PJ_FALSE, 1468 PJ_FALSE, sess->srv_addr, 1469 pj_sockaddr_get_len(sess->srv_addr), 1470 tdata); 1420 1471 } 1421 1472 }
Note: See TracChangeset
for help on using the changeset viewer.