static void ict_handle_transport_error(osip_transaction_t * ict, int err) { __osip_transport_error_callback(OSIP_ICT_TRANSPORT_ERROR, ict, err); __osip_transaction_set_state(ict, ICT_TERMINATED); __osip_kill_transaction_callback(OSIP_ICT_KILL_TRANSACTION, ict); /* TODO: MUST BE DELETED NOW */ }
void nict_rcv_23456xx (osip_transaction_t * nict, osip_event_t * evt) { /* leave this answer to the core application */ if (nict->last_response != NULL) { osip_message_free (nict->last_response); } nict->last_response = evt->sip; if (EVT_IS_RCV_STATUS_2XX (evt)) __osip_message_callback (OSIP_NICT_STATUS_2XX_RECEIVED, nict, nict->last_response); else if (MSG_IS_STATUS_3XX (nict->last_response)) __osip_message_callback (OSIP_NICT_STATUS_3XX_RECEIVED, nict, nict->last_response); else if (MSG_IS_STATUS_4XX (nict->last_response)) __osip_message_callback (OSIP_NICT_STATUS_4XX_RECEIVED, nict, nict->last_response); else if (MSG_IS_STATUS_5XX (nict->last_response)) __osip_message_callback (OSIP_NICT_STATUS_5XX_RECEIVED, nict, nict->last_response); else __osip_message_callback (OSIP_NICT_STATUS_6XX_RECEIVED, nict, nict->last_response); if (nict->state != NICT_COMPLETED) /* reset timer K */ { osip_gettimeofday (&nict->nict_context->timer_k_start, NULL); add_gettimeofday (&nict->nict_context->timer_k_start, nict->nict_context->timer_k_length); } __osip_transaction_set_state (nict, NICT_COMPLETED); }
void ist_snd_3456xx (osip_transaction_t * ist, osip_event_t * evt) { int i; if (ist->last_response != NULL) { osip_message_free (ist->last_response); } ist->last_response = evt->sip; i = __osip_transaction_snd_xxx (ist, evt->sip); if (i != 0) { ist_handle_transport_error (ist, i); return; } else { if (MSG_IS_STATUS_3XX (ist->last_response)) __osip_message_callback (OSIP_IST_STATUS_3XX_SENT, ist, ist->last_response); else if (MSG_IS_STATUS_4XX (ist->last_response)) __osip_message_callback (OSIP_IST_STATUS_4XX_SENT, ist, ist->last_response); else if (MSG_IS_STATUS_5XX (ist->last_response)) __osip_message_callback (OSIP_IST_STATUS_5XX_SENT, ist, ist->last_response); else __osip_message_callback (OSIP_IST_STATUS_6XX_SENT, ist, ist->last_response); } if (ist->ist_context->timer_g_length != -1) { osip_gettimeofday (&ist->ist_context->timer_g_start, NULL); add_gettimeofday (&ist->ist_context->timer_g_start, ist->ist_context->timer_g_length); } osip_gettimeofday (&ist->ist_context->timer_h_start, NULL); add_gettimeofday (&ist->ist_context->timer_h_start, ist->ist_context->timer_h_length); __osip_transaction_set_state (ist, IST_COMPLETED); return; }
static void nist_handle_transport_error(osip_transaction_t * nist, int err) { __osip_transport_error_callback(OSIP_NIST_TRANSPORT_ERROR, nist, err); __osip_transaction_set_state(nist, NIST_TERMINATED); __osip_kill_transaction_callback(OSIP_NIST_KILL_TRANSACTION, nist); /* TODO: MUST BE DELETED NOW */ }
void osip_nist_timeout_j_event(osip_transaction_t * nist, osip_event_t * evt) { nist->nist_context->timer_j_length = -1; nist->nist_context->timer_j_start.tv_sec = -1; __osip_transaction_set_state(nist, NIST_TERMINATED); __osip_kill_transaction_callback(OSIP_NIST_KILL_TRANSACTION, nist); }
void osip_ict_timeout_d_event(osip_transaction_t * ict, osip_event_t * evt) { ict->ict_context->timer_d_length = -1; ict->ict_context->timer_d_start.tv_sec = -1; __osip_transaction_set_state(ict, ICT_TERMINATED); __osip_kill_transaction_callback(OSIP_ICT_KILL_TRANSACTION, ict); }
void osip_ict_timeout_b_event(osip_transaction_t * ict, osip_event_t * evt) { ict->ict_context->timer_b_length = -1; ict->ict_context->timer_b_start.tv_sec = -1; __osip_message_callback(OSIP_ICT_STATUS_TIMEOUT, ict, evt->sip); __osip_transaction_set_state(ict, ICT_TERMINATED); __osip_kill_transaction_callback(OSIP_ICT_KILL_TRANSACTION, ict); }
void osip_ist_timeout_i_event (osip_transaction_t * ist, osip_event_t * evt) { ist->ist_context->timer_i_length = -1; ist->ist_context->timer_i_start.tv_sec = -1; __osip_transaction_set_state (ist, IST_TERMINATED); __osip_kill_transaction_callback (OSIP_IST_KILL_TRANSACTION, ist); }
void osip_nict_timeout_f_event (osip_transaction_t * nict, osip_event_t * evt) { nict->nict_context->timer_f_length = -1; nict->nict_context->timer_f_start.tv_sec = -1; __osip_message_callback (OSIP_NICT_STATUS_TIMEOUT, nict, evt->sip); __osip_transaction_set_state (nict, NICT_TERMINATED); __osip_kill_transaction_callback (OSIP_NICT_KILL_TRANSACTION, nict); }
void ict_rcv_1xx(osip_transaction_t * ict, osip_event_t * evt) { /* leave this answer to the core application */ if (ict->last_response != NULL) { osip_message_free(ict->last_response); } ict->last_response = evt->sip; __osip_message_callback(OSIP_ICT_STATUS_1XX_RECEIVED, ict, evt->sip); __osip_transaction_set_state(ict, ICT_PROCEEDING); }
void ict_rcv_2xx(osip_transaction_t * ict, osip_event_t * evt) { /* leave this answer to the core application */ if (ict->last_response != NULL) { osip_message_free(ict->last_response); } ict->last_response = evt->sip; __osip_message_callback(OSIP_ICT_STATUS_2XX_RECEIVED, ict, evt->sip); __osip_transaction_set_state(ict, ICT_TERMINATED); __osip_kill_transaction_callback(OSIP_ICT_KILL_TRANSACTION, ict); }
void ict_snd_invite(osip_transaction_t * ict, osip_event_t * evt) { int i; osip_t *osip = (osip_t *) ict->config; /* Here we have ict->orig_request == NULL */ ict->orig_request = evt->sip; i = osip->cb_send_message(ict, evt->sip, ict->ict_context->destination, ict->ict_context->port, ict->out_socket); if (i < 0) { ict_handle_transport_error(ict, i); return; } #ifndef USE_BLOCKINGSOCKET /* stop timer E in reliable transport - non blocking socket: the message was just sent */ if (i == 0) { /* but message was really sent */ osip_via_t *via; char *proto; i = osip_message_get_via(ict->orig_request, 0, &via); /* get top via */ if (i < 0) { ict_handle_transport_error(ict, i); return; } proto = via_get_protocol(via); if (proto == NULL) { ict_handle_transport_error(ict, i); return; } if (osip_strcasecmp(proto, "TCP") != 0 && osip_strcasecmp(proto, "TLS") != 0 && osip_strcasecmp(proto, "SCTP") != 0) { } else { /* reliable protocol is used: */ ict->ict_context->timer_a_length = -1; /* A is not ACTIVE */ ict->ict_context->timer_a_start.tv_sec = -1; } } #endif __osip_message_callback(OSIP_ICT_INVITE_SENT, ict, ict->orig_request); __osip_transaction_set_state(ict, ICT_CALLING); }
void ist_rcv_ack (osip_transaction_t * ist, osip_event_t * evt) { if (ist->ack != NULL) { osip_message_free (ist->ack); } ist->ack = evt->sip; if (ist->state == IST_COMPLETED) __osip_message_callback (OSIP_IST_ACK_RECEIVED, ist, ist->ack); else /* IST_CONFIRMED */ __osip_message_callback (OSIP_IST_ACK_RECEIVED_AGAIN, ist, ist->ack); /* set the timer to 0 for reliable, and T4 for unreliable (already set) */ osip_gettimeofday (&ist->ist_context->timer_i_start, NULL); add_gettimeofday (&ist->ist_context->timer_i_start, ist->ist_context->timer_i_length); __osip_transaction_set_state (ist, IST_CONFIRMED); }
void nist_snd_23456xx (osip_transaction_t * nist, osip_event_t * evt) { int i; if (nist->last_response != NULL) { osip_message_free (nist->last_response); } nist->last_response = evt->sip; i = __osip_transaction_snd_xxx(nist, nist->last_response); if (i != 0) { nist_handle_transport_error (nist, i); return; } else { if (EVT_IS_SND_STATUS_2XX (evt)) __osip_message_callback (OSIP_NIST_STATUS_2XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_3XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_3XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_4XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_4XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_5XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_5XX_SENT, nist, nist->last_response); else __osip_message_callback (OSIP_NIST_STATUS_6XX_SENT, nist, nist->last_response); } if (nist->state != NIST_COMPLETED) /* start J timer */ { osip_gettimeofday (&nist->nist_context->timer_j_start, NULL); add_gettimeofday (&nist->nist_context->timer_j_start, nist->nist_context->timer_j_length); } __osip_transaction_set_state (nist, NIST_COMPLETED); }
void nist_snd_1xx(osip_transaction_t * nist, osip_event_t * evt) { int i; if (nist->last_response != NULL) { osip_message_free(nist->last_response); } nist->last_response = evt->sip; i = __osip_transaction_snd_xxx(nist, nist->last_response); if (i != 0) { nist_handle_transport_error(nist, i); return; } else __osip_message_callback(OSIP_NIST_STATUS_1XX_SENT, nist, nist->last_response); __osip_transaction_set_state(nist, NIST_PROCEEDING); }
void nict_rcv_1xx (osip_transaction_t * nict, osip_event_t * evt) { /* leave this answer to the core application */ if (nict->last_response != NULL) { osip_message_free (nict->last_response); } nict->last_response = evt->sip; /* for unreliable transport increase the retransmission timeout */ if (nict->nict_context->timer_e_length > 0) { nict->nict_context->timer_e_length = DEFAULT_T2; osip_gettimeofday (&nict->nict_context->timer_e_start, NULL); add_gettimeofday (&nict->nict_context->timer_e_start, nict->nict_context->timer_e_length); } __osip_message_callback (OSIP_NICT_STATUS_1XX_RECEIVED, nict, evt->sip); __osip_transaction_set_state (nict, NICT_PROCEEDING); }
void nict_snd_request (osip_transaction_t * nict, osip_event_t * evt) { int i; osip_t *osip = (osip_t *) nict->config; /* Here we have ict->orig_request == NULL */ nict->orig_request = evt->sip; i = osip->cb_send_message (nict, evt->sip, nict->nict_context->destination, nict->nict_context->port, nict->out_socket); if (i == 0) { /* invoke the right callback! */ if (MSG_IS_REGISTER (evt->sip)) __osip_message_callback (OSIP_NICT_REGISTER_SENT, nict, nict->orig_request); else if (MSG_IS_BYE (evt->sip)) __osip_message_callback (OSIP_NICT_BYE_SENT, nict, nict->orig_request); else if (MSG_IS_OPTIONS (evt->sip)) __osip_message_callback (OSIP_NICT_OPTIONS_SENT, nict, nict->orig_request); else if (MSG_IS_INFO (evt->sip)) __osip_message_callback (OSIP_NICT_INFO_SENT, nict, nict->orig_request); else if (MSG_IS_CANCEL (evt->sip)) __osip_message_callback (OSIP_NICT_CANCEL_SENT, nict, nict->orig_request); else if (MSG_IS_NOTIFY (evt->sip)) __osip_message_callback (OSIP_NICT_NOTIFY_SENT, nict, nict->orig_request); else if (MSG_IS_SUBSCRIBE (evt->sip)) __osip_message_callback (OSIP_NICT_SUBSCRIBE_SENT, nict, nict->orig_request); else __osip_message_callback (OSIP_NICT_UNKNOWN_REQUEST_SENT, nict, nict->orig_request); __osip_transaction_set_state (nict, NICT_TRYING); } else { nict_handle_transport_error (nict, i); } }
void ist_snd_2xx (osip_transaction_t * ist, osip_event_t * evt) { int i; if (ist->last_response != NULL) { osip_message_free (ist->last_response); } ist->last_response = evt->sip; i = __osip_transaction_snd_xxx (ist, evt->sip); if (i != 0) { ist_handle_transport_error (ist, i); return; } else { __osip_message_callback (OSIP_IST_STATUS_2XX_SENT, ist, ist->last_response); __osip_transaction_set_state (ist, IST_TERMINATED); __osip_kill_transaction_callback (OSIP_IST_KILL_TRANSACTION, ist); } return; }
void ist_rcv_invite (osip_transaction_t * ist, osip_event_t * evt) { int i; if (ist->state == IST_PRE_PROCEEDING) { /* announce new INVITE */ /* Here we have ist->orig_request == NULL */ ist->orig_request = evt->sip; __osip_message_callback (OSIP_IST_INVITE_RECEIVED, ist, evt->sip); } else { /* IST_PROCEEDING or IST_COMPLETED */ /* delete retransmission */ osip_message_free (evt->sip); __osip_message_callback (OSIP_IST_INVITE_RECEIVED_AGAIN, ist, ist->orig_request); if (ist->last_response != NULL) { /* retransmit last response */ i = __osip_transaction_snd_xxx (ist, ist->last_response); if (i != 0) { ist_handle_transport_error (ist, i); return; } else { if (MSG_IS_STATUS_1XX (ist->last_response)) __osip_message_callback (OSIP_IST_STATUS_1XX_SENT, ist, ist->last_response); else if (MSG_IS_STATUS_2XX (ist->last_response)) __osip_message_callback (OSIP_IST_STATUS_2XX_SENT_AGAIN, ist, ist->last_response); else __osip_message_callback (OSIP_IST_STATUS_3456XX_SENT_AGAIN, ist, ist->last_response); } } return; } /* we come here only if it was the first INVITE received */ __osip_transaction_set_state (ist, IST_PROCEEDING); }
void ict_retransmit_ack(osip_transaction_t * ict, osip_event_t * evt) { int i; osip_t *osip = (osip_t *) ict->config; /* this could be another 3456xx ??? */ /* we should make a new ACK and send it!!! */ /* TODO */ __osip_message_callback(OSIP_ICT_STATUS_3456XX_RECEIVED_AGAIN, ict, evt->sip); osip_message_free(evt->sip); i = osip->cb_send_message(ict, ict->ack, ict->ict_context->destination, ict->ict_context->port, ict->out_socket); if (i == 0) { __osip_message_callback(OSIP_ICT_ACK_SENT_AGAIN, ict, ict->ack); __osip_transaction_set_state(ict, ICT_COMPLETED); } else { ict_handle_transport_error(ict, i); } }
void nist_rcv_request (osip_transaction_t * nist, osip_event_t * evt) { int i; if (nist->state == NIST_PRE_TRYING) /* announce new REQUEST */ { /* Here we have ist->orig_request == NULL */ nist->orig_request = evt->sip; if (MSG_IS_REGISTER (evt->sip)) __osip_message_callback (OSIP_NIST_REGISTER_RECEIVED, nist, nist->orig_request); else if (MSG_IS_BYE (evt->sip)) __osip_message_callback (OSIP_NIST_BYE_RECEIVED, nist, nist->orig_request); else if (MSG_IS_OPTIONS (evt->sip)) __osip_message_callback (OSIP_NIST_OPTIONS_RECEIVED, nist, nist->orig_request); else if (MSG_IS_INFO (evt->sip)) __osip_message_callback (OSIP_NIST_INFO_RECEIVED, nist, nist->orig_request); else if (MSG_IS_CANCEL (evt->sip)) __osip_message_callback (OSIP_NIST_CANCEL_RECEIVED, nist, nist->orig_request); else if (MSG_IS_NOTIFY (evt->sip)) __osip_message_callback (OSIP_NIST_NOTIFY_RECEIVED, nist, nist->orig_request); else if (MSG_IS_SUBSCRIBE (evt->sip)) __osip_message_callback (OSIP_NIST_SUBSCRIBE_RECEIVED, nist, nist->orig_request); else __osip_message_callback (OSIP_NIST_UNKNOWN_REQUEST_RECEIVED, nist, nist->orig_request); } else /* NIST_PROCEEDING or NIST_COMPLETED */ { /* delete retransmission */ osip_message_free (evt->sip); __osip_message_callback (OSIP_NIST_REQUEST_RECEIVED_AGAIN, nist, nist->orig_request); if (nist->last_response != NULL) /* retransmit last response */ { i = __osip_transaction_snd_xxx(nist, nist->last_response); if (i != 0) { nist_handle_transport_error (nist, i); return; } else { if (MSG_IS_STATUS_1XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_1XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_2XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_2XX_SENT_AGAIN, nist, nist->last_response); else __osip_message_callback (OSIP_NIST_STATUS_3456XX_SENT_AGAIN, nist, nist->last_response); return; } } /* we are already in the proper state */ return; } /* we come here only if it was the first REQUEST received */ __osip_transaction_set_state (nist, NIST_TRYING); }
void ict_rcv_3456xx(osip_transaction_t * ict, osip_event_t * evt) { osip_route_t *route; int i; osip_t *osip = (osip_t *) ict->config; /* leave this answer to the core application */ if (ict->last_response != NULL) osip_message_free(ict->last_response); ict->last_response = evt->sip; if (ict->state != ICT_COMPLETED) { /* not a retransmission */ /* automatic handling of ack! */ osip_message_t *ack = ict_create_ack(ict, evt->sip); ict->ack = ack; if (ict->ack == NULL) { __osip_transaction_set_state(ict, ICT_TERMINATED); __osip_kill_transaction_callback(OSIP_ICT_KILL_TRANSACTION, ict); return; } /* reset ict->ict_context->destination only if it is not yet set. */ if (ict->ict_context->destination == NULL) { osip_message_get_route(ack, 0, &route); if (route != NULL && route->url != NULL) { osip_uri_param_t *lr_param; osip_uri_uparam_get_byname(route->url, "lr", &lr_param); if (lr_param == NULL) { /* using uncompliant proxy: destination is the request-uri */ route = NULL; } } if (route != NULL && route->url != NULL) { int port = 5060; if (route->url->port != NULL) port = osip_atoi(route->url->port); osip_ict_set_destination(ict->ict_context, osip_strdup(route->url->host), port); } else { int port = 5060; /* search for maddr parameter */ osip_uri_param_t *maddr_param = NULL; port = 5060; if (ack->req_uri->port != NULL) port = osip_atoi(ack->req_uri->port); osip_uri_uparam_get_byname(ack->req_uri, "maddr", &maddr_param); if (maddr_param != NULL && maddr_param->gvalue != NULL) osip_ict_set_destination(ict->ict_context, osip_strdup(maddr_param->gvalue), port); else osip_ict_set_destination(ict->ict_context, osip_strdup(ack->req_uri->host), port); } } i = osip->cb_send_message(ict, ack, ict->ict_context->destination, ict->ict_context->port, ict->out_socket); if (i != 0) { ict_handle_transport_error(ict, i); return; } if (MSG_IS_STATUS_3XX(evt->sip)) __osip_message_callback(OSIP_ICT_STATUS_3XX_RECEIVED, ict, evt->sip); else if (MSG_IS_STATUS_4XX(evt->sip)) __osip_message_callback(OSIP_ICT_STATUS_4XX_RECEIVED, ict, evt->sip); else if (MSG_IS_STATUS_5XX(evt->sip)) __osip_message_callback(OSIP_ICT_STATUS_5XX_RECEIVED, ict, evt->sip); else __osip_message_callback(OSIP_ICT_STATUS_6XX_RECEIVED, ict, evt->sip); __osip_message_callback(OSIP_ICT_ACK_SENT, ict, evt->sip); } /* start timer D (length is set to MAX (64*DEFAULT_T1 or 32000) */ osip_gettimeofday(&ict->ict_context->timer_d_start, NULL); add_gettimeofday(&ict->ict_context->timer_d_start, ict->ict_context->timer_d_length); __osip_transaction_set_state(ict, ICT_COMPLETED); }
void nict_snd_request (osip_transaction_t * nict, osip_event_t * evt) { int i; osip_t *osip = (osip_t *) nict->config; /* Here we have ict->orig_request == NULL */ nict->orig_request = evt->sip; i = osip->cb_send_message (nict, evt->sip, nict->nict_context->destination, nict->nict_context->port, nict->out_socket); if (i >= 0) { /* invoke the right callback! */ if (MSG_IS_REGISTER (evt->sip)) __osip_message_callback (OSIP_NICT_REGISTER_SENT, nict, nict->orig_request); else if (MSG_IS_BYE (evt->sip)) __osip_message_callback (OSIP_NICT_BYE_SENT, nict, nict->orig_request); else if (MSG_IS_OPTIONS (evt->sip)) __osip_message_callback (OSIP_NICT_OPTIONS_SENT, nict, nict->orig_request); else if (MSG_IS_INFO (evt->sip)) __osip_message_callback (OSIP_NICT_INFO_SENT, nict, nict->orig_request); else if (MSG_IS_CANCEL (evt->sip)) __osip_message_callback (OSIP_NICT_CANCEL_SENT, nict, nict->orig_request); else if (MSG_IS_NOTIFY (evt->sip)) __osip_message_callback (OSIP_NICT_NOTIFY_SENT, nict, nict->orig_request); else if (MSG_IS_SUBSCRIBE (evt->sip)) __osip_message_callback (OSIP_NICT_SUBSCRIBE_SENT, nict, nict->orig_request); else __osip_message_callback (OSIP_NICT_UNKNOWN_REQUEST_SENT, nict, nict->orig_request); #ifndef USE_BLOCKINGSOCKET /* stop timer E in reliable transport - non blocking socket: the message was just sent */ { osip_via_t *via; char *proto; int k; k = osip_message_get_via (nict->orig_request, 0, &via); /* get top via */ if (k < 0) { nict_handle_transport_error (nict, -1); return; } proto = via_get_protocol (via); if (proto == NULL) { nict_handle_transport_error (nict, -1); return; } if (i == 0) { /* but message was really sent */ if (osip_strcasecmp (proto, "TCP") != 0 && osip_strcasecmp (proto, "TLS") != 0 && osip_strcasecmp (proto, "SCTP") != 0) { } else { /* reliable protocol is used: */ nict->nict_context->timer_e_length = -1; /* E is not ACTIVE */ nict->nict_context->timer_e_start.tv_sec = -1; } } else { if (osip_strcasecmp (proto, "TCP") != 0 && osip_strcasecmp (proto, "TLS") != 0 && osip_strcasecmp (proto, "SCTP") != 0) { } else { /* reliable protocol is used: */ nict->nict_context->timer_e_length = DEFAULT_T1_TCP_PROGRESS; } } } #endif if (nict->nict_context->timer_e_length > 0) { osip_gettimeofday (&nict->nict_context->timer_e_start, NULL); add_gettimeofday (&nict->nict_context->timer_e_start, nict->nict_context->timer_e_length); } __osip_transaction_set_state (nict, NICT_TRYING); } else { nict_handle_transport_error (nict, i); } }
void nist_snd_23456xx (osip_transaction_t * nist, osip_event_t * evt) { int i; osip_via_t *via; osip_t *osip = (osip_t *) nist->config; if (nist->last_response != NULL) { osip_message_free (nist->last_response); } nist->last_response = evt->sip; via = (osip_via_t *) osip_list_get (nist->last_response->vias, 0); if (via) { char *host; int port; osip_generic_param_t *maddr; osip_generic_param_t *received; osip_generic_param_t *rport; osip_via_param_get_byname (via, "maddr", &maddr); osip_via_param_get_byname (via, "received", &received); osip_via_param_get_byname (via, "rport", &rport); /* 1: user should not use the provided information (host and port) if they are using a reliable transport. Instead, they should use the already open socket attached to this transaction. */ /* 2: check maddr and multicast usage */ if (maddr != NULL) host = maddr->gvalue; /* we should check if this is a multicast address and use set the "ttl" in this case. (this must be done in the UDP message (not at the SIP layer) */ else if (received != NULL) host = received->gvalue; else host = via->host; if (rport == NULL || rport->gvalue == NULL) { if (via->port != NULL) port = osip_atoi (via->port); else port = 5060; } else port = osip_atoi (rport->gvalue); i = osip->cb_send_message (nist, nist->last_response, host, port, nist->out_socket); } else i = -1; if (i != 0) { nist_handle_transport_error (nist, i); return; } else { if (EVT_IS_SND_STATUS_2XX (evt)) __osip_message_callback (OSIP_NIST_STATUS_2XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_3XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_3XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_4XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_4XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_5XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_5XX_SENT, nist, nist->last_response); else __osip_message_callback (OSIP_NIST_STATUS_6XX_SENT, nist, nist->last_response); } if (nist->state != NIST_COMPLETED) /* start J timer */ nist->nist_context->timer_j_start = time (NULL); __osip_transaction_set_state (nist, NIST_COMPLETED); }
void nist_rcv_request (osip_transaction_t * nist, osip_event_t * evt) { int i; osip_t *osip = (osip_t *) nist->config; if (nist->state == NIST_PRE_TRYING) /* announce new REQUEST */ { /* Here we have ist->orig_request == NULL */ nist->orig_request = evt->sip; if (MSG_IS_REGISTER (evt->sip)) __osip_message_callback (OSIP_NIST_REGISTER_RECEIVED, nist, nist->orig_request); else if (MSG_IS_BYE (evt->sip)) __osip_message_callback (OSIP_NIST_BYE_RECEIVED, nist, nist->orig_request); else if (MSG_IS_OPTIONS (evt->sip)) __osip_message_callback (OSIP_NIST_OPTIONS_RECEIVED, nist, nist->orig_request); else if (MSG_IS_INFO (evt->sip)) __osip_message_callback (OSIP_NIST_INFO_RECEIVED, nist, nist->orig_request); else if (MSG_IS_CANCEL (evt->sip)) __osip_message_callback (OSIP_NIST_CANCEL_RECEIVED, nist, nist->orig_request); else if (MSG_IS_NOTIFY (evt->sip)) __osip_message_callback (OSIP_NIST_NOTIFY_RECEIVED, nist, nist->orig_request); else if (MSG_IS_SUBSCRIBE (evt->sip)) __osip_message_callback (OSIP_NIST_SUBSCRIBE_RECEIVED, nist, nist->orig_request); else __osip_message_callback (OSIP_NIST_UNKNOWN_REQUEST_RECEIVED, nist, nist->orig_request); } else /* NIST_PROCEEDING or NIST_COMPLETED */ { /* delete retransmission */ osip_message_free (evt->sip); __osip_message_callback (OSIP_NIST_REQUEST_RECEIVED_AGAIN, nist, nist->orig_request); if (nist->last_response != NULL) /* retransmit last response */ { osip_via_t *via; via = (osip_via_t *) osip_list_get (nist->last_response->vias, 0); if (via) { char *host; int port; osip_generic_param_t *maddr; osip_generic_param_t *received; osip_generic_param_t *rport; osip_via_param_get_byname (via, "maddr", &maddr); osip_via_param_get_byname (via, "received", &received); osip_via_param_get_byname (via, "rport", &rport); /* 1: user should not use the provided information (host and port) if they are using a reliable transport. Instead, they should use the already open socket attached to this transaction. */ /* 2: check maddr and multicast usage */ if (maddr != NULL) host = maddr->gvalue; /* we should check if this is a multicast address and use set the "ttl" in this case. (this must be done in the UDP message (not at the SIP layer) */ else if (received != NULL) host = received->gvalue; else host = via->host; if (rport == NULL || rport->gvalue == NULL) { if (via->port != NULL) port = osip_atoi (via->port); else port = 5060; } else port = osip_atoi (rport->gvalue); i = osip->cb_send_message (nist, nist->last_response, host, port, nist->out_socket); } else i = -1; if (i != 0) { nist_handle_transport_error (nist, i); return; } else { if (MSG_IS_STATUS_1XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_1XX_SENT, nist, nist->last_response); else if (MSG_IS_STATUS_2XX (nist->last_response)) __osip_message_callback (OSIP_NIST_STATUS_2XX_SENT_AGAIN, nist, nist->last_response); else __osip_message_callback (OSIP_NIST_STATUS_3456XX_SENT_AGAIN, nist, nist->last_response); return; } } /* we are already in the proper state */ return; } /* we come here only if it was the first REQUEST received */ __osip_transaction_set_state (nist, NIST_TRYING); }