view sip-in/retrans.c @ 78:72b7d85d6354

sip-in: retransmission error handling
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 20 Sep 2022 18:00:56 -0800
parents 709b78a4ebf0
children 915f0f397fb6
line wrap: on
line source

/*
 * In this module we handle retransmission of INVITE responses
 * and BYE requests.
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <syslog.h>
#include "../include/gsm48_const.h"
#include "../libsip/out_msg.h"
#include "call.h"

extern unsigned cfg_retrans_count;
extern struct call *call_list;

void
run_periodic_retrans()
{
	struct call *call;
	struct sip_msg_out msg;

	for (call = call_list; call; call = call->next) {
		switch (call->sip_state) {
		case SIP_STATE_INVITE_200:
			if (call->sip_tx_count < cfg_retrans_count) {
				fill_invite_200_resp(&msg, call);
				sip_tx_packet(&msg, &call->udp_sin);
				call->sip_tx_count++;
			} else {
				/* TODO: send BYE */
				call->sip_state = SIP_STATE_ENDED;
				call->overall_state = OVERALL_STATE_TEARDOWN;
				disconnect_mncc(call, GSM48_CAUSE_LOC_PRN_S_LU,
						GSM48_CC_CAUSE_INTERWORKING);
				disconnect_tmgw(call);
			}
			break;
		case SIP_STATE_INVITE_ERR:
			if (call->sip_tx_count < cfg_retrans_count) {
				start_response_out_msg(&msg, call->invite_fail);
				fill_invite_resp_from_call(&msg, call);
				out_msg_finish(&msg);
				sip_tx_packet(&msg, &call->udp_sin);
				call->sip_tx_count++;
			} else
				call->sip_state = SIP_STATE_ENDED;
			break;
		}
	}
}