Skip to contentSkip to conversation

R: Re: BUG (?) multicast loopback (IP6SKB_FORWARDED)

DISCUSSION [email protected] 1 participant 1 message Jun 11, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hi Eric,
thanks for the quick reply. It seems that reverting the patch fixes the issue, and I have not observed any unintended behaviour so far.
Do you know what was the motivation for the patch?

Regards,
Massimiliano

Quoted 11 lines

----Messaggio originale----
Da: [email protected]
Data: 08/06/2012 19.23
A: "[email protected]"<[email protected]>
Cc: <[email protected]>
Ogg: Re: BUG (?) multicast loopback (IP6SKB_FORWARDED)

Quoted 3 lines · On Fri, 2012-06-08 at 18:48 +0200, [email protected] wrote:

Hi guys,
I found a probably wrong behaviour while doing some tests with multicast routing on IPv6 with kernel 2.6.29. I will try to describe what's wrong in

the

Quoted 3 lines
Quoted 3 lines

code in the following. I will use the latest kernel sources (3.5-rc1) as reference source code (line numbers are taken there). Let's assume a scenario with a node with two network interfaces acting as

a

Quoted 1 line
Quoted 1 line

multicast router. The router receives the message on one interface and

needs to

Quoted 7 lines
Quoted 7 lines

forward it on the other interface. Looking at the packet flow inside the kernel, we notice that

in ip6mr.c, line 2282, a flag is set:
IP6CB(skb)->flags |= IP6SKB_FORWARDED;

After this, a multicast packet can be looped back (see line 124 in

ip6_output.

Quoted 10 lines
Quoted 10 lines

c where function ip6_dev_loopback_xmit is called). The packet is hence reinjected in the stack.

The packet is processed by function ipv6_rcv (ip6_input.c), and then by ipv6_mc_input (ip6_input.c).

In ipv6_rcv, line 82, the previously set flag is cleared memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm));

In ipv6_mc_input, , line 268, the flag is checked to determine if the

packet

Quoted 1 line
Quoted 1 line

has been already forwarded. Since the flag has been cleared, the kernel

cannot

Quoted 1 line
Quoted 1 line

determine that the packet has been looped back, and will hence try to

forward

Quoted 4 lines
Quoted 4 lines

it again.

Trying to forward a looped back packet determines a wrong behaviour of the multicast routing protocol (PIM): the kernel believes that a multicast

message

Quoted 1 line
Quoted 1 line

has been received from a wrong interface (line 1993 in ip6mr.c), discard

the

Quoted 1 line
Quoted 1 line

message (this explains why the packet does not loop forever) and triggers

the

Quoted 16 lines
Quoted 4 lines

transmission of an ASSERT message. Basically, the node ends up sending an ASSERT message because of a looped back packet.

WDYT? Is my analysis correct? Which is the best way to fix this issue?

I guess your analysis is correct, try to revert commit 6b7fdc3ae18a0598a999156b62d55ea55220e00f ([IPV6]: Clean skb cb on IPv6 input) ?

--
To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html