From 5d885b9dc73d3007ea04e96c24d0ef30c365bc4d Mon Sep 17 00:00:00 2001 From: Robert Rosengren Date: Mon, 30 Oct 2017 10:49:06 +0100 Subject: [PATCH] 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 --- libs/gst/net/Makefile.am | 5 ++- libs/gst/net/gstnetclientclock.c | 23 ++--------- libs/gst/net/gstnettimeprovider.c | 22 ++--------- libs/gst/net/gstnetutils.c | 66 +++++++++++++++++++++++++++++++ libs/gst/net/gstnetutils.h | 36 +++++++++++++++++ 5 files changed, 111 insertions(+), 41 deletions(-) create mode 100644 libs/gst/net/gstnetutils.c create mode 100644 libs/gst/net/gstnetutils.h diff --git a/libs/gst/net/Makefile.am b/libs/gst/net/Makefile.am index c7c6b503bf..35ed9062d3 100644 --- a/libs/gst/net/Makefile.am +++ b/libs/gst/net/Makefile.am @@ -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) \ diff --git a/libs/gst/net/gstnetclientclock.c b/libs/gst/net/gstnetclientclock.c index 49897d2170..102ba19241 100644 --- a/libs/gst/net/gstnetclientclock.c +++ b/libs/gst/net/gstnetclientclock.c @@ -58,17 +58,10 @@ #include "config.h" #endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -#ifndef G_OS_WIN32 -#include -#endif - #include "gstnettimepacket.h" #include "gstntppacket.h" #include "gstnetclientclock.h" +#include "gstnetutils.h" #include @@ -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; } diff --git a/libs/gst/net/gstnettimeprovider.c b/libs/gst/net/gstnettimeprovider.c index 824e43d608..b5432a110e 100644 --- a/libs/gst/net/gstnettimeprovider.c +++ b/libs/gst/net/gstnettimeprovider.c @@ -38,16 +38,9 @@ #include "config.h" #endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -#ifndef G_OS_WIN32 -#include -#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; } diff --git a/libs/gst/net/gstnetutils.c b/libs/gst/net/gstnetutils.c new file mode 100644 index 0000000000..a8a99d9718 --- /dev/null +++ b/libs/gst/net/gstnetutils.c @@ -0,0 +1,66 @@ +/* GStreamer + * Copyright (C) 2017 Sebastian Dröge + * Copyright (C) 2017 Robert Rosengren + * + * 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 +#include + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +#ifndef G_OS_WIN32 +#include +#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; +} diff --git a/libs/gst/net/gstnetutils.h b/libs/gst/net/gstnetutils.h new file mode 100644 index 0000000000..053f187e65 --- /dev/null +++ b/libs/gst/net/gstnetutils.h @@ -0,0 +1,36 @@ +/* GStreamer + * Copyright (C) 2017 Sebastian Dröge + * Copyright (C) 2017 Robert Rosengren + * + * 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 +#include + +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__ */