RTP: replace use_ipv6 by force_ip_version

This commit is contained in:
Martin Pulec
2018-07-17 16:04:20 +02:00
parent e9c0d79c84
commit c692a018c9
4 changed files with 23 additions and 20 deletions

View File

@@ -649,9 +649,9 @@ int udp_addr_valid(const char *addr)
* Returns: a pointer to a valid socket_udp structure on success, NULL otherwise. * Returns: a pointer to a valid socket_udp structure on success, NULL otherwise.
**/ **/
socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port,
int ttl, bool use_ipv6, bool multithreaded) int ttl, int force_ip_version, bool multithreaded)
{ {
return udp_init_if(addr, NULL, rx_port, tx_port, ttl, use_ipv6, multithreaded); return udp_init_if(addr, NULL, rx_port, tx_port, ttl, force_ip_version, multithreaded);
} }
ADD_TO_PARAM(udp_queue_len, "udp-queue-len", ADD_TO_PARAM(udp_queue_len, "udp-queue-len",
@@ -668,13 +668,13 @@ ADD_TO_PARAM(udp_queue_len, "udp-queue-len",
* @param rx_port receive port. * @param rx_port receive port.
* @param tx_port transmit port. * @param tx_port transmit port.
* @param ttl time-to-live value for transmitted packets. * @param ttl time-to-live value for transmitted packets.
* @param use_ipv6 whether to use IPv6 for hostname * @param force_ip_version force specific IP version
* @param multithreaded receiving in a separate thread than processing * @param multithreaded receiving in a separate thread than processing
* *
* @returns a pointer to a socket_udp structure on success, NULL otherwise. * @returns a pointer to a socket_udp structure on success, NULL otherwise.
**/ **/
socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port, socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port,
uint16_t tx_port, int ttl, bool use_ipv6, bool multithreaded) uint16_t tx_port, int ttl, int force_ip_version, bool multithreaded)
{ {
int ret; int ret;
int reuse = 1; int reuse = 1;
@@ -686,9 +686,8 @@ socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port,
s->local = new socket_udp_local(); s->local = new socket_udp_local();
s->local->fd = INVALID_SOCKET; s->local->fd = INVALID_SOCKET;
if (use_ipv6) { assert(force_ip_version == 0 || force_ip_version == 4 || force_ip_version == 6);
s->local->mode = IPv6; s->local->mode = force_ip_version;
}
if ((ret = resolve_address(s, addr, tx_port)) != 0) { if ((ret = resolve_address(s, addr, tx_port)) != 0) {
log_msg(LOG_LEVEL_ERROR, "Can't resolve IP address for %s: %s\n", addr, log_msg(LOG_LEVEL_ERROR, "Can't resolve IP address for %s: %s\n", addr,

View File

@@ -53,8 +53,8 @@ extern "C" {
#endif #endif
int udp_addr_valid(const char *addr); int udp_addr_valid(const char *addr);
socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, int ttl, bool use_ipv6, bool multithreaded); socket_udp *udp_init(const char *addr, uint16_t rx_port, uint16_t tx_port, int ttl, int force_ip_version, bool multithreaded);
socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl, bool use_ipv6, bool multithreaded); socket_udp *udp_init_if(const char *addr, const char *iface, uint16_t rx_port, uint16_t tx_port, int ttl, int force_ip_version, bool multithreaded);
void udp_exit(socket_udp *s); void udp_exit(socket_udp *s);
int udp_peek(socket_udp *s, char *buffer, int buflen); int udp_peek(socket_udp *s, char *buffer, int buflen);
@@ -97,7 +97,7 @@ int udp_fd_isset_r(socket_udp *s, struct udp_fd_r *);
int udp_recv_data(socket_udp * s, char **buffer); int udp_recv_data(socket_udp * s, char **buffer);
bool udp_not_empty(socket_udp *s, struct timeval *timeout); bool udp_not_empty(socket_udp *s, struct timeval *timeout);
bool udp_port_pair_is_free(const char *addr, bool use_ipv6, int even_port); bool udp_port_pair_is_free(const char *addr, int force_ip_version, int even_port);
bool udp_is_ipv6(socket_udp *s); bool udp_is_ipv6(socket_udp *s);
void socket_error(const char *msg, ...); void socket_error(const char *msg, ...);

View File

@@ -1026,10 +1026,10 @@ struct rtp *rtp_init(const char *addr,
uint16_t rx_port, uint16_t tx_port, uint16_t rx_port, uint16_t tx_port,
int ttl, double rtcp_bw, int ttl, double rtcp_bw,
int tfrc_on, rtp_callback callback, uint8_t * userdata, int tfrc_on, rtp_callback callback, uint8_t * userdata,
bool use_ipv6, bool multithreaded) int force_ip_version, bool multithreaded)
{ {
return rtp_init_if(addr, NULL, rx_port, tx_port, ttl, rtcp_bw, tfrc_on, return rtp_init_if(addr, NULL, rx_port, tx_port, ttl, rtcp_bw, tfrc_on,
callback, userdata, use_ipv6, multithreaded); callback, userdata, force_ip_version, multithreaded);
} }
/** /**
@@ -1049,7 +1049,7 @@ struct rtp *rtp_init(const char *addr,
* @callback: See section on #rtp_callback. * @callback: See section on #rtp_callback.
* @userdata: Opaque data associated with the session. See * @userdata: Opaque data associated with the session. See
* rtp_get_userdata(). * rtp_get_userdata().
* @use_ipv6 whether or not use IP version 6 * @force_ip_version if IPv4 or IPv4 is requested, pass 4 or 6 respectively, otherwise 0
* @multithreaded if set to true uses separate thread to receive data (performance optimization) * @multithreaded if set to true uses separate thread to receive data (performance optimization)
* *
* Creates and initializes an RTP session. * Creates and initializes an RTP session.
@@ -1061,15 +1061,19 @@ struct rtp *rtp_init_if(const char *addr, const char *iface,
uint16_t rx_port, uint16_t tx_port, uint16_t rx_port, uint16_t tx_port,
int ttl, double rtcp_bw, int ttl, double rtcp_bw,
int tfrc_on, rtp_callback callback, uint8_t * userdata, int tfrc_on, rtp_callback callback, uint8_t * userdata,
bool use_ipv6, bool multithreaded) int force_ip_version, bool multithreaded)
{ {
struct rtp *session; struct rtp *session;
int i, j; int i, j;
char *cname; char *cname;
char *hname; char *hname;
if (force_ip_version != 0 && force_ip_version != 4 && force_ip_version != 6) {
log_msg(LOG_LEVEL_ERROR, "IP version must be either 4 or 6 (or 0)\n");
return NULL;
}
if (ttl < 0 || ttl > 255) { if (ttl < 0 || ttl > 255) {
fprintf(stderr, "ttl must be in range [0..255]\n"); log_msg(LOG_LEVEL_ERROR, "ttl must be in range [0..255]\n");
return NULL; return NULL;
} }
if (rx_port % 2) { if (rx_port % 2) {
@@ -1091,7 +1095,7 @@ struct rtp *rtp_init_if(const char *addr, const char *iface,
if (rx_port == 0) { if (rx_port == 0) {
for (int i = 1<<15; i < 1<<16; i += 2) { for (int i = 1<<15; i < 1<<16; i += 2) {
// this stuff is not atomic. but... it cannot be done in this way, either // this stuff is not atomic. but... it cannot be done in this way, either
if (udp_port_pair_is_free(addr, use_ipv6, i)) { if (udp_port_pair_is_free(addr, force_ip_version, i)) {
rx_port = i; rx_port = i;
break; break;
} }
@@ -1105,11 +1109,11 @@ struct rtp *rtp_init_if(const char *addr, const char *iface,
if (tx_port == 0) { if (tx_port == 0) {
tx_port = rx_port; tx_port = rx_port;
} }
session->rtp_socket = udp_init_if(addr, iface, rx_port, tx_port, ttl, use_ipv6, multithreaded); session->rtp_socket = udp_init_if(addr, iface, rx_port, tx_port, ttl, force_ip_version, multithreaded);
session->rtcp_socket = session->rtcp_socket =
udp_init_if(addr, iface, (uint16_t) (rx_port + (rx_port ? 1 : 0)), udp_init_if(addr, iface, (uint16_t) (rx_port + (rx_port ? 1 : 0)),
(uint16_t) (tx_port + (tx_port ? 1 : 0)), ttl, use_ipv6, false); (uint16_t) (tx_port + (tx_port ? 1 : 0)), ttl, force_ip_version, false);
init_opt(session); init_opt(session);

View File

@@ -230,14 +230,14 @@ rtp_t rtp_init(const char *addr,
int tfrc_on, int tfrc_on,
rtp_callback callback, rtp_callback callback,
uint8_t *userdata, uint8_t *userdata,
bool use_ipv6, bool multithreaded); int force_ip_version, bool multithreaded);
rtp_t rtp_init_if(const char *addr, const char *iface, rtp_t rtp_init_if(const char *addr, const char *iface,
uint16_t rx_port, uint16_t tx_port, uint16_t rx_port, uint16_t tx_port,
int ttl, double rtcp_bw, int ttl, double rtcp_bw,
int tfrc_on, int tfrc_on,
rtp_callback callback, rtp_callback callback,
uint8_t *userdata, uint8_t *userdata,
bool use_ipv6, bool multithreaded); int force_ip_version, bool multithreaded);
rtp_t rtp_init_with_udp_socket(struct socket_udp_local *l, struct sockaddr *sa, socklen_t len, rtp_callback callback); rtp_t rtp_init_with_udp_socket(struct socket_udp_local *l, struct sockaddr *sa, socklen_t len, rtp_callback callback);
void rtp_send_bye(struct rtp *session); void rtp_send_bye(struct rtp *session);