diff options
author | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2008-04-02 20:22:53 -0400 |
---|---|---|
committer | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2008-04-05 09:33:38 -0400 |
commit | 7bc570c8b4f75ddb3fd5dbeb38127cdc4acbcc9c (patch) | |
tree | b688b728c3ea08479f75986d1e9f590fca1f8715 /net/ipv6/ip6_output.c | |
parent | 80a9492a33dd7d852465625022d56ff76d62174d (diff) |
[IPV6] MROUTE: Support multicast forwarding.
Based on ancient patch by Mickael Hoerdt
<hoerdt@clarinet.u-strasbg.fr>, which is available at
<http://www-r2.u-strasbg.fr/~hoerdt/dev/linux_ipv6_mforwarding/patch-linux-ipv6-mforwarding-0.1a>.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r-- | net/ipv6/ip6_output.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index a8b4da25b0a7..c0dbe549cc42 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -55,6 +55,7 @@ | |||
55 | #include <net/icmp.h> | 55 | #include <net/icmp.h> |
56 | #include <net/xfrm.h> | 56 | #include <net/xfrm.h> |
57 | #include <net/checksum.h> | 57 | #include <net/checksum.h> |
58 | #include <linux/mroute6.h> | ||
58 | 59 | ||
59 | static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); | 60 | static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); |
60 | 61 | ||
@@ -137,8 +138,9 @@ static int ip6_output2(struct sk_buff *skb) | |||
137 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); | 138 | struct inet6_dev *idev = ip6_dst_idev(skb->dst); |
138 | 139 | ||
139 | if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) && | 140 | if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) && |
140 | ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr, | 141 | ((mroute6_socket && !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) || |
141 | &ipv6_hdr(skb)->saddr)) { | 142 | ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr, |
143 | &ipv6_hdr(skb)->saddr))) { | ||
142 | struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); | 144 | struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); |
143 | 145 | ||
144 | /* Do not check for IFF_ALLMULTI; multicast routing | 146 | /* Do not check for IFF_ALLMULTI; multicast routing |