view sip-manual-out/sdp_in.c @ 205:0047c4c08d9e

mgw: accept the new TRAUlike RTP format in addition to standard, old BFI and zero-length payload formats
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 06 Apr 2023 19:50:09 -0800
parents d3c99b41fb04
children fbfa72b114e8
line wrap: on
line source

/*
 * In this module we handle SDP responses to our INVITE.
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "../libsip/parse.h"
#include "../libsip/sdp.h"

extern char *get_single_header();
extern char *extract_to_tag();

struct sockaddr_in rtp_remote_addr;
int pcma_selected, rtp_out_enable;

static
check_sdp_present(msg)
	struct sip_pkt_rx *msg;
{
	char *hval;

	if (!msg->msg_body_len)
		return 0;
	hval = get_single_header(msg, "Content-Type", "c", (int *) 0);
	if (!hval)
		return 0;
	if (!strcasecmp(hval, "application/sdp"))
		return 1;
	else
		return 0;
}

void
extract_resp_sdp(msg)
	struct sip_pkt_rx *msg;
{
	struct sdp_parse sdp_parse;
	int rc;

	if (!check_sdp_present(msg)) {
		printf("INVITE response has no SDP!\n");
		return;
	}
	rc = parse_incoming_sdp(msg->msg_body, msg->msg_body_len, &sdp_parse);
	if (rc < 0) {
		printf("SDP parse error: %d\n", rc);
		return;
	}
	switch (sdp_parse.codec_mask) {
	case SDP_CODEC_MASK_PCMU:
	case SDP_CODEC_MASK_BOTH:
		pcma_selected = 0;
		break;
	case SDP_CODEC_MASK_PCMA:
	case SDP_CODEC_MASK_BOTH | SDP_CODEC_MASK_PCMA_PREF:
		pcma_selected = 1;
		break;
	default:
		printf("SDP error: no supported codec\n");
		return;
	}
	printf("SDP response: IP %s port %u codec %s\n",
		inet_ntoa(sdp_parse.ip_addr), sdp_parse.audio_port,
		pcma_selected ? "PCMA" : "PCMU");
	rtp_remote_addr.sin_family = AF_INET;
	rtp_remote_addr.sin_addr = sdp_parse.ip_addr;
	rtp_remote_addr.sin_port = htons(sdp_parse.audio_port);
	rtp_out_enable = 1;
	assign_rtpout_ssrc();
	prepare_tfo_fill();
}