summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgssdp/gssdp-client.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/libgssdp/gssdp-client.c b/libgssdp/gssdp-client.c
index 60aeb06..a81f81d 100644
--- a/libgssdp/gssdp-client.c
+++ b/libgssdp/gssdp-client.c
@@ -1726,19 +1726,29 @@ socket_source_cb (GSSDPSocketSource *socket_source, GSSDPClient *client)
msg = GSSDP_PKTINFO6_MESSAGE (messages[i]);
msg_ifindex = gssdp_pktinfo6_message_get_ifindex (msg);
local_addr = gssdp_pktinfo6_message_get_local_addr (msg);
- } else
+ } else {
continue;
+ }
/* message needs to be on correct interface or on
* loopback (as kernel can be smart and route things
* there even if sent to another network) */
- if (!((msg_ifindex == priv->device.index ||
- msg_ifindex == LOOPBACK_IFINDEX) &&
- (g_inet_address_equal (local_addr,
- priv->device.host_addr) ||
- g_inet_address_equal (local_addr, group_addr)))) {
- goto out;
- } else {
+ if (g_inet_address_equal (local_addr, group_addr)) {
+ // This is a multicast packet. If the index is not our index, ignore
+ if (msg_ifindex != priv->device.index) {
+ goto out;
+ }
+ break;
+ }
+
+ if (g_inet_address_equal (local_addr,
+ priv->device.host_addr)) {
+ // This is a "normal" packet. We can receive those
+
+ if (msg_ifindex != priv->device.index &&
+ msg_ifindex != LOOPBACK_IFINDEX) {
+ goto out;
+ }
break;
}
}