/* * Notification when outgoing TCP socket has been connected. */ static pj_bool_t on_connect_complete(pj_activesock_t *asock, pj_status_t status) { pj_turn_sock *turn_sock; turn_sock = (pj_turn_sock*) pj_activesock_get_user_data(asock); if (status != PJ_SUCCESS) { sess_fail(turn_sock, "TCP connect() error", status); return PJ_FALSE; } if (turn_sock->conn_type != PJ_TURN_TP_UDP) { PJ_LOG(5,(turn_sock->obj_name, "TCP connected")); } /* Kick start pending read operation */ status = pj_activesock_start_read(asock, turn_sock->pool, PJ_TURN_MAX_PKT_LEN, 0); /* Init send_key */ pj_ioqueue_op_key_init(&turn_sock->send_key, sizeof(turn_sock->send_key)); /* Send Allocate request */ status = pj_turn_session_alloc(turn_sock->sess, &turn_sock->alloc_param); if (status != PJ_SUCCESS) { sess_fail(turn_sock, "Error sending ALLOCATE", status); return PJ_FALSE; } return PJ_TRUE; }
/* * Notification when outgoing TCP socket has been connected. */ static pj_bool_t on_connect_complete(pj_activesock_t *asock, pj_status_t status) { pj_turn_sock *turn_sock; turn_sock = (pj_turn_sock*) pj_activesock_get_user_data(asock); if (!turn_sock) return PJ_FALSE; pj_grp_lock_acquire(turn_sock->grp_lock); /* TURN session may have already been destroyed here. * See ticket #1557 (http://trac.pjsip.org/repos/ticket/1557). */ if (!turn_sock->sess) { sess_fail(turn_sock, "TURN session already destroyed", status); pj_grp_lock_release(turn_sock->grp_lock); return PJ_FALSE; } if (status != PJ_SUCCESS) { sess_fail(turn_sock, "TCP connect() error", status); pj_grp_lock_release(turn_sock->grp_lock); return PJ_FALSE; } if (turn_sock->conn_type != PJ_TURN_TP_UDP) { PJ_LOG(5,(turn_sock->obj_name, "TCP connected")); } /* Kick start pending read operation */ status = pj_activesock_start_read(asock, turn_sock->pool, turn_sock->setting.max_pkt_size, 0); /* Init send_key */ pj_ioqueue_op_key_init(&turn_sock->send_key, sizeof(turn_sock->send_key)); /* Send Allocate request */ status = pj_turn_session_alloc(turn_sock->sess, &turn_sock->alloc_param); if (status != PJ_SUCCESS) { sess_fail(turn_sock, "Error sending ALLOCATE", status); pj_grp_lock_release(turn_sock->grp_lock); return PJ_FALSE; } pj_grp_lock_release(turn_sock->grp_lock); return PJ_TRUE; }
/* * Notification when outgoing TCP socket has been connected. */ static pj_bool_t on_connect_complete(pj_activesock_t *asock, pj_status_t status) { pj_turn_sock *turn_sock; turn_sock = (pj_turn_sock*) pj_activesock_get_user_data(asock); if (!turn_sock) return PJ_FALSE; /* TURN session may have already been destroyed here. * See ticket #1557 (http://trac.pjsip.org/repos/ticket/1557). */ if (!turn_sock->sess) { PJ_LOG(1, ("turn_sock.c", "!!! TURN DEALLOCATE !!! in on_connect_complete() turn_sock->sess is NULL status=%d", status)); sess_fail(turn_sock, "TURN session already destroyed", status); return PJ_FALSE; } if (status != PJ_SUCCESS) { // DEAN assigned next turn server if (turn_sock->turn_cnt <= ++turn_sock->curr_turn) { PJ_LOG(1, ("turn_sock.c", "!!! TURN DEALLOCATE !!! in on_connect_complete() turn_sock->turn_cnt <= ++turn_sock->curr_turn (%d,%d)", turn_sock->turn_cnt, turn_sock->curr_turn)); sess_fail(turn_sock, "TCP connect() error", status); turn_sock->curr_turn = 0; PJ_LOG(3, (__FILE__, "Failed(%d) connect to all turn servers.", status)); } else { set_state(turn_sock->sess, PJ_TURN_STATE_NULL); PJ_LOG(3, (__FILE__, "Failed(%d) connect to turn server [%.*s:%d].", status, turn_sock->turn.domain->slen, turn_sock->turn.domain->ptr, turn_sock->turn.default_port)); turn_sock->turn.domain = &turn_sock->turn_list[turn_sock->curr_turn].server; turn_sock->turn.default_port = turn_sock->turn_list[turn_sock->curr_turn].port; PJ_LOG(3, (__FILE__, "Try another turn server [%.*s:%d].", turn_sock->turn.domain->slen, turn_sock->turn.domain->ptr, turn_sock->turn.default_port)); /* Resolve server */ status = pj_turn_session_set_server(turn_sock->sess, turn_sock->turn.domain, turn_sock->turn.default_port, turn_sock->turn.resolver); if (status != PJ_SUCCESS) { PJ_LOG(1, ("turn_sock.c", "!!! TURN DEALLOCATE !!! in on_connect_complete() pj_turn_session_set_server failed status=%d", status)); sess_fail(turn_sock, "Error setting TURN server", status); return status; } } return PJ_FALSE; } if (turn_sock->conn_type != PJ_TURN_TP_UDP) { PJ_LOG(5,(turn_sock->obj_name, "TCP connected")); } /* Kick start pending read operation */ status = pj_activesock_start_read(asock, turn_sock->pool, PJ_TURN_MAX_PKT_LEN, 0); /* Init send_key */ pj_ioqueue_op_key_init(&turn_sock->send_key, sizeof(turn_sock->send_key)); /* Send Allocate request */ status = pj_turn_session_alloc(turn_sock->sess, &turn_sock->alloc_param); if (status != PJ_SUCCESS) { PJ_LOG(1, ("turn_sock.c", "!!! TURN DEALLOCATE !!! in on_connect_complete() pj_turn_session_alloc failed status=%d", status)); sess_fail(turn_sock, "Error sending ALLOCATE", status); return PJ_FALSE; } return PJ_TRUE; }