From 33c4f2487c784129c9262d057abb6b77fe0e1c2f Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Fri, 26 Jan 2024 02:03:21 +0100 Subject: [PATCH 1/2] Revert "wfd-p2p-sink: Use device name instead of MAC for matching" This reverts commit ec1c3d134fe734c5ca555a60517752f699c7ee5c. --- src/nd-wfd-p2p-sink.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/nd-wfd-p2p-sink.c b/src/nd-wfd-p2p-sink.c index ffd4f0c..f5b1d46 100644 --- a/src/nd-wfd-p2p-sink.c +++ b/src/nd-wfd-p2p-sink.c @@ -131,15 +131,15 @@ nd_wfd_p2p_sink_get_property (GObject *object, case PROP_MATCHES: { g_autoptr(GPtrArray) res = NULL; - const char *name; + const char *hw_addr; res = g_ptr_array_new_with_free_func (g_free); /* Should not usually happen, but it can if something is holding on * to the sink. So guard against NULL being returned if the peer * object is not valid anymore. */ - name = nm_wifi_p2p_peer_get_name (sink->nm_peer); - if (name) - g_ptr_array_add (res, g_strdup (name)); + hw_addr = nm_wifi_p2p_peer_get_hw_address (sink->nm_peer); + if (hw_addr) + g_ptr_array_add (res, g_strdup (hw_addr)); g_value_take_boxed (value, g_steal_pointer (&res)); break; -- GitLab From 3f77723e31eee62ad1e58510266a04add119fadb Mon Sep 17 00:00:00 2001 From: Christian Glombek Date: Fri, 26 Jan 2024 03:27:46 +0100 Subject: [PATCH 2/2] Deduplicate sinks based on IP and P2P MAC --- src/nd-cc-sink.c | 47 ++++++++++++++------------ src/nd-wfd-mice-provider.c | 20 ++++++++++- src/nd-wfd-mice-sink.c | 68 ++++++++++++++++++++++++++------------ src/nd-wfd-mice-sink.h | 5 +-- src/nd-wfd-p2p-sink.c | 6 +++- 5 files changed, 99 insertions(+), 47 deletions(-) diff --git a/src/nd-cc-sink.c b/src/nd-cc-sink.c index c172809..aa45ced 100644 --- a/src/nd-cc-sink.c +++ b/src/nd-cc-sink.c @@ -36,8 +36,8 @@ struct _NdCCSink GtkStringList *missing_audio_codec; char *missing_firewall_zone; - gchar *remote_address; - gchar *remote_name; + gchar *ip; + gchar *name; GSocketClient *client; @@ -48,7 +48,7 @@ struct _NdCCSink enum { PROP_CLIENT = 1, PROP_NAME, - PROP_ADDRESS, + PROP_IP, PROP_DISPLAY_NAME, PROP_MATCHES, @@ -90,11 +90,11 @@ nd_cc_sink_get_property (GObject * object, break; case PROP_NAME: - g_value_set_string (value, self->remote_name); + g_value_set_string (value, self->name); break; - case PROP_ADDRESS: - g_value_set_string (value, self->remote_address); + case PROP_IP: + g_value_set_string (value, self->ip); break; case PROP_DISPLAY_NAME: @@ -106,8 +106,11 @@ nd_cc_sink_get_property (GObject * object, g_autoptr(GPtrArray) res = NULL; res = g_ptr_array_new_with_free_func (g_free); - if (self->remote_name) - g_ptr_array_add (res, g_strdup (self->remote_name)); + if (self->ip) + { + g_debug ("NdCCSink: Adding IP %s to match list", self->ip); + g_ptr_array_add (res, g_strdup (self->ip)); + } g_value_take_boxed (value, g_steal_pointer (&res)); break; @@ -155,13 +158,13 @@ nd_cc_sink_set_property (GObject *object, break; case PROP_NAME: - self->remote_name = g_value_dup_string (value); + self->name = g_value_dup_string (value); g_object_notify (G_OBJECT (self), "display-name"); break; - case PROP_ADDRESS: - g_assert (self->remote_address == NULL); - self->remote_address = g_value_dup_string (value); + case PROP_IP: + g_assert (self->ip == NULL); + self->ip = g_value_dup_string (value); break; default: @@ -183,8 +186,8 @@ nd_cc_sink_finalize (GObject *object) g_clear_object (&self->missing_audio_codec); g_clear_pointer (&self->missing_firewall_zone, g_free); - g_clear_pointer (&self->remote_address, g_free); - g_clear_pointer (&self->remote_name, g_free); + g_clear_pointer (&self->ip, g_free); + g_clear_pointer (&self->name, g_free); g_clear_object (&self->client); @@ -254,9 +257,9 @@ nd_cc_sink_class_init (NdCCSinkClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); - props[PROP_ADDRESS] = - g_param_spec_string ("address", "Sink Address", - "The address the sink was found on.", + props[PROP_IP] = + g_param_spec_string ("ip", "Sink IP Address", + "The IP address the sink was found on.", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); @@ -356,15 +359,15 @@ nd_cc_sink_sink_start_stream (NdSink *sink) self->ctrl.cancellable = self->cancellable; self->ctrl.comm.cancellable = self->cancellable; - g_debug ("NdCCSink: Attempting connection to Chromecast: %s @ %s", self->remote_name, self->remote_address); - if (!cc_ctrl_connection_init (&self->ctrl, self->remote_address)) + g_debug ("NdCCSink: Attempting connection to Chromecast: %s @ %s", self->name, self->ip); + if (!cc_ctrl_connection_init (&self->ctrl, self->ip)) { g_warning ("NdCCSink: Failed to init cc-ctrl"); goto error; } self->http_server = cc_http_server_new (); - cc_http_server_set_remote_address (self->http_server, self->remote_address); + cc_http_server_set_remote_address (self->http_server, self->ip); /* copy the pointer to ctrl */ self->ctrl.http_server = self->http_server; @@ -411,12 +414,12 @@ error: NdCCSink * nd_cc_sink_new (GSocketClient *client, gchar *name, - gchar *remote_address) + gchar *ip) { return g_object_new (ND_TYPE_CC_SINK, "client", client, "name", name, - "address", remote_address, + "ip", ip, NULL); } diff --git a/src/nd-wfd-mice-provider.c b/src/nd-wfd-mice-provider.c index 1d81b9a..c3b299d 100644 --- a/src/nd-wfd-mice-provider.c +++ b/src/nd-wfd-mice-provider.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "gnome-network-displays-config.h" #include "nd-wfd-mice-provider.h" #include "nd-sink.h" @@ -152,7 +153,9 @@ resolver_found_cb (GaServiceResolver *resolver, NdWFDMiceProvider *provider) { NdWFDMiceSink * sink = NULL; + AvahiStringList *l; gchar address[AVAHI_ADDRESS_STR_MAX]; + gchar *p2p_mac = NULL; g_debug ("NdWFDMiceProvider: Found sink %s at %s:%d on interface %i", name, hostname, port, iface); @@ -161,7 +164,22 @@ resolver_found_cb (GaServiceResolver *resolver, g_debug ("NdWFDMiceProvider: Resolved %s to %s", hostname, address); - sink = nd_wfd_mice_sink_new (name, address); + for (l = txt; l; l = l->next) + { + char *key, *value; + + if (avahi_string_list_get_pair (l, &key, &value, NULL) != 0) + break; + + if (g_str_equal (key, "p2pMAC")) + p2p_mac = g_strdup (value); + + avahi_free (key); + avahi_free (value); + } + + /* TODO it might be more convenient to pass the whole AvahiStringList */ + sink = nd_wfd_mice_sink_new (name, address, p2p_mac); g_object_unref (resolver); diff --git a/src/nd-wfd-mice-sink.c b/src/nd-wfd-mice-sink.c index 034103a..8054fcf 100644 --- a/src/nd-wfd-mice-sink.c +++ b/src/nd-wfd-mice-sink.c @@ -34,8 +34,9 @@ struct _NdWFDMiceSink GtkStringList *missing_audio_codec; char *missing_firewall_zone; - gchar *remote_address; - gchar *remote_name; + gchar *name; + gchar *ip; + gchar *p2p_mac; GSocketClient *signalling_client; GSocketConnection *signalling_client_conn; @@ -47,8 +48,8 @@ struct _NdWFDMiceSink enum { PROP_CLIENT = 1, PROP_NAME, - PROP_ADDRESS, - + PROP_IP, + PROP_P2P_MAC, PROP_DISPLAY_NAME, PROP_MATCHES, PROP_PRIORITY, @@ -111,11 +112,15 @@ nd_wfd_mice_sink_get_property (GObject *object, break; case PROP_NAME: - g_value_set_string (value, sink->remote_name); + g_value_set_string (value, sink->name); + break; + + case PROP_IP: + g_value_set_string (value, sink->ip); break; - case PROP_ADDRESS: - g_value_set_string (value, sink->remote_address); + case PROP_P2P_MAC: + g_value_set_string (value, sink->p2p_mac); break; case PROP_DISPLAY_NAME: @@ -127,9 +132,17 @@ nd_wfd_mice_sink_get_property (GObject *object, g_autoptr(GPtrArray) res = NULL; res = g_ptr_array_new_with_free_func (g_free); - if (sink->remote_name) - g_ptr_array_add (res, g_strdup (sink->remote_name)); - + if (sink->ip) + { + g_debug ("NdWFDMiceSink: Adding IP %s to match list", sink->ip); + g_ptr_array_add (res, g_strdup (sink->ip)); + } + if (sink->p2p_mac) + { + gchar *p2p_mac = g_utf8_strup (sink->p2p_mac, -1); + g_debug ("NdWFDMiceSink: Adding P2P MAC %s to match list", p2p_mac); + g_ptr_array_add (res, p2p_mac); + } g_value_take_boxed (value, g_steal_pointer (&res)); break; } @@ -176,13 +189,18 @@ nd_wfd_mice_sink_set_property (GObject *object, break; case PROP_NAME: - sink->remote_name = g_value_dup_string (value); + sink->name = g_value_dup_string (value); g_object_notify (G_OBJECT (sink), "display-name"); break; - case PROP_ADDRESS: - g_assert (sink->remote_address == NULL); - sink->remote_address = g_value_dup_string (value); + case PROP_IP: + g_assert (sink->ip == NULL); + sink->ip = g_value_dup_string (value); + break; + + case PROP_P2P_MAC: + g_assert (sink->p2p_mac == NULL); + sink->p2p_mac = g_value_dup_string (value); break; default: @@ -232,9 +250,15 @@ nd_wfd_mice_sink_class_init (NdWFDMiceSinkClass *klass) NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); - props[PROP_ADDRESS] = - g_param_spec_string ("address", "Sink Address", - "The address the sink was found on.", + props[PROP_IP] = + g_param_spec_string ("ip", "Sink IP Address", + "The IP address the sink was found on.", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + props[PROP_P2P_MAC] = + g_param_spec_string ("p2p-mac", "Sink P2P MAC Address", + "The P2P MAC address the sink was found on.", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); @@ -292,7 +316,7 @@ signalling_client_send (NdWFDMiceSink * self, if (self->signalling_client_conn == NULL) { self->signalling_client_conn = g_socket_client_connect_to_host (self->signalling_client, - (gchar *) self->remote_address, + (gchar *) self->ip, 7250, NULL, &error); @@ -433,7 +457,7 @@ nd_wfd_mice_sink_sink_start_stream (NdSink *sink) self->server = wfd_server_new (); self->server_source_id = gst_rtsp_server_attach (GST_RTSP_SERVER (self->server), NULL); - if (self->server_source_id == 0 || self->remote_address == NULL) + if (self->server_source_id == 0 || self->ip == NULL) goto fail; g_signal_connect_object (self->server, @@ -584,11 +608,13 @@ nd_wfd_mice_sink_sink_stop_stream (NdSink *sink) NdWFDMiceSink * nd_wfd_mice_sink_new (gchar *name, - gchar *remote_address) + gchar *ip, + gchar *p2p_mac) { return g_object_new (ND_TYPE_WFD_MICE_SINK, "name", name, - "address", remote_address, + "ip", ip, + "p2p-mac", p2p_mac, NULL); } diff --git a/src/nd-wfd-mice-sink.h b/src/nd-wfd-mice-sink.h index e38043e..05545cd 100644 --- a/src/nd-wfd-mice-sink.h +++ b/src/nd-wfd-mice-sink.h @@ -26,8 +26,9 @@ G_BEGIN_DECLS #define ND_TYPE_WFD_MICE_SINK (nd_wfd_mice_sink_get_type ()) G_DECLARE_FINAL_TYPE (NdWFDMiceSink, nd_wfd_mice_sink, ND, WFD_MICE_SINK, GObject) -NdWFDMiceSink * nd_wfd_mice_sink_new (gchar * name, - gchar * remote_address); +NdWFDMiceSink * nd_wfd_mice_sink_new (gchar * name, + gchar * ip, + gchar * p2p_mac); NdSinkState nd_wfd_mice_sink_get_state (NdWFDMiceSink *sink); diff --git a/src/nd-wfd-p2p-sink.c b/src/nd-wfd-p2p-sink.c index f5b1d46..5e19f5b 100644 --- a/src/nd-wfd-p2p-sink.c +++ b/src/nd-wfd-p2p-sink.c @@ -139,7 +139,11 @@ nd_wfd_p2p_sink_get_property (GObject *object, * object is not valid anymore. */ hw_addr = nm_wifi_p2p_peer_get_hw_address (sink->nm_peer); if (hw_addr) - g_ptr_array_add (res, g_strdup (hw_addr)); + { + gchar *addr = g_utf8_strup (hw_addr, -1); + g_debug ("NdWFDP2PSink: Adding P2P MAC %s to match list", addr); + g_ptr_array_add (res, addr); + } g_value_take_boxed (value, g_steal_pointer (&res)); break; -- GitLab