mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 15:08:53 +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 \
|
gstnettimepacket.c \
|
||||||
gstnettimeprovider.c \
|
gstnettimeprovider.c \
|
||||||
gstptpclock.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_CFLAGS = $(GST_OBJ_CFLAGS) $(GIO_CFLAGS)
|
||||||
libgstnet_@GST_API_VERSION@_la_LIBADD = $(GST_OBJ_LIBS) $(GIO_LIBS) \
|
libgstnet_@GST_API_VERSION@_la_LIBADD = $(GST_OBJ_LIBS) $(GIO_LIBS) \
|
||||||
|
|
|
@ -58,17 +58,10 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef G_OS_WIN32
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "gstnettimepacket.h"
|
#include "gstnettimepacket.h"
|
||||||
#include "gstntppacket.h"
|
#include "gstntppacket.h"
|
||||||
#include "gstnetclientclock.h"
|
#include "gstnetclientclock.h"
|
||||||
|
#include "gstnetutils.h"
|
||||||
|
|
||||||
#include <gio/gio.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 */
|
/* before next sending check if need to change QoS */
|
||||||
new_qos_dscp = self->qos_dscp;
|
new_qos_dscp = self->qos_dscp;
|
||||||
if (cur_qos_dscp != new_qos_dscp) {
|
if (cur_qos_dscp != new_qos_dscp &&
|
||||||
gint tos, fd;
|
gst_net_utils_set_socket_dscp (socket, new_qos_dscp)) {
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "changed QoS DSCP to: %d", new_qos_dscp);
|
GST_DEBUG_OBJECT (self, "changed QoS DSCP to: %d", new_qos_dscp);
|
||||||
cur_qos_dscp = new_qos_dscp;
|
cur_qos_dscp = new_qos_dscp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,16 +38,9 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef G_OS_WIN32
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "gstnettimeprovider.h"
|
#include "gstnettimeprovider.h"
|
||||||
#include "gstnettimepacket.h"
|
#include "gstnettimepacket.h"
|
||||||
|
#include "gstnetutils.h"
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (ntp_debug);
|
GST_DEBUG_CATEGORY_STATIC (ntp_debug);
|
||||||
#define GST_CAT_DEFAULT (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 */
|
/* before next sending check if need to change QoS */
|
||||||
new_qos_dscp = self->priv->qos_dscp;
|
new_qos_dscp = self->priv->qos_dscp;
|
||||||
if (cur_qos_dscp != new_qos_dscp) {
|
if (cur_qos_dscp != new_qos_dscp &&
|
||||||
gint tos, fd;
|
gst_net_utils_set_socket_dscp (socket, new_qos_dscp)) {
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "changed QoS DSCP to: %d", new_qos_dscp);
|
GST_DEBUG_OBJECT (self, "changed QoS DSCP to: %d", new_qos_dscp);
|
||||||
cur_qos_dscp = 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