annotate src/bind_fdpair.c @ 42:334d883b96ba

twrtp_jibuf_create: make config argument const While this config structure is not a constant in the mathematical sense of the term (it is expected that vty config changes may happen while twjit instance is alive), twjit functions never write to it, only read, hence it is 'const' in the not-quite-mathematical C-standard sense.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 20 Dec 2024 22:47:20 +0000
parents 2a24487453a7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Here we implement the function that creates and binds a pair of
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * UDP sockets for RTP & RTCP, given the bind IP address in string form
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * and the even port number in integer form.
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 *
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * The current implementation supports only IPv4; however, given that
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * the API takes a string for the IP address, it should be possible
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 * to extend this function to support IPv6 if and when such support
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 * becomes necessary.
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 */
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <sys/types.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <sys/socket.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include <netinet/in.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include <arpa/inet.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 #include <stdint.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 #include <unistd.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 #include <errno.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 #include <themwi/rtp/fdpair.h>
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 int twrtp_bind_fdpair(const char *ip, uint16_t port, int *fd_rtp, int *fd_rtcp)
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 {
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 struct sockaddr_in sin;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 int rc;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 sin.sin_family = AF_INET;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 rc = inet_aton(ip, &sin.sin_addr);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 if (!rc)
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 return -EINVAL;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 /* do RTP socket first */
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 rc = socket(AF_INET, SOCK_DGRAM, 0);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 if (rc < 0)
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 return -errno;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 *fd_rtp = rc;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 sin.sin_port = htons(port);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 rc = bind(*fd_rtp, (struct sockaddr *) &sin, sizeof sin);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 if (rc < 0) {
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 rc = -errno;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 close(*fd_rtp);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 return rc;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 }
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 /* now do RTCP */
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 rc = socket(AF_INET, SOCK_DGRAM, 0);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 if (rc < 0) {
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 rc = -errno;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 close(*fd_rtp);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 return rc;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 }
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 *fd_rtcp = rc;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 sin.sin_port = htons(port + 1);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 rc = bind(*fd_rtcp, (struct sockaddr *) &sin, sizeof sin);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 if (rc < 0) {
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 rc = -errno;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 close(*fd_rtp);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 close(*fd_rtcp);
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 return rc;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 }
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 return 0;
2a24487453a7 implement twrtp_bind_fdpair()
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }