[PATCH v2] ipv4: Make IP_MULTICAST_ALL and IP_MSFILTER work on raw sockets

Subsystems: networking [general], the rest

STALE4399d

2 messages, 2 authors, 2014-07-22 · open the first message on its own page

[PATCH v2] ipv4: Make IP_MULTICAST_ALL and IP_MSFILTER work on raw sockets

From: Quentin Armitage <hidden>
Date: 2014-07-22 08:10:32

Currently, although IP_MULTICAST_ALL and IP_MSFILTER ioctl calls succeed on
raw sockets, there is no code to implement the functionality on received
packets; it is only implemented for UDP sockets. The raw(7) man page states:
"In addition, all ip(7) IPPROTO_IP socket options valid for datagram sockets
are supported", which implies these ioctls should work on raw sockets.

To fix this, add a call to ip_mc_sf_allow on raw sockets.

This should not break any existing code, since the current position of
not calling ip_mc_sf_filter makes it behave as if neither the IP_MULTICAST_ALL
nor the IP_MSFILTER ioctl had been called. Adding the call to ip_mc_sf_allow
will therefore maintain the current behaviour so long as IP_MULTICAST_ALL and
IP_MSFILTER ioctls are not called. Any code that currently is calling
IP_MULTICAST_ALL or IP_MSFILTER ioctls on raw sockets presumably is wanting
the filter to be applied, although no filtering will currently be occurring.

Signed-off-by: Quentin Armitage <redacted>
---
v2: * Fixed subject line
---
 net/ipv4/raw.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index 2c65160..2e1628c 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -58,6 +58,7 @@
 #include <linux/in_route.h>
 #include <linux/route.h>
 #include <linux/skbuff.h>
+#include <linux/igmp.h>
 #include <net/net_namespace.h>
 #include <net/dst.h>
 #include <net/sock.h>
@@ -174,7 +175,9 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
 
        while (sk) {
                delivered = 1;
-               if (iph->protocol != IPPROTO_ICMP || !icmp_filter(sk, skb)) {
+               if ((iph->protocol != IPPROTO_ICMP || !icmp_filter(sk, skb)) &&
+                   ip_mc_sf_allow(sk, iph->daddr, iph->saddr,
+                                  skb->dev->ifindex)) {
                        struct sk_buff *clone = skb_clone(skb, GFP_ATOMIC);
 
                        /* Not releasing hash table! */
-- 
1.7.7.6

Re: [PATCH v2] ipv4: Make IP_MULTICAST_ALL and IP_MSFILTER work on raw sockets

From: David Miller <davem@davemloft.net>
Date: 2014-07-22 20:29:15

From: Quentin Armitage <redacted>
Date: Tue, 22 Jul 2014 09:10:10 +0100
Currently, although IP_MULTICAST_ALL and IP_MSFILTER ioctl calls succeed on
raw sockets, there is no code to implement the functionality on received
packets; it is only implemented for UDP sockets. The raw(7) man page states:
"In addition, all ip(7) IPPROTO_IP socket options valid for datagram sockets
are supported", which implies these ioctls should work on raw sockets.

To fix this, add a call to ip_mc_sf_allow on raw sockets.

This should not break any existing code, since the current position of
not calling ip_mc_sf_filter makes it behave as if neither the IP_MULTICAST_ALL
nor the IP_MSFILTER ioctl had been called. Adding the call to ip_mc_sf_allow
will therefore maintain the current behaviour so long as IP_MULTICAST_ALL and
IP_MSFILTER ioctls are not called. Any code that currently is calling
IP_MULTICAST_ALL or IP_MSFILTER ioctls on raw sockets presumably is wanting
the filter to be applied, although no filtering will currently be occurring.

Signed-off-by: Quentin Armitage <redacted>
---
v2: * Fixed subject line
Your email client has corrupted the patch, transforming TAB characters
into spaces, amongst other things.

Please correct this and resubmit your patch.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help