changeset 17:2a24487453a7

implement twrtp_bind_fdpair()
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 07 Jul 2024 00:02:44 +0000
parents 58e9719d1a84
children ec50018cc4ea
files include/fdpair.h src/Makefile src/bind_fdpair.c
diffstat 3 files changed, 74 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/fdpair.h	Sun Jul 07 00:02:44 2024 +0000
@@ -0,0 +1,10 @@
+/*
+ * This header file provides API declaration for twrtp_bind_fdpair()
+ * standalone function.
+ */
+
+#pragma once
+
+#include <stdint.h>
+
+int twrtp_bind_fdpair(const char *ip, uint16_t port, int *fd_rtp, int *fd_rtcp);
--- a/src/Makefile	Sat Jul 06 22:00:06 2024 +0000
+++ b/src/Makefile	Sun Jul 07 00:02:44 2024 +0000
@@ -1,4 +1,4 @@
-OBJS=	twjit.o twjit_in.o twjit_out.o twjit_vty.o
+OBJS=	bind_fdpair.o twjit.o twjit_in.o twjit_out.o twjit_vty.o
 LIB=	libtwrtp.a
 
 include ../config.defs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bind_fdpair.c	Sun Jul 07 00:02:44 2024 +0000
@@ -0,0 +1,63 @@
+/*
+ * Here we implement the function that creates and binds a pair of
+ * UDP sockets for RTP & RTCP, given the bind IP address in string form
+ * and the even port number in integer form.
+ *
+ * The current implementation supports only IPv4; however, given that
+ * the API takes a string for the IP address, it should be possible
+ * to extend this function to support IPv6 if and when such support
+ * becomes necessary.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <themwi/rtp/fdpair.h>
+
+int twrtp_bind_fdpair(const char *ip, uint16_t port, int *fd_rtp, int *fd_rtcp)
+{
+	struct sockaddr_in sin;
+	int rc;
+
+	sin.sin_family = AF_INET;
+	rc = inet_aton(ip, &sin.sin_addr);
+	if (!rc)
+		return -EINVAL;
+
+	/* do RTP socket first */
+	rc = socket(AF_INET, SOCK_DGRAM, 0);
+	if (rc < 0)
+		return -errno;
+	*fd_rtp = rc;
+	sin.sin_port = htons(port);
+	rc = bind(*fd_rtp, (struct sockaddr *) &sin, sizeof sin);
+	if (rc < 0) {
+		rc = -errno;
+		close(*fd_rtp);
+		return rc;
+	}
+
+	/* now do RTCP */
+	rc = socket(AF_INET, SOCK_DGRAM, 0);
+	if (rc < 0) {
+		rc = -errno;
+		close(*fd_rtp);
+		return rc;
+	}
+	*fd_rtcp = rc;
+	sin.sin_port = htons(port + 1);
+	rc = bind(*fd_rtcp, (struct sockaddr *) &sin, sizeof sin);
+	if (rc < 0) {
+		rc = -errno;
+		close(*fd_rtp);
+		close(*fd_rtcp);
+		return rc;
+	}
+
+	return 0;
+}