# HG changeset patch # User Mychaela Falconia # Date 1665590174 28800 # Node ID 7643b779dbea19cbb1ecc084de136b793e519269 # Parent 0bacca1f2f7bcab974d5ecf8916dacdb7ca47529 sip-out: handle INVITE errors, except for cause mapping diff -r 0bacca1f2f7b -r 7643b779dbea sip-out/invite.c --- a/sip-out/invite.c Wed Oct 12 07:13:55 2022 -0800 +++ b/sip-out/invite.c Wed Oct 12 07:56:14 2022 -0800 @@ -22,6 +22,7 @@ extern char *get_single_header(); extern char *extract_to_tag(); +extern unsigned sip_linger_invite_err; extern unsigned sip_linger_response_err; static @@ -236,7 +237,38 @@ char *tag; struct sockaddr_in *sin; { + int rc; + rc = send_ack(call, tag, sin); + if (rc < 0) + syslog(LOG_CRIT, "ACK to %03u response exceeds msg size!", + msg->status_code); + switch (call->sip_state) { + case SIP_STATE_INV_SENT: + case SIP_STATE_100_RCVD: + call->overall_state = OVERALL_STATE_TEARDOWN; + disconnect_mncc(call, GSM48_CAUSE_LOC_NET_BEYOND, + sip_error_to_gsm_cause(msg->status_code)); + disconnect_tmgw(call); + call->sip_state = SIP_STATE_ENDED; + sip_mark_end_time(call, sip_linger_invite_err); + return; + case SIP_STATE_CANCEL_SENT: + case SIP_STATE_ACCEPT_100: + case SIP_STATE_ACCEPT_200: + call->sip_state = SIP_STATE_ENDED; + sip_mark_end_time(call, sip_linger_invite_err); + return; + case SIP_STATE_CONNECTED: + case SIP_STATE_BYE_SENT: + case SIP_STATE_ENDED: + return; + default: + syslog(LOG_CRIT, + "FATAL: invalid SIP state 0x%x on INVITE %03u response", + call->sip_state, msg->status_code); + exit(1); + } } void