mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-24 16:18:16 +00:00
netutils: Add util for setting socket DSCP
Util function for setting QoS DSCP added, to remove duplicated code in netclientclock and nettimeprovider. Fix build error if missing IP_TOS. https://bugzilla.gnome.org/show_bug.cgi?id=784737
This commit is contained in:
parent
fb56ad6bee
commit
5d885b9dc7
5 changed files with 111 additions and 41 deletions
|
@ -18,9 +18,10 @@ libgstnet_@GST_API_VERSION@_la_SOURCES = \
|
|||
gstnettimepacket.c \
|
||||
gstnettimeprovider.c \
|
||||
gstptpclock.c \
|
||||
gstntppacket.c
|
||||
gstntppacket.c \
|
||||
gstnetutils.c
|
||||
|
||||
noinst_HEADERS = gstptp_private.h gstntppacket.h
|
||||
noinst_HEADERS = gstptp_private.h gstntppacket.h gstnetutils.h
|
||||
|
||||
libgstnet_@GST_API_VERSION@_la_CFLAGS = $(GST_OBJ_CFLAGS) $(GIO_CFLAGS)
|
||||
libgstnet_@GST_API_VERSION@_la_LIBADD = $(GST_OBJ_LIBS) $(GIO_LIBS) \
|
||||
|
|
|
@ -58,17 +58,10 @@
|
|||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifndef G_OS_WIN32
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#include "gstnettimepacket.h"
|
||||
#include "gstntppacket.h"
|
||||
#include "gstnetclientclock.h"
|
||||
#include "gstnetutils.h"
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
|
@ -682,18 +675,8 @@ gst_net_client_internal_clock_thread (gpointer data)
|
|||
|
||||
/* before next sending check if need to change QoS */
|
||||
new_qos_dscp = self->qos_dscp;
|
||||
if (cur_qos_dscp != new_qos_dscp) {
|
||||
gint tos, fd;
|
||||
fd = g_socket_get_fd (socket);
|
||||
|
||||
/* Extract and shift 6 bits of DSFIELD */
|
||||
tos = (new_qos_dscp & 0x3f) << 2;
|
||||
|
||||
if (setsockopt (fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0) {
|
||||
GST_ERROR_OBJECT (self, "could not set TOS: %s",
|
||||
g_strerror (errno));
|
||||
}
|
||||
|
||||
if (cur_qos_dscp != new_qos_dscp &&
|
||||
gst_net_utils_set_socket_dscp (socket, new_qos_dscp)) {
|
||||
GST_DEBUG_OBJECT (self, "changed QoS DSCP to: %d", new_qos_dscp);
|
||||
cur_qos_dscp = new_qos_dscp;
|
||||
}
|
||||
|
|
|
@ -38,16 +38,9 @@
|
|||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifndef G_OS_WIN32
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#include "gstnettimeprovider.h"
|
||||
#include "gstnettimepacket.h"
|
||||
#include "gstnetutils.h"
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (ntp_debug);
|
||||
#define GST_CAT_DEFAULT (ntp_debug)
|
||||
|
@ -225,17 +218,8 @@ gst_net_time_provider_thread (gpointer data)
|
|||
|
||||
/* before next sending check if need to change QoS */
|
||||
new_qos_dscp = self->priv->qos_dscp;
|
||||
if (cur_qos_dscp != new_qos_dscp) {
|
||||
gint tos, fd;
|
||||
fd = g_socket_get_fd (socket);
|
||||
|
||||
/* Extract and shift 6 bits of DSFIELD */
|
||||
tos = (new_qos_dscp & 0x3f) << 2;
|
||||
|
||||
if (setsockopt (fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0) {
|
||||
GST_ERROR_OBJECT (self, "could not set TOS: %s", g_strerror (errno));
|
||||
}
|
||||
|
||||
if (cur_qos_dscp != new_qos_dscp &&
|
||||
gst_net_utils_set_socket_dscp (socket, new_qos_dscp)) {
|
||||
GST_DEBUG_OBJECT (self, "changed QoS DSCP to: %d", new_qos_dscp);
|
||||
cur_qos_dscp = new_qos_dscp;
|
||||
}
|
||||
|
|
66
libs/gst/net/gstnetutils.c
Normal file
66
libs/gst/net/gstnetutils.c
Normal file
|
@ -0,0 +1,66 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2017 Sebastian Dröge <sebastian@centricular.com>
|
||||
* Copyright (C) 2017 Robert Rosengren <robertr@axis.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "gstnetutils.h"
|
||||
#include <gst/gstinfo.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#ifndef G_OS_WIN32
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* gst_net_time_packet_util_set_dscp:
|
||||
* @socket: Socket to configure
|
||||
* @qos_dscp: QoS DSCP value
|
||||
*
|
||||
* Configures IP_TOS value of socket, i.e. sets QoS DSCP.
|
||||
*
|
||||
* Returns: TRUE if successful, FALSE in case an error occurred.
|
||||
*/
|
||||
gboolean
|
||||
gst_net_utils_set_socket_dscp (GSocket * socket, gint qos_dscp)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
|
||||
#ifdef IP_TOS
|
||||
gint tos, fd;
|
||||
fd = g_socket_get_fd (socket);
|
||||
|
||||
/* Extract and shift 6 bits of DSFIELD */
|
||||
tos = (qos_dscp & 0x3f) << 2;
|
||||
|
||||
if (setsockopt (fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0) {
|
||||
GST_ERROR ("could not set TOS: %s", g_strerror (errno));
|
||||
} else {
|
||||
ret = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
36
libs/gst/net/gstnetutils.h
Normal file
36
libs/gst/net/gstnetutils.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2017 Sebastian Dröge <sebastian@centricular.com>
|
||||
* Copyright (C) 2017 Robert Rosengren <robertr@axis.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GST_NET_UTILS_H__
|
||||
#define __GST_NET_UTILS_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
gboolean gst_net_utils_set_socket_dscp (GSocket * socket,
|
||||
gint qos_dscp);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_NET_UTILS_H__ */
|
Loading…
Reference in a new issue