view include/endp.h @ 37:8f1700a42ca5 default tip

set_remote: add functions for IPv6 and for sockaddr_{in,in6} A convenient way to pass in remote end address as struct sockaddr_in is needed for tw-border-mgw; IPv6 support will be needed in order to bring twrtp_endp into Osmocom mainline.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 23 Nov 2024 19:08:28 +0000
parents c0ce22777694
children
line wrap: on
line source

/*
 * twrtp_endp is the big abstraction provided by libtwrtp: a complete
 * RTP endpoint with RTP & RTCP sockets, sending and receiving both types
 * of packets, and incorporating twjit.
 */

#pragma once

#include <stdint.h>
#include <stdbool.h>

#include <osmocom/core/osmo_io.h>
#include <osmocom/core/socket.h>
#include <osmocom/core/timer.h>

#include <themwi/rtp/twjit.h>

struct twrtp_endp_tx {
	uint32_t ssrc;
	uint32_t ts;
	uint16_t seq;
	bool started;
	bool restart;
};

struct twrtp_endp_rtcp_rx {
	uint32_t sr_ssrc;
	uint16_t sr_ntp_sec;
	uint16_t sr_ntp_fract;
	struct timespec sr_rx_time;
	uint32_t rr_lost_word;
	uint32_t rr_jitter;
	bool got_sr;
	bool got_rr;
};

struct twrtp_endp_rtcp_tx {
	uint32_t last_received;
	uint32_t last_expected;
};

struct twrtp_endp_stats {
	uint32_t rx_rtp_pkt;
	uint32_t rx_rtp_badsrc;
	uint32_t rx_rtcp_pkt;
	uint32_t rx_rtcp_badsrc;
	uint32_t rx_rtcp_invalid;
	uint32_t rx_rtcp_wrong_ssrc;
	uint32_t tx_rtp_pkt;
	uint32_t tx_rtp_bytes;
	uint32_t tx_rtcp_pkt;
};

struct twrtp_endp {
	/* the root of the matter: the two sockets */
	int rtp_fd;
	int rtcp_fd;
	struct osmo_io_fd *iofd_rtp;
	struct osmo_io_fd *iofd_rtcp;
	struct osmo_sockaddr rtp_remote;
	struct osmo_sockaddr rtcp_remote;
	/* Rx and Tx state */
	struct twrtp_jibuf_inst *twjit;
	struct twrtp_endp_tx tx;
	struct twrtp_endp_rtcp_rx rtcp_rx;
	struct twrtp_endp_rtcp_tx rtcp_tx;
	uint8_t *sdes_buf;
	uint16_t sdes_len;
	uint16_t auto_rtcp_interval;
	uint16_t auto_rtcp_count;
	/* always have to have stats */
	struct twrtp_endp_stats stats;
	/* bool flags at the end for structure packing optimization */
	bool register_done;
	bool remote_set;
	bool rx_enable;
};

/* public API functions */

struct twrtp_endp *twrtp_endp_create(void *ctx,
				     struct twrtp_jibuf_config *config);
void twrtp_endp_destroy(struct twrtp_endp *endp);

int twrtp_endp_register_fds(struct twrtp_endp *endp);
int twrtp_endp_bind_ip_port(struct twrtp_endp *endp, const char *ip,
			    uint16_t port);

void twrtp_endp_set_remote_ipv4(struct twrtp_endp *endp,
				const struct in_addr *ip, uint16_t port);
void twrtp_endp_set_remote_ipv6(struct twrtp_endp *endp,
				const struct in6_addr *ip6, uint16_t port);
void twrtp_endp_set_remote_sin(struct twrtp_endp *endp,
				const struct sockaddr_in *sin);
void twrtp_endp_set_remote_sin6(struct twrtp_endp *endp,
				const struct sockaddr_in6 *sin6);

int twrtp_endp_tx_quantum(struct twrtp_endp *endp, const uint8_t *payload,
			  unsigned payload_len, uint8_t payload_type,
			  bool marker, bool auto_marker, bool send_rtcp);
void twrtp_endp_tx_skip(struct twrtp_endp *endp);

int twrtp_endp_set_sdes(struct twrtp_endp *endp, const char *cname,
			const char *name, const char *email, const char *phone,
			const char *loc, const char *tool, const char *note);
int twrtp_endp_send_rtcp_rr(struct twrtp_endp *endp);

int twrtp_endp_set_dscp(struct twrtp_endp *endp, uint8_t dscp);
int twrtp_endp_set_socket_prio(struct twrtp_endp *endp, int prio);