diff options
-rw-r--r-- | pjsip/src/pjsip-ua/sip_inv.c | 4 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua_core.c | 33 | ||||
-rw-r--r-- | pjsip/src/pjsua/pjsua_inv.c | 13 |
3 files changed, 36 insertions, 14 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index a41f7f6e..5ab97345 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -1274,8 +1274,8 @@ PJ_DEF(pj_status_t) pjsip_inv_end_session( pjsip_inv_session *inv, if (inv->invite_tsx->status_code < 100) { pjsip_tsx_terminate(inv->invite_tsx, 487); - - return PJSIP_ETSXDESTROYED; + *p_tdata = NULL; + return PJ_SUCCESS; } /* The CSeq here assumes that the dialog is started with an diff --git a/pjsip/src/pjsua/pjsua_core.c b/pjsip/src/pjsua/pjsua_core.c index 1e81d91e..77b6631a 100644 --- a/pjsip/src/pjsua/pjsua_core.c +++ b/pjsip/src/pjsua/pjsua_core.c @@ -149,7 +149,7 @@ static pj_status_t init_sockets(pj_bool_t sip, RTCP_SOCK, }; int i; - pj_uint16_t rtp_port; + static pj_uint16_t rtp_port = RTP_START_PORT; pj_sock_t sock[3]; pj_sockaddr_in mapped_addr[3]; pj_status_t status = PJ_SUCCESS; @@ -157,23 +157,27 @@ static pj_status_t init_sockets(pj_bool_t sip, for (i=0; i<3; ++i) sock[i] = PJ_INVALID_SOCKET; + /* Create and bind SIP UDP socket. */ + status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock[SIP_SOCK]); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "socket() error", status); + goto on_error; + } + if (sip) { - /* Create and bind SIP UDP socket. */ - status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock[SIP_SOCK]); + status = pj_sock_bind_in(sock[SIP_SOCK], 0, pjsua.sip_port); if (status != PJ_SUCCESS) { - pjsua_perror(THIS_FILE, "socket() error", status); + pjsua_perror(THIS_FILE, "bind() error", status); goto on_error; } - - status = pj_sock_bind_in(sock[SIP_SOCK], 0, pjsua.sip_port); + } else { + status = pj_sock_bind_in(sock[SIP_SOCK], 0, 0); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "bind() error", status); goto on_error; } } - /* Initialize start of RTP port to try. */ - rtp_port = (pj_uint16_t)(RTP_START_PORT + (pj_rand() % RTP_RANDOM_START) / 2); /* Loop retry to bind RTP and RTCP sockets. */ for (i=0; i<RTP_RETRY; ++i, rtp_port += 2) { @@ -234,8 +238,6 @@ static pj_status_t init_sockets(pj_bool_t sip, if (sip) mapped_addr[SIP_SOCK].sin_port = pj_htons((pj_uint16_t)pjsua.sip_port); - else - mapped_addr[RTP_SOCK].sin_port = pj_htons((pj_uint16_t)rtp_port); mapped_addr[RTP_SOCK].sin_port = pj_htons((pj_uint16_t)rtp_port); mapped_addr[RTCP_SOCK].sin_port = pj_htons((pj_uint16_t)(rtp_port+1)); break; @@ -265,6 +267,8 @@ static pj_status_t init_sockets(pj_bool_t sip, if (sip) { pjsua.sip_sock = sock[SIP_SOCK]; pj_memcpy(&pjsua.sip_sock_name, &mapped_addr[SIP_SOCK], sizeof(pj_sockaddr_in)); + } else { + pj_sock_close(sock[0]); } skinfo->rtp_sock = sock[RTP_SOCK]; @@ -287,6 +291,7 @@ static pj_status_t init_sockets(pj_bool_t sip, pj_inet_ntoa(skinfo->rtcp_addr_name.sin_addr), pj_ntohs(skinfo->rtcp_addr_name.sin_port))); + rtp_port += 2; return PJ_SUCCESS; on_error: @@ -454,6 +459,14 @@ pj_status_t pjsua_init(void) return status; } + /* Init PJLIB-UTIL: */ + + status = pjlib_util_init(); + if (status != PJ_SUCCESS) { + pjsua_perror(THIS_FILE, "pjlib_util_init() error", status); + return status; + } + /* Init memory pool: */ /* Init caching pool. */ diff --git a/pjsip/src/pjsua/pjsua_inv.c b/pjsip/src/pjsua/pjsua_inv.c index 5789cbc7..83b2bfff 100644 --- a/pjsip/src/pjsua/pjsua_inv.c +++ b/pjsip/src/pjsua/pjsua_inv.c @@ -832,6 +832,13 @@ void pjsua_inv_hangup(struct pjsua_inv_data *inv_session, int code) return; } + /* pjsip_inv_end_session may return PJ_SUCCESS with NULL + * as p_tdata when INVITE transaction has not been answered + * with any provisional responses. + */ + if (tdata == NULL) + return; + status = pjsip_inv_send_msg(inv_session->inv, tdata, NULL); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, @@ -974,8 +981,10 @@ void pjsua_inv_shutdown() next = inv_data->next; - if (pjsip_inv_end_session(inv_data->inv, 410, NULL, &tdata)==0) - pjsip_inv_send_msg(inv_data->inv, tdata, NULL); + if (pjsip_inv_end_session(inv_data->inv, 410, NULL, &tdata)==0) { + if (tdata) + pjsip_inv_send_msg(inv_data->inv, tdata, NULL); + } inv_data = next; } |